88 lines
2.3 KiB
Go
88 lines
2.3 KiB
Go
//go:build aego_editor
|
|
|
|
package mutate_test
|
|
|
|
import (
|
|
"testing"
|
|
"unsafe"
|
|
|
|
"aego/editor/core/history/commands"
|
|
"aego/scene"
|
|
"aego/scene/scriptcomp"
|
|
"aego/schema"
|
|
)
|
|
|
|
func defaults(td *schema.TypeDescriptor) []commands.FieldValue {
|
|
var p unsafe.Pointer
|
|
switch {
|
|
case td.Default != nil:
|
|
p = td.Default()
|
|
case td.New != nil:
|
|
p = td.New()
|
|
default:
|
|
return nil
|
|
}
|
|
out := make([]commands.FieldValue, 0, len(td.Fields))
|
|
for i := range td.Fields {
|
|
var v schema.Value
|
|
td.Fields[i].Get(p, &v)
|
|
out = append(out, commands.FieldValue{Field: td.Fields[i].ID, Value: v})
|
|
}
|
|
return out
|
|
}
|
|
|
|
func freshNode(s *scene.Scene, td *schema.TypeDescriptor) scene.NodeHandle {
|
|
var h scene.NodeHandle
|
|
if td.Space.Allows(scene.Space2D.Kind()) {
|
|
h = s.Create2D(s.Root(), "N")
|
|
} else {
|
|
h = s.Create3D(s.Root(), "N")
|
|
}
|
|
s.Flush()
|
|
return h
|
|
}
|
|
|
|
func TestEveryComponentPassesTheEditorPaths(t *testing.T) {
|
|
e := env(t)
|
|
reg := e.Types.Schema()
|
|
types, fields := 0, 0
|
|
for _, td := range reg.Components() {
|
|
if td.Hidden || td.FullName == "engine.Unknown" || td.ID == scriptcomp.ScriptTypeID {
|
|
continue
|
|
}
|
|
types++
|
|
list := defaults(td)
|
|
s := scene.New(e.Types, nil, scene.Options{})
|
|
h := freshNode(s, td)
|
|
id := s.ID(h)
|
|
if err := commands.NewMutation("Add", commands.EnvFor(s), commands.AddComp(s, id, td, list)).Do(target{s}); err != nil {
|
|
t.Errorf("%s: add-comp: %v", td.FullName, err)
|
|
continue
|
|
}
|
|
scratch := scene.New(e.Types, nil, scene.Options{})
|
|
sh := freshNode(scratch, td)
|
|
if err := commands.NewMutation("", commands.EnvFor(scratch), commands.AddRaw(scratch, scratch.ID(sh), td, list)).Do(target{scratch}); err != nil {
|
|
t.Errorf("%s: raw add-comp: %v", td.FullName, err)
|
|
}
|
|
for i := range td.Fields {
|
|
fd := &td.Fields[i]
|
|
if !fd.Flags.Has(schema.FlagSerialize) || !fd.Flags.Has(schema.FlagEditor) || fd.Flags.Has(schema.FlagReadOnly) {
|
|
continue
|
|
}
|
|
fields++
|
|
cur, err := s.GetProperty(h, td.ID, fd.ID)
|
|
if err != nil {
|
|
t.Errorf("%s.%s: %v", td.FullName, fd.Name, err)
|
|
continue
|
|
}
|
|
if err := commands.SetField(s, id, td, fd, cur, fd.Name).Do(target{s}); err != nil {
|
|
t.Errorf("%s.%s: set: %v", td.FullName, fd.Name, err)
|
|
}
|
|
}
|
|
}
|
|
if types < 10 || fields < 50 {
|
|
t.Fatalf("only %d components and %d fields were checked", types, fields)
|
|
}
|
|
t.Logf("%d components, %d fields", types, fields)
|
|
}
|