monkey/lexer/lexer_test.go

124 lines
2.4 KiB
Go
Raw Normal View History

2021-11-30 19:02:01 +00:00
package lexer
2021-11-30 19:45:39 +00:00
2021-11-30 19:02:01 +00:00
import (
2021-11-30 19:45:39 +00:00
"testing"
"gitlab.com/Tyrel/monkey/token"
2021-11-30 19:02:01 +00:00
)
2021-11-30 19:45:39 +00:00
func TestNextToken(t *testing.T) {
2021-11-30 20:27:22 +00:00
input := `let five = 5;
let ten = 10;
let add = fn(x,y) {
x + y;
};
let result = add(five, ten);
2021-11-30 20:43:13 +00:00
!-/*5;
5 < 10 > 5;
if (5 < 10) {
return true;
} else {
return false;
}
2021-11-30 21:07:55 +00:00
10 == 10;
10 != 9;
2021-11-30 20:27:22 +00:00
`
2021-11-30 19:45:39 +00:00
tests := []struct {
expectedType token.TokenType
expectedLiteral string
}{
2021-11-30 20:27:22 +00:00
{token.LET, "let"},
{token.IDENT, "five"},
2021-11-30 19:45:39 +00:00
{token.ASSIGN, "="},
2021-11-30 20:27:22 +00:00
{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"},
2021-11-30 19:45:39 +00:00
{token.LPAREN, "("},
2021-11-30 20:27:22 +00:00
{token.IDENT, "x"},
{token.COMMA, ","},
{token.IDENT, "y"},
2021-11-30 19:45:39 +00:00
{token.RPAREN, ")"},
{token.LBRACE, "{"},
2021-11-30 20:27:22 +00:00
{token.IDENT, "x"},
{token.PLUS, "+"},
{token.IDENT, "y"},
{token.SEMICOLON, ";"},
2021-11-30 19:45:39 +00:00
{token.RBRACE, "}"},
2021-11-30 20:27:22 +00:00
{token.SEMICOLON, ";"},
{token.LET, "let"},
{token.IDENT, "result"},
{token.ASSIGN, "="},
{token.IDENT, "add"},
{token.LPAREN, "("},
{token.IDENT, "five"},
2021-11-30 19:45:39 +00:00
{token.COMMA, ","},
2021-11-30 20:27:22 +00:00
{token.IDENT, "ten"},
{token.RPAREN, ")"},
2021-11-30 19:45:39 +00:00
{token.SEMICOLON, ";"},
2021-11-30 20:43:13 +00:00
{token.BANG, "!"},
{token.MINUS, "-"},
{token.SLASH, "/"},
{token.ASTERISK, "*"},
{token.INT, "5"},
{token.SEMICOLON, ";"},
{token.INT, "5"},
{token.LT, "<"},
{token.INT, "10"},
{token.GT, ">"},
{token.INT, "5"},
{token.SEMICOLON, ";"},
2021-11-30 21:07:55 +00:00
{token.IF, "if"},
{token.LPAREN, "("},
{token.INT, "5"},
{token.LT, "<"},
{token.INT, "10"},
{token.RPAREN, ")"},
{token.LBRACE, "{"},
{token.RETURN, "return"},
{token.TRUE, "true"},
{token.SEMICOLON, ";"},
{token.RBRACE, "}"},
{token.ELSE, "else"},
{token.LBRACE, "{"},
{token.RETURN, "return"},
{token.FALSE, "false"},
{token.SEMICOLON, ";"},
{token.RBRACE, "}"},
{token.INT, "10"},
{token.EQ, "=="},
{token.INT, "10"},
{token.SEMICOLON, ";"},
{token.INT, "10"},
{token.NOT_EQ, "!="},
{token.INT, "9"},
{token.SEMICOLON, ";"},
2021-11-30 19:45:39 +00:00
{token.EOF, ""},
}
2021-11-30 19:02:01 +00:00
2021-11-30 19:45:39 +00:00
l := New(input)
for i, tt := range tests {
tok := l.NextToken()
2021-11-30 19:02:01 +00:00
2021-11-30 19:45:39 +00:00
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] - literal wrong. expected=%q, got %q",
i, tt.expectedLiteral, tok.Literal)
}
}
2021-11-30 19:02:01 +00:00
}