From 293eee7329fc31bc77bb6421716ef711341a2dfd Mon Sep 17 00:00:00 2001 From: Aden-Q Date: Tue, 7 May 2024 22:52:22 -0500 Subject: [PATCH] test: add tests for object pkg --- internal/evaluator/evaluator.go | 18 ++++----- internal/object/object.go | 24 +++++------ internal/object/object_test.go | 72 ++++++++++++++++++++++++++++++++- 3 files changed, 92 insertions(+), 22 deletions(-) diff --git a/internal/evaluator/evaluator.go b/internal/evaluator/evaluator.go index e514b27..ae1723f 100644 --- a/internal/evaluator/evaluator.go +++ b/internal/evaluator/evaluator.go @@ -28,26 +28,26 @@ func (e *evaluator) Eval(node ast.Node) (object.Object, error) { return object.NIL, ErrEmptyNodeInput } - switch node.(type) { + switch node := node.(type) { // evaluate the program case *ast.Program: - return e.evalStatements(node.(*ast.Program).Statements) + return e.evalStatements(node.Statements) // evaluate statements case *ast.ExpressionStatement: - return e.Eval(node.(*ast.ExpressionStatement).Expression) + return e.Eval(node.Expression) case *ast.BlockStatement: - return e.evalStatements(node.(*ast.BlockStatement).Statements) + return e.evalStatements(node.Statements) // evaluate expressions case *ast.IntegerExpression: - return object.NewInteger(node.(*ast.IntegerExpression).Value), nil + return object.NewInteger(node.Value), nil case *ast.BooleanExpression: - return booleanConv(node.(*ast.BooleanExpression).Value), nil + return booleanConv(node.Value), nil case *ast.IfExpression: - return e.evalIfExpression(node.(*ast.IfExpression)) + return e.evalIfExpression(node) case *ast.PrefixExpression: - return e.evalPrefixExpression(node.(*ast.PrefixExpression)) + return e.evalPrefixExpression(node) case *ast.InfixExpression: - return e.evalInfixExpression(node.(*ast.InfixExpression)) + return e.evalInfixExpression(node) } // no match, unexpected path diff --git a/internal/object/object.go b/internal/object/object.go index 1eb0984..6cdde1b 100644 --- a/internal/object/object.go +++ b/internal/object/object.go @@ -2,10 +2,17 @@ package object import "strconv" -const ( - INTEGER_OBJ = "INTEGER" - BOOLEAN_OBJ = "BOOLEAN" - NIL_OBJ = "NIL" +// interface compliance check +var _ Object = (*Integer)(nil) +var _ Object = (*Boolean)(nil) +var _ Object = (*Nil)(nil) + +type ObjectType string + +var ( + INTEGER_OBJ = ObjectType("INTEGER") + BOOLEAN_OBJ = ObjectType("BOOLEAN") + NIL_OBJ = ObjectType("NIL") ) // boolean literal objects @@ -15,13 +22,6 @@ var ( NIL = NewNil() ) -// interface compliance check -var _ Object = (*Integer)(nil) -var _ Object = (*Boolean)(nil) -var _ Object = (*Nil)(nil) - -type ObjectType string - type Object interface { Type() ObjectType Inspect() string @@ -70,7 +70,7 @@ func (b *Boolean) Inspect() string { } func (b *Boolean) IsTruthy() bool { - return b.Value == true + return b.Value } // Nil represents the absence of any value diff --git a/internal/object/object_test.go b/internal/object/object_test.go index 1f21d7c..b81c494 100644 --- a/internal/object/object_test.go +++ b/internal/object/object_test.go @@ -2,9 +2,79 @@ package object_test import ( . "github.com/onsi/ginkgo/v2" - _ "github.com/onsi/gomega" + . "github.com/onsi/gomega" + + "github.com/aden-q/monkey/internal/object" ) var _ = Describe("Object", func() { + Describe("Integer", func() { + Context("integer object", func() { + It("truthy integer object", func() { + var val int64 = 5 + + expectedIntegerObj := &object.Integer{ + Value: val, + } + obj := object.NewInteger(val) + + Expect(obj).To(Equal(expectedIntegerObj)) + Expect(obj.Inspect()).To(Equal("5")) + Expect(obj.Type()).To(Equal(object.INTEGER_OBJ)) + Expect(obj.IsTruthy()).To(Equal(true)) + }) + + It("false integer object", func() { + var val int64 = 0 + + expectedIntegerObj := &object.Integer{ + Value: val, + } + obj := object.NewInteger(val) + + Expect(obj).To(Equal(expectedIntegerObj)) + Expect(obj.Inspect()).To(Equal("0")) + Expect(obj.Type()).To(Equal(object.INTEGER_OBJ)) + Expect(obj.IsTruthy()).To(Equal(false)) + }) + }) + }) + + Describe("Boolean", func() { + It("truthy boolean object", func() { + var val bool = true + + expectedBooleanObj := object.TRUE + obj := object.NewBoolean(val) + + Expect(obj).To(Equal(expectedBooleanObj)) + Expect(obj.Inspect()).To(Equal("true")) + Expect(obj.Type()).To(Equal(object.BOOLEAN_OBJ)) + Expect(obj.IsTruthy()).To(Equal(true)) + }) + + It("false boolean object", func() { + var val bool = false + + expectedBooleanObj := object.FALSE + obj := object.NewBoolean(val) + + Expect(obj).To(Equal(expectedBooleanObj)) + Expect(obj.Inspect()).To(Equal("false")) + Expect(obj.Type()).To(Equal(object.BOOLEAN_OBJ)) + Expect(obj.IsTruthy()).To(Equal(false)) + }) + }) + + Describe("Boolean", func() { + It("false nil object", func() { + expectedNilObj := object.NIL + obj := object.NewNil() + Expect(obj).To(Equal(expectedNilObj)) + Expect(obj.Inspect()).To(Equal("nil")) + Expect(obj.Type()).To(Equal(object.NIL_OBJ)) + Expect(obj.IsTruthy()).To(Equal(false)) + }) + }) })