Skip to content

Commit bff8fb2

Browse files
committed
Fix cascading args and add a test
1 parent 6b676c4 commit bff8fb2

File tree

4 files changed

+35
-2
lines changed

4 files changed

+35
-2
lines changed

py_trees_parser/parser.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -403,7 +403,9 @@ def _sub_args(self, args, var):
403403
return None
404404

405405
def _build_tree(
406-
self, xml_node: ElementTree, args: dict | None = None
406+
self,
407+
xml_node: ElementTree,
408+
args: dict = {}, # noqa
407409
) -> py_trees.behaviour.Behaviour:
408410
"""
409411
Build the behavior tree from an XML node.
@@ -443,7 +445,7 @@ def _build_tree(
443445
)
444446
self._process_args(child_xml, new_args)
445447
args.update(new_args)
446-
return self._build_tree(child_xml, args)
448+
return self._build_tree(child_xml, {**args, **new_args})
447449

448450
# we only need to find children if the node is a composite
449451
children = list()

test/data/test_cascade_args.xml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
<subtree xmlns:xi="http://www.w3.org/2001/XInclude">
2+
<arg name="selector_name" value="Subtree Selector" />
3+
<arg name="idle_name" value="Idle" />
4+
<arg name="flip_name" value="Flip Eggs" />
5+
<arg name="n" value="2" />
6+
<xi:include href="test_subtree_cascade.xml" parse="xml" />
7+
</subtree>
8+

test/data/test_subtree_cascade.xml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
<subtree xmlns:xi="http://www.w3.org/2001/XInclude">
2+
<arg name="selector_name" value="${selector_name}" />
3+
<arg name="idle_name" value="${idle_name}" />
4+
<arg name="flip_name" value="${flip_name}" />
5+
<arg name="n" value="${n}" />
6+
<xi:include href="test_subtree_args.xml" parse="xml" />
7+
</subtree>

test/test_parser.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,3 +89,19 @@ def test_subtree_and_args(setup_parser):
8989
assert child.period == 2
9090
else:
9191
assert False, f"Unexpected child node type {type(child)}" # noqa
92+
93+
94+
def test_subtree_cascaded_args(setup_parser):
95+
"""Test that cascaded args through subtrees is working as expected."""
96+
tree_file = "test/data/test_cascade_args.xml"
97+
root = setup_parser(tree_file)
98+
99+
assert root.name == "Subtree Selector"
100+
for child in root.children:
101+
if isinstance(child, py_trees.behaviours.Running):
102+
assert child.name == "Idle"
103+
elif isinstance(child, py_trees.behaviours.Periodic):
104+
assert child.name == "Flip Eggs"
105+
assert child.period == 2
106+
else:
107+
assert False, f"Unexpected child node type {type(child)}" # noqa

0 commit comments

Comments
 (0)