public void Waith50millisec_UpdateAfter300Millisec_TotalWaitingIsApprox800Millisec()
        {
            var spin    = new UpdateableSpin();
            var watcher = new Stopwatch();

            watcher.Start();

            const int timeOut          = 500;
            const int spanBeforeUpdate = 300;

            Task.Factory.StartNew(() =>
            {
                Thread.Sleep(spanBeforeUpdate);
                spin.UpdateTimeOut();
            });

            spin.Wait(TimeSpan.FromMilliseconds(timeOut));

            watcher.Stop();

            TimeSpan  actual   = TimeSpan.FromMilliseconds(watcher.ElapsedMilliseconds);
            const int expected = timeOut + spanBeforeUpdate;

            TimeSpan left  = TimeSpan.FromMilliseconds(expected - expected * 0.1);
            TimeSpan right = TimeSpan.FromMilliseconds(expected + expected * 0.1);

            Assert.IsTrue(actual > left && actual < right);
        }
        public void Wait_NoPulse_ReturnsFalse()
        {
            var  spin      = new UpdateableSpin();
            bool wasPulsed = spin.Wait(TimeSpan.FromMilliseconds(10));

            Assert.IsFalse(wasPulsed);
        }
        public void Wait_Pulse_ReturnsTrue()
        {
            UpdateableSpin spin = new UpdateableSpin();

            Task.Factory.StartNew(() =>
            {
                Thread.Sleep(100);
                spin.Set();
            });
            bool wasPulsed = spin.Wait(TimeSpan.FromSeconds(10));

            Assert.IsTrue(wasPulsed);
        }
        public void Wait50Millisec_CallIsActuallyWaitingFor50Millisec()
        {
            var spin = new UpdateableSpin();

            Stopwatch watcher = new Stopwatch();

            watcher.Start();

            spin.Wait(TimeSpan.FromMilliseconds(50));

            watcher.Stop();

            TimeSpan actual       = TimeSpan.FromMilliseconds(watcher.ElapsedMilliseconds);
            TimeSpan lefEpsilon   = TimeSpan.FromMilliseconds(50 - 50 * 0.1);
            TimeSpan rightEpsilon = TimeSpan.FromMilliseconds(50 + 50 * 0.1);

            Assert.IsTrue(actual > lefEpsilon && actual < rightEpsilon);
        }