diff --git a/tests/AcDream.App.Tests/Rendering/Walk/WalkTraceConformanceTests.cs b/tests/AcDream.App.Tests/Rendering/Walk/WalkTraceConformanceTests.cs index ae4032c0..64e84d10 100644 --- a/tests/AcDream.App.Tests/Rendering/Walk/WalkTraceConformanceTests.cs +++ b/tests/AcDream.App.Tests/Rendering/Walk/WalkTraceConformanceTests.cs @@ -124,12 +124,13 @@ public sealed class WalkTraceConformanceTests $"walk diverged from retail ({fixture})\nEXPECTED: {expected}\nACTUAL: {actual}"); } - [Theory(Skip = "FW1 moving-fixture tail (2026-08-30): the six STILL fixtures are " - + "fully conformant; the moving four diverge only at punch-edge frames " - + "(walkout/transitions F2: retail punches 001e where the replay does " - + "not; walkabout diverges at F9, foundry-entry at F67) - pose-timing/" - + "threshold sensitivity to adjudicate next (the exact pose-application " - + "point within the frame).")] + [Theory(Skip = "FW1 moving tail (2026-08-30 v2): six still fixtures frame-exact; " + + "the moving four diverge at punch-edge frames under BOTH adjacent poses " + + "(walkout/transitions F2 - retail punches 001e from deeper in the " + + "cottage; walkabout F9; foundry-entry F67). FALSIFIED: pose-lag " + + "pairing, gate polarity swaps (raw+flipped-gates broke 3 still " + + "fixtures - reverted). Next: znear (CY d guess 0.1), per-view punch " + + "ordering inside DrawMesh, and exit-view precision at edge angles.")] [InlineData("posed/holtburg-walkout")] [InlineData("posed/holtburg-transitions")] [InlineData("posed/holtburg-walkabout")] @@ -152,29 +153,42 @@ public sealed class WalkTraceConformanceTests for (int n = 1; n < frames.Count - 1; n++) { WalkOracleFrame frame = frames[n]; - WalkOraclePose pose = frames[n + 1].Pose!; - Assert.NotNull(pose); - WalkLandscapeDatBuilder.SetViewer(world.Landscape, pose.CellId, pose.Origin); - var ctx = new WalkTraceReplayContext(pose, world.Cells) - { - Buildings = world.Buildings, - }; - WalkCell? camera = null; - if ((pose.CellId & 0xFFFFu) >= 0x100) - { - Assert.True( - world.Cells.TryGetValue(pose.CellId, out camera), - $"frame {frame.Number}: interior camera cell {pose.CellId:x8} not loaded"); - } - var recorder = new Recorder(); - - walk.WalkFrame(pose.CellId, camera, world.Landscape, ctx, recorder); - string expected = WalkTraceReplayContext.Signature(frame); - string actual = WalkTraceReplayContext.Signature(recorder.Events); + // The marker dumps the PREVIOUS frame's camera, so frame N's + // true camera state lies between pose(N) and pose(N+1) — a + // capture artifact, not a port ambiguity. A frame passes when + // the replay matches under either adjacent pose. + string? firstActual = null; + bool matched = false; + foreach (WalkOraclePose pose in new[] { frames[n + 1].Pose!, frame.Pose! }) + { + Assert.NotNull(pose); + WalkLandscapeDatBuilder.SetViewer(world.Landscape, pose.CellId, pose.Origin); + var ctx = new WalkTraceReplayContext(pose, world.Cells) + { + Buildings = world.Buildings, + }; + WalkCell? camera = null; + if ((pose.CellId & 0xFFFFu) >= 0x100) + { + Assert.True( + world.Cells.TryGetValue(pose.CellId, out camera), + $"frame {frame.Number}: interior camera cell {pose.CellId:x8} not loaded"); + } + var recorder = new Recorder(); + walk.WalkFrame(pose.CellId, camera, world.Landscape, ctx, recorder); + string actual = WalkTraceReplayContext.Signature(recorder.Events); + firstActual ??= actual; + if (actual == expected) + { + matched = true; + break; + } + } Assert.True( - expected == actual, - $"frame {frame.Number} diverged ({fixture})\nEXPECTED: {expected}\nACTUAL: {actual}"); + matched, + $"frame {frame.Number} diverged under both adjacent poses ({fixture})\n" + + $"EXPECTED: {expected}\nACTUAL: {firstActual}"); } }