public void StateBeforeFrame()
        {
            var ss = new StateSource {
                PaddingData = new byte[1000]
            };
            var zw = new ZwinderStateManager(new ZwinderStateManagerSettings
            {
                CurrentBufferSize        = 1,
                CurrentTargetFrameLength = 10000,

                RecentBufferSize        = 1,
                RecentTargetFrameLength = 100000,

                AncientStateInterval = 50000
            }, f => false);

            {
                var ms = new MemoryStream();
                ss.SaveStateBinary(new BinaryWriter(ms));
                zw.Engage(ms.ToArray());
            }
            for (int frame = 0; frame <= 10440; frame++)
            {
                ss.Frame = frame;
                zw.Capture(frame, ss);
            }
            var kvp    = zw.GetStateClosestToFrame(10440);
            var actual = StateSource.GetFrameNumberInState(kvp.Value);

            Assert.AreEqual(kvp.Key, actual);
            Assert.IsTrue(actual <= 10440);
        }
        public void StateCache()
        {
            var ss = CreateStateSource();
            var zw = new ZwinderStateManager(new ZwinderStateManagerSettings
            {
                CurrentBufferSize        = 2,
                CurrentTargetFrameLength = 1000,
                RecentBufferSize         = 2,
                RecentTargetFrameLength  = 1000,
                AncientStateInterval     = 100
            }, f => false);

            for (int i = 0; i < 1000; i += 200)
            {
                zw.CaptureReserved(i, ss);
            }

            for (int i = 400; i < 1000; i += 400)
            {
                zw.EvictReserved(i);
            }

            for (int i = 0; i < 10000; i++)
            {
                zw.Capture(i, ss);
            }

            zw.Capture(101, ss);

            var allStates = zw.AllStates()
                            .Select(s => s.Frame)
                            .ToList();

            for (int i = 0; i < 10000; i++)
            {
                var actual   = zw.HasState(i);
                var expected = allStates.Contains(i);
                Assert.AreEqual(expected, actual);
            }
        }