parser_test.go 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. package parser
  2. import (
  3. "github/runnignwater/monkey/ast"
  4. "github/runnignwater/monkey/lexer"
  5. "testing"
  6. )
  7. /**
  8. * @Author: simon
  9. * @Author: ynwdlxm@163.com
  10. * @Date: 2022/10/2 下午10:40
  11. * @Desc: LetStatement test case
  12. */
  13. func TestLetStatements(t *testing.T) {
  14. input := `
  15. let x = 5;
  16. let y = 10;
  17. let foo = 838383;
  18. `
  19. l := lexer.New(input)
  20. p := New(l)
  21. program := p.ParseProgram()
  22. if program == nil {
  23. t.Fatalf("ParseProgram() return nil")
  24. }
  25. if len(program.Statements) != 3 {
  26. t.Fatalf("Program.Statements does not contain 3 statements. got=%d", len(program.Statements))
  27. }
  28. tests := []struct {
  29. expectedIdentifies string
  30. }{
  31. {"x"},
  32. {"y"},
  33. {"foo"},
  34. }
  35. for i, tt := range tests {
  36. stmt := program.Statements[i]
  37. if !testLetStatement(t, stmt, tt.expectedIdentifies) {
  38. return
  39. }
  40. }
  41. }
  42. func testLetStatement(t *testing.T, s ast.Statement, name string) bool {
  43. if s.TokenLiteral() != "let" {
  44. t.Errorf("s.TokenLiteral() not 'let'. got =%q", s.TokenLiteral())
  45. return false
  46. }
  47. letStmt, ok := s.(*ast.LetStatement)
  48. if !ok {
  49. t.Errorf("s is not *ast.LetStatement. got=%T", s)
  50. return false
  51. }
  52. if letStmt.Name.Value != name {
  53. t.Errorf("letStmt.Name.Value not '%s'. got=%s", name, letStmt.Name.Value)
  54. return false
  55. }
  56. if letStmt.Name.TokenLiteral() != name {
  57. t.Errorf("s.name not '%s. got=%s", name, letStmt.Name)
  58. return false
  59. }
  60. return true
  61. }