From 9297953443c7e93e88319c5c6b97ef46a99f77a9 Mon Sep 17 00:00:00 2001 From: GreasySlug <9619abgoni@gmail.com> Date: Wed, 28 Dec 2022 14:53:50 +0900 Subject: [PATCH] test: check valid dedent at the end of block --- compiler/erg_parser/tests/for.er | 5 ++ compiler/erg_parser/tests/tokenize_test.rs | 53 +++++++++++++++++++++- 2 files changed, 57 insertions(+), 1 deletion(-) create mode 100644 compiler/erg_parser/tests/for.er diff --git a/compiler/erg_parser/tests/for.er b/compiler/erg_parser/tests/for.er new file mode 100644 index 00000000..0db325d6 --- /dev/null +++ b/compiler/erg_parser/tests/for.er @@ -0,0 +1,5 @@ +for! 0..1, i => + for! 0..1, j => + for! 0..1, k => + + print! "hi" \ No newline at end of file diff --git a/compiler/erg_parser/tests/tokenize_test.rs b/compiler/erg_parser/tests/tokenize_test.rs index 7b57b7f1..55990fb2 100644 --- a/compiler/erg_parser/tests/tokenize_test.rs +++ b/compiler/erg_parser/tests/tokenize_test.rs @@ -13,6 +13,7 @@ const FILE1: &str = "tests/test1_basic_syntax.er"; const FILE2: &str = "tests/test2_advanced_syntax.er"; const FILE3: &str = "tests/test3_literal_syntax.er"; const FILE4: &str = "tests/multi_line_str_literal.er"; +const FILE5: &str = "tests/for.er"; #[test] fn test_lexer_for_basic() -> ParseResult<()> { @@ -310,7 +311,7 @@ fn test_lexer_for_literals() -> ParseResult<()> { fn test_lexer_for_multi_line_str_literal() -> ParseResult<()> { let mut lexer = Lexer::new(Input::File(FILE4.into())); let newline = "\n"; - let token_array = vec![ + let token_array = [ (Newline, newline), (Newline, newline), (Symbol, "single_a"), @@ -401,6 +402,56 @@ line break\"\"\"", Ok(()) } +#[test] +fn for_loop() -> ParseResult<()> { + let mut lexer = Lexer::new(Input::File(FILE5.into())); + let newline = "\n"; + let token_array = [ + (Symbol, "for!"), + (NatLit, "0"), + (Closed, ".."), + (NatLit, "1"), + (Comma, ","), + (Symbol, "i"), + (ProcArrow, "=>"), + (Newline, newline), + (Indent, " "), + (Symbol, "for!"), + (NatLit, "0"), + (Closed, ".."), + (NatLit, "1"), + (Comma, ","), + (Symbol, "j"), + (ProcArrow, "=>"), + (Newline, newline), + (Indent, " "), + (Symbol, "for!"), + (NatLit, "0"), + (Closed, ".."), + (NatLit, "1"), + (Comma, ","), + (Symbol, "k"), + (ProcArrow, "=>"), + (Newline, newline), + (Newline, newline), + (Indent, " "), + (Symbol, "print!"), + (StrLit, "\"hi\""), + (Dedent, ""), + (Dedent, ""), + (Dedent, ""), + (EOF, ""), + ]; + let mut tok: Token; + for (id, i) in token_array.into_iter().enumerate() { + print!("{id:>03}: "); + tok = lexer.next().unwrap().unwrap(); + assert_eq!(tok, Token::from_str(i.0, i.1)); + println!("{tok}"); + } + Ok(()) +} + #[test] fn tesop_te_prec() { assert_eq!(Mod.precedence(), Some(170));