Example #1
0
        public static void DoTest()
        {
            // Red-Black Tree Map collection
            var redBlackTree = new RedBlackTreeMap <int, string>(allowDuplicates: false);

            // Testing data
            KeyValuePair <int, string>[] values = new KeyValuePair <int, string> [10];

            // Prepare the values array
            for (int i = 1; i <= 10; ++i)
            {
                var keyValPair = new KeyValuePair <int, string>(i, String.Format("Integer: {0}", i));
                values[i - 1] = keyValPair;
            }


            //
            // Test singular insert
            for (int i = 0; i < 10; ++i)
            {
                redBlackTree.Insert(values[i].Key, values[i].Value);
            }

            Debug.Assert(redBlackTree.Count == values.Length, "Expected the same number of items.");
            Debug.Assert(redBlackTree.Height < redBlackTree.Count, "Fail! Tree doesn't rebalance against sorted elements!");

            redBlackTree.Clear();


            //
            // Test collection insert
            redBlackTree.Insert(values);

            Debug.Assert(redBlackTree.Height < redBlackTree.Count, "Fail! Tree doesn't rebalance against sorted elements!");


            //
            // Test enumeration of key-value pairs is still in oreder
            var enumerator = redBlackTree.GetInOrderEnumerator();

            for (int i = 0; i < 10; ++i)
            {
                if (enumerator.MoveNext())
                {
                    var curr = enumerator.Current;
                    if (curr.Key != values[i].Key || curr.Value != values[i].Value)
                    {
                        throw new Exception();
                    }
                }
            }


            //
            // Test against re-shuffled insertions (not like above order)
            redBlackTree = new RedBlackTreeMap <int, string>(allowDuplicates: false);

            redBlackTree.Insert(4, "int4");
            redBlackTree.Insert(5, "int5");
            redBlackTree.Insert(7, "int7");
            redBlackTree.Insert(2, "int2");
            redBlackTree.Insert(1, "int1");
            redBlackTree.Insert(3, "int3");
            redBlackTree.Insert(6, "int6");
            redBlackTree.Insert(0, "int0");
            redBlackTree.Insert(8, "int8");
            redBlackTree.Insert(10, "int10");
            redBlackTree.Insert(9, "int9");

            Debug.Assert(redBlackTree.Count == values.Length, "Expected the same number of items.");
            Debug.Assert(redBlackTree.Height < redBlackTree.Count, "Fail! Tree doesn't rebalance against sorted elements!");


            //
            // ASSERT INSERTING DUPLICATES WOULD BREAK
            var insert_duplicate_passed = true;

            try
            {
                // 2 already exists in tree
                redBlackTree.Insert(2, "int2");
                insert_duplicate_passed = true;
            }
            catch
            {
                insert_duplicate_passed = false;
            }

            Debug.Assert(insert_duplicate_passed == false, "Fail! The tree doesn't allow duplicates");


            //
            // Test find
            Debug.Assert(redBlackTree.Find(5).Key == 5, "Wrong find result!");
            Debug.Assert(redBlackTree.FindMin().Key == 0, "Wrong min!");
            Debug.Assert(redBlackTree.FindMax().Key == 10, "Wrong max!");


            //
            // Assert find raises exception on non-existing elements
            bool threwKeyNotFoundError = false;

            try
            {
                redBlackTree.Find(999999999);
                threwKeyNotFoundError = false;
            }
            catch (KeyNotFoundException)
            {
                threwKeyNotFoundError = true;
            }

            Debug.Assert(true == threwKeyNotFoundError, "Expected to catch KeyNotFoundException.");


            //
            // PRINT TREE
            Console.WriteLine("********************");
            Console.WriteLine(" [*] RED-BLACK TREE:\r\n");
            Console.WriteLine("********************");
            Console.WriteLine(redBlackTree.DrawTree());
            Console.WriteLine("\r\n");


            //
            // Assert count
            Debug.Assert(redBlackTree.Count == 11);


            //
            // Assert existence and nonexistence of some items
            Debug.Assert(redBlackTree.Contains(1) == true);
            Debug.Assert(redBlackTree.Contains(3) == true);
            Debug.Assert(redBlackTree.Contains(999) == false);


            //
            // ASSERT THAT EACH LEVEL HAS A DIFFERENT COLOR
            Asset_Levels_Different_Colors(redBlackTree);


            //
            // Do some deletions
            redBlackTree.Remove(7);
            redBlackTree.Remove(1);
            redBlackTree.Remove(3);


            //
            // Assert count
            Debug.Assert(redBlackTree.Count == 8);


            //
            // Assert nonexistence of previously existing items
            Debug.Assert(redBlackTree.Contains(1) == false);
            Debug.Assert(redBlackTree.Contains(3) == false);


            //
            // Remove root value
            var oldRootKey = redBlackTree.Root.Key;

            redBlackTree.Remove(redBlackTree.Root.Key);


            //
            // Assert count
            Debug.Assert(redBlackTree.Count == 7);


            //
            // Assert nonexistence of old root's key
            Debug.Assert(redBlackTree.Contains(oldRootKey) == false);


            //
            // PRINT TREE
            Console.WriteLine("********************");
            Console.WriteLine(" [*] RED-BLACK TREE:\r\n");
            Console.WriteLine("********************");
            Console.WriteLine(redBlackTree.DrawTree(includeValues: true));
            Console.WriteLine("\r\n");

            Console.ReadLine();
        }//end-do-test