Skip to content

Commit 2c8fbee

Browse files
committed
Add failure/low-level lexer tests
1 parent 845d874 commit 2c8fbee

File tree

2 files changed

+62
-1
lines changed

2 files changed

+62
-1
lines changed

src/parser/lexer.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -472,7 +472,7 @@ impl<'a> fmt::Display for Token<'a> {
472472
Token::Name(ref name) => write!(f, "{}", name),
473473
Token::Int(i) => write!(f, "{}", i),
474474
Token::Float(v) => write!(f, "{}", v),
475-
Token::String(ref s) => write!(f, "{}", s),
475+
Token::String(ref s) => write!(f, "\"{}\"", s.replace('\\', "\\\\").replace('"', "\\\"")),
476476
Token::ExclamationMark => write!(f, "!"),
477477
Token::Dollar => write!(f, "$"),
478478
Token::ParenOpen => write!(f, "("),

src/parser/tests/lexer.rs

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -258,6 +258,18 @@ fn string_errors() {
258258
Spanning::zero_width(
259259
&SourcePosition::new(6, 0, 6),
260260
LexerError::UnknownEscapeSequence("\\uXXXF".to_owned())));
261+
262+
assert_eq!(
263+
tokenize_error(r#""unterminated in string \""#),
264+
Spanning::zero_width(
265+
&SourcePosition::new(26, 0, 26),
266+
LexerError::UnterminatedString));
267+
268+
assert_eq!(
269+
tokenize_error(r#""unterminated \"#),
270+
Spanning::zero_width(
271+
&SourcePosition::new(15, 0, 15),
272+
LexerError::UnterminatedString));
261273
}
262274

263275
#[test]
@@ -276,6 +288,13 @@ fn numbers() {
276288
&SourcePosition::new(5, 0, 5),
277289
Token::Float(4.123)));
278290

291+
assert_eq!(
292+
tokenize_single("4.0"),
293+
Spanning::start_end(
294+
&SourcePosition::new(0, 0, 0),
295+
&SourcePosition::new(3, 0, 3),
296+
Token::Float(4.0)));
297+
279298
assert_eq!(
280299
tokenize_single("-4"),
281300
Spanning::start_end(
@@ -534,3 +553,45 @@ fn punctuation_error() {
534553
&SourcePosition::new(0, 0, 0),
535554
LexerError::UnknownCharacter('\u{200b}')));
536555
}
556+
557+
#[test]
558+
fn display() {
559+
assert_eq!(
560+
format!("{}", Token::Name("identifier")),
561+
"identifier"
562+
);
563+
564+
assert_eq!(
565+
format!("{}", Token::Int(123)),
566+
"123"
567+
);
568+
569+
assert_eq!(
570+
format!("{}", Token::Float(4.123)),
571+
"4.123"
572+
);
573+
574+
assert_eq!(
575+
format!("{}", Token::String("some string".to_owned())),
576+
"\"some string\""
577+
);
578+
579+
assert_eq!(
580+
format!("{}", Token::String("string with \\ escape and \" quote".to_owned())),
581+
"\"string with \\\\ escape and \\\" quote\""
582+
);
583+
584+
assert_eq!(format!("{}", Token::ExclamationMark), "!");
585+
assert_eq!(format!("{}", Token::Dollar), "$");
586+
assert_eq!(format!("{}", Token::ParenOpen), "(");
587+
assert_eq!(format!("{}", Token::ParenClose), ")");
588+
assert_eq!(format!("{}", Token::BracketOpen), "[");
589+
assert_eq!(format!("{}", Token::BracketClose), "]");
590+
assert_eq!(format!("{}", Token::CurlyOpen), "{");
591+
assert_eq!(format!("{}", Token::CurlyClose), "}");
592+
assert_eq!(format!("{}", Token::Ellipsis), "...");
593+
assert_eq!(format!("{}", Token::Colon), ":");
594+
assert_eq!(format!("{}", Token::Equals), "=");
595+
assert_eq!(format!("{}", Token::At), "@");
596+
assert_eq!(format!("{}", Token::Pipe), "|");
597+
}

0 commit comments

Comments
 (0)