about summary refs log tree commit diff
path: root/pkg/lang/vm/text/compiler_test.go
diff options
context:
space:
mode:
Diffstat (limited to 'pkg/lang/vm/text/compiler_test.go')
-rw-r--r--pkg/lang/vm/text/compiler_test.go166
1 files changed, 82 insertions, 84 deletions
diff --git a/pkg/lang/vm/text/compiler_test.go b/pkg/lang/vm/text/compiler_test.go
index 56b886d..c9e3fa1 100644
--- a/pkg/lang/vm/text/compiler_test.go
+++ b/pkg/lang/vm/text/compiler_test.go
@@ -1,10 +1,8 @@
 package text_test
 
 import (
-	"encoding/binary"
 	"jinx/pkg/lang/vm/code"
 	"jinx/pkg/lang/vm/text"
-	"math"
 	"strings"
 	"testing"
 
@@ -22,13 +20,13 @@ func TestSimple(t *testing.T) {
 	res, err := c.Compile()
 	require.NoError(t, err)
 
-	parts := [][]byte{
-		opBin(code.OpAdd),
-		opBin(code.OpSub),
-		opBin(code.OpRet),
-	}
+	exp := code.NewBuilder()
 
-	require.Equal(t, joinSlices(parts), res.Code())
+	exp.AppendOp(code.OpAdd)
+	exp.AppendOp(code.OpSub)
+	exp.AppendOp(code.OpRet)
+
+	require.Equal(t, exp.Code(), res.Code())
 }
 
 func TestInt(t *testing.T) {
@@ -43,16 +41,16 @@ func TestInt(t *testing.T) {
 	res, err := c.Compile()
 	require.NoError(t, err)
 
-	parts := [][]byte{
-		opBin(code.OpPushInt),
-		uintBin(1),
-		opBin(code.OpPushInt),
-		uintBin(2),
-		opBin(code.OpAdd),
-		opBin(code.OpRet),
-	}
+	exp := code.NewBuilder()
+
+	exp.AppendOp(code.OpPushInt)
+	exp.AppendInt(1)
+	exp.AppendOp(code.OpPushInt)
+	exp.AppendInt(2)
+	exp.AppendOp(code.OpAdd)
+	exp.AppendOp(code.OpRet)
 
-	require.Equal(t, joinSlices(parts), res.Code())
+	require.Equal(t, exp.Code(), res.Code())
 }
 
 func TestFloat(t *testing.T) {
@@ -65,14 +63,14 @@ func TestFloat(t *testing.T) {
 	res, err := c.Compile()
 	require.NoError(t, err)
 
-	parts := [][]byte{
-		opBin(code.OpPushFloat),
-		floatBin(3.1415),
-		opBin(code.OpPushFloat),
-		floatBin(-2.71828),
-	}
+	exp := code.NewBuilder()
+
+	exp.AppendOp(code.OpPushFloat)
+	exp.AppendFloat(3.1415)
+	exp.AppendOp(code.OpPushFloat)
+	exp.AppendFloat(-2.71828)
 
-	require.Equal(t, joinSlices(parts), res.Code())
+	require.Equal(t, exp.Code(), res.Code())
 }
 
 func TestString(t *testing.T) {
@@ -86,15 +84,15 @@ func TestString(t *testing.T) {
 	res, err := c.Compile()
 	require.NoError(t, err)
 
-	parts := [][]byte{
-		opBin(code.OpPushString),
-		stringBin("Hello, "),
-		opBin(code.OpPushString),
-		stringBin("world!"),
-		opBin(code.OpAdd),
-	}
+	exp := code.NewBuilder()
 
-	require.Equal(t, joinSlices(parts), res.Code())
+	exp.AppendOp(code.OpPushString)
+	exp.AppendString("Hello, ")
+	exp.AppendOp(code.OpPushString)
+	exp.AppendString("world!")
+	exp.AppendOp(code.OpAdd)
+
+	require.Equal(t, exp.Code(), res.Code())
 }
 
 func TestLabels(t *testing.T) {
@@ -114,19 +112,19 @@ func TestLabels(t *testing.T) {
 	res, err := c.Compile()
 	require.NoError(t, err)
 
-	parts := [][]byte{
-		opBin(code.OpNop),
-		opBin(code.OpNop),
-		opBin(code.OpNop),
-		opBin(code.OpJmp),
-		uintBin(0),
-		opBin(code.OpJmp),
-		uintBin(1),
-		opBin(code.OpJmp),
-		uintBin(2),
-	}
-
-	require.Equal(t, joinSlices(parts), res.Code())
+	exp := code.NewBuilder()
+
+	exp.AppendOp(code.OpNop)
+	exp.AppendOp(code.OpNop)
+	exp.AppendOp(code.OpNop)
+	exp.AppendOp(code.OpJmp)
+	exp.AppendInt(0)
+	exp.AppendOp(code.OpJmp)
+	exp.AppendInt(1)
+	exp.AppendOp(code.OpJmp)
+	exp.AppendInt(2)
+
+	require.Equal(t, exp.Code(), res.Code())
 }
 
 func TestDebugInfo(t *testing.T) {
@@ -146,46 +144,46 @@ func TestDebugInfo(t *testing.T) {
 	res, err := c.Compile()
 	require.NoError(t, err)
 
-	expected := code.NewDebugInfo("unknown file")
-
-	expected.AppendLine(8, 1)
-	expected.AppendLine(17, 2)
-	expected.AppendLine(18, 4)
-	expected.AppendLine(19, 5)
-	expected.AppendLine(20, 8)
-	expected.AppendLine(21, 9)
+	exp := code.NewDebugInfo("unknown file")
 
-	require.Equal(t, expected, *res.Debug())
-}
+	exp.AppendLine(8, 1)
+	exp.AppendLine(17, 2)
+	exp.AppendLine(18, 4)
+	exp.AppendLine(19, 5)
+	exp.AppendLine(20, 8)
+	exp.AppendLine(21, 9)
 
-func opBin(op code.Op) []byte {
-	return []byte{byte(op)}
+	require.Equal(t, exp, *res.Debug())
 }
 
-func uintBin(x uint64) []byte {
-	res := make([]byte, 8)
-	binary.LittleEndian.PutUint64(res, x)
-	return res
-}
-
-func floatBin(x float64) []byte {
-	res := make([]byte, 8)
-	binary.LittleEndian.PutUint64(res, math.Float64bits(x))
-	return res
-}
-
-func stringBin(x string) []byte {
-	res := []byte(x)
-	res = append(res, 0)
-	return res
-}
-
-func joinSlices[T any](slices [][]T) []T {
-	res := []T{}
-
-	for _, slice := range slices {
-		res = append(res, slice...)
-	}
-
-	return res
-}
+// func opBin(op code.Op) []byte {
+// 	return []byte{byte(op)}
+// }
+
+// func uintBin(x uint64) []byte {
+// 	res := make([]byte, 8)
+// 	binary.LittleEndian.PutUint64(res, x)
+// 	return res
+// }
+
+// func floatBin(x float64) []byte {
+// 	res := make([]byte, 8)
+// 	binary.LittleEndian.PutUint64(res, math.Float64bits(x))
+// 	return res
+// }
+
+// func stringBin(x string) []byte {
+// 	res := []byte(x)
+// 	res = append(res, 0)
+// 	return res
+// }
+
+// func joinSlices[T any](slices [][]T) []T {
+// 	res := []T{}
+
+// 	for _, slice := range slices {
+// 		res = append(res, slice...)
+// 	}
+
+// 	return res
+// }