public void Merge2Test()
        {
            var heap1 = "c a b".Split().Aggregate(BootstrappedHeap <string> .Empty, (current, word) => BootstrappedHeap <string> .Insert(word, current));
            var heap3 = BootstrappedHeap <string> .Merge(heap1, BootstrappedHeap <string> .Empty);

            Assert.AreSame(heap1, heap3);
        }
        public void InsertTest()
        {
            var empty = BootstrappedHeap <string> .Empty;
            var heap  = BootstrappedHeap <string> .Insert("A", empty);

            Assert.AreEqual("A", BootstrappedHeap <string> .FindMin(heap));
        }
        public void DeleteMinTest()
        {
            var ts1 = "c a b".Split().Aggregate(BootstrappedHeap <string> .Empty, (current, word) => BootstrappedHeap <string> .Insert(word, current));
            var ts2 = BootstrappedHeap <string> .DeleteMin(ts1);

            Assert.AreEqual("b", BootstrappedHeap <string> .FindMin(ts2));
        }
        public void Merge3Test()
        {
            var heap1 = "c a b".Split().Aggregate(BootstrappedHeap <string> .Empty, (current, word) => BootstrappedHeap <string> .Insert(word, current));
            var heap2 = "z x y".Split().Aggregate(BootstrappedHeap <string> .Empty, (current, word) => BootstrappedHeap <string> .Insert(word, current));
            var heap3 = BootstrappedHeap <string> .Merge(heap1, heap2);

            Assert.AreEqual("[a: {[b: Empty]: {[c: Empty]: {[x: {[y: Empty]: {[z: Empty]: Empty}}]: Empty}}}]", DumpHeap(heap3));
        }
        public void EmptyTest()
        {
            var t = BootstrappedHeap <string> .Empty;

            Assert.IsTrue(BootstrappedHeap <string> .IsEmpty(t));

            var t1 = BootstrappedHeap <string> .Insert("C", t);

            Assert.IsFalse(BootstrappedHeap <string> .IsEmpty(t1));
        }
 public void DeleteEmptyMinTest()
 {
     AssertThrows <ArgumentNullException>(() => BootstrappedHeap <string> .DeleteMin(BootstrappedHeap <string> .Empty));
 }
 private static string DumpHeap <T>(BootstrappedHeap <T> .Heap heap) where T : IComparable <T>
 {
     return(BootstrappedHeap <T> .IsEmpty(heap)
         ? "Empty"
         : $"[{heap.X}: {DumpElement(heap.P)}]");
 }
 private static string DumpElement <T>(BootstrappedHeap <T> .PrimH.Element element) where T : IComparable <T>
 {
     return(BootstrappedHeap <T> .PrimH.IsEmpty(element)
         ? "Empty"
         : $"{{{DumpHeap(element.H1)}: {DumpElement(element.H2)}}}");
 }