public void TailTest()
        {
            const string data  = "One Two Three One Three";
            var          queue = data.Split().Aggregate(HoodMelvilleQueue <string> .Empty, HoodMelvilleQueue <string> .Snoc);
            var          tail  = HoodMelvilleQueue <string> .Tail(queue);

            Assert.AreEqual("[2, [Two, Three], 2, [Three, One]]", DumpQueue(tail));
        }
        public void HeadTest()
        {
            const string data  = "One Two Three One Three";
            var          queue = data.Split().Aggregate(HoodMelvilleQueue <string> .Empty, HoodMelvilleQueue <string> .Snoc);
            var          head  = HoodMelvilleQueue <string> .Head(queue);

            Assert.AreEqual("One", head);
        }
        public void EmptyTest()
        {
            var queue = HoodMelvilleQueue <string> .Empty;

            Assert.IsTrue(HoodMelvilleQueue <string> .IsEmpty(queue));

            queue = HoodMelvilleQueue <string> .Snoc(queue, "Item");

            Assert.IsFalse(HoodMelvilleQueue <string> .IsEmpty(queue));

            queue = HoodMelvilleQueue <string> .Tail(queue);

            Assert.IsTrue(HoodMelvilleQueue <string> .IsEmpty(queue));
        }
        public void PushPopTest()
        {
            const string data  = "One Two Three One Three";
            var          queue = data.Split().Aggregate(HoodMelvilleQueue <string> .Empty, HoodMelvilleQueue <string> .Snoc);

            foreach (var expected in data.Split())
            {
                var actual = HoodMelvilleQueue <string> .Head(queue);

                Assert.AreEqual(expected, actual);
                queue = HoodMelvilleQueue <string> .Tail(queue);
            }

            Assert.IsTrue(HoodMelvilleQueue <string> .IsEmpty(queue));
        }
        public void SnocTest()
        {
            var queue = HoodMelvilleQueue <string> .Empty;

            queue = HoodMelvilleQueue <string> .Snoc(queue, "One");

            Assert.AreEqual("[1, [One], 0, null]", DumpQueue(queue));

            queue = HoodMelvilleQueue <string> .Snoc(queue, "Two");

            Assert.AreEqual("[1, [One], 1, [Two]]", DumpQueue(queue));

            queue = HoodMelvilleQueue <string> .Snoc(queue, "Three");

            Assert.AreEqual("[3, [One], 0, null]", DumpQueue(queue));
        }
        private static string DumpQueue <T>(HoodMelvilleQueue <T> .Queue queue)
        {
            if (queue == null)
            {
                return("null");
            }

            var result = new StringBuilder();

            result.Append("[");
            result.Append(queue.LenF);
            result.Append(", ");
            result.Append(queue.F?.ToReadableString() ?? "null");
            // result.Append(", ");
            // result.Append(queue.State.GetType());
            result.Append(", ");
            result.Append(queue.LenR);
            result.Append(", ");
            result.Append(queue.R?.ToReadableString() ?? "null");
            result.Append("]");
            return(result.ToString());
        }
 public void SnocEmptyTest()
 {
     AssertThrows <NullReferenceException>(() => HoodMelvilleQueue <string> .Snoc(null, "Item"));
 }
        public void EmptyTailTest()
        {
            var queue = HoodMelvilleQueue <string> .Empty;

            AssertThrows <ArgumentNullException>(() => HoodMelvilleQueue <string> .Tail(queue));
        }