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 (p Person) Compile(f forge.FE) forge.FPtr { return f.Code(p) } func TestForge(tb *tbase.T) { t := testing.SetUp(tb) t.Run("exec", ExecTest) t.Run("core", CoreTest) 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 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) data := prep.(*rep.Record).Data.(*interface{}) person := (*data).(Person) t.AssertEqual(person.FirstName, "John") }