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