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") }