100 lines
2.1 KiB
Go
100 lines
2.1 KiB
Go
package projectsettings_test
|
|
|
|
import (
|
|
"reflect"
|
|
"testing"
|
|
|
|
"aego/app/edit"
|
|
"aego/core/log"
|
|
"aego/editor/panels/projectsettings"
|
|
"aego/engine/module"
|
|
"aego/project"
|
|
"aego/schema"
|
|
)
|
|
|
|
const section = "engine"
|
|
|
|
type rig struct {
|
|
p *projectsettings.Panel
|
|
sec *module.Section
|
|
}
|
|
|
|
func newRig(t *testing.T) rig {
|
|
t.Helper()
|
|
p, err := project.Create(t.TempDir(), "SettingsUndo", false)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
s, err := edit.Open(p, edit.Config{Headless: true, NoWatch: true, Logger: log.Nop()})
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
t.Cleanup(s.Close)
|
|
s.Step()
|
|
pn, ok := s.App.Workspace().Panel(projectsettings.ID)
|
|
if !ok {
|
|
t.Fatal("no project settings panel")
|
|
}
|
|
sec, ok := s.Host.Sections.Desc(section)
|
|
if !ok || sec.Type == nil {
|
|
t.Fatal("no engine section")
|
|
}
|
|
return rig{p: pn.(*projectsettings.Panel), sec: sec}
|
|
}
|
|
|
|
func (r rig) field() *schema.FieldDescriptor {
|
|
for i := range r.sec.Type.Fields {
|
|
if r.sec.Type.Fields[i].Name == "fixedHz" {
|
|
return &r.sec.Type.Fields[i]
|
|
}
|
|
}
|
|
panic("no fixedHz field")
|
|
}
|
|
|
|
func (r rig) hz() float64 {
|
|
var v schema.Value
|
|
r.field().Get(reflect.ValueOf(r.p.Draft(section)).UnsafePointer(), &v)
|
|
return v.F
|
|
}
|
|
|
|
func (r rig) setHz(hz float64) {
|
|
r.p.Edit(section, func(d any) { r.field().Set(reflect.ValueOf(d).UnsafePointer(), schema.Float64(hz)) })
|
|
}
|
|
|
|
func TestUnsavedOnlyWhenValuesDiffer(t *testing.T) {
|
|
r := newRig(t)
|
|
r.setHz(30)
|
|
if r.p.Title() != "Project Settings *" {
|
|
t.Fatal("a real change is not marked unsaved")
|
|
}
|
|
r.setHz(0)
|
|
if r.p.Title() != "Project Settings" {
|
|
t.Fatal("changing a value back still shows unsaved changes")
|
|
}
|
|
}
|
|
|
|
func TestUndoRedoSettings(t *testing.T) {
|
|
r := newRig(t)
|
|
r.setHz(30)
|
|
r.setHz(120)
|
|
if !r.p.CanUndo() {
|
|
t.Fatal("nothing to undo")
|
|
}
|
|
r.p.Undo()
|
|
if r.hz() != 30 {
|
|
t.Fatalf("undo gave %v, want 30", r.hz())
|
|
}
|
|
r.p.Undo()
|
|
if r.hz() != 0 || r.p.Title() != "Project Settings" {
|
|
t.Fatalf("second undo gave %v, title %q", r.hz(), r.p.Title())
|
|
}
|
|
r.p.Redo()
|
|
if r.hz() != 30 {
|
|
t.Fatalf("redo gave %v, want 30", r.hz())
|
|
}
|
|
r.setHz(60)
|
|
if r.p.CanRedo() {
|
|
t.Fatal("a new change must clear redo")
|
|
}
|
|
}
|