public void CanReadValuesAndNodesThroughAReadOnlyWrapper()
        {
            RedBlackTree <int, string> tree = new RedBlackTree <int, string>
            {
                { 1, "1" },
                { 2, "2" },
                { 3, "3" },
                { 4, "4" },
                { 5, "5" },
            };

            ReadOnlyRedBlackTree <int, string> wrapper = new ReadOnlyRedBlackTree <int, string>(tree);

            Assert.That(wrapper[2], Is.EqualTo("2"));
            Assert.That(wrapper.ContainsKey(2), Is.True);
            Assert.That(wrapper.Find(2), Is.EqualTo(tree.Find(2)));
            Assert.That(wrapper.Contains(tree.Find(2)), Is.True);

            Assert.That(wrapper.TryGetValue(2, out string value), Is.True);
            Assert.That(value, Is.EqualTo("2"));

            Assert.That(wrapper.FindOrInsert(2, null, out RedBlackTreeNode <int, string> node), Is.False);
            Assert.That(node, Is.EqualTo(tree.Find(2)));

            Assert.That(wrapper.ContainsKey(6), Is.False);
            Assert.That(wrapper.TryGetValue(6, out value), Is.False);
            Assert.That(wrapper.Contains(tree.Find(6)), Is.False);
        }
        public void CannotMutateTheTreeThroughAReadOnlyWrapper()
        {
            RedBlackTree <int, string> tree = new RedBlackTree <int, string>
            {
                { 1, "1" },
                { 2, "2" },
                { 3, "3" },
                { 4, "4" },
                { 5, "5" },
            };

            ReadOnlyRedBlackTree <int, string> wrapper = new ReadOnlyRedBlackTree <int, string>(tree);

            Assert.Throws <ImmutableException>(() => wrapper.Add(6, "6"));
            Assert.Throws <ImmutableException>(() => wrapper.Add(new RedBlackTreeNode <int, string>(6, "6")));
            Assert.Throws <ImmutableException>(() => wrapper.Clear());
            Assert.Throws <ImmutableException>(() => wrapper.DeleteNode(wrapper.MinimumNode));
            Assert.Throws <ImmutableException>(() => wrapper.FindOrInsert(6, "6", out RedBlackTreeNode <int, string> newNode));
            Assert.Throws <ImmutableException>(() => wrapper.Remove(5));
            Assert.Throws <ImmutableException>(() => wrapper.Remove(wrapper.MinimumNode));
            Assert.Throws <ImmutableException>(() => wrapper.RemoveRange(1, 3));
            Assert.Throws <ImmutableException>(() => wrapper[2] = "foo");
            Assert.Throws <ImmutableException>(() => wrapper[6] = "bar");
        }