public void ErrorTest1()
        {
            var actionProducerConsumer = new ActionBlockPerformer <int>(4);

            var execCount = 0;
            var errors    = 0;

            var random = new Random(1);

            var put        = new List <int>();
            var result     = new List <int>();
            var exceptions = new List <Exception>();

            var all = new List <PerfWorkItem <int> >();

            for (var i = 0; i < 20; i++)
            {
                var t = new PerfWorkItem <int>(o =>
                {
                    Thread.Sleep(random.Next(1, 500));
                    Console.WriteLine($"{o} run");
                    throw new Exception("Asd faf la la l a");
                    result.Add(o);
                })
                {
                    Argument = i
                };

                t.Completed += (o, y) => { execCount++; };
                t.Failed    += (o, y) => { errors++; exceptions.Add(y); };

                all.Add(t);
                put.Add(i);
                actionProducerConsumer.Send(t);
            }

            actionProducerConsumer.Wait(2000);

            for (var i = 0; i < result.Count; i++)
            {
                Assert.AreEqual(put[i], result[i]);
            }

            foreach (var perfWorkItem in all)
            {
                Assert.IsNotNull(perfWorkItem.Error);
            }

            for (var i = 0; i < exceptions.Count; i++)
            {
                Assert.IsTrue(exceptions[i].Message.Contains("Asd faf la la l a"));
            }

            Assert.AreEqual(0, result.Count);
            Assert.AreEqual(0, execCount);
            Assert.AreEqual(20, errors);
            Assert.AreEqual(20, exceptions.Count);
        }
        public void ErrorTest0()
        {
            var actionProducerConsumer = new ActionBlockPerformer <int>(4);

            var execCount       = 0;
            var errors          = 0;
            var completedCommon = 0;
            var errorsCommon    = 0;

            actionProducerConsumer.ItemComplete += (sender, item) => { completedCommon++; };
            actionProducerConsumer.ItemFailed   += (sender, item) => { errorsCommon++; };

            var random = new Random(1);

            var put        = new List <int>();
            var result     = new List <int>();
            var exceptions = new List <Exception>();

            var all = new List <PerfWorkItem <int> >();

            for (var i = 0; i < 20; i++)
            {
                var t = new PerfWorkItem <int>(o =>
                {
                    Thread.Sleep(random.Next(1, 500));
                    Console.WriteLine($"{o} run");
                    result.Add(o);
                })
                {
                    Argument = i
                };

                t.Completed += (o, y) => { execCount++; };
                t.Failed    += (o, y) => { errors++; exceptions.Add(y); };

                all.Add(t);
                put.Add(i);
                actionProducerConsumer.Send(t);
            }

            actionProducerConsumer.Wait(2000);


            foreach (var perfWorkItem in all)
            {
                Assert.IsNull(perfWorkItem.Error);
            }


            Assert.AreEqual(20, result.Count);
            Assert.AreEqual(20, execCount);
            Assert.AreEqual(0, errors);
            Assert.AreEqual(0, exceptions.Count);

            Assert.AreEqual(20, completedCommon);
            Assert.AreEqual(0, errorsCommon);
        }
        public void OrderExecutionTest2()
        {
            var actionProducerConsumer = new ActionBlockPerformer <int>(1);

            var completedCommon = 0;
            var errorsCommon    = 0;

            actionProducerConsumer.ItemComplete += (sender, item) => { completedCommon++; };
            actionProducerConsumer.ItemFailed   += (sender, item) => { errorsCommon++; };

            var execCount = 0;

            var random = new Random(1);

            var put    = new List <int>();
            var result = new List <int>();

            for (var i = 0; i < 30; i++)
            {
                var t = new PerfWorkItem <int>(o =>
                {
                    Thread.Sleep(random.Next(1, 500));
                    Console.WriteLine($"{o} run");
                    result.Add(o);
                })
                {
                    Argument = i
                };

                t.Completed += (o, y) => { execCount++; };

                put.Add(i);
                actionProducerConsumer.Send(t);
            }

            actionProducerConsumer.Wait(10000);

            for (var i = 0; i < result.Count; i++)
            {
                Assert.AreEqual(put[i], result[i]);
            }

            Assert.AreEqual(30, result.Count);
            Assert.AreEqual(30, execCount);

            Assert.AreEqual(30, completedCommon);
            Assert.AreEqual(0, errorsCommon);
        }
        public void OrderExecutionTest3()
        {
            var performer = new ActionBlockPerformer <int>(1);

            var execCount = 0;

            var random = new Random(1);

            var put    = new List <int>();
            var result = new List <int>();

            for (var i = 0; i < 10; i++)
            {
                var t = new PerfWorkItem <int>(o =>
                {
                    Thread.Sleep(random.Next(1, 2000));
                    Console.WriteLine($"{o} run");
                    result.Add(o);
                })
                {
                    Argument = i
                };

                t.Completed += (o, y) => { execCount++; };

                put.Add(i);
                performer.Send(t);
            }

            performer.Wait(10000);

            for (var i = 0; i < result.Count; i++)
            {
                Assert.AreEqual(put[i], result[i]);
            }


            Assert.AreEqual(10, result.Count);
            Assert.AreEqual(10, execCount);
        }