evaluator_test.go 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. package evaluator
  2. import (
  3. "github/runnignwater/monkey/lexer"
  4. "github/runnignwater/monkey/object"
  5. "github/runnignwater/monkey/parser"
  6. "testing"
  7. )
  8. func TestEvalIntegerExpression(t *testing.T) {
  9. tests := []struct {
  10. input string
  11. expected int64
  12. }{
  13. {"5", 5},
  14. {"10", 10},
  15. {"-5", -5},
  16. {"-10", -10},
  17. {"5+5+5+5-10", 10},
  18. {"2*2*2*2*2", 32},
  19. {"-50+100+-50", 0},
  20. }
  21. for _, tt := range tests {
  22. evaluated := testEval(tt.input)
  23. testIntegerObject(t, evaluated, tt.expected)
  24. }
  25. }
  26. func TestEvalBooleanExpression(t *testing.T) {
  27. tests := []struct {
  28. input string
  29. expected bool
  30. }{
  31. {"true", true},
  32. {"false", false},
  33. {"1 < 2", true},
  34. {"1 > 2", false},
  35. {"1 == 1", true},
  36. {"1 != 1", false},
  37. {"1 == 2", false},
  38. {"1 != 2", true},
  39. }
  40. for _, tt := range tests {
  41. evaluated := testEval(tt.input)
  42. testBooleanObject(t, evaluated, tt.expected)
  43. }
  44. }
  45. func TestBangOperator(t *testing.T) {
  46. tests := []struct {
  47. input string
  48. expected bool
  49. }{
  50. {"!true", false},
  51. {"!false", true},
  52. {"!5", false},
  53. {"!!true", true},
  54. {"!!false", false},
  55. {"!!5", true},
  56. }
  57. for _, tt := range tests {
  58. evaluated := testEval(tt.input)
  59. testBooleanObject(t, evaluated, tt.expected)
  60. }
  61. }
  62. func testIntegerObject(t *testing.T, obj object.Object, expected int64) bool {
  63. result, ok := obj.(*object.Integer)
  64. if !ok {
  65. t.Errorf("object is not Integer. got=%T (%+v)", obj, obj)
  66. return false
  67. }
  68. if result.Value != expected {
  69. t.Errorf("object has wrong value. got=%d, want=%d", result.Value, expected)
  70. return false
  71. }
  72. return true
  73. }
  74. func testBooleanObject(t *testing.T, obj object.Object, expected bool) bool {
  75. result, ok := obj.(*object.Boolean)
  76. if !ok {
  77. t.Errorf("object is not Boolean. got=%T (%+v)", obj, obj)
  78. return false
  79. }
  80. if result.Value != expected {
  81. t.Errorf("object has wrong value. got=%t, want=%t", result.Value, expected)
  82. return false
  83. }
  84. return true
  85. }
  86. func testEval(input string) object.Object {
  87. l := lexer.New(input)
  88. p := parser.New(l)
  89. program := p.ParseProgram()
  90. return Eval(program)
  91. }