From fa9895221c139ba3313d9bbbbda6b53a1e445870 Mon Sep 17 00:00:00 2001 From: SuuperW Date: Tue, 27 May 2025 19:30:51 -0500 Subject: [PATCH] Add test for respecting ancient interval on save --- .../Movie/ZwinderStateManagerTests.cs | 40 +++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/src/BizHawk.Tests/Client.Common/Movie/ZwinderStateManagerTests.cs b/src/BizHawk.Tests/Client.Common/Movie/ZwinderStateManagerTests.cs index ae8cf927ea..e465b1fdff 100644 --- a/src/BizHawk.Tests/Client.Common/Movie/ZwinderStateManagerTests.cs +++ b/src/BizHawk.Tests/Client.Common/Movie/ZwinderStateManagerTests.cs @@ -645,6 +645,46 @@ namespace BizHawk.Tests.Client.Common.Movie } } + [TestMethod] + public void TestKeepsAtLeastAncientIntervalOnSave() + { + IStatable ss = CreateStateSource(); + // For this test to work, CurrentTargetFrameLength + RecentTargetFrameLength should be larger than AncientInterval. + ZwinderStateManager manager = new ZwinderStateManager(new ZwinderStateManagerSettings + { + CurrentBufferSize = 1, + CurrentTargetFrameLength = 40, + + RecentBufferSize = 1, + RecentTargetFrameLength = 40, + + AncientStateInterval = 10, + }, f => false); + + var ms = new MemoryStream(); + ss.SaveStateBinary(new BinaryWriter(ms)); + manager.Engage(ms.ToArray()); + + // Simulate playing movie. + int endFrame = manager.Settings.AncientStateInterval * 10; + for (int i = 0; i <= endFrame; i++) + manager.Capture(i, ss); + // Simulate save and load + MemoryStream stream = new(); + manager.SaveStateHistory(new(stream)); + stream.Seek(0, SeekOrigin.Begin); + ZwinderStateManager loadedManager = ZwinderStateManager.Create(new(stream), manager.Settings, (f) => false); + // ASSERT: There are no gaps larger than the ancient interval + int lastState = 0; + // minus AncientStateInterval: It will not save the last state due to lack of information regarding future states. So don't test that it is kept. + while (lastState < endFrame - manager.Settings.AncientStateInterval) + { + int nextState = loadedManager.GetStateClosestToFrame(lastState + manager.Settings.AncientStateInterval).Key; + Assert.AreNotEqual(lastState, nextState, "AncientStateInterval was not respected on save."); + lastState = nextState; + } + } + private class StateSource : IStatable { public int Frame { get; set; }