public void SynchronisedDoubleEndedQueueDequeuingItemBackUpdatesCount()
        {
            var items = new[] { 1, 2, 3, 4, 5, 6, 7, 8 };

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

            deque.DequeueItemFromBack();

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

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

            int back = deque.DequeueItemFromBack();

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

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

            deque.DequeueItemFromBack();

            int newBack = deque.PeekAtItemFromBack();

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

            var deque = new SynchronisedDeque <int>();

            deque.EnqueueRangeToBack(items);

            while (!deque.IsEmpty)
            {
                deque.DequeueItemFromBack();
            }
            Assert.AreEqual(0, deque.Count);
        }
        public void SynchronisedDoubleEndedQueueEnumerationThrowsIfCollectionIsModified()
        {
            var items = new[] { 1, 2, 3, 4, 5, 6, 7, 8 };

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

            Assert.Throws <InvalidOperationException>(() =>
            {
                foreach (int i in deque)
                {
                    deque.DequeueItemFromBack();
                }
            });
        }
        public void SynchronisedDoubleEndedQueueDequeuingItemBackDoesNotImpactFront()
        {
            var items = new[] { 1, 2, 3, 4, 5, 6, 7, 8 };

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

            int originalFront = deque.PeekAtItemFromFront();

            deque.DequeueItemFromBack();

            int newFront = deque.PeekAtItemFromFront();

            Assert.AreEqual(originalFront, newFront);
        }
        public void SynchronisedDoubleEndedQueueDequeueItemFromBackThrowsIfQueueIsEmpty()
        {
            var deque = new SynchronisedDeque <int>();

            Assert.Throws <InvalidOperationException>(() => deque.DequeueItemFromBack());
        }