go-scopes/tests/forge_test.go

82 lines
2 KiB
Go

package scopes_test
import (
tbase "testing"
"git.sr.ht/~cco/go-scopes/common/testing"
"git.sr.ht/~cco/go-scopes/forge"
"git.sr.ht/~cco/go-scopes/forge/builtins"
"git.sr.ht/~cco/go-scopes/forge/rep"
)
var fe = forge.NewFE()
var b = builtins.Get(fe)
type Person struct {
FirstName string `json:"firstname"`
LastName string `json:"lastname"`
}
func TestForge(tb *tbase.T) {
t := testing.SetUp(tb)
t.Run("exec", ExecTest)
t.Run("core", CoreTest)
t.Run("control", ControlTest)
t.Run("rep", RepTest)
t.Run("json", JsonTest)
}
func ExecTest(t *testing.T) {
c1 := fe.Code(4, 2, b.Add)
fe.Call(c1)
t.AssertEqual(fe.Pop(), 6)
}
func CoreTest(t *testing.T) {
sq := fe.Exec(fe.Code(b.Dup, b.Mult), "square", b.Reg).LatestXT()
seven := fe.Exec(fe.Code(7), "seven", b.Reg).LatestXT()
fe.Exec(3, seven, sq, b.Add)
t.AssertEqual(fe.Pop(), 52)
myvar := fe.Exec("myvar", b.Var1).LatestXT()
fe.Exec(5, myvar, b.Put)
fe.Exec(seven, myvar, b.Get, b.Mult)
t.AssertEqual(fe.Pop(), 35)
fe.Exec(9, b.Lit, seven, b.Body, b.Put)
t.AssertEqual(fe.Exec(seven).Pop(), 9)
}
func ControlTest(t *testing.T) {
fac := fe.Exec(fe.Code(
b.Dup, b.Do, fe.Code(
b.Dup, 3, b.LT, b.If, fe.Code(
b.Drop, b.Leave),
1, b.Sub, b.Swap, b.Over, b.Mult, b.Swap, b.Repeat)),
"fac", b.Reg).LatestXT()
t.AssertEqual(fe.Exec(1, fac).Pop(), 1)
t.AssertEqual(fe.Exec(2, fac).Pop(), 2)
t.AssertEqual(fe.Exec(3, fac).Pop(), 6)
t.AssertEqual(fe.Exec(4, fac).Pop(), 24)
}
func RepTest(t *testing.T) {
src := rep.Code(4, 2, "+")
c := src.Compile(fe)
fe.Call(c)
t.AssertEqual(fe.Pop(), 6)
src = rep.Code(rep.Code("dup", "dup", "*", "*"), "'cube'", "reg")
fe.Call(src.Compile(fe))
fe.Call(rep.Code(3, "cube").Compile(fe))
t.AssertEqual(fe.Pop(), 27)
}
func JsonTest(t *testing.T) {
j := `[4, 2, +]`
src := rep.ParseJson(j)
c := src.Compile(fe)
fe.Call(c)
t.AssertEqual(fe.Pop(), 6)
j = `{firstname: John, lastname: Dow}`
prep := rep.ParseJsonTo[Person](j)
person := prep.(*rep.Record).Data().(Person)
t.AssertEqual(person.FirstName, "John")
}