acdream/tests/AcDream.App.Tests/UI/UiElementChildOrderTests.cs
Erik 749e8ceeb1 fix(rendering): bound portal resource lifetime
Separate logical ownership, render publication, and GPU retirement across live entities, landblocks, particles, textures, mesh arenas, portal/UI teardown, and per-frame scratch storage. Add bounded DAT/texture caches, upload budgets, three-frame fence retirement, exact-incarnation appearance reconciliation, frame pacing, and extensive lifetime conformance coverage.\n\nThe seven-destination connected route now cuts peak working/private memory roughly in half, returns Caul to 125-153 FPS locally, and produces no WER or AMD reset.\n\nCo-authored-by: OpenAI Codex <codex@openai.com>
2026-07-18 21:35:16 +02:00

67 lines
2.3 KiB
C#

using AcDream.App.UI;
namespace AcDream.App.Tests.UI;
public sealed class UiElementChildOrderTests
{
[Fact]
public void StableTree_ReusesBothTraversalSnapshots()
{
var parent = new TestElement();
parent.AddChild(new TestElement { ZOrder = 2 });
parent.AddChild(new TestElement { ZOrder = 1 });
UiElement[] drawFirst = parent.ChildrenBackToFrontSnapshot();
UiElement[] drawSecond = parent.ChildrenBackToFrontSnapshot();
UiElement[] hitFirst = parent.ChildrenFrontToBackSnapshot();
UiElement[] hitSecond = parent.ChildrenFrontToBackSnapshot();
Assert.Same(drawFirst, drawSecond);
Assert.Same(hitFirst, hitSecond);
Assert.Equal([1, 2], drawFirst.Select(child => child.ZOrder).ToArray());
Assert.Equal([2, 1], hitFirst.Select(child => child.ZOrder).ToArray());
}
[Fact]
public void ChildZOrderChange_InvalidatesBothTraversalSnapshots()
{
var parent = new TestElement();
var first = new TestElement { ZOrder = 1 };
var second = new TestElement { ZOrder = 2 };
parent.AddChild(first);
parent.AddChild(second);
UiElement[] oldDraw = parent.ChildrenBackToFrontSnapshot();
UiElement[] oldHit = parent.ChildrenFrontToBackSnapshot();
first.ZOrder = 3;
UiElement[] newDraw = parent.ChildrenBackToFrontSnapshot();
UiElement[] newHit = parent.ChildrenFrontToBackSnapshot();
Assert.NotSame(oldDraw, newDraw);
Assert.NotSame(oldHit, newHit);
Assert.Same(second, newDraw[0]);
Assert.Same(first, newDraw[1]);
Assert.Same(first, newHit[0]);
Assert.Same(second, newHit[1]);
}
[Fact]
public void MembershipChange_InvalidatesSnapshotsWithoutMutatingPriorWalk()
{
var parent = new TestElement();
var first = new TestElement { ZOrder = 1 };
var second = new TestElement { ZOrder = 2 };
parent.AddChild(first);
UiElement[] prior = parent.ChildrenBackToFrontSnapshot();
parent.AddChild(second);
UiElement[] current = parent.ChildrenBackToFrontSnapshot();
Assert.Single(prior);
Assert.Same(first, prior[0]);
Assert.Equal(2, current.Length);
Assert.NotSame(prior, current);
}
private sealed class TestElement : UiElement;
}