aboutsummaryrefslogtreecommitdiff
path: root/evaluator
diff options
context:
space:
mode:
Diffstat (limited to 'evaluator')
-rw-r--r--evaluator/evaluator.go2
-rw-r--r--evaluator/evaluator_test.go77
-rw-r--r--evaluator/macro_expansion.go4
-rw-r--r--evaluator/macro_expansion_test.go18
-rw-r--r--evaluator/quote_unquote_test.go16
5 files changed, 53 insertions, 64 deletions
diff --git a/evaluator/evaluator.go b/evaluator/evaluator.go
index e7b7193..c9d13d7 100644
--- a/evaluator/evaluator.go
+++ b/evaluator/evaluator.go
@@ -300,7 +300,7 @@ func isTruthy(obj object.Object) bool {
}
}
-func newError(format string, a ...interface{}) *object.Error {
+func newError(format string, a ...any) *object.Error {
return &object.Error{Message: fmt.Sprintf(format, a...)}
}
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
diff --git a/evaluator/macro_expansion.go b/evaluator/macro_expansion.go
index 21d3dcb..d504d31 100644
--- a/evaluator/macro_expansion.go
+++ b/evaluator/macro_expansion.go
@@ -35,8 +35,8 @@ func isMacroDefinition(node ast.Statement) bool {
}
func addMacro(stmt ast.Statement, env *object.Environment) {
- letStatement, _ := stmt.(*ast.LetStatement)
- macroLiteral, _ := letStatement.Value.(*ast.MacroLiteral)
+ letStatement := stmt.(*ast.LetStatement)
+ macroLiteral := letStatement.Value.(*ast.MacroLiteral)
macro := &object.Macro{
Parameters: macroLiteral.Parameters,
diff --git a/evaluator/macro_expansion_test.go b/evaluator/macro_expansion_test.go
index 81c03ef..df0042d 100644
--- a/evaluator/macro_expansion_test.go
+++ b/evaluator/macro_expansion_test.go
@@ -17,13 +17,12 @@ let mymacro = macro(x, y) { x + y; };
`
env := object.NewEnvironment()
- program := testParseProgram(input)
+ program := testParseProgram(t, input)
DefineMacros(program, env)
if len(program.Statements) != 2 {
- t.Fatalf("Wrong number of statements. got=%d",
- len(program.Statements))
+ t.Fatalf("Wrong number of statements. got=%d", len(program.Statements))
}
_, ok := env.Get("number")
@@ -46,8 +45,7 @@ let mymacro = macro(x, y) { x + y; };
}
if len(macro.Parameters) != 2 {
- t.Fatalf("Wrong number of macro parameters. got=%d",
- len(macro.Parameters))
+ t.Fatalf("Wrong number of macro parameters. got=%d", len(macro.Parameters))
}
if macro.Parameters[0].String() != "x" {
@@ -64,7 +62,8 @@ let mymacro = macro(x, y) { x + y; };
}
}
-func testParseProgram(input string) *ast.Program {
+func testParseProgram(t *testing.T, input string) *ast.Program {
+ t.Helper()
l := lexer.New(input)
p := parser.New(l)
return p.ParseProgram()
@@ -109,16 +108,15 @@ func TestExpandMacros(t *testing.T) {
}
for _, tt := range tests {
- expected := testParseProgram(tt.expected)
- program := testParseProgram(tt.input)
+ expected := testParseProgram(t, tt.expected)
+ program := testParseProgram(t, tt.input)
env := object.NewEnvironment()
DefineMacros(program, env)
expanded := ExpandMacros(program, env)
if expanded.String() != expected.String() {
- t.Errorf("not equal. want=%q, got=%q",
- expected.String(), expanded.String())
+ t.Errorf("not equal. want=%q, got=%q", expected.String(), expanded.String())
}
}
}
diff --git a/evaluator/quote_unquote_test.go b/evaluator/quote_unquote_test.go
index 0f79589..edcff16 100644
--- a/evaluator/quote_unquote_test.go
+++ b/evaluator/quote_unquote_test.go
@@ -30,11 +30,10 @@ func TestQuote(t *testing.T) {
}
for _, tt := range tests {
- evaluated := testEval(tt.input)
+ evaluated := testEval(t, tt.input)
quote, ok := evaluated.(*object.Quote)
if !ok {
- t.Fatalf("expected *object.Quote. got=%T (%+v)",
- evaluated, evaluated)
+ t.Fatalf("expected *object.Quote. got=%T (%+v)", evaluated, evaluated)
}
if quote.Node == nil {
@@ -42,8 +41,7 @@ func TestQuote(t *testing.T) {
}
if quote.Node.String() != tt.expected {
- t.Errorf("not equal. got=%q, want=%q",
- quote.Node.String(), tt.expected)
+ t.Errorf("not equal. got=%q, want=%q", quote.Node.String(), tt.expected)
}
}
}
@@ -99,11 +97,10 @@ func TestQuoteUnquote(t *testing.T) {
}
for _, tt := range tests {
- evaluated := testEval(tt.input)
+ evaluated := testEval(t, tt.input)
quote, ok := evaluated.(*object.Quote)
if !ok {
- t.Fatalf("expected *object.Quote. got=%T (%+v)",
- evaluated, evaluated)
+ t.Fatalf("expected *object.Quote. got=%T (%+v)", evaluated, evaluated)
}
if quote.Node == nil {
@@ -111,8 +108,7 @@ func TestQuoteUnquote(t *testing.T) {
}
if quote.Node.String() != tt.expected {
- t.Errorf("not equal. got=%q, want=%q",
- quote.Node.String(), tt.expected)
+ t.Errorf("not equal. got=%q, want=%q", quote.Node.String(), tt.expected)
}
}
}