Files

110 lines
2.2 KiB
Go

//go:build aego_editor
package docsview
import (
"strings"
"testing"
"aego/app/playground"
"aego/engine/docs"
)
func newHeadless(t *testing.T) *App {
t.Helper()
a, err := New(Options{Headless: true, FrameTime: 1.0 / 60})
if err != nil {
t.Fatal(err)
}
t.Cleanup(a.Close)
return a
}
func tries(t *testing.T) []docs.Entry {
t.Helper()
p, err := playground.New()
if err != nil {
t.Fatal(err)
}
out := p.TryScenes()
if len(out) < 10 {
t.Fatalf("only %d try scenes; does the module embed res/docs/try?", len(out))
}
return out
}
func errorsOf(a *App) []string {
var out []string
for _, l := range a.lines {
if l.Error {
out = append(out, l.Text)
}
}
a.lines = nil
return out
}
func TestTryScenesRun(t *testing.T) {
a := newHeadless(t)
for _, e := range tries(t) {
if err := a.session.Load([]byte(e.Try), e.TrySelect); err != nil {
t.Fatalf("%s: %v", e.ID, err)
}
if err := a.Step(60); err != nil {
t.Fatalf("%s: %v", e.ID, err)
}
st := a.session.State()
if !st.Running || st.Frames < 30 {
t.Fatalf("%s: %+v", e.ID, st)
}
if len(a.session.Selected()) != 1 {
t.Fatalf("%s: nothing selected", e.ID)
}
for _, msg := range errorsOf(a) {
t.Errorf("%s: %s", e.ID, msg)
}
}
}
func TestEditRestartsUndoReset(t *testing.T) {
a := newHeadless(t)
var body docs.Entry
for _, e := range tries(t) {
if e.ID == "physics.Body2D" {
body = e
}
}
if body.Try == "" {
t.Fatal("physics.Body2D has no try scene")
}
s := a.session
if err := s.Load([]byte(body.Try), body.TrySelect); err != nil {
t.Fatal(err)
}
a.Step(10)
if err := s.Set("physics.BoxCollider2D", "restitution", 0.75); err != nil {
t.Fatal(err)
}
a.Step(2)
if !strings.Contains(string(s.Text()), "restitution=0.75") {
t.Fatalf("the scene text did not follow the edit:\n%s", s.Text())
}
if st := s.State(); st.Restarts != 1 || !st.CanUndo || !st.Running {
t.Fatalf("after edit %+v", st)
}
if err := s.Undo(); err != nil {
t.Fatal(err)
}
a.Step(2)
if strings.Contains(string(s.Text()), "restitution=0.75") {
t.Fatal("undo kept the edit")
}
if err := s.Reset(); err != nil {
t.Fatal(err)
}
a.Step(2)
if st := s.State(); st.CanUndo || st.Restarts != 0 && st.Restarts != 2 {
t.Fatalf("after reset %+v", st)
}
}