public void Init_FromEmptyCopy_WithOutExcpetion()
        {
            // Arrange
            var concurrentQueue = new CustomConcurrentQueue <int>(null);

            // Act
            concurrentQueue.Push(5);
            concurrentQueue.Push(6);
            var result = concurrentQueue.Pop();

            // Assert
            Assert.AreEqual(5, result);
        }
        public void Queue_SingleThreadPopPush_ReturnValue()
        {
            // Arrange
            var concurrentQueue = new CustomConcurrentQueue <int>();

            // Act
            concurrentQueue.Push(5);
            concurrentQueue.Push(6);
            var result = concurrentQueue.Pop();

            // Assert
            Assert.AreEqual(5, result);
        }
        public async Task Queue_MultiThreadPop_ReturnValues()
        {
            // Arrange
            var concurrentQueue = new CustomConcurrentQueue <int>();

            // Act
            concurrentQueue.Push(5);
            concurrentQueue.Push(6);

            var firstTask  = Task.Run(() => concurrentQueue.Pop());
            var secondTask = Task.Run(() => concurrentQueue.Pop());

            var result = await Task.WhenAll(firstTask, secondTask);;

            // Assert
            Assert.AreEqual(result.Length, 2);
            Assert.That(result[0], Is.EqualTo(5).Or.EqualTo(6));
            Assert.That(result[1], Is.EqualTo(5).Or.EqualTo(6));
        }
        public void Queue_MultiThreadPopPush_ReturnValues()
        {
            // Arrange
            var concurrentQueue = new CustomConcurrentQueue <int>();

            // Act
            var firstTask  = Task.Run(() => concurrentQueue.Pop());
            var secondTask = Task.Run(() => concurrentQueue.Pop());
            var thirdTask  = Task.Run(() =>
            {
                concurrentQueue.Push(5);
                concurrentQueue.Push(6);
                concurrentQueue.Push(7);
            });

            Task.WaitAll(firstTask, secondTask, thirdTask);

            // Assert
            Assert.That(firstTask.Result, Is.EqualTo(5).Or.EqualTo(6));
            Assert.That(secondTask.Result, Is.EqualTo(5).Or.EqualTo(6));
        }