public void TestFastExitEntryRefusal()
        {
            var timeProvider = new ExternalTimeProvider();
            var detector     = new EntryDetector(Background, timeProvider);
            var enterRaised  = false;
            var exitRaised   = false;

            detector.Enter += (sender, args) => enterRaised = true;
            detector.Exit  += (sender, args) => exitRaised = true;
            detector.Abort += (sender, args) => Assert.Fail("Abort not expected");

            timeProvider.CurrentTime = Year2000;
            detector.Tick(EntryImages);
            Assert.AreEqual(DetectorState.Entry, detector.CurrentState);
            Assert.IsTrue(enterRaised);
            Assert.IsFalse(exitRaised);

            timeProvider.CurrentTime = timeProvider.CurrentTime.AddSeconds(EntryDetector.MinTimeAfterEntry + 1);
            for (var i = 0; i <= EntryDetector.ExitThreshold; i++)
            {
                detector.Tick(EmptyImages);
            }
            Assert.AreEqual(DetectorState.Exit, detector.CurrentState);
            Assert.IsTrue(exitRaised);
            enterRaised = false;

            timeProvider.CurrentTime = timeProvider.CurrentTime.AddSeconds(EntryDetector.MinTimeAfterExit - 1);
            detector.Tick(EntryImages);
            Assert.AreEqual(DetectorState.Exit, detector.CurrentState);
            Assert.IsFalse(enterRaised);
        }
        public void TestFull()
        {
            var timeProvider = new ExternalTimeProvider {
                CurrentTime = Year2000
            };
            var detector = new EntryDetector(Background, timeProvider);

            for (var k = 0; k < 2; k++)
            {
                var enterRaised = false;
                var exitRaised  = false;

                detector.Enter += (sender, args) => enterRaised = true;
                detector.Exit  += (sender, args) => exitRaised = true;
                detector.Abort += (sender, args) => Assert.Fail("Abort not expected");

                // entry
                timeProvider.CurrentTime = timeProvider.CurrentTime.AddSeconds(5);
                detector.Tick(EntryImages);
                Assert.AreEqual(DetectorState.Entry, detector.CurrentState);
                Assert.IsTrue(enterRaised);

                // exit
                timeProvider.CurrentTime = timeProvider.CurrentTime.AddSeconds(5);
                for (var i = 0; i <= EntryDetector.ExitThreshold; i++)
                {
                    detector.Tick(EmptyImages);
                }
                Assert.AreEqual(DetectorState.Exit, detector.CurrentState);
                Assert.IsTrue(exitRaised);
            }
        }
        public void TestStopTooLong()
        {
            var timeProvider = new ExternalTimeProvider();
            var detector     = new EntryDetector(Background, timeProvider);
            var enterRaised  = false;
            var exitRaised   = false;

            detector.Enter += (sender, args) => enterRaised = true;
            detector.Exit  += (sender, args) => exitRaised = true;
            detector.Abort += (sender, args) => Assert.Fail("Abort not expected");

            timeProvider.CurrentTime = Year2000;
            detector.Tick(EntryImages);
            Assert.AreEqual(DetectorState.Entry, detector.CurrentState);
            Assert.IsTrue(enterRaised);
            Assert.IsFalse(exitRaised);

            timeProvider.CurrentTime = timeProvider.CurrentTime.AddSeconds(EntryDetector.MaxRecordingDuration + 1);
            detector.Tick(SlowlyMovingTrain);
            Assert.AreEqual(DetectorState.Exit, detector.CurrentState);
            Assert.IsTrue(exitRaised);
        }