def test_rotations(): """Tests my rotations, balance, and depth with a simple AVLtree""" # Initialization etc. should work fine, just inherits from well-tested BST bintree = AVLTree() assert bintree.depth() == 0 with pytest.raises(ValueError): bintree._rotate_left() bintree.insert(5) assert bintree.depth() == 1 with pytest.raises(ValueError): bintree._rotate_left() with pytest.raises(ValueError): bintree._rotate_right() bintree.insert(3) assert bintree.depth() == 2 with pytest.raises(ValueError): bintree._rotate_right() # 3 is on left bintree._rotate_left() # 3 now head bintree._rotate_right() # 5 is head again bintree.insert(7) bintree.insert(6) bintree.insert(2) bintree.insert(4) bintree.insert(1) bintree.insert(9) bintree.insert(10) # All in order, no rotations done # 5 # / \ # 3 7 # /\ / \ # 2 4 6 9 # | | # 1 10 bintree._rotate_right() # 7 # / \ # 5 9 # | \ \ # 3 6 10 # /\ # 2 4 # | # 1 assert bintree.value == 7 assert bintree.balance() == 2 assert bintree.size() == 9 assert bintree.depth() == 5 assert bintree.rightchild.value == 9 assert bintree.leftchild.value == 5 assert bintree.leftchild.rightchild.value == 6 bintree.leftchild._rotate_left() # Note that this breaks stuff at head; the update of depth/_level is part # of insert()/delete(), so 7 never gets releveled without the next line bintree._relevel() # 7 # / \ # 3 9 # | \ \ # 2 5 10 # / / \ # 1 4 6 assert bintree.balance() == 1 assert bintree.depth() == 4 pivot_node = bintree.leftchild assert pivot_node.value == 3 assert pivot_node.leftchild.value == 2 assert pivot_node.rightchild.value == 5