| 851 | |
| 852 | |
| 853 | def test_tree_validate() -> None: |
| 854 | class TestNode(Node): |
| 855 | def __setattr__(self, attr: str, value: Any) -> None: |
| 856 | object.__setattr__(self, attr, value) |
| 857 | |
| 858 | root = Node(1) |
| 859 | root.validate() # Should pass |
| 860 | |
| 861 | root = Node(1) |
| 862 | root.left = Node(2) |
| 863 | root.validate() # Should pass |
| 864 | |
| 865 | root = Node(1) |
| 866 | root.left = Node(2) |
| 867 | root.right = Node(3) |
| 868 | root.validate() # Should pass |
| 869 | |
| 870 | root = Node(1) |
| 871 | root.left = Node(2) |
| 872 | root.right = Node(3) |
| 873 | root.left.left = Node(4) |
| 874 | root.left.right = Node(5) |
| 875 | root.left.right.left = Node(6) |
| 876 | root.validate() # Should pass |
| 877 | |
| 878 | root = TestNode(1) |
| 879 | root.left = "not_a_node" # type: ignore |
| 880 | with pytest.raises(NodeTypeError) as err1: |
| 881 | root.validate() |
| 882 | assert str(err1.value) == "invalid node instance at index 1" |
| 883 | |
| 884 | root = TestNode(1) |
| 885 | root.right = TestNode(2) |
| 886 | root.right.val = EMPTY_LIST |
| 887 | with pytest.raises(NodeValueError) as err2: |
| 888 | root.validate() |
| 889 | assert str(err2.value) == "invalid node value at index 2" |
| 890 | |
| 891 | root = TestNode(1) |
| 892 | root.left = TestNode(2) |
| 893 | root.left.right = root |
| 894 | with pytest.raises(NodeReferenceError) as err3: |
| 895 | root.validate() |
| 896 | assert str(err3.value) == "cyclic reference at Node(1) (level-order index 4)" |
| 897 | |
| 898 | |
| 899 | def test_tree_validate_with_letters() -> None: |