1
1
import pytest
2
2
3
3
from datatree .iterators import LevelOrderIter , PreOrderIter
4
- from datatree .treenode import TreeError , TreeNode
4
+ from datatree .treenode import NamedNode , TreeError , TreeNode
5
5
6
6
7
7
class TestFamilyTree :
@@ -143,43 +143,6 @@ def test_get_from_root(self):
143
143
assert sue ._get_item ("/Mary" ) is mary
144
144
145
145
146
- class TestPaths :
147
- def test_path_property (self ):
148
- sue = TreeNode ()
149
- mary = TreeNode (children = {"Sue" : sue })
150
- john = TreeNode (children = {"Mary" : mary }) # noqa
151
- assert sue .path == "/Mary/Sue"
152
- assert john .path == "/"
153
-
154
- def test_path_roundtrip (self ):
155
- sue = TreeNode ()
156
- mary = TreeNode (children = {"Sue" : sue })
157
- john = TreeNode (children = {"Mary" : mary }) # noqa
158
- assert john ._get_item (sue .path ) == sue
159
-
160
- def test_same_tree (self ):
161
- mary = TreeNode ()
162
- kate = TreeNode ()
163
- john = TreeNode (children = {"Mary" : mary , "Kate" : kate }) # noqa
164
- assert mary .same_tree (kate )
165
-
166
- def test_relative_paths (self ):
167
- sue = TreeNode ()
168
- mary = TreeNode (children = {"Sue" : sue })
169
- annie = TreeNode ()
170
- john = TreeNode (children = {"Mary" : mary , "Annie" : annie })
171
-
172
- assert sue .relative_to (john ) == "Mary/Sue"
173
- assert john .relative_to (sue ) == "../.."
174
- assert annie .relative_to (sue ) == "../../Annie"
175
- assert sue .relative_to (annie ) == "../Mary/Sue"
176
- assert sue .relative_to (sue ) == "."
177
-
178
- evil_kate = TreeNode ()
179
- with pytest .raises (ValueError , match = "nodes do not lie within the same tree" ):
180
- sue .relative_to (evil_kate )
181
-
182
-
183
146
class TestSetNodes :
184
147
def test_set_child_node (self ):
185
148
john = TreeNode ()
@@ -261,16 +224,66 @@ def test_del_child(self):
261
224
del john ["Mary" ]
262
225
263
226
227
+ class TestNames :
228
+ def test_child_gets_named_on_attach (self ):
229
+ sue = NamedNode ()
230
+ mary = NamedNode (children = {"Sue" : sue }) # noqa
231
+ assert sue .name == "Sue"
232
+
233
+ @pytest .mark .xfail (reason = "requires refactoring to retain name" )
234
+ def test_grafted_subtree_retains_name (self ):
235
+ subtree = NamedNode ("original" )
236
+ root = NamedNode (children = {"new_name" : subtree }) # noqa
237
+ assert subtree .name == "original"
238
+
239
+
240
+ class TestPaths :
241
+ def test_path_property (self ):
242
+ sue = NamedNode ()
243
+ mary = NamedNode (children = {"Sue" : sue })
244
+ john = NamedNode (children = {"Mary" : mary }) # noqa
245
+ assert sue .path == "/Mary/Sue"
246
+ assert john .path == "/"
247
+
248
+ def test_path_roundtrip (self ):
249
+ sue = NamedNode ()
250
+ mary = NamedNode (children = {"Sue" : sue })
251
+ john = NamedNode (children = {"Mary" : mary }) # noqa
252
+ assert john ._get_item (sue .path ) == sue
253
+
254
+ def test_same_tree (self ):
255
+ mary = NamedNode ()
256
+ kate = NamedNode ()
257
+ john = NamedNode (children = {"Mary" : mary , "Kate" : kate }) # noqa
258
+ assert mary .same_tree (kate )
259
+
260
+ def test_relative_paths (self ):
261
+ sue = NamedNode ()
262
+ mary = NamedNode (children = {"Sue" : sue })
263
+ annie = NamedNode ()
264
+ john = NamedNode (children = {"Mary" : mary , "Annie" : annie })
265
+
266
+ assert sue .relative_to (john ) == "Mary/Sue"
267
+ assert john .relative_to (sue ) == "../.."
268
+ assert annie .relative_to (sue ) == "../../Annie"
269
+ assert sue .relative_to (annie ) == "../Mary/Sue"
270
+ assert sue .relative_to (sue ) == "."
271
+
272
+ evil_kate = NamedNode ()
273
+ with pytest .raises (ValueError , match = "nodes do not lie within the same tree" ):
274
+ sue .relative_to (evil_kate )
275
+
276
+
264
277
def create_test_tree ():
265
- f = TreeNode ()
266
- b = TreeNode ()
267
- a = TreeNode ()
268
- d = TreeNode ()
269
- c = TreeNode ()
270
- e = TreeNode ()
271
- g = TreeNode ()
272
- i = TreeNode ()
273
- h = TreeNode ()
278
+ f = NamedNode ()
279
+ b = NamedNode ()
280
+ a = NamedNode ()
281
+ d = NamedNode ()
282
+ c = NamedNode ()
283
+ e = NamedNode ()
284
+ g = NamedNode ()
285
+ i = NamedNode ()
286
+ h = NamedNode ()
274
287
275
288
f .children = {"b" : b , "g" : g }
276
289
b .children = {"a" : a , "d" : d }
@@ -286,7 +299,7 @@ def test_preorderiter(self):
286
299
tree = create_test_tree ()
287
300
result = [node .name for node in PreOrderIter (tree )]
288
301
expected = [
289
- None , # root TreeNode is unnamed
302
+ None , # root Node is unnamed
290
303
"b" ,
291
304
"a" ,
292
305
"d" ,
@@ -302,7 +315,7 @@ def test_levelorderiter(self):
302
315
tree = create_test_tree ()
303
316
result = [node .name for node in LevelOrderIter (tree )]
304
317
expected = [
305
- None , # root TreeNode is unnamed
318
+ None , # root Node is unnamed
306
319
"b" ,
307
320
"g" ,
308
321
"a" ,
@@ -317,19 +330,19 @@ def test_levelorderiter(self):
317
330
318
331
class TestRenderTree :
319
332
def test_render_nodetree (self ):
320
- sam = TreeNode ()
321
- ben = TreeNode ()
322
- mary = TreeNode (children = {"Sam" : sam , "Ben" : ben })
323
- kate = TreeNode ()
324
- john = TreeNode (children = {"Mary" : mary , "Kate" : kate })
333
+ sam = NamedNode ()
334
+ ben = NamedNode ()
335
+ mary = NamedNode (children = {"Sam" : sam , "Ben" : ben })
336
+ kate = NamedNode ()
337
+ john = NamedNode (children = {"Mary" : mary , "Kate" : kate })
325
338
326
339
printout = john .__str__ ()
327
340
expected_nodes = [
328
- "TreeNode ()" ,
329
- "TreeNode ('Mary')" ,
330
- "TreeNode ('Sam')" ,
331
- "TreeNode ('Ben')" ,
332
- "TreeNode ('Kate')" ,
341
+ "NamedNode ()" ,
342
+ "NamedNode ('Mary')" ,
343
+ "NamedNode ('Sam')" ,
344
+ "NamedNode ('Ben')" ,
345
+ "NamedNode ('Kate')" ,
333
346
]
334
347
for expected_node , printed_node in zip (expected_nodes , printout .splitlines ()):
335
348
assert expected_node in printed_node
0 commit comments