def testFindMin(self):
     tree2 = BST()
     self.assertIsNone(tree2.find_min())
     tree2.insert(5)
     self.assertEqual(5, tree2.find(5).key)
     self.assertEqual(5, tree2.find_min().key)
     self.assertEqual(4, self.tree1.find_min().key)
 def test_general_functions(self):  # XX
     print("Running test_general_functions")
     # Add a number of elements to at least prevent some possible toy-example working out
     h = BST([50, 70, 80, 60, 55, 67, 90, 57, 20, 10, 15, 0])
     self.assertEqual(h.find_min(), 0)
     self.assertEqual(h.find_max(), 90)
     self.assertFalse(h.is_empty())
     n = h.search(67)
     m = h.search(99)
     self.assertTrue(isinstance(n, Node))
     self.assertEqual(n.get_key(), 67)
     self.assertEqual(m, None)
     self.assertTrue(h.contains(67))
     self.assertFalse(h.contains(100))
class BSTTest(unittest.TestCase):
    def setUp(self):
        self.tree1 = BST()
        self.tree1.insert(23)
        self.tree1.insert(8)
        self.tree1.insert(4)
        self.tree1.insert(16)
        self.tree1.insert(15)
        self.tree1.insert(42)

    def testInsert(self):
        tree2 = BST()
        tree2.insert(5)
        tree2.check_ri()
        self.assertEqual(5, tree2.find(5).key)
        tree2.insert(3)
        tree2.check_ri()
        self.assertEqual(3, tree2.find(3).key)
        tree2.insert(4)
        tree2.check_ri()
        self.assertEqual(4, tree2.find(4).key)
        tree2.insert(4)
        tree2.check_ri()
        self.assertEqual(4, tree2.find(4).key)

    def testFind(self):
        tree2 = BST()
        self.assertIsNone(tree2.find(3))
        tree2.insert(4)
        self.assertIsNone(tree2.find(3))

    def testDeleteNodeWithoutChildren(self):
        d = self.tree1.delete(15)
        self.tree1.check_ri()
        self.assertEqual(15, d.key)
        self.assertIsNone(self.tree1.find(15))

    def testDeleteNodeWithOneChild(self):
        d = self.tree1.delete(16)
        self.tree1.check_ri()
        self.assertEqual(16, d.key)
        self.assertIsNone(self.tree1.find(16))

    def testDeleteNodeWithTwoChildren(self):
        d = self.tree1.delete(8)
        self.tree1.check_ri()
        self.assertEqual(8, d.key)
        self.assertIsNone(self.tree1.find(8))

    def testDeleteRoot(self):
        d = self.tree1.delete(23)
        self.tree1.check_ri()
        self.assertEqual(23, d.key)
        self.assertIsNone(self.tree1.find(23))
        self.assertEqual(42, self.tree1.find(42).key)

    def testDelateLastNode(self):
        tree2 = BST()
        tree2.insert(1)
        deleted = tree2.delete(1)
        self.assertEqual(1, deleted.key)
        tree2.check_ri()
        tree2.insert(2)
        tree2.check_ri()

    def testNextLarger(self):
        self.assertEqual(15, self.tree1.next_larger(8).key)
        self.assertEqual(23, self.tree1.next_larger(16).key)

    def testFindMin(self):
        tree2 = BST()
        self.assertIsNone(tree2.find_min())
        tree2.insert(5)
        self.assertEqual(5, tree2.find(5).key)
        self.assertEqual(5, tree2.find_min().key)
        self.assertEqual(4, self.tree1.find_min().key)