82 lines
2 KiB
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")
|
|
}
|