diff options
| author | franck cuny <franck@fcuny.net> | 2020-01-11 13:34:54 +0100 |
|---|---|---|
| committer | franck cuny <franck@fcuny.net> | 2020-01-11 13:55:16 +0100 |
| commit | d7b15313dc554871cc0973924323f7407722121a (patch) | |
| tree | e78190942639de4673c5f64ed51aed95eb839cb2 /users/fcuny/exp/monkey/pkg/lexer/lexer_test.go | |
| parent | token: initial tokenizer. (diff) | |
| download | infra-d7b15313dc554871cc0973924323f7407722121a.tar.gz | |
lexer: initial lexer
The initial lexer for the monkey language. We only support a small
subset at this stage.
We have some simple tests to ensure that we can parse some small
snippet, and that the minimum number of tokens we need are also all
supported correctly.
Diffstat (limited to '')
| -rw-r--r-- | users/fcuny/exp/monkey/pkg/lexer/lexer_test.go | 104 |
1 files changed, 104 insertions, 0 deletions
diff --git a/users/fcuny/exp/monkey/pkg/lexer/lexer_test.go b/users/fcuny/exp/monkey/pkg/lexer/lexer_test.go new file mode 100644 index 0000000..73b27fb --- /dev/null +++ b/users/fcuny/exp/monkey/pkg/lexer/lexer_test.go @@ -0,0 +1,104 @@ +package lexer + +import ( + "monkey/pkg/token" + "testing" +) + +func TestNextTokenBasic(t *testing.T) { + input := `=+(){},;` + + tests := []struct { + expectedType token.TokenType + expectedLiteral string + }{ + {token.ASSIGN, "="}, + {token.PLUS, "+"}, + {token.LPAREN, "("}, + {token.RPAREN, ")"}, + {token.LBRACE, "{"}, + {token.RBRACE, "}"}, + {token.COMMA, ","}, + {token.SEMICOLON, ";"}, + } + + l := New(input) + + for i, tt := range tests { + tok := l.NextToken() + if tok.Type != tt.expectedType { + t.Fatalf("tests[%d] - tokentype wrong. expected=%q, got=%q", i, tt.expectedType, tok.Type) + } + + if tok.Literal != tt.expectedLiteral { + t.Fatalf("tests[%d] - tokenliteral wrong. expected=%q, got=%q", i, tt.expectedLiteral, tok.Literal) + } + } +} + +func TestNextTokenMonkey(t *testing.T) { + input := `let five = 5; +let ten = 10; + +let add = fn(x, y) { + x + y +}; + +let result = add(five, ten);` + + tests := []struct { + expectedType token.TokenType + expectedLiteral string + }{ + {token.LET, "let"}, + {token.IDENT, "five"}, + {token.ASSIGN, "="}, + {token.INT, "5"}, + {token.SEMICOLON, ";"}, + + {token.LET, "let"}, + {token.IDENT, "ten"}, + {token.ASSIGN, "="}, + {token.INT, "10"}, + {token.SEMICOLON, ";"}, + + {token.LET, "let"}, + {token.IDENT, "add"}, + {token.ASSIGN, "="}, + {token.FUNCTION, "fn"}, + {token.LPAREN, "("}, + {token.IDENT, "x"}, + {token.COMMA, ","}, + {token.IDENT, "y"}, + {token.RPAREN, ")"}, + {token.LBRACE, "{"}, + {token.IDENT, "x"}, + {token.PLUS, "+"}, + {token.IDENT, "y"}, + {token.RBRACE, "}"}, + {token.SEMICOLON, ";"}, + + {token.LET, "let"}, + {token.IDENT, "result"}, + {token.ASSIGN, "="}, + {token.IDENT, "add"}, + {token.LPAREN, "("}, + {token.IDENT, "five"}, + {token.COMMA, ","}, + {token.IDENT, "ten"}, + {token.RPAREN, ")"}, + {token.SEMICOLON, ";"}, + } + + l := New(input) + for i, tt := range tests { + tok := l.NextToken() + if tok.Type != tt.expectedType { + t.Fatalf("tests[%d] - tokentype wrong. expected=%q, got=%q", i, tt.expectedType, tok.Type) + } + + if tok.Literal != tt.expectedLiteral { + t.Fatalf("tests[%d] - tokenliteral wrong. expected=%q, got=%q", i, tt.expectedLiteral, tok.Literal) + } + } +} |
