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 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)
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)