From f10d3d540a70e9752e374f58155fc3388b252bbc Mon Sep 17 00:00:00 2001 From: yunyv <62236062+yunyv@users.noreply.github.com> Date: Sun, 1 Nov 2026 10:38:04 -0700 Subject: [PATCH 1/2] Fix Inverter propagation of running child status --- MissionPlanning/BehaviorTree/behavior_tree.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/MissionPlanning/BehaviorTree/behavior_tree.py b/MissionPlanning/BehaviorTree/behavior_tree.py index 9ad886aafb..62a9b756cc 100644 --- a/MissionPlanning/BehaviorTree/behavior_tree.py +++ b/MissionPlanning/BehaviorTree/behavior_tree.py @@ -331,6 +331,8 @@ def __init__(self, name): def tick(self) -> Status: self.not_set_child_raise_error() status = self.child.tick_and_set_status() + if status == Status.RUNNING: + return Status.RUNNING return Status.SUCCESS if status == Status.FAILURE else Status.FAILURE From 9e73a85ce28c698c470d75551922d41e501a1740 Mon Sep 17 00:00:00 2001 From: yunyv <62236062+yunyv@users.noreply.github.com> Date: Sun, 1 Nov 2026 10:38:57 -0700 Subject: [PATCH 2/2] Test Inverter terminal and running child states --- tests/test_behavior_tree.py | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/tests/test_behavior_tree.py b/tests/test_behavior_tree.py index 0898690448..5ab9e91a1f 100644 --- a/tests/test_behavior_tree.py +++ b/tests/test_behavior_tree.py @@ -5,9 +5,44 @@ BehaviorTreeFactory, Status, ActionNode, + InverterNode, ) +@pytest.mark.parametrize("child_status, expected_status", [ + (Status.SUCCESS, Status.FAILURE), + (Status.FAILURE, Status.SUCCESS), + (Status.RUNNING, Status.RUNNING), +]) +def test_inverter_node_status(child_status, expected_status): + class FixedStatusNode(ActionNode): + def tick(self): + return child_status + + inverter = InverterNode("inverter") + inverter.child = FixedStatusNode("child") + assert inverter.tick_and_set_status() == expected_status + assert inverter.status == expected_status + assert inverter.child.status == child_status + + +def test_inverter_waits_for_sleep(monkeypatch): + now = 0.0 + monkeypatch.setattr( + "MissionPlanning.BehaviorTree.behavior_tree.time.time", lambda: now + ) + tree = BehaviorTreeFactory().build_tree( + '' + ) + tree.tick() + assert tree.root.status == Status.RUNNING + assert tree.root.child.status == Status.RUNNING + now = 2.0 + tree.tick() + assert tree.root.status == Status.FAILURE + assert tree.root.child.status == Status.SUCCESS + + def test_sequence_node1(): xml_string = """