public void WaitForProcessingCompletionWithCancellationShouldCancel()
        {
            var actionCounter = 0;

            void TestAction(int x)
            {
                Thread.Sleep(x);
                actionCounter += 1;
            }

            var sut = new AsyncProducerConsumerQueue <int>(TestAction);

            sut.ProduceJob(50);
            sut.ProduceJob(50);
            sut.ProduceJob(50);
            sut.ProduceJob(50);
            sut.ProduceJob(50);
            sut.ProduceJob(50);
            sut.ProduceJob(50);

            sut.WaitForProcessingCompletion(100, true);

            Assert.That(actionCounter, Is.InRange(3, 5));
            Assert.That(sut.TotalJobsCompleted, Is.InRange(3, 5));

            sut.Dispose();
        }
        public void RemainingProcessingTimeShouldBeReported()
        {
            var actionCounter = 0;

            void TestAction(int x)
            {
                Thread.Sleep(x);
                actionCounter += 1;
            }

            var sut = new AsyncProducerConsumerQueue <int>(TestAction);

            sut.ProduceJob(50);
            sut.ProduceJob(50);
            sut.ProduceJob(50);
            sut.ProduceJob(50);
            sut.ProduceJob(50);
            sut.ProduceJob(50);

            Thread.Sleep(100);
            Assert.That(sut.EstimatedCurrentCompletionTimeMs, Is.InRange(200, 1000));
            Thread.Sleep(1000);

            Assert.That(actionCounter, Is.EqualTo(6));
            Assert.That(sut.TotalJobsCompleted, Is.EqualTo(6));
            Assert.That(sut.LastJobTimeTakenMs, Is.InRange(45, 100));
            Assert.That(sut.RollingAverageTimeMs, Is.InRange(45, 120));
            Assert.That(sut.EstimatedCurrentCompletionTimeMs, Is.EqualTo(0));

            sut.Dispose();
        }
        public void StatsShouldBeCorrectAfterWaitForProcessingCompletionRun()
        {
            var actionCounter = 0;

            void TestAction(int x)
            {
                Thread.Sleep(x);
                actionCounter += 1;
            }

            var sut = new AsyncProducerConsumerQueue <int>(TestAction);

            sut.ProduceJob(1500);
            sut.ProduceJob(50);

            sut.WaitForProcessingCompletion();

            Assert.That(actionCounter, Is.EqualTo(2));
            Assert.That(sut.TotalJobsCompleted, Is.EqualTo(2));
            Assert.That(sut.LastJobTimeTakenMs, Is.InRange(50, 80));
            Assert.That(sut.RollingAverageTimeMs, Is.InRange(750, 850));
            Assert.That(sut.EstimatedCurrentCompletionTimeMs, Is.EqualTo(0));

            sut.Dispose();
        }