1616from zepben .ewb .services .network .tracing .networktrace .actions .tree_node import TreeNode
1717
1818
19+ def test_accessing_leaves_when_not_calculated_raises_exception ():
20+ builder = EquipmentTreeBuilder ()
21+ with pytest .raises (AttributeError ):
22+ builder .leaves
23+
24+ @pytest .mark .asyncio
25+ async def test_equipment_tree_builder_leaves ():
26+ n = create_looping_network ()
27+ normal = NetworkStateOperators .NORMAL
28+ current = NetworkStateOperators .CURRENT
29+
30+ await Tracing .set_phases ().run (n )
31+ feeder_head = n .get ("j0" , ConductingEquipment )
32+ await Tracing .set_direction ().run_terminal (feeder_head , network_state_operators = normal )
33+ await Tracing .set_direction ().run_terminal (feeder_head , network_state_operators = current )
34+ await log_directions (n .get ('j0' , ConductingEquipment ))
35+
36+ start = n .get ("j1" , ConductingEquipment )
37+ assert start is not None
38+ tree_builder = EquipmentTreeBuilder (calculate_leaves = True )
39+ trace = (
40+ Tracing .network_trace_branching (
41+ network_state_operators = normal ,
42+ action_step_type = NetworkTraceActionType .FIRST_STEP_ON_EQUIPMENT
43+ )
44+ .add_condition (downstream ())
45+ .add_step_action (tree_builder )
46+ )
47+
48+ await trace .run (start )
49+
50+ for ce in (n ['j5' ], n ['j13' ]):
51+ assert ce in {l .identified_object for l in tree_builder .leaves }
52+
53+
1954@pytest .mark .asyncio
2055async def test_downstream_tree ():
2156 n = create_looping_network ()
@@ -33,12 +68,15 @@ async def test_downstream_tree():
3368 start = n .get ("j1" , ConductingEquipment )
3469 assert start is not None
3570 tree_builder = EquipmentTreeBuilder ()
36- trace = Tracing .network_trace_branching (
37- network_state_operators = normal ,
38- action_step_type = NetworkTraceActionType .FIRST_STEP_ON_EQUIPMENT ) \
39- .add_condition (downstream ()) \
40- .add_step_action (tree_builder ) \
71+ trace = (
72+ Tracing .network_trace_branching (
73+ network_state_operators = normal ,
74+ action_step_type = NetworkTraceActionType .FIRST_STEP_ON_EQUIPMENT
75+ )
76+ .add_condition (downstream ())
77+ .add_step_action (tree_builder )
4178 .add_step_action (lambda item , context : visited_ce .append (item .path .to_equipment .mrid ))
79+ )
4280
4381 await trace .run (start )
4482
@@ -51,34 +89,39 @@ async def test_downstream_tree():
5189
5290 pprint .pprint (visit_counts )
5391
54- root = list ( tree_builder .roots )[ 0 ]
92+ root = tree_builder ._roots [ start ]
5593
5694 assert root is not None
5795 _verify_tree_asset (root , n ["j1" ], None , [n ["ac1" ], n ["ac3" ]])
5896
59- test_node = root .children [0 ]
60- _verify_tree_asset (test_node , n ["ac1" ], n ["j1" ], [n ["j2" ]])
97+ assert len (root .children ) == 2
98+ for test_node in root .children :
99+ if test_node .identified_object == n ['ac1' ]:
100+ _verify_tree_asset (test_node , n ["ac1" ], n ["j1" ], [n ["j2" ]])
61101
62- test_node = test_node .children [ 0 ]
63- _verify_tree_asset (test_node , n ["j2" ], n ["ac1" ], [n ["ac2" ]])
102+ test_node = test_node .children . pop ()
103+ _verify_tree_asset (test_node , n ["j2" ], n ["ac1" ], [n ["ac2" ]])
64104
65- test_node = test_node .children [ 0 ]
66- _verify_tree_asset (test_node , n ["ac2" ], n ["j2" ], [n ["j3" ]])
105+ test_node = test_node .children . pop ()
106+ _verify_tree_asset (test_node , n ["ac2" ], n ["j2" ], [n ["j3" ]])
67107
68- test_node = next (iter (test_node .children ))
69- _verify_tree_asset (test_node , n ["j3" ], n ["ac2" ], [n ["ac4" ]])
108+ test_node = next (iter (test_node .children ))
109+ _verify_tree_asset (test_node , n ["j3" ], n ["ac2" ], [n ["ac4" ]])
70110
71- test_node = next (iter (test_node .children ))
72- _verify_tree_asset (test_node , n ["ac4" ], n ["j3" ], [n ["j6" ]])
111+ test_node = next (iter (test_node .children ))
112+ _verify_tree_asset (test_node , n ["ac4" ], n ["j3" ], [n ["j6" ]])
73113
74- test_node = next (iter (test_node .children ))
75- _verify_tree_asset (test_node , n ["j6" ], n ["ac4" ], [])
114+ test_node = next (iter (test_node .children ))
115+ _verify_tree_asset (test_node , n ["j6" ], n ["ac4" ], [])
116+ break
76117
77- test_node = list ( root . children )[ 1 ]
78- _verify_tree_asset (test_node , n ["ac3" ], n ["j1" ], [n ["j4" ]])
118+ elif test_node . identified_object == n [ 'ac3' ]:
119+ _verify_tree_asset (test_node , n ["ac3" ], n ["j1" ], [n ["j4" ]])
79120
80- test_node = next (iter (test_node .children ))
81- _verify_tree_asset (test_node , n ["j4" ], n ["ac3" ], [n ["ac5" ], n ["ac6" ]])
121+ test_node = next (iter (test_node .children ))
122+ _verify_tree_asset (test_node , n ["j4" ], n ["ac3" ], [n ["ac5" ], n ["ac6" ]])
123+ else :
124+ assert False
82125
83126 assert len (_find_nodes (root , "j0" )) == 0
84127 assert len (_find_nodes (root , "ac0" )) == 0
@@ -162,8 +205,15 @@ def _verify_tree_asset(
162205 else :
163206 assert tree_node .parent is None
164207
165- children_nodes = list (c .identified_object for c in tree_node .children )
166- assert children_nodes == expected_children
208+ children_nodes = [c .identified_object for c in tree_node .children ]
209+ try :
210+ for child in expected_children :
211+ assert child in children_nodes
212+ for child in children_nodes :
213+ assert child in expected_children
214+ except AssertionError as e :
215+ e .args = (expected_children , children_nodes )
216+ raise e
167217
168218
169219def _find_nodes (root : TreeNode [ConductingEquipment ], asset_id : str ) -> List [TreeNode [ConductingEquipment ]]:
0 commit comments