public void TestWorkflowTaskGroupSingleTask()
 {
     var group = new MockTaskGroup(new BaseWorkflowTask("Step 1", (state) =>
     {
         Debug.WriteLine("Executing step 1");
     }));
     group.Run(new State());
     group.GetTasks().ForEach(t => Assert.AreEqual(WorkflowStatus.Completed, t.Status));
     Assert.AreEqual(WorkflowStatus.Completed, group.Status);
 }
        public void TestWorkflowTaskAsync()
        {
            var group = new MockTaskGroup(
                new AsyncWorkflowTask("Step 1", (state, action) =>
                {
                    Debug.WriteLine("Executing Step 1");
                    Task.Factory.StartNew(() =>
                    {
                        Debug.WriteLine("--- Inside task...");
                        Thread.Sleep(2000);
                        Debug.WriteLine("--- I slept for 2000 ms");
                        action.Complete();
                        Debug.WriteLine("--- and I now completed.");
                    });
                    Debug.WriteLine("Executed Step 1, I should now wait");
                }).Then(new AsyncWorkflowTask("Step 2", (state, action) =>
                {
                    Debug.WriteLine("Executing Step 2");
                    Task.Factory.StartNew(() =>
                    {
                        Debug.WriteLine("--- Inside task...");
                        Thread.Sleep(2000);
                        Debug.WriteLine("--- I slept for 2000 ms");
                        action.Complete();
                        Debug.WriteLine("--- and I now completed.");
                    });
                    Debug.WriteLine("Executed Step 2, I should now wait");
                }).Then(new AsyncWorkflowTask("Step 1", (state, action) =>
                {
                    Debug.WriteLine("Executing Step 3");
                    Task.Factory.StartNew(() =>
                    {
                        Debug.WriteLine("--- Inside task...");
                        Thread.Sleep(2000);
                        Debug.WriteLine("--- I slept for 2000 ms");
                        action.Complete();
                        Debug.WriteLine("--- and I now completed.");
                    });
                    Debug.WriteLine("Executed Step 3, I should now wait");
                }))));

            group.Run(new State());
            group.GetTasks().ForEach(t => Assert.AreEqual(WorkflowStatus.Completed, t.Status));
            Assert.AreEqual(WorkflowStatus.Completed, group.Status);
        }
        public void TestWorkflowTaskGroupMultipleTasksRandom()
        {
            var tasksWith1 = new List<ITask>();
            for (var i = 1; i <= 10; i++)
            {
                var i1 = i;
                tasksWith1.Add(new BaseWorkflowTask($"Task with 1 - {i}",
                    (state) => Debug.WriteLine($"Executing task with 1 - {i1}")));
            }

            var tasksAfter1 = new List<ITask>();
            for (var i = 1; i <= 10; i++)
            {
                var i1 = i;
                tasksAfter1.Add(new BaseWorkflowTask($"Task after 1 - {i}",
                    (state) => Debug.WriteLine($"Executing task after 1 - {i1}")));
            }

            var tasksAfter10 = new List<ITask>();
            for (var i = 1; i <= 5; i++)
            {
                var i1 = i;
                tasksAfter10.Add(new BaseWorkflowTask($"Task after 1.10 - {i}",
                    (state) => Debug.WriteLine($"-- After 1.10, parallel - {i1}")));
            }

            tasksAfter1[4].Then(tasksAfter10[2]);
            tasksWith1.Last().Then(tasksAfter10);
            tasksAfter10.Then(tasksAfter1[3]);

            var group =
                new MockTaskGroup(new BaseWorkflowTask("Step 1", (state) =>
                {
                    Debug.WriteLine("Executing step 1");
                })
                    .Then(tasksAfter1)
                    .Then(new BaseWorkflowTask("Step 3", (state) =>
                    {
                        Debug.WriteLine("Executing step 3");
                    })));
            group.Add(tasksWith1);

            group.Run(new State());
            group.GetTasks().ForEach(t => Assert.AreEqual(WorkflowStatus.Completed, t.Status));
            Assert.AreEqual(WorkflowStatus.Completed, group.Status);
        }