public void TestTaskCompletion()
        {
            var queue = new ProducerConsumerQueue();
            var task = queue.Enqueue(() =>
            {
                Thread.Sleep(500);
            });
            task.Wait();

            Assert.IsFalse(task.IsFaulted);
            Assert.IsTrue(task.IsCompleted);
            Assert.IsTrue(task.Status == System.Threading.Tasks.TaskStatus.RanToCompletion);
        }
        public void CanAddElementAsProducerAndRemoveAsConsumer()
        {
            queue = new ProducerConsumerQueue();
            ThreadStart consumerMethod = new ThreadStart(runner);
            Thread consumerThread = new Thread(consumerMethod);
            consumerThread.Start();
            Thread.Sleep(500);

            queue.Enqueue("this is a string");

            Thread.Sleep(500);
            consumerThread.Join();

            Assert.AreEqual("this is a string", dequeuedMsg);
        }
        public void TestException()
        {
            var queue = new ProducerConsumerQueue();
            var task = queue.Enqueue(() =>
            {
                Thread.Sleep(500);
                throw new Exception("You failed");

            });
            try
            {
                task.Wait();
            }
            catch (Exception e)
            {
                Assert.IsNotNull(e);
                Assert.IsTrue(e.InnerException.Message == "You failed");
            }
        }