Inheritance: IProcessingMethod
        public async Task RunAsync_SubProcessListSupplied_AllAreRun(int processCount)
        {
            // arrange
            var processId    = 0;
            var expectedKeys = Enumerable.Range(1, processCount);
            var dict         = new ConcurrentDictionary <int, DateTime>();

            _fixture.Register(() =>
            {
                var process = A.Fake <IProcess>();
                A.CallTo(() => process.RunAsync(CancellationToken.None)).ReturnsLazily(() =>
                {
                    var id = Interlocked.Increment(ref processId);
                    dict.TryAdd(id, DateTime.Now);
                    return(Task.CompletedTask);
                });
                return(process);
            });

            var processes = _fixture.CreateMany <IProcess>(processCount);
            var sut       = new ParallelProcess(processes);

            // act
            await sut.RunAsync(CancellationToken.None);

            // assert
            dict.Should().ContainKeys(expectedKeys);
        }
        public void TaskSample()
        {
            Console.WriteLine("Task");
            Console.WriteLine("====");
            ParallelProcess parallelProcess = new ParallelProcess();

            Task[] tasks      = new Task[2];
            string taskName01 = "Tarea 01";
            string taskName02 = "Tarea 02";

            tasks[0] = Task.Factory.StartNew((Object obj) => {
                TaskParameter param = (TaskParameter)obj;
                parallelProcess.WriteProcess01(param.Name);
            }, new TaskParameter {
                Name = taskName01
            });

            tasks[1] = Task.Factory.StartNew((Object obj) => {
                TaskParameter param = (TaskParameter)obj;
                parallelProcess.WriteProcess02(param.Name);
            }, new TaskParameter {
                Name = taskName02
            });

            Task.WaitAll(tasks);
        }
        public void RunAsync_NoProcessesToRun_NoExceptions()
        {
            // arrange
            var sut = new ParallelProcess();

            // act + assert
            sut.Invoking(async process => await process.RunAsync(CancellationToken.None))
            .Should().NotThrow();
        }
        public void Create_ListOfProcesses_ShouldContainSameProcesses()
        {
            // arrange
            var subProcesses = _fixture.CreateMany <IProcess>().ToArray();
            var sut          = new ParallelProcess();

            // act
            var process = sut.Create(subProcesses);

            // assert
            process.Should().BeEquivalentTo(subProcesses);
        }
        public void ThreadSample()
        {
            Console.WriteLine("Thread");
            Console.WriteLine("======");
            ParallelProcess parallelProcess = new ParallelProcess();

            Thread th1 = new Thread(new ThreadStart(parallelProcess.WriteProcess01));
            Thread th2 = new Thread(new ThreadStart(parallelProcess.WriteProcess02));

            th1.Start();
            th2.Start();

            th1.Join();
            th2.Join();
        }
        public async Task RunAsync_ManyProcesses_RunInParallel(int processCount)
        {
            // arrange
            var processIdCounter              = 0;
            var runOrder                      = new BlockingCollection <int>(processCount);
            var parallelProcessCounter        = 0;
            var maxProcessesRunningInParallel = 0;
            var randomizer                    = new Random(Environment.TickCount);

            _fixture.Register(() =>
            {
                var process   = A.Fake <IProcess>();
                var processId = Interlocked.Increment(ref processIdCounter);

                A.CallTo(() => process.RunAsync(CancellationToken.None)).ReturnsLazily(async() =>
                {
                    var runningProcesses = Interlocked.Increment(ref parallelProcessCounter);

                    maxProcessesRunningInParallel = Math.Max(runningProcesses, maxProcessesRunningInParallel);
                    await Task.Delay(randomizer.Next(minValue: 1, maxValue: 100));

                    runOrder.Add(processId);
                    Interlocked.Decrement(ref parallelProcessCounter);
                });

                return(process);
            });

            var processes = _fixture.CreateMany <IProcess>(processCount);
            var sut       = new ParallelProcess(processes);

            // act
            await sut.RunAsync(CancellationToken.None);

            // assert
            maxProcessesRunningInParallel.Should().BeGreaterOrEqualTo(2);
            runOrder.Should().HaveCount(processCount);
            runOrder.Should().NotBeAscendingInOrder();
        }
        public void RunAsync_ManyProcessesThrows_ThrowsAggregateExceptionForProcesses(int processCount)
        {
            // arrange
            var counter = 0;

            _fixture.Register(() =>
            {
                var processId         = Interlocked.Increment(ref counter);
                var expectedException = new Exception($"I'm failing You, I'm so sorry. Process id: {processId}.");

                var process = A.Fake <IProcess>();
                A.CallTo(() => process.RunAsync(CancellationToken.None)).Returns(Task.FromException(expectedException));
                return(process);
            });

            var processes = _fixture.CreateMany <IProcess>(processCount);
            var sut       = new ParallelProcess(processes);

            // act + assert
            sut.Invoking(async x => await x.RunAsync(CancellationToken.None))
            .Should().Throw <AggregateException>().Where(ex => ex.InnerExceptions.Count == processCount);
        }
 public ParallelProcessRegistered(ParallelProcess <TResult> parent)
 {
     Parent = parent;
 }