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 = """