Files
aego/scene/propref/resolve_alloc_test.go
sanspie 5eb1832907
ci-platforms / darwin amd64 smoke (push) Skipped
ci / build (amd64, linux, ubuntu-24.04) (push) Failing after 15m28s
ci / release (push) Skipped
ci-platforms / windows amd64 smoke (push) Skipped
ci-platforms / darwin arm64 smoke (push) Skipped
ci / checks (push) Successful in 7m47s
Complete Stage 12 for v0.12.0
2026-11-05 11:46:53 +03:00

87 lines
2.4 KiB
Go

package propref
import (
"strings"
"testing"
"aego/core/mathx"
"aego/scene"
"aego/schema"
)
type laneProbe struct {
Tint mathx.Color `aego:"tint"`
}
type qualifiedLaneProbe struct {
Alpha float32 `aego:"a"`
}
func laneScene(t *testing.T, qualified bool) (*scene.Scene, scene.NodeHandle, *Resolver) {
t.Helper()
types := scene.NewTypes(schema.NewRegistry())
if err := scene.RegisterComponent[laneProbe](types, schema.Name("test.Probe")); err != nil {
t.Fatal(err)
}
if qualified {
if err := scene.RegisterComponent[qualifiedLaneProbe](types, schema.Name("test.Probe.tint")); err != nil {
t.Fatal(err)
}
}
if err := types.Schema().Freeze(); err != nil {
t.Fatal(err)
}
s := scene.New(types, nil, scene.Options{})
h := s.Create(s.Root(), "probe")
scene.Add[laneProbe](s, h).Tint = mathx.Color{A: 0.25}
if qualified {
scene.Add[qualifiedLaneProbe](s, h).Alpha = 0.75
}
s.Flush()
return s, h, New(s, nil)
}
func TestResolveVectorLaneDoesNotAllocateSpeculativeDiagnostics(t *testing.T) {
_, h, r := laneScene(t, false)
for _, path := range []string{"Probe.tint.a", "test.Probe.tint.a", "transform.position.x"} {
t.Run(path, func(t *testing.T) {
for _, discrete := range []bool{false, true} {
ref, err := r.resolve(h, path, discrete)
if err != nil || ref.Lane() < 0 {
t.Fatalf("resolve lane: ref=%+v err=%v", ref, err)
}
if n := testing.AllocsPerRun(100, func() {
resolved, err := r.resolve(h, path, discrete)
if err != nil || !resolved.Same(&ref) {
t.Fatalf("rebind: ref=%+v err=%v", resolved, err)
}
}); n != 0 {
t.Fatalf("successful lane binding allocated %g diagnostics per resolution", n)
}
}
})
}
}
func TestResolveQualifiedComponentPrecedesLane(t *testing.T) {
_, h, r := laneScene(t, true)
ref, err := r.ResolveAny(h, "test.Probe.tint.a")
if err != nil {
t.Fatal(err)
}
value, ok := r.Read(&ref, h)
if !ok || ref.Lane() != -1 || value[0] != 0.75 {
t.Fatalf("qualified scalar field must precede Probe.tint alpha lane: ref=%+v value=%v ok=%v", ref, value, ok)
}
}
func TestResolveInvalidLaneStillExplainsFailure(t *testing.T) {
_, h, r := laneScene(t, false)
for _, path := range []string{"Missing.tint.a", "Probe.missing.a", "transform.position.w"} {
_, err := r.ResolveAny(h, path)
if err == nil || !strings.Contains(err.Error(), path) {
t.Fatalf("invalid property %q lost its diagnostic: %v", path, err)
}
}
}