aboutsummaryrefslogtreecommitdiffstats
path: root/src/parser.rs
diff options
context:
space:
mode:
authorTeddy Wing2018-11-03 13:53:16 +0100
committerTeddy Wing2018-11-03 13:53:16 +0100
commit3091ebe0deb1ba832b4a5925263409ec5b651c62 (patch)
tree9c7fddbe970acab88f34e2a718994f1ade3c84fd /src/parser.rs
parent33d17c5557f4d3a932eda818e1ac4ca715a720d7 (diff)
downloaddome-key-map-3091ebe0deb1ba832b4a5925263409ec5b651c62.tar.bz2
parser: Add a failing test for parse errors in the middle of lines
We currently correctly report errors in the middle of the first line (problems with the trigger, problems with special keys in an action), but for all subsequent lines, the error message is limited to the first character on the line. This means that even if you write "map", "cmd", or "mode", which are all correct, the error message will refer to "column 1", even though the actual error is in a different part of the parser. Not sure why that's happening, nor why it doesn't happen for the first line. But at least we have a test for it now. The test will need to be modified once I can actually get the error messages propagating correctly, as the `Expected` lines are going to be wrong. They were just copy-pasted from the test above this one.
Diffstat (limited to 'src/parser.rs')
-rw-r--r--src/parser.rs26
1 files changed, 26 insertions, 0 deletions
diff --git a/src/parser.rs b/src/parser.rs
index 027c309..4bad78b 100644
--- a/src/parser.rs
+++ b/src/parser.rs
@@ -1550,4 +1550,30 @@ not-a-kind <play> <Nop>
],
}));
}
+
+ #[test]
+ fn map_group_shows_error_in_middle_of_line() {
+ let text = "map <up> <Up>
+map <not-a-button> <Nop>
+";
+ let result = map_group().easy_parse(State::new(text)).map(|t| t.0);
+
+ assert_eq!(result, Err(easy::Errors {
+ position: SourcePosition {
+ line: 2,
+ column: 5,
+ },
+ errors: vec![
+ easy::Error::Unexpected('n'.into()),
+ easy::Error::Expected("map".into()),
+ easy::Error::Expected("cmd".into()),
+ easy::Error::Expected("mode".into()),
+ easy::Error::Expected("lf newline".into()),
+ easy::Error::Expected("whitespace".into()),
+ easy::Error::Expected("tab".into()),
+ easy::Error::Expected('#'.into()),
+ easy::Error::Expected("end of input".into()),
+ ],
+ }));
+ }
}