public void Stop_Should_StopAfterLooping()
        {
            var mockTask  = MockTask.Create();
            int loopCount = 3;

            //todo: fix failed sometimes
            using (var loopTask = new SimpleLoopTask())
            {
                loopTask.LoopSpan            = TimeSpan.FromMilliseconds(50);
                loopTask.LoopAction          = mockTask.MockAction;
                loopTask.AfterExitLoopAction = mockTask.MockStopAction;

                loopTask.Start();
                Task.Delay(TimeSpan.FromMilliseconds(50 + 20)).Wait();

                loopTask.Stop();
                Task.Delay(TimeSpan.FromMilliseconds(50 * 2)).Wait();

                mockTask.StopInvoked.ShouldTrue();
            }

            mockTask.InvokeCount.Log();
            (mockTask.InvokeCount >= 1).ShouldTrue();
            (mockTask.InvokeCount <= 2).ShouldTrue();
            mockTask.StopInvoked.ShouldTrue();
        }
        public void Start_Should_LoopBySpan()
        {
            var mockTask  = MockTask.Create();
            int loopCount = 3;

            using (var loopTask = new SimpleLoopTask())
            {
                loopTask.LoopSpan            = TimeSpan.FromMilliseconds(50);
                loopTask.LoopAction          = mockTask.MockAction;
                loopTask.AfterExitLoopAction = mockTask.MockStopAction;

                loopTask.Start();
                Task.Delay(TimeSpan.FromMilliseconds(50 * loopCount + 20)).Wait();

                mockTask.StopInvoked.ShouldFalse();
            }

            (mockTask.InvokeCount >= 3).ShouldTrue();
            (mockTask.InvokeCount <= 4).ShouldTrue();
            mockTask.StopInvoked.ShouldTrue();
        }