public void ConstructorTest()
        {
            var q = new SPSCQueue <int>(10);

            Assert.AreEqual(0, q.Count);
            Assert.AreEqual(10, q.Capacity);
        }
        //[Test]
        // Demonstration that this queue isn't MPSC

        // This test is disabled, because on rare occasions (or if Count is too small) it might fail.
        // Increasing Count will increase the likelyhood of a successful test.
        public void ConcurrencyTest2()
        {
            int count = 10000;
            var q     = new SPSCQueue <int>(count);


            Thread writer = new Thread(() =>
            {
                for (int i = 0; i < count / 2; i++)
                {
                    while (!q.TryEnqueue(i))
                    {
                    }
                }
            });
            Thread writer2 = new Thread(() =>
            {
                for (int i = 0; i < count / 2; i++)
                {
                    while (!q.TryEnqueue(i))
                    {
                    }
                }
            });

            writer.Start();
            writer2.Start();


            writer.Join();
            writer2.Join();

            Assert.AreNotEqual(count, q.Count);
        }
        // Demonstration that this queue is SPSC
        public void ConcurrencyTest()
        {
            var q     = new SPSCQueue <int>(16);
            int count = 10000;

            Thread reader = new Thread(() =>
            {
                for (int i = 0; i < count; i++)
                {
                    int item;
                    while (!q.TryDequeue(out item))
                    {
                    }

                    Assert.AreEqual(i, item);
                }
            });

            reader.Start();

            for (int i = 0; i < count; i++)
            {
                while (!q.TryEnqueue(i))
                {
                }
            }

            reader.Join();
        }
        public void TryActionTest()
        {
            var q = new SPSCQueue <int>(16);

            //Inserts 10 items.
            QueueTestSetup.SplitQueue(q);

            //Insert 6 more to fill the queue
            for (int i = 0; i < 6; i++)
            {
                q.TryEnqueue(999);
            }

            Assert.IsFalse(q.TryEnqueue(10));
            Assert.IsTrue(q.TryPeek(out int result));
            Assert.AreEqual(0, result);

            for (int i = 0; i < 10; i++)
            {
                Assert.IsTrue(q.TryDequeue(out int val));
                Assert.AreEqual(i, val);
            }

            //Empty 6 last items
            for (int i = 0; i < 6; i++)
            {
                Assert.IsTrue(q.TryDequeue(out int val));
                Assert.AreEqual(999, val);
            }

            //Empty queue
            Assert.IsFalse(q.TryPeek(out int res));
        }
 public Benchmarks()
 {
     _concurrentQueue       = new ConcurrentQueue <long>(COUNT, true);
     _systemConcurrentQueue = new SysConcurrentQueue();
     _mpscQueue             = new MPSCQueue <long>(COUNT);
     _spscQueue             = new SPSCQueue <long>(COUNT);
     _queue = new Queue <long>(COUNT);
 }
        public void FromCollectionTest()
        {
            var col = Enumerable.Range(0, 10).ToList();

            var q = new SPSCQueue <int>(col);

            Assert.AreEqual(10, q.Count);
            Assert.AreEqual(10, q.Capacity);

            Assert.IsTrue(col.SequenceEqual(q));
        }
        public void ToArrayTest()
        {
            var q = new SPSCQueue <int>(10);

            QueueTestSetup.SplitQueue(q);

            var arr = q.ToArray();

            for (int i = 0; i < 10; i++)
            {
                Assert.AreEqual(i, arr[i]);
            }
        }
        public void ClearTest()
        {
            var q = new SPSCQueue <int>(10);

            //Inserts 10 items.
            QueueTestSetup.SplitQueue(q);

            Assert.AreEqual(10, q.Count);
            q.Clear();
            Assert.AreEqual(0, q.Count);

            Assert.IsTrue(q.IsEmpty);
        }
        public void DequeueTest()
        {
            var q = new SPSCQueue <int>(10);

            for (int i = 0; i < 10; i++)
            {
                q.TryEnqueue(i * i);
            }

            for (int i = 0; i < 10; i++)
            {
                q.TryDequeue(out int num);
                Assert.AreEqual(i * i, num);
            }
        }
        public void ExpandTest()
        {
            var q = new SPSCQueue <int>(16);

            QueueTestSetup.SplitQueue(q);

            //Fill buffer to capacity.
            for (int i = 0; i < 6; i++)
            {
                Assert.IsTrue(q.TryEnqueue(999));
            }


            //Buffer is full, can no longer insert.
            Assert.IsFalse(q.TryEnqueue(10));
        }
        public void EnqueueTest()
        {
            var q = new SPSCQueue <int>(10);

            for (int i = 0; i < 10; i++)
            {
                q.TryEnqueue(i * i);
            }

            Assert.AreEqual(10, q.Count);
            Assert.AreEqual(10, q.Capacity);

            q.Clear();

            Assert.AreEqual(0, q.Count);
            Assert.AreEqual(10, q.Capacity);
        }
        public void CopyToTest()
        {
            var q = new SPSCQueue <int>(10);

            QueueTestSetup.SplitQueue(q);

            var arr = new int[15];

            q.CopyTo(arr, 5);

            var num = 0;

            for (int i = 5; i < 15; i++)
            {
                Assert.AreEqual(num++, arr[i]);
            }
        }
        public void PeekTest()
        {
            var q = new SPSCQueue <int>(10);

            for (int i = 0; i < 10; i++)
            {
                q.TryEnqueue((int)Math.Pow(i + 2, 2));
            }

            for (int i = 0; i < 10; i++)
            {
                q.TryPeek(out int num);
                Assert.AreEqual(4, num);
            }

            //Verify no items are dequeued
            Assert.AreEqual(10, q.Count);
        }
        public void IteratorTest()
        {
            var q = new SPSCQueue <int>(10);

            // Wrap tail around
            QueueTestSetup.SplitQueue(q);

            // Iterator should start from the head.
            int num = 0;

            foreach (int i in q)
            {
                Assert.AreEqual(num, i);
                num++;
            }

            // Iterated 10 items
            Assert.AreEqual(10, num);
        }