lexer_test.go 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. package lexer
  2. import (
  3. "fgm/waiig15/token"
  4. "testing"
  5. )
  6. func TestNextToken(t *testing.T) {
  7. input := `
  8. let five = 5;
  9. let ten = 10;
  10. let add = fn(x, y) {
  11. x + y;
  12. }
  13. let result = add(five, ten);
  14. !-/*5;
  15. 5 < 10 > 5;
  16. `
  17. tests := []struct {
  18. expectedType token.TokenType
  19. expectedLiteral string
  20. }{
  21. { token.LET, "let" },
  22. { token.IDENT, "five" },
  23. { token.ASSIGN, "="},
  24. { token.INT, "5" },
  25. { token.SEMICOLON, ";" },
  26. { token.LET, "let" },
  27. { token.IDENT, "ten" },
  28. { token.ASSIGN, "="},
  29. { token.INT, "10" },
  30. { token.SEMICOLON, ";" },
  31. { token.LET, "let" },
  32. { token.IDENT, "add" },
  33. { token.ASSIGN, "="},
  34. { token.FUNCTION, "fn" },
  35. { token.LPAREN, "(" },
  36. { token.IDENT, "x" },
  37. { token.COMMA, "," },
  38. { token.IDENT, "y" },
  39. { token.RPAREN, ")" },
  40. { token.LBRACE, "{" },
  41. { token.IDENT, "x" },
  42. { token.PLUS, "+" },
  43. { token.IDENT, "y" },
  44. { token.SEMICOLON, ";" },
  45. { token.RBRACE, "}" },
  46. { token.LET, "let" },
  47. { token.IDENT, "result" },
  48. { token.ASSIGN, "="},
  49. { token.IDENT, "add" },
  50. { token.LPAREN, "(" },
  51. { token.IDENT, "five" },
  52. { token.COMMA, "," },
  53. { token.IDENT, "ten" },
  54. { token.RPAREN, ")" },
  55. {token.SEMICOLON, ";"},
  56. { token.BANG, "!" },
  57. { token.MINUS, "-" },
  58. { token.SLASH, "/" },
  59. { token.ASTERISK, "*" },
  60. { token.INT, "5" },
  61. { token.SEMICOLON, ";" },
  62. { token.INT, "5" },
  63. { token.LT, "<" },
  64. { token.INT, "10" },
  65. { token.GT, ">" },
  66. { token.INT, "5" },
  67. { token.SEMICOLON, ";" },
  68. { token.EOF, ""},
  69. }
  70. l := New(input)
  71. for i, tt := range tests {
  72. tok := l.NextToken()
  73. if tok.Type != tt.expectedType {
  74. t.Fatalf("tests[%d] - tokentype wrong, expected %q, got %q",
  75. i, tt.expectedType, tok.Type)
  76. }
  77. if tok.Literal != tt.expectedLiteral {
  78. t.Fatalf("tests[%d] - literal wrong, expected %q, got %q",
  79. i, tt.expectedLiteral, tok.Literal)
  80. }
  81. }
  82. }