public void CoroutineThreadIntShouldBePossibleToPauseAndRestart()
        {
            // ReSharper disable once ConvertToConstant.Local
            int hundred = 100;
            var ft      = new CoroutineThread(1);
            var first   = new WaitCoroutine(hundred);
            var second  = new WaitCoroutine(200);

            ft.AddCoroutine(first, second);
            ft.Start();
            Thread.Sleep(1000);
            ft.Pause();
            Thread.Sleep(300);
            var firstCycles  = first.Cycles;
            var secondCycles = second.Cycles;

            Assert.AreEqual(ft.Status, CoroutineThreadStatus.Paused);
            Thread.Sleep(1500);
            Assert.AreEqual(firstCycles, first.Cycles);
            Assert.AreEqual(secondCycles, second.Cycles);
            ft.Start();
            Thread.Sleep(300);
            Assert.AreEqual(CoroutineThreadStatus.Running, ft.Status);
            ft.Stop();
            Thread.Sleep(300);
            Assert.AreEqual(CoroutineThreadStatus.Stopped, ft.Status);

            Assert.IsTrue(firstCycles <= first.Cycles);
            Assert.IsTrue(secondCycles <= second.Cycles);
        }
        public void ShouldBeExecutedTheRightNumberOfCyclesDefaultThreads()
        {
            var threadContainer = new CoroutineThread(100);

            threadContainer.Start();
            _reset = new ManualResetEvent(false);
            // ReSharper disable once ConvertToConstant.Local
            int hundred = 100;

            var first = new WaitCoroutine(hundred)
            {
                Thread = threadContainer
            };
            var second = new WaitCoroutine(200)
            {
                Thread = threadContainer
            };
            var firstt  = new Thread(ExecuteTimerCoroutine);
            var secondt = new Thread(ExecuteTimerCoroutine);

            firstt.Start(first);
            secondt.Start(second);
            _reset.Set();
            Thread.Sleep(1000);
            threadContainer.Stop();
            Thread.Sleep(300);
            Assert.IsTrue((first.Cycles + second.Cycles) < 100);
            Console.WriteLine("First: " + first.Cycles);
            Console.WriteLine("Second: " + second.Cycles);
        }
        public void CoroutineThreadIntShouldBeExecutedTheRightNumberOfCyclesByHundredsOfThings()
        {
            // ReSharper disable once ConvertToConstant.Local
            int cycleLength     = 100;
            int coroutinesCount = 30;
            int runningTimeMs   = 1000;
            var ft = new CoroutineThread(1);
            var fl = new List <WaitCoroutine>();

            for (int i = 0; i < coroutinesCount; i++)
            {
                var fb = new WaitCoroutine(cycleLength);
                fl.Add(fb);
                ft.AddCoroutine(fb);
            }

            ft.Start();
            Thread.Sleep(1000 + 100);
            ft.Stop();
            Thread.Sleep(300);
            var total = 0;

            foreach (var fb in fl)
            {
                total += fb.Cycles;
                Console.WriteLine("Result: " + fb.Cycles);
            }
            Console.WriteLine("Total: " + total);
            Assert.IsTrue(total > 100, "Executed " + total);
        }
        public void CoroutineIntItShouldBePossibleToDoOneLevelNesting()
        {
            var ft = new CoroutineThread(1);
            var co = new SingleNestedCoroutine();

            ft.AddCoroutine(co);
            ft.Start();
            Thread.Sleep(100);
            Assert.IsTrue(co.RunFinished);
            Assert.IsTrue(co.FirstCallFinished);
            ft.Stop();
        }
        public void CoroutineIntShouldCallTheCoroutine()
        {
            // ReSharper disable once ConvertToConstant.Local
            int hundred = 100;
            var ft      = new CoroutineThread(1);
            var co      = new CoroutineCallingLocal();

            ft.AddCoroutine(co);
            ft.Start();
            Thread.Sleep(100);
            ft.Stop();
            Thread.Sleep(300);
            Assert.IsTrue(co.LocalCalled);
            Assert.IsTrue(co.LocalSetted);
        }
        public void CoroutineThreadIntShouldBeExecutedTheRightNumberOfCycles()
        {
            var ft     = new CoroutineThread(1);
            var first  = new WaitCoroutine(100);
            var second = new WaitCoroutine(200);

            ft.AddCoroutine(first, second);
            ft.Start();
            Thread.Sleep(1100);
            ft.Stop();
            Thread.Sleep(300);
            Assert.IsTrue((first.Cycles + second.Cycles) >= 13, "Cycles were " + (first.Cycles + second.Cycles));
            Console.WriteLine("First: " + first.Cycles);
            Console.WriteLine("Second: " + second.Cycles);
        }
        public void CoroutineIntShouldCallTheCoroutineWaitingForIt()
        {
            // ReSharper disable once ConvertToConstant.Local
            int hundred = 100;
            var ft      = new CoroutineThread(1);
            var co      = new LocalCoroutineWithWait();

            ft.AddCoroutine(co);
            ft.Start();
            Thread.Sleep(1000);
            ft.Stop();
            Thread.Sleep(300);
            Assert.IsTrue(co.LocalCalled);
            Assert.IsTrue(co.LocalSetted);
            Assert.AreEqual(0, co.Counter);
        }
        public void CoroutineIntShouldCallTheCoroutineWithData()
        {
            // ReSharper disable once ConvertToConstant.Local
            int hundred = 100;
            var data    = new Exception();
            var ft      = new CoroutineThread(1);
            var co      = new LocalCoroutineWithData(data);

            ft.AddCoroutine(co);
            ft.Start();
            Thread.Sleep(1000);
            ft.Stop();
            Thread.Sleep(300);
            Assert.IsTrue(co.LocalCalled);
            Assert.IsTrue(co.LocalSetted);
            Assert.AreEqual(data, co.Result);
        }
        public void CoroutineThreadIntShouldHandleCorrectlyTheSubroutines()
        {
            // ReSharper disable once ConvertToConstant.Local
            int hundred = 100;
            var ft      = new CoroutineThread(1);
            var first   = new CoroutineWithSub(hundred);
            var second  = new CoroutineWithSub(200);

            ft.AddCoroutine(first);            //, second);
            ft.Start();
            Thread.Sleep(1000);
            ft.Stop();
            Thread.Sleep(300);
            //Assert.AreEqual(15, (int)(first.Cycles + second.Cycles));
            Console.WriteLine("First: " + first.Cycles);
            Console.WriteLine("Second: " + second.Cycles);
        }
        public void ShouldBeExecutedTheRightNumberOfCyclesByHundredsOfThingsDefaultThreads()
        {
            // ReSharper disable once ConvertToConstant.Local
            int hundred = 100;

            _reset = new ManualResetEvent(false);

            var threadContainer = new CoroutineThread(100);

            threadContainer.Start();

            var fl = new List <WaitCoroutine>();

            for (int i = 0; i < MULTIPLE_COUNT; i++)
            {
                var fb = new WaitCoroutine(hundred)
                {
                    Thread = threadContainer
                };
                fl.Add(fb);
                var flt = new Thread(ExecuteTimerCoroutine);
                flt.Start(fb);
            }
            _reset.Set();

            Thread.Sleep(1000);
            threadContainer.Stop();
            Thread.Sleep(300);
            var total = 0;

            foreach (var fb in fl)
            {
                total += fb.Cycles;
                Console.WriteLine("Result: " + fb.Cycles);
            }
            Console.WriteLine("Total: " + total);
            Assert.IsTrue(total < 100);
        }