public void SynchronisedDoubleEndedQueueTryDequeueAtItemFromFrontReturnsFalseIfQueueDoesNotContainItems()
        {
            var deque = new SynchronisedDeque <int>();

            int  i;
            bool result = deque.TryDequeueAtItemFromFront(out i);

            Assert.IsFalse(result);
        }
        public void SynchronisedDoubleEndedQueueTryQueueAtItemFromFrontReturnsTrueIfQueueContainsItems()
        {
            var items = new[] { 1, 2, 3, 4, 5, 6, 7, 8 };

            var deque = new SynchronisedDeque <int>(items);

            int  i;
            bool result = deque.TryDequeueAtItemFromFront(out i);

            Assert.IsTrue(result);
        }
        public void SynchronisedDoubleEndedQueueTryDequeueAtItemFromFrontRemovesItemFromFront()
        {
            var items = new[] { 1, 2, 3, 4, 5, 6, 7, 8 };

            var deque = new SynchronisedDeque <int>(items);

            int i;

            deque.TryDequeueAtItemFromFront(out i);

            Assert.AreEqual(7, deque.Count);
        }
        public void SynchronisedDoubleEndedQueueSupportsDequeueingFromFrontUntilQueueIsEmptyMultiThreaded()
        {
            var items = new[] { 1, 2, 3, 4, 5, 6, 7, 8 };

            var deque = new SynchronisedDeque <int>();

            deque.EnqueueRangeToFront(items);

            List <Task> tasks = new List <Task>();

            for (int i = 0; i < items.Length * 2; i++)
            {
                tasks.Add(Task.Factory.StartNew(() =>
                {
                    int j;
                    deque.TryDequeueAtItemFromFront(out j);
                }));
            }

            Assert.DoesNotThrow(() => Task.WaitAll(tasks.ToArray()));
            Assert.AreEqual(0, deque.Count);
        }