public void ShouldThrowExceptionAboutEndingOfThreadWorking()
        {
            threadPool = new MyThreadPool.ThreadPool(2);
            var task = threadPool.AddTask(() => 5);

            threadPool.Shutdown();
            var taskAfterShutDown = threadPool.AddTask(() => 5);
        }
        public void CanSolveManyTaskFastBy75ThreadsAndFinellyGetAllResult()
        {
            var numberOfTasksSoMuch = 500;

            threadPool = new MyThreadPool.ThreadPool(75);
            var tasks = new IMyTask <int> [numberOfTasksSoMuch];

            for (int i = 0; i < tasks.Length - 10; i++)
            {
                tasks[i] = threadPool.AddTask(() =>
                {
                    Thread.Sleep(500);
                    return(5);
                });
            }
            for (int i = 0; i < 10; i++)
            {
                tasks[numberOfTasksSoMuch - 10 + i] = tasks[i].ContinueWith(x => x + x);
            }

            int result = 0;

            for (int i = 0; i < tasks.Length; i++)
            {
                result += tasks[i].Result;
            }

            Assert.AreEqual(2550, result);
        }
        public void CanSolveTask()
        {
            threadPool = new MyThreadPool.ThreadPool(4);
            var task = threadPool.AddTask(() => 5);

            Assert.AreEqual(5, task.Result);
        }
        public void TaskCompleteddAndCouldBeContinue()
        {
            threadPool = new MyThreadPool.ThreadPool(4);
            var task = threadPool.AddTask(() => 5);

            Assert.AreEqual(25, task.ContinueWith(result => result * result).Result);
        }
        public void ContinueWithSecondCallAfterOtherMethodWithContinueShouldNice()
        {
            threadPool = new MyThreadPool.ThreadPool(4);
            var task    = threadPool.AddTask(() => 3);
            var newTask = task.ContinueWith(x => x + 5);

            Assert.AreEqual(8, newTask.Result);
        }
        public void PropertyIsCompletedOfTaskShouldBeCorrect()
        {
            threadPool = new MyThreadPool.ThreadPool(4);
            var task = threadPool.AddTask(() => 5);

            var waitResult = task.Result;

            Assert.AreEqual(true, task.IsCompleted);
        }
        public void ConstructorOfThreadPoolCompletedBeforeAddTask()
        {
            var numberThreads = 100;

            threadPool = new MyThreadPool.ThreadPool(numberThreads);
            Thread.Sleep(200);
            var temp = threadPool.AddTask(() => 5);

            Assert.AreEqual(numberThreads, threadPool.CountAliveThread());
        }
        public void CanSolveTaskByOneThread()
        {
            threadPool = new MyThreadPool.ThreadPool(1);
            var task = threadPool.AddTask(() =>
            {
                Thread.Sleep(250);
                return(5);
            });

            Assert.AreEqual(5, task.Result);
        }
        public void ShouldThrowExceptionDuringTaskPerform()
        {
            Func <int> func = () =>
            {
                throw new Exception();
            };

            threadPool = new MyThreadPool.ThreadPool(1);
            var task = threadPool.AddTask(func);

            var shouldBeException = task.Result;
        }
        public void ShouldWaitingToCompletedTaskAndGetResult()
        {
            threadPool = new MyThreadPool.ThreadPool(4);
            var task = threadPool.AddTask(() =>
            {
                Thread.Sleep(5000);
                return(5);
            });
            var result = task.Result;

            Assert.AreEqual(5, result);
        }
        public void ContinueWithTakeResultPreviouseTaskWhichSleep()
        {
            threadPool = new MyThreadPool.ThreadPool(4);
            var taskWhichWillContinue = threadPool.AddTask(() =>
            {
                Thread.Sleep(4000);
                return(10);
            });
            var res = taskWhichWillContinue.ContinueWith(result => result + result);

            Assert.AreEqual(20, res.Result);
        }
        public void ContinueWithDontBlockThreadWhichCalledContinueWith_TwoThreads()
        {
            Stopwatch stopwatch = Stopwatch.StartNew();

            threadPool = new MyThreadPool.ThreadPool(2);
            var task = threadPool.AddTask(() =>
            {
                Thread.Sleep(3500);
                return(5);
            });

            var newTask = task.ContinueWith(x => x + 5);

            var taskAfterContinueUnstopableTask = threadPool.AddTask(() => 5);
            var waitingResultOfLastTask         = taskAfterContinueUnstopableTask.Result;

            stopwatch.Stop();
            if (stopwatch.ElapsedMilliseconds > 3300)
            {
                Assert.Fail();
            }
        }
        public void ContinueWithSeveralTime_FromContinueWith_FromContWith_E_T_C()
        {
            threadPool = new MyThreadPool.ThreadPool(4);
            var t1 = threadPool.AddTask(() =>
            {
                return(2);
            });
            var t2     = t1.ContinueWith(res => res * res);
            var t3     = t2.ContinueWith(res => res * res);
            var t4     = t3.ContinueWith(res => res * res);
            var res_t4 = t4.Result;

            Assert.AreEqual(256, res_t4);
        }
        public void PropertyResultShouldWait()
        {
            threadPool = new MyThreadPool.ThreadPool(4);
            var task = threadPool.AddTask(() =>
            {
                long result = 1;
                for (long i = 0; i < 1000000; i++)
                {
                    result += i;
                }
                return(10);
            });

            Assert.AreEqual(10, task.Result);
        }
        public void ContinueWithSeveralTimeWithWaitingInCalc_FromContinueWith_FromContWith_E_T_C()
        {
            threadPool = new MyThreadPool.ThreadPool(10);
            var t1 = threadPool.AddTask(() =>
            {
                Thread.Sleep(1000);
                return(2);
            });
            var t2     = t1.ContinueWith(res => { Thread.Sleep(1000); return(res * res); });
            var t3     = t2.ContinueWith(res => { Thread.Sleep(1000); return(res * res); });
            var t4     = t3.ContinueWith(res => { Thread.Sleep(1000); return(res * res); });
            var res_t4 = t4.Result;

            Assert.AreEqual(256, res_t4);
        }
        public void TaskOfContinueWithAfterShutDownShouldThrowException()
        {
            threadPool = new MyThreadPool.ThreadPool(4);
            var taskWhichWillContinue = threadPool.AddTask(() =>
            {
                var temp   = 1;
                var result = 0;
                for (int i = 0; i < 1000; i++)
                {
                    temp   += i;
                    result += i;
                }
                return(result);
            });

            threadPool.Shutdown();
            var res = taskWhichWillContinue.ContinueWith(result => result + result);
        }
        public void ContinueWithTakeResultPreviouseLongTask()
        {
            threadPool = new MyThreadPool.ThreadPool(4);
            var taskWhichWillContinue = threadPool.AddTask(() =>
            {
                var temp   = 1;
                var result = 0;
                for (int i = 0; i < 1000; i++)
                {
                    temp   += i;
                    result += i;
                }
                return(result);
            });
            var res = taskWhichWillContinue.ContinueWith(result => result + result);

            Assert.AreEqual(999000, res.Result);
        }
        public void NumberOfTaskMoreThatThreadsAndTheyWillCompleteAndGetResult()
        {
            var numberTasks = 5;
            var tasks       = new IMyTask <int> [10];

            threadPool = new MyThreadPool.ThreadPool(4);
            for (int i = 0; i < numberTasks; i++)
            {
                tasks[i] = threadPool.AddTask(() =>
                {
                    Thread.Sleep(1500);
                    return(5);
                });
            }
            for (int i = 0; i < numberTasks; i++)
            {
                Assert.AreEqual(5, tasks[i].Result);
            }
        }
        public void CanSolveTasksByOneThread()
        {
            threadPool = new MyThreadPool.ThreadPool(1);
            var tasks = new IMyTask <int> [10];

            for (int i = 0; i < 10; i++)
            {
                tasks[i] = threadPool.AddTask(() =>
                {
                    Thread.Sleep(250);
                    return(5);
                });
            }

            var result = 0;

            for (int i = 0; i < 10; i++)
            {
                result += tasks[i].Result;
            }
            Assert.AreEqual(50, result);
        }