public void TestGetItemKey()
        {
            var q = new PunisherQueue <string>(item =>
            {
                switch (item)
                {
                case "a":
                case "x":
                    return("ax");

                case "b":
                case "y":
                    return("by");

                case "c":
                case "z":
                    return("cz");

                default:
                    return(item);
                }
            });

            q.Enqueue("a");
            q.Enqueue("b");
            q.Enqueue("c");
            q.Enqueue("x");
            q.Enqueue("z");
            q.Enqueue("w");
            Assert.IsTrue(string.Join("", q) == "bxzw");
        }
        public void TestConcurrency()
        {
            var q = new PunisherQueue <string>();
            int n = 0;

            _ = Task.Run(() =>
            {
                for (int i = 0; i < 10000; ++i)
                {
                    q.Enqueue(Path.GetRandomFileName());
                    ++n;
                    Thread.Yield();
                }
            });
            for (int i = 0; i < 10000; ++i)
            {
                if (!q.TryDequeue(out _))
                {
                    --i;
                }
                --n;
                Thread.Yield();
            }
            if (n == 0)
            {
                Assert.Inconclusive();
            }
            Assert.IsTrue(q.Count() == 0);
        }
        public void TestRemove()
        {
            var q = new PunisherQueue <string>();

            q.Enqueue("a");
            q.Enqueue("b");
            q.Enqueue("c");
            q.Remove("b");
            Assert.IsTrue(string.Join("", q) == "ac");
        }
        public void TestPeek()
        {
            var q = new PunisherQueue <string>();

            q.Enqueue("a");
            q.Enqueue("b");
            q.Enqueue("c");
            Assert.IsTrue(q.Peek() == "a");
            Assert.IsTrue(string.Join("", q) == "abc");
        }
        public void TestTryPeek()
        {
            var q = new PunisherQueue <string>();

            Assert.IsTrue(!q.TryPeek(out _));
            q.Enqueue("a");
            q.Enqueue("b");
            q.Enqueue("c");
            Assert.IsTrue(q.TryPeek(out string s) && s == "a");
            Assert.IsTrue(string.Join("", q) == "abc");
        }
        public void TestEnqueueContains()
        {
            var q = new PunisherQueue <string>();

            q.Enqueue("a");
            q.Enqueue("b");
            q.Enqueue("c");
            Assert.IsTrue(q.Contains("a"));
            Assert.IsTrue(q.Contains("b"));
            Assert.IsTrue(q.Contains("c"));
            Assert.IsTrue(string.Join("", q) == "abc");
        }
        public void TestClear()
        {
            var q = new PunisherQueue <string>();

            q.Enqueue("a");
            q.Enqueue("b");
            q.Enqueue("c");
            q.Clear();
            q.Enqueue("x");
            q.Enqueue("y");
            q.Enqueue("z");
            Assert.IsTrue(string.Join("", q) == "xyz");
        }
        public void TestDequeueEmpty()
        {
            var q = new PunisherQueue <string>();

            q.Dequeue();
        }
        public void TestPeekEmpty()
        {
            var q = new PunisherQueue <string>();

            q.Peek();
        }