public void SimpleStartToEndScenarioTest()
        {

            // Setup Fakes

            var fakeRtEvents = new FakeRTEvents();
            var fakeDecalEvents = new FakeDecalEventsProxy();

            Queue<Location> locationResults = new Queue<Location>();
            locationResults.Enqueue(new Location(0, 0, 1, 0, 0));
            locationResults.Enqueue(new Location(0, 0, 2, 0, 0));
            locationResults.Enqueue(new Location(0, 0, 3, 0, 0));
            locationResults.Enqueue(new Location(0, 0, 4, 0, 0));

            for (int i = 0; i < JumpRecorder.NumberOfConsecutiveZCoordsSameToSingleLand; i++)
            {
                locationResults.Enqueue(new Location(0, 0, 5, 0, 0));
            }

            List<SelfJumpCompleteEventArgs> cachedCompleteCallValues = new List<SelfJumpCompleteEventArgs>();

            // Workflow to Test

            JumpRecorder recorder = new JumpRecorder(fakeRtEvents, fakeDecalEvents, e => cachedCompleteCallValues.Add(e), () => locationResults.Dequeue());

            var initialJumpData = new JumpData(new Location(0, 0, 0, 0, 0), 0.0, 0.0);

            Assert.IsFalse(recorder.IsRecording);

            fakeRtEvents.FireSelfJump(new JumpEventArgs(0, initialJumpData, 0, 0));

            Assert.IsTrue(recorder.IsRecording);

            fakeDecalEvents.FireRenderFrame(new EventArgs());
            fakeDecalEvents.FireRenderFrame(new EventArgs());
            fakeDecalEvents.FireRenderFrame(new EventArgs());

            // We should not have landed yet
            Assert.IsTrue(recorder.IsRecording);
            Assert.AreEqual(0, cachedCompleteCallValues.Count);

            fakeDecalEvents.FireRenderFrame(new EventArgs());

            for (int i = 0; i < JumpRecorder.NumberOfConsecutiveZCoordsSameToSingleLand; i++)
            {
                fakeDecalEvents.FireRenderFrame(new EventArgs());
            }

            // Now we should have landed
            Assert.IsFalse(recorder.IsRecording);
            Assert.AreEqual(1, cachedCompleteCallValues.Count);

            Assert.AreEqual(initialJumpData, cachedCompleteCallValues[0].JumpData);

            Assert.AreEqual(4 + JumpRecorder.NumberOfConsecutiveZCoordsSameToSingleLand, cachedCompleteCallValues[0].Trajectory);
            Assert.AreEqual(1, cachedCompleteCallValues[0].Trajectory[0].Z);
            Assert.AreEqual(5, cachedCompleteCallValues[0].Trajectory.Last().Z);

            Assert.AreEqual(5, cachedCompleteCallValues[0].LandingLocation.Z);
        }
        public REEvents(IDecalEventsProxy decalEventsProxy, IFellowshipEventsDisposable fellowshipEvents)
        {
            this._decalEventsProxy = decalEventsProxy;
            this._fellowshipEvents = fellowshipEvents;

            this._decalEventsProxy.StatusTextIntercept += DecalEventsProxy_StatusTextIntercept;
            this._decalEventsProxy.ChangePortalMode += DecalEventsProxy_ChangePortalMode;
            this._decalEventsProxy.RenderFrame += DecalEventsProxy_RenderFrame;
            this._decalEventsProxy.ChatBoxMessage += _decalEventsProxy_ChatBoxMessage;
            this._decalEventsProxy.StatusMessage += _decalEventsProxy_StatusMessage;

            this._decalEventsProxy.ServerDispatch += _decalEventsProxy_ServerDispatch;

            this._jumpRecorder = new JumpRecorder(this, this._decalEventsProxy, this.FireSelfJumpCompleted);
        }