diff options
Diffstat (limited to 'evaluator/evaluator_test.go')
| -rw-r--r-- | evaluator/evaluator_test.go | 59 |
1 files changed, 58 insertions, 1 deletions
diff --git a/evaluator/evaluator_test.go b/evaluator/evaluator_test.go index ca7738f..6553f55 100644 --- a/evaluator/evaluator_test.go +++ b/evaluator/evaluator_test.go @@ -5,7 +5,7 @@ import ( "mana/object" "mana/parser" - "testing" + "testing" ) func TestEvalIntegerExpression(t *testing.T) { @@ -137,6 +137,63 @@ func TestReturnStatements(t *testing.T) { } } +func TestErrorhandling(t *testing.T) { + tests := [] struct { + input string + expectedMessage string + } { + { + "5 + true;", + "type mismatch: INTEGER + BOOLEAN", + }, + { + "5 + true; 5;", + "type mismatch: INTEGER + BOOLEAN", + }, + { + "-true", + "unknown operator: -BOOLEAN", + }, + { + "true + false;", + "unknown operator: BOOLEAN + BOOLEAN", + }, + { + "5; true + false; 5", + "unknown operator: BOOLEAN + BOOLEAN", + }, + { + "if (10 > 1) { true + false; }", + "unknown operator: BOOLEAN + BOOLEAN", + }, + { + ` + if (10 > 1) { + if (10 > 1) { + return true + false; + } + return 1; + } + `, + "unknown operator: BOOLEAN + BOOLEAN", + }, + } + + for _, tt := range tests { + evaluated := testEval(tt.input) + + errObj, ok := evaluated.(*object.Error) + if !ok { + t.Errorf("no error object returned. got=%T(%+v)", evaluated, evaluated) + continue + } + + if errObj.Message != tt.expectedMessage { + t.Errorf("wrong error message. expected=%q, got=%q", tt.expectedMessage, errObj.Message) + } + } +} + func testEval(input string) object.Object { l := lexer.New(input) p := parser.New(l) |
