Skip to content

Commit

Permalink
test: add tests for object pkg
Browse files Browse the repository at this point in the history
  • Loading branch information
Aden-Q committed May 8, 2024
1 parent f6f2966 commit 293eee7
Show file tree
Hide file tree
Showing 3 changed files with 92 additions and 22 deletions.
18 changes: 9 additions & 9 deletions internal/evaluator/evaluator.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
24 changes: 12 additions & 12 deletions internal/object/object.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
Expand Down Expand Up @@ -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
Expand Down
72 changes: 71 additions & 1 deletion internal/object/object_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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))
})
})
})

0 comments on commit 293eee7

Please sign in to comment.