public void ShouldCancelCountAt5()
        {
            const int expected      = 10;
            var       countUpdated  = new AutoResetEvent(false);
            var       countCanceled = new AutoResetEvent(false);
            var       tracking      = new MemoryTrackingParticipant();
            var       target        = CountModelFactory.CreateModel(tracking);

            target.CountUpdated = i =>
            {
                if (i == 5)
                {
                    countUpdated.Set();
                }
            };

            target.CountCanceled = () => countCanceled.Set();

            try
            {
                target.StartCounting(expected);

                // Wait for the first update
                Assert.IsTrue(countUpdated.WaitOne(TestTimeout));
                target.CancelCounting();

                // Wait for the cancel
                Assert.IsTrue(countCanceled.WaitOne(TestTimeout));
            }
            finally
            {
                tracking.Trace();
            }
        }
        public void WhenCountIsCanceledNoCompleteEventShouldBeRaised()
        {
            var countUpdated  = new AutoResetEvent(false);
            var countCanceled = new AutoResetEvent(false);

            const int expected = 10;
            var       tracking = new MemoryTrackingParticipant();
            var       target   = CountModelFactory.CreateModel(tracking);

            // Trigger the sync event on the first count
            target.CountUpdated = i => countUpdated.Set();

            target.CountCanceled  = () => countCanceled.Set();
            target.CountCompleted = () => countCanceled.Set();

            try
            {
                target.StartCounting(expected);

                // Wait for the first update
                Assert.IsTrue(countUpdated.WaitOne(TestTimeout));
                target.CancelCounting();

                // Wait for the cancel
                Assert.IsTrue(countCanceled.WaitOne(TestTimeout));
            }
            finally
            {
                tracking.Trace();
            }
        }
        public void ShouldUseDelayWhenCounting()
        {
            const int expected       = 5;
            var       countCompleted = new AutoResetEvent(false);
            var       tracking       = new MemoryTrackingParticipant();

            var target = CountModelFactory.CreateModel(tracking);

            target.CountCompleted = () => countCompleted.Set();

            try
            {
                var start = DateTime.Now;
                target.StartCounting(expected, 10);
                Assert.IsTrue(countCompleted.WaitOne(TestTimeout));

                var stop = DateTime.Now;

                // Should be at least 50msecs
                Assert.IsTrue(stop.Subtract(start).Milliseconds >= 50);
            }
            finally
            {
                tracking.Trace();
            }
        }
        public void ShouldRaiseCompleteEvent()
        {
            var tracking       = new MemoryTrackingParticipant();
            var target         = CountModelFactory.CreateModel(tracking);
            var countCompleted = new AutoResetEvent(false);

            target.CountCompleted = () => countCompleted.Set();

            try
            {
                target.StartCounting(1);
                Assert.IsTrue(countCompleted.WaitOne(TestTimeout));
            }
            finally
            {
                tracking.Trace();
            }
        }
        public void ShouldCountTo10()
        {
            var       actual   = -1;
            const int expected = 10;
            var       tracking = new MemoryTrackingParticipant();
            var       target   = CountModelFactory.CreateModel(tracking);

            var countCompleted = new AutoResetEvent(false);

            target.CountCompleted = () => countCompleted.Set();
            target.CountUpdated   = i => actual = i;

            try
            {
                target.StartCounting(expected);
                Assert.IsTrue(countCompleted.WaitOne(TestTimeout));
                Assert.AreEqual(expected, actual);
            }
            finally
            {
                tracking.Trace();
            }
        }