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 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 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 NotifyUpdatedShouldNotify()
        {
            var       model          = CountModelFactory.CreateModel();
            var       updateNotified = false;
            var       actual         = 0;
            const int expected       = 32;

            // The delegate will be invoked with the count
            model.CountUpdated = i =>
            {
                updateNotified = true;
                actual         = i;
            };

            var invoker = new WorkflowInvoker(
                new NotifyCountUpdated
            {
                CurrentCount = expected
            });

            invoker.Extensions.Add(model);

            invoker.Invoke();

            Assert.IsTrue(updateNotified);
            Assert.AreEqual(expected, actual);
        }
        public void NotifyCompletedWithNoDelegateShouldDoNothing()
        {
            var model   = CountModelFactory.CreateModel();
            var invoker = new WorkflowInvoker(new NotifyCountCompleted());

            invoker.Extensions.Add(model);

            invoker.Invoke();
            // No exception is success
        }
        public void NotifyStartedShouldNotify()
        {
            var model         = CountModelFactory.CreateModel();
            var startNotified = false;

            model.CountStarted = () => startNotified = true;
            var invoker = new WorkflowInvoker(new NotifyCountStarted());

            invoker.Extensions.Add(model);

            invoker.Invoke();

            Assert.IsTrue(startNotified);
        }
        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();
            }
        }