aboutsummaryrefslogtreecommitdiff
path: root/evaluator/evaluator_test.go
diff options
context:
space:
mode:
Diffstat (limited to 'evaluator/evaluator_test.go')
-rw-r--r--evaluator/evaluator_test.go77
1 files changed, 36 insertions, 41 deletions
diff --git a/evaluator/evaluator_test.go b/evaluator/evaluator_test.go
index f8fb53b..f7c235d 100644
--- a/evaluator/evaluator_test.go
+++ b/evaluator/evaluator_test.go
@@ -31,7 +31,7 @@ func TestEvalIntegerExpression(t *testing.T) {
}
for _, tt := range tests {
- evaluated := testEval(tt.input)
+ evaluated := testEval(t, tt.input)
testIntegerObject(t, evaluated, tt.expected)
}
}
@@ -67,7 +67,7 @@ func TestEvalBooleanExpression(t *testing.T) {
}
for _, tt := range tests {
- evaluated := testEval(tt.input)
+ evaluated := testEval(t, tt.input)
testBooleanObject(t, evaluated, tt.expected)
}
}
@@ -86,7 +86,7 @@ func TestBangOperator(t *testing.T) {
}
for _, tt := range tests {
- evaluated := testEval(tt.input)
+ evaluated := testEval(t, tt.input)
testBooleanObject(t, evaluated, tt.expected)
}
}
@@ -94,7 +94,7 @@ func TestBangOperator(t *testing.T) {
func TestIfElseExpressions(t *testing.T) {
tests := []struct {
input string
- expected interface{}
+ expected any
}{
{"if (true) { 10 }", 10},
{"if (false) { 10 }", nil},
@@ -106,7 +106,7 @@ func TestIfElseExpressions(t *testing.T) {
}
for _, tt := range tests {
- evaluated := testEval(tt.input)
+ evaluated := testEval(t, tt.input)
integer, ok := tt.expected.(int)
if ok {
testIntegerObject(t, evaluated, int64(integer))
@@ -160,7 +160,7 @@ f(10);`,
}
for _, tt := range tests {
- evaluated := testEval(tt.input)
+ evaluated := testEval(t, tt.input)
testIntegerObject(t, evaluated, tt.expected)
}
}
@@ -229,18 +229,16 @@ if (10 > 1) {
}
for _, tt := range tests {
- evaluated := testEval(tt.input)
+ evaluated := testEval(t, tt.input)
errObj, ok := evaluated.(*object.Error)
if !ok {
- t.Errorf("no error object returned. got=%T(%+v)",
- evaluated, evaluated)
+ 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)
+ t.Errorf("wrong error message. expected=%q, got=%q", tt.expectedMessage, errObj.Message)
}
}
}
@@ -257,22 +255,21 @@ func TestLetStatements(t *testing.T) {
}
for _, tt := range tests {
- testIntegerObject(t, testEval(tt.input), tt.expected)
+ testIntegerObject(t, testEval(t, tt.input), tt.expected)
}
}
func TestFunctionObject(t *testing.T) {
input := "fn(x) { x + 2; };"
- evaluated := testEval(input)
+ evaluated := testEval(t, input)
fn, ok := evaluated.(*object.Function)
if !ok {
t.Fatalf("object is not Function. got=%T (%+v)", evaluated, evaluated)
}
if len(fn.Parameters) != 1 {
- t.Fatalf("function has wrong parameters. Parameters=%+v",
- fn.Parameters)
+ t.Fatalf("function has wrong parameters. Parameters=%+v", fn.Parameters)
}
if fn.Parameters[0].String() != "x" {
@@ -300,7 +297,7 @@ func TestFunctionApplication(t *testing.T) {
}
for _, tt := range tests {
- testIntegerObject(t, testEval(tt.input), tt.expected)
+ testIntegerObject(t, testEval(t, tt.input), tt.expected)
}
}
@@ -318,7 +315,7 @@ let ourFunction = fn(first) {
ourFunction(20) + first + second;`
- testIntegerObject(t, testEval(input), 70)
+ testIntegerObject(t, testEval(t, input), 70)
}
func TestClosures(t *testing.T) {
@@ -330,13 +327,13 @@ let newAdder = fn(x) {
let addTwo = newAdder(2);
addTwo(2);`
- testIntegerObject(t, testEval(input), 4)
+ testIntegerObject(t, testEval(t, input), 4)
}
func TestStringLiteral(t *testing.T) {
input := `"Hello World!"`
- evaluated := testEval(input)
+ evaluated := testEval(t, input)
str, ok := evaluated.(*object.String)
if !ok {
t.Fatalf("object is not String. got=%T (%+v)", evaluated, evaluated)
@@ -350,7 +347,7 @@ func TestStringLiteral(t *testing.T) {
func TestStringConcatenation(t *testing.T) {
input := `"Hello" + " " + "World!"`
- evaluated := testEval(input)
+ evaluated := testEval(t, input)
str, ok := evaluated.(*object.String)
if !ok {
t.Fatalf("object is not String. got=%T (%+v)", evaluated, evaluated)
@@ -364,7 +361,7 @@ func TestStringConcatenation(t *testing.T) {
func TestBuiltinFunctions(t *testing.T) {
tests := []struct {
input string
- expected interface{}
+ expected any
}{
{`len("")`, 0},
{`len("four")`, 4},
@@ -387,7 +384,7 @@ func TestBuiltinFunctions(t *testing.T) {
}
for _, tt := range tests {
- evaluated := testEval(tt.input)
+ evaluated := testEval(t, tt.input)
switch expected := tt.expected.(type) {
case int:
@@ -397,13 +394,11 @@ func TestBuiltinFunctions(t *testing.T) {
case string:
errObj, ok := evaluated.(*object.Error)
if !ok {
- t.Errorf("object is not Error. got=%T (%+v)",
- evaluated, evaluated)
+ t.Errorf("object is not Error. got=%T (%+v)", evaluated, evaluated)
continue
}
if errObj.Message != expected {
- t.Errorf("wrong error message. expected=%q, got=%q",
- expected, errObj.Message)
+ t.Errorf("wrong error message. expected=%q, got=%q", expected, errObj.Message)
}
case []int:
array, ok := evaluated.(*object.Array)
@@ -413,8 +408,7 @@ func TestBuiltinFunctions(t *testing.T) {
}
if len(array.Elements) != len(expected) {
- t.Errorf("wrong num of elements. want=%d, got=%d",
- len(expected), len(array.Elements))
+ t.Errorf("wrong num of elements. want=%d, got=%d", len(expected), len(array.Elements))
continue
}
@@ -428,15 +422,14 @@ func TestBuiltinFunctions(t *testing.T) {
func TestArrayLiterals(t *testing.T) {
input := "[1, 2 * 2, 3 + 3]"
- evaluated := testEval(input)
+ evaluated := testEval(t, input)
result, ok := evaluated.(*object.Array)
if !ok {
t.Fatalf("object is not Array. got=%T (%+v)", evaluated, evaluated)
}
if len(result.Elements) != 3 {
- t.Fatalf("array has wrong num of elements. got=%d",
- len(result.Elements))
+ t.Fatalf("array has wrong num of elements. got=%d", len(result.Elements))
}
testIntegerObject(t, result.Elements[0], 1)
@@ -447,7 +440,7 @@ func TestArrayLiterals(t *testing.T) {
func TestArrayIndexExpressions(t *testing.T) {
tests := []struct {
input string
- expected interface{}
+ expected any
}{
{
"[1, 2, 3][0]",
@@ -492,7 +485,7 @@ func TestArrayIndexExpressions(t *testing.T) {
}
for _, tt := range tests {
- evaluated := testEval(tt.input)
+ evaluated := testEval(t, tt.input)
integer, ok := tt.expected.(int)
if ok {
testIntegerObject(t, evaluated, int64(integer))
@@ -513,7 +506,7 @@ func TestHashLiterals(t *testing.T) {
false: 6
}`
- evaluated := testEval(input)
+ evaluated := testEval(t, input)
result, ok := evaluated.(*object.Hash)
if !ok {
t.Fatalf("Eval didn't return Hash. got=%T (%+v)", evaluated, evaluated)
@@ -545,7 +538,7 @@ func TestHashLiterals(t *testing.T) {
func TestHashIndexExpressions(t *testing.T) {
tests := []struct {
input string
- expected interface{}
+ expected any
}{
{
`{"foo": 5}["foo"]`,
@@ -578,7 +571,7 @@ func TestHashIndexExpressions(t *testing.T) {
}
for _, tt := range tests {
- evaluated := testEval(tt.input)
+ evaluated := testEval(t, tt.input)
integer, ok := tt.expected.(int)
if ok {
testIntegerObject(t, evaluated, int64(integer))
@@ -587,7 +580,8 @@ func TestHashIndexExpressions(t *testing.T) {
}
}
}
-func testEval(input string) object.Object {
+func testEval(t *testing.T, input string) object.Object {
+ t.Helper()
l := lexer.New(input)
p := parser.New(l)
program := p.ParseProgram()
@@ -597,14 +591,14 @@ func testEval(input string) object.Object {
}
func testIntegerObject(t *testing.T, obj object.Object, expected int64) bool {
+ t.Helper()
result, ok := obj.(*object.Integer)
if !ok {
t.Errorf("object is not Integer. got=%T (%+v)", obj, obj)
return false
}
if result.Value != expected {
- t.Errorf("object has wrong value. got=%d, want=%d",
- result.Value, expected)
+ t.Errorf("object has wrong value. got=%d, want=%d", result.Value, expected)
return false
}
@@ -612,20 +606,21 @@ func testIntegerObject(t *testing.T, obj object.Object, expected int64) bool {
}
func testBooleanObject(t *testing.T, obj object.Object, expected bool) bool {
+ t.Helper()
result, ok := obj.(*object.Boolean)
if !ok {
t.Errorf("object is not Boolean. got=%T (%+v)", obj, obj)
return false
}
if result.Value != expected {
- t.Errorf("object has wrong value. got=%t, want=%t",
- result.Value, expected)
+ t.Errorf("object has wrong value. got=%t, want=%t", result.Value, expected)
return false
}
return true
}
func testNullObject(t *testing.T, obj object.Object) bool {
+ t.Helper()
if obj != NULL {
t.Errorf("object is not NULL. got=%T (%+v)", obj, obj)
return false