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

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

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

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

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

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

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

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

            Assert.Throws <ArgumentNullException>(() => deque.CopyTo(null, 0));
        }
        public void SynchronisedDoubleEndedQueueTryDequeueAtItemFromBackReturnsFalseIfQueueDoesNotContainItems()
        {
            var deque = new SynchronisedDeque <int>();

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

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

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

            deque.Clear();

            Assert.AreEqual(0, deque.Count);
        }
        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 SynchronisedDoubleEndedQueueCopyToThrowsIfArrayIsLessThanZero()
        {
            var items = new[] { 1, 2, 3, 4, 5, 6, 7, 8 };

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

            var array = new int[10];

            Assert.Throws <ArgumentOutOfRangeException>(() => deque.CopyTo(array, -1));
        }
        public void SynchronisedDoubleEndedQueueSupportsDequeuingItemFromFrontOfQueue()
        {
            var items = new[] { 1, 2, 3, 4, 5, 6, 7, 8 };

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

            int front = deque.DequeueItemFromFront();

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

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

            var array = new int[5];

            Assert.Throws <ArgumentException>(() => deque.CopyTo(array, 0));
        }
        public void SynchronisedDoubleEndedQueueTryDequeueAtItemFromBackReturnsTrueIfQueueContainsItems()
        {
            var items = new[] { 1, 2, 3, 4, 5, 6, 7, 8 };

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

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

            Assert.IsTrue(result);
        }
        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 SynchronisedDoubleEndedQueueTryDequeueAtItemFromBackRemovesItemFromBack()
        {
            var items = new[] { 1, 2, 3, 4, 5, 6, 7, 8 };

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

            int i;

            deque.TryDequeueAtItemFromBack(out i);

            Assert.AreEqual(7, deque.Count);
        }
        public void SynchronisedDoubleEndedQueueTryDequeueAtItemFromFrontGetsItemFromFront()
        {
            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(1, i);
        }
        public void SynchronisedDoubleEndedQueueCopyToCopiesContentsToArray()
        {
            var items = new[] { "1", "2", "3", "4", "5", "6", "7", "8" };

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

            var array = new string[8];

            deque.CopyTo(array, 0);

            array.ToList().ForEach(i => Assert.IsNotNull(i));
        }
        public void SynchronisedDoubleEndedQueueEnqueueItemToFrontDoesNotImpactBackOfQueue()
        {
            var items = new[] { 1, 2, 3, 4, 5, 6, 7, 8 };

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

            int originalBack = deque.PeekAtItemFromBack();

            deque.EnqueueItemToFront(9);

            int newBack = deque.PeekAtItemFromBack();

            Assert.AreEqual(originalBack, 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 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 SynchronisedDoubleEndedQueueSupportEnumeration()
        {
            var items = new[] { 1, 2, 3, 4, 5, 6, 7, 8 };

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

            Assert.DoesNotThrow(() =>
            {
                foreach (int i in deque)
                {
                    //ignore
                }
            });
        }
        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 SynchronisedDoubleEndedQueueSupportsDequeueingFromBackUntilQueueIsEmptyMultiThreaded()
        {
            var items = new[] { 1, 2, 3, 4, 5, 6, 7, 8 };

            var deque = new SynchronisedDeque <int>();

            deque.EnqueueRangeToBack(items);

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

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

            Assert.DoesNotThrow(() => Task.WaitAll(tasks.ToArray()));
            Assert.AreEqual(0, deque.Count);
        }
        public void SynchronisedDoubleEndedQueuePeekAtItemFromFrontThrowsIfQueueIsEmpty()
        {
            var deque = new SynchronisedDeque <int>();

            Assert.Throws <InvalidOperationException>(() => deque.PeekAtItemFromFront());
        }
        public void SynchronisedDoubleEndedQueueInitialisesEmpty()
        {
            var deque = new SynchronisedDeque <int>();

            Assert.AreEqual(0, deque.Count);
        }
        public void SynchronisedDoubleEndedQueueInitialises()
        {
            var deque = new SynchronisedDeque <int>();

            Assert.IsNotNull(deque);
        }