public async Task run_CancelTest()
        {
            FifoTaskQueue queue              = CreateTaskQueue();
            bool          firstTaskFinished  = false;
            bool          secondTaskfinished = false;
            bool          thirdTaskStarted   = false;

            queue.Run(() =>
            {
//                queue.CancelExecution();
                Task.Delay(5000, queue.CancellationToken).Wait();
                firstTaskFinished = true;
            });
            queue.Run((dummyObject) =>
            {
                secondTaskfinished = true;
            }, new object());
            queue.Run((dummyObject) =>
            {
                thirdTaskStarted = false;
            }, new object());
            bool done = await queue.CancelAfter(2000, EXCLUDE_TASK_CLEANUP_AFTER_FINALIZATION);

            Assert.IsTrue(queue.Tasks[0].IsFaulted, "First Task faulted");
            Assert.IsFalse(firstTaskFinished, "First Task's Action not terminated");
            Assert.IsTrue(queue.Tasks[1].IsCanceled, "Second Task Canceled");
            Assert.IsFalse(secondTaskfinished, "Second not finished");
            Assert.IsTrue(queue.Tasks[2].IsCanceled, "third Task Canceled");
            Assert.IsFalse(thirdTaskStarted, "third task not finished");
            queue.Dispose();
        }
        public async Task Run_WithParameters_RunOrderIsSequentialTest()
        {
            FifoTaskQueue queue     = CreateTaskQueue();
            bool          firstRun  = false;
            bool          secondRun = false;
            bool          thirdRun  = false;

            queue.Run((testx) =>
            {
                firstRun = true;
                Assert.IsTrue(firstRun == true && secondRun == false && thirdRun == false);
            }, new object());
            queue.Run((testx) =>
            {
                secondRun = true;
                Assert.IsTrue(firstRun == true && secondRun == true && thirdRun == false);
            }, new Object());
            queue.Run((testx) =>
            {
                thirdRun = true;
                Assert.IsTrue(firstRun == true && secondRun == true && thirdRun == true);
            }, new Object());
            bool done = await queue.ObserveCompletation(EXCLUDE_TASK_CLEANUP_AFTER_FINALIZATION);

            Assert.IsTrue(queue.Tasks[0].IsCompleted, "first task completed");
            Assert.IsTrue(queue.Tasks[1].IsCompleted, "second task completed");
            Assert.IsTrue(queue.Tasks[2].IsCompleted, "third task completed");
            queue.Dispose();
            Assert.IsTrue(queue.Tasks.Count == 0, "All Tasks where disposed!");
        }
        public async Task Run_WithParameters_ShareObject()
        {
            object[]      objectRerenceToShare = new object[3];
            FifoTaskQueue queue = CreateTaskQueue();

            queue.Run((sharedObject) =>
            {
                ((object[])sharedObject)[0] = "a";
                Assert.IsTrue(object.ReferenceEquals(sharedObject, objectRerenceToShare),
                              "object is the same at first iteration");
            }, objectRerenceToShare);
            queue.Run((sharedObject) =>
            {
                ((object[])sharedObject)[1] = "b";
                Assert.IsTrue(object.ReferenceEquals(sharedObject, objectRerenceToShare),
                              "object is the same at second iteration");
            }, objectRerenceToShare);
            queue.Run((sharedObject) =>
            {
                ((object[])sharedObject)[2] = "c";
                Assert.IsTrue(object.ReferenceEquals(sharedObject, objectRerenceToShare),
                              "object is the same at third iteration");
            }, objectRerenceToShare);
            bool done = await queue.ObserveCompletation(EXCLUDE_TASK_CLEANUP_AFTER_FINALIZATION);

            Assert.IsTrue(queue.Tasks[0].IsCompleted, "first task completed");
            Assert.IsTrue(queue.Tasks[1].IsCompleted, "second task completed");
            Assert.IsTrue(queue.Tasks[2].IsCompleted, "third task completed");
            Assert.AreEqual("a b c", String.Join(" ", objectRerenceToShare));
            queue.Dispose();
        }
        public async Task Run_WithParameters_ParametersAreUnmutableTest()
        {
            FifoTaskQueue queue           = CreateTaskQueue();
            int           countIterations = 0;

            queue.Run((parameters) =>
            {
                Task.Delay(1000).Wait();
                countIterations++;
                Assert.AreEqual(1, countIterations);
                Assert.AreEqual(0, parameters);
            }, countIterations);
            queue.Run((parameters) =>
            {
                countIterations++;
                Assert.AreEqual(2, countIterations);
                Assert.AreEqual(0, parameters);
            }, countIterations);
            queue.Run((parameters) =>
            {
                countIterations++;
                Assert.AreEqual(3, countIterations);
                Assert.AreEqual(0, parameters);
            }, countIterations);
            bool done = await queue.ObserveCompletation(EXCLUDE_TASK_CLEANUP_AFTER_FINALIZATION);

            Assert.IsTrue(queue.Tasks[0].IsCompleted, "Task 1 is completed");
            Assert.IsTrue(queue.Tasks[1].IsCompleted, "Task 2 is completed");
            Assert.IsTrue(queue.Tasks[2].IsCompleted, "Task 3 is completed");
            queue.Dispose();
            Assert.IsTrue(queue.Tasks.Count == 0, "All Tasks where disposed!");
        }
        private FifoTaskQueue CreateTaskQueue()
        {
            Mock <ILogger> logger = new Mock <ILogger>();

            logger.Setup(p => p.Info(It.IsAny <string>()));
            logger.Setup(p => p.Debug(It.IsAny <string>()));
            logger.Setup(p => p.Warn(It.IsAny <string>()));
            logger.Setup(p => p.Error(It.IsAny <string>()));
            return(FifoTaskQueue.Create(TaskShedulerWraper.Create().FromCurrentWorker(),
                                        TasksProvider.Create(new List <Task>(), logger.Object), logger.Object));
        }
        public async Task AllTaskRemovedAfterCompletationOfEachObservationTest()
        {
            FifoTaskQueue queue = CreateTaskQueue();

            queue.Run(() => { });
            queue.Run(() => { });
            queue.Run(() => { });
            bool done = await queue.ObserveCompletation();

            Assert.IsTrue(queue.Tasks.Count() == 0);
            queue.Dispose();
        }
        public async Task ClearUp_Tasks_TasksFinishedTest()
        {
            FifoTaskQueue queue = CreateTaskQueue();

            queue.Run(() => { });
            queue.Run(() => { });
            queue.Run(() => { });
            bool done = await queue.ObserveCompletation(EXCLUDE_TASK_CLEANUP_AFTER_FINALIZATION);

            Assert.IsTrue(queue.Tasks[0].IsCompleted == true &&
                          queue.Tasks[1].IsCompleted == true &&
                          queue.Tasks[2].IsCompleted == true);
            queue.ClearUpTasks();
            Assert.IsTrue(queue.Tasks.Count() == 0);
            queue.Dispose();
        }
        public async Task Complete_SecondTaskBrokenTest()
        {
            FifoTaskQueue queue        = CreateTaskQueue();
            bool          taskExecuted = false;

            queue.Run(() => { });
            queue.Run(() => {
                Task.Delay(5000, queue.CancellationToken).Wait();
                taskExecuted = true;
            });
            queue.Run(() => { });
            queue.Run(() => { });
            int elapsedTimeToCancelQueue = 2000;
            await queue.CancelAfter(elapsedTimeToCancelQueue, EXCLUDE_TASK_CLEANUP_AFTER_FINALIZATION);

            Assert.IsTrue(queue.Tasks[0].IsCompleted, "First Task Completed");
            Assert.IsTrue(queue.Tasks[1].IsFaulted && taskExecuted == false, "second Task faulted and broken");
            Assert.IsTrue(queue.Tasks[2].IsCanceled && queue.Tasks[3].IsCanceled, "Last tasks canceled");
            queue.ClearUpTasks();
            queue.Dispose();
        }
        public void ClearUp_Tasks_TasksNotFinishedTest()
        {
            FifoTaskQueue queue = CreateTaskQueue();

            queue.Run(() =>
            {
                Task.Delay(5000).Wait();
            });
            queue.Run(() =>
            {
                Task.Delay(2000).Wait();
            });
            queue.Run(() =>
            {
                Task.Delay(2000).Wait();
            });
            queue.ClearUpTasks();
            Assert.IsTrue(queue.Tasks[0].IsCompleted == false &&
                          queue.Tasks[1].IsCompleted == false &&
                          queue.Tasks[2].IsCompleted == false);
            queue.Dispose();
        }
        public async Task Run_DownloadSyncTest()
        {
            FifoTaskQueue queue       = CreateTaskQueue();
            bool          downloaded1 = false;
            bool          downloaded2 = false;

            queue.Run(() =>
            {
                using (Task <bool> downloading = Download(1000))
                {
                    downloading.Wait();
                    downloaded1 = downloading.Result;
                }
                Assert.IsTrue(downloaded1, "First async action performed.");
            });
            queue.Run(() =>
            {
                using (Task <bool> downloading = Download(1000))
                {
                    downloading.Wait();
                    downloaded2 = downloading.Result;
                }
                Assert.IsTrue(downloaded2, "Second async action performed.");
            });
            queue.Run(() =>
            {
                Assert.IsTrue(downloaded1 == true && downloaded2 == true);
            });
            bool done = await queue.ObserveCompletation(EXCLUDE_TASK_CLEANUP_AFTER_FINALIZATION);

            //wait for download finalization at async methods.
            Assert.IsTrue(queue.Tasks[0].IsCompleted, "all task completed");
            Assert.IsTrue(queue.Tasks[1].IsCompleted, "all task completed");
            Assert.IsTrue(queue.Tasks[2].IsCompleted, "all task completed");
            Assert.IsTrue(downloaded1, "First Async. Task performed.");
            Assert.IsTrue(downloaded2, "Second Async. Task performed.");
            queue.Dispose();
        }
        public async Task CompleteTasks_Called_After_Each_TaskTest()
        {
            FifoTaskQueue queue = CreateTaskQueue();

            queue.Run(() => {
                Task.Delay(5000, queue.CancellationToken).Wait();
            });
            await queue.CancelAfter(2000, EXCLUDE_TASK_CLEANUP_AFTER_FINALIZATION);

            queue.Run(() => { });
            await queue.ObserveCompletation(EXCLUDE_TASK_CLEANUP_AFTER_FINALIZATION);

            queue.Run(() => { });
            await queue.ObserveCompletation(EXCLUDE_TASK_CLEANUP_AFTER_FINALIZATION);

            queue.Run(() => { });
            await queue.ObserveCompletation(EXCLUDE_TASK_CLEANUP_AFTER_FINALIZATION);

            Assert.IsTrue(queue.Tasks[0].IsFaulted, "First Task Faulted");
            Assert.IsTrue(queue.Tasks[1].IsCanceled, "second Task completed");
            Assert.IsTrue(queue.Tasks[2].IsCanceled && queue.Tasks[3].IsCanceled, "Last two completed");
            queue.ClearUpTasks();
            queue.Dispose();
        }