@@ -64,18 +64,28 @@ def test_forbid_setting_parent_directly(self):
64
64
):
65
65
mary .parent = john
66
66
67
+ def test_dont_modify_children_inplace (self ):
68
+ # GH issue 9196
69
+ child : TreeNode = TreeNode ()
70
+ TreeNode (children = {"child" : child })
71
+ assert child .parent is None
72
+
67
73
def test_multi_child_family (self ):
68
- mary : TreeNode = TreeNode ()
69
- kate : TreeNode = TreeNode ()
70
- john : TreeNode = TreeNode ( children = { "Mary" : mary , "Kate" : kate })
71
- assert john .children ["Mary" ] is mary
72
- assert john . children [ "Kate" ] is kate
74
+ john : TreeNode = TreeNode (children = { "Mary" : TreeNode (), "Kate" : TreeNode ()} )
75
+
76
+ assert "Mary" in john . children
77
+ mary = john .children ["Mary" ]
78
+ assert isinstance ( mary , TreeNode )
73
79
assert mary .parent is john
80
+
81
+ assert "Kate" in john .children
82
+ kate = john .children ["Kate" ]
83
+ assert isinstance (kate , TreeNode )
74
84
assert kate .parent is john
75
85
76
86
def test_disown_child (self ):
77
- mary : TreeNode = TreeNode ()
78
- john : TreeNode = TreeNode ( children = { "Mary" : mary })
87
+ john : TreeNode = TreeNode (children = { "Mary" : TreeNode ()} )
88
+ mary = john . children [ "Mary" ]
79
89
mary .orphan ()
80
90
assert mary .parent is None
81
91
assert "Mary" not in john .children
@@ -96,29 +106,45 @@ def test_doppelganger_child(self):
96
106
assert john .children ["Kate" ] is evil_kate
97
107
98
108
def test_sibling_relationships (self ):
99
- mary : TreeNode = TreeNode ()
100
- kate : TreeNode = TreeNode ()
101
- ashley : TreeNode = TreeNode ()
102
- TreeNode (children = {"Mary" : mary , "Kate" : kate , "Ashley" : ashley })
103
- assert kate .siblings ["Mary" ] is mary
104
- assert kate .siblings ["Ashley" ] is ashley
109
+ john : TreeNode = TreeNode (
110
+ children = {"Mary" : TreeNode (), "Kate" : TreeNode (), "Ashley" : TreeNode ()}
111
+ )
112
+ kate = john .children ["Kate" ]
113
+ assert list (kate .siblings ) == ["Mary" , "Ashley" ]
105
114
assert "Kate" not in kate .siblings
106
115
107
- def test_ancestors (self ):
116
+ def test_copy_subtree (self ):
108
117
tony : TreeNode = TreeNode ()
109
118
michael : TreeNode = TreeNode (children = {"Tony" : tony })
110
119
vito = TreeNode (children = {"Michael" : michael })
120
+
121
+ # check that children of assigned children are also copied (i.e. that ._copy_subtree works)
122
+ copied_tony = vito .children ["Michael" ].children ["Tony" ]
123
+ assert copied_tony is not tony
124
+
125
+ def test_parents (self ):
126
+ vito : TreeNode = TreeNode (
127
+ children = {"Michael" : TreeNode (children = {"Tony" : TreeNode ()})},
128
+ )
129
+ michael = vito .children ["Michael" ]
130
+ tony = michael .children ["Tony" ]
131
+
111
132
assert tony .root is vito
112
133
assert tony .parents == (michael , vito )
113
- assert tony .ancestors == (vito , michael , tony )
114
134
115
135
116
136
class TestGetNodes :
117
137
def test_get_child (self ):
118
- steven : TreeNode = TreeNode ()
119
- sue = TreeNode (children = {"Steven" : steven })
120
- mary = TreeNode (children = {"Sue" : sue })
121
- john = TreeNode (children = {"Mary" : mary })
138
+ john : TreeNode = TreeNode (
139
+ children = {
140
+ "Mary" : TreeNode (
141
+ children = {"Sue" : TreeNode (children = {"Steven" : TreeNode ()})}
142
+ )
143
+ }
144
+ )
145
+ mary = john .children ["Mary" ]
146
+ sue = mary .children ["Sue" ]
147
+ steven = sue .children ["Steven" ]
122
148
123
149
# get child
124
150
assert john ._get_item ("Mary" ) is mary
@@ -138,10 +164,14 @@ def test_get_child(self):
138
164
assert mary ._get_item ("Sue/Steven" ) is steven
139
165
140
166
def test_get_upwards (self ):
141
- sue : TreeNode = TreeNode ()
142
- kate : TreeNode = TreeNode ()
143
- mary = TreeNode (children = {"Sue" : sue , "Kate" : kate })
144
- john = TreeNode (children = {"Mary" : mary })
167
+ john : TreeNode = TreeNode (
168
+ children = {
169
+ "Mary" : TreeNode (children = {"Sue" : TreeNode (), "Kate" : TreeNode ()})
170
+ }
171
+ )
172
+ mary = john .children ["Mary" ]
173
+ sue = mary .children ["Sue" ]
174
+ kate = mary .children ["Kate" ]
145
175
146
176
assert sue ._get_item ("../" ) is mary
147
177
assert sue ._get_item ("../../" ) is john
@@ -150,9 +180,11 @@ def test_get_upwards(self):
150
180
assert sue ._get_item ("../Kate" ) is kate
151
181
152
182
def test_get_from_root (self ):
153
- sue : TreeNode = TreeNode ()
154
- mary = TreeNode (children = {"Sue" : sue })
155
- john = TreeNode (children = {"Mary" : mary }) # noqa
183
+ john : TreeNode = TreeNode (
184
+ children = {"Mary" : TreeNode (children = {"Sue" : TreeNode ()})}
185
+ )
186
+ mary = john .children ["Mary" ]
187
+ sue = mary .children ["Sue" ]
156
188
157
189
assert sue ._get_item ("/Mary" ) is mary
158
190
@@ -367,11 +399,14 @@ def test_levels(self):
367
399
368
400
class TestRenderTree :
369
401
def test_render_nodetree (self ):
370
- sam : NamedNode = NamedNode ()
371
- ben : NamedNode = NamedNode ()
372
- mary : NamedNode = NamedNode (children = {"Sam" : sam , "Ben" : ben })
373
- kate : NamedNode = NamedNode ()
374
- john : NamedNode = NamedNode (children = {"Mary" : mary , "Kate" : kate })
402
+ john : NamedNode = NamedNode (
403
+ children = {
404
+ "Mary" : NamedNode (children = {"Sam" : NamedNode (), "Ben" : NamedNode ()}),
405
+ "Kate" : NamedNode (),
406
+ }
407
+ )
408
+ mary = john .children ["Mary" ]
409
+
375
410
expected_nodes = [
376
411
"NamedNode()" ,
377
412
"\t NamedNode('Mary')" ,
0 commit comments