Esempio n. 1
0
class TestBST(unittest.TestCase):
    def setUp(self):
        self.bst = BST()

    ############### tests en boîte noire ###############

    # cas où BST = None et node n'existe pas (B1N1)
    def test_delete_node_when_node_is_none_and_BST_is_none(self):
        self.bst.root = None
        self.assertEqual(self.bst.delete_node(node(100)), None)

    # impossible de tester ce cas
    # cas où BST = None et node existe (B1N2)
    def test_delete_node_when_node_is_not_none_and_BST_is_none(self):
        self.bst.root = None
        self.bst.insert(6)  # ici BST n'est plus "None" (vide)
        self.assertEqual(self.bst.delete_node(node(6)), None)

    # cas où BST existe et node n'existe pas (B2N1)
    def test_delete_node_when_node_is_not_none_but_value_is_not_in_BST(self):
        self.bst.insert(2)
        self.assertEqual(self.bst.delete_node(node(100)), None)

    # cas où BST existe et node exist (B2N2)
    def test_delete_node_when_node_is_not_none(self):
        self.bst.insert(2)
        self.bst.delete_node(node(2))
        self.assertEqual(self.bst.find(2), None)
        self.assertEqual(self.bst.root, None)

    ############### tests boite blanche ###############

    #note: nbChild indique le nombre d'enfant que le node contient

    # cas où le noeud n'existe pas (node == None)
    def test_delete_node_when_node_is_none_it_should_return_none(self):
        self.assertEqual(self.bst.delete_node(None), None)

    # cas où le search retourne False (self.search(node.value) == False)
    def test_delete_node_when_node_is_not_in_BST_it_should_return_none(self):
        self.bst.insert(2)
        self.assertEqual(self.bst.delete_node(node(100)), None)

    # cas où nbChild = 0 et le node à delete est la racine
    def test_delete_node_when_the_node_to_delete_has_no_children_and_is_root(
            self):
        self.bst.insert(4)
        self.bst.delete_node(node(4))
        self.assertEqual(self.bst.root, None)

    # cas où nbChild = 0 et le node est un enfant gauche de la racine
    def test_delete_node_when_the_node_to_delete_has_no_children_and_is_left_leaf(
            self):
        self.bst.insert(4)
        self.bst.insert(1)
        node = self.bst.find(1)
        self.bst.delete_node(node)
        self.assertEqual(node.parent.left, None)

    # cas où nbChild = 0 et le node est un enfant à droite de la racine
    def test_delete_node_when_the_node_to_delete_has_no_children_and_is_right_leaf(
            self):
        self.bst.insert(4)
        self.bst.insert(10)
        node = self.bst.find(10)
        self.bst.delete_node(node)
        self.assertEqual(node.parent.right, None)

    # cas où nbChild = 1, son fils est à sa gauche et le noeud est la racine
    def test_delete_node_when_the_node_to_delete_has_one_left_child_and_is_root(
            self):
        self.bst.insert(5)
        self.bst.insert(1)
        nodeToDelete = self.bst.find(5)
        self.bst.delete_node(nodeToDelete)
        self.assertEqual(self.bst.root.value, nodeToDelete.left.value)

    # cas où nbChild = 1, son fils est à sa gauche, le noeud n'est pas la racine et le noeud est à droite de son parent
    def test_delete_node_when_the_node_to_delete_has_one_left_child_and_is_not_root(
            self):
        self.bst.insert(5)
        self.bst.insert(8)
        self.bst.insert(7)
        nodeToDelete = self.bst.find(8)
        self.bst.delete_node(nodeToDelete)
        self.assertEqual(self.bst.root.right.value, nodeToDelete.left.value)

    # cas où nbChild = 1, son fils est à sa droite, le noeud n'est pas la racine et le noeud est à gauche de son parent
    def test_delete_node_when_the_node_to_delete_has_one_right_child_and_is_not_root(
            self):
        self.bst.insert(5)
        self.bst.insert(3)
        self.bst.insert(4)
        nodeToDelete = self.bst.find(3)
        self.bst.delete_node(nodeToDelete)
        self.assertEqual(self.bst.root.left.value, nodeToDelete.right.value)

    # cas où nbChild = 2, on vérifie si l'enfant de droite devient la racine
    def test_delete_node_when_the_node_to_delete_has_two_children(self):
        self.bst.insert(5)
        self.bst.insert(6)
        self.bst.insert(3)
        nodeToDelete = self.bst.find(5)
        rightNode = nodeToDelete.right
        self.bst.delete_node(nodeToDelete)
        self.assertEqual(self.bst.root.value, rightNode.value)

    # cas où nbChild = 2, on vérifie si le noeud le plus petit de la partie droite de l'arbre devient la racine
    def test_delete_node_when_the_node_to_delete_has_two_children_and_root_is_the_smallest_child_from_the_right_branch(
            self):
        self.bst.insert(5)
        self.bst.insert(3)
        self.bst.insert(8)
        self.bst.insert(7)
        self.bst.insert(10)
        nodeToDelete = self.bst.find(5)
        self.bst.delete_node(nodeToDelete)
        self.assertEqual(self.bst.root.value, 7)