import pytest import conftest from MissionPlanning.BehaviorTree.behavior_tree import ( BehaviorTreeFactory, Status, ActionNode, ) def test_sequence_node1(): xml_string = """ """ bt_factory = BehaviorTreeFactory() bt = bt_factory.build_tree(xml_string) bt.tick() assert bt.root.status == Status.RUNNING assert bt.root.children[0].status == Status.SUCCESS assert bt.root.children[1].status is None assert bt.root.children[2].status is None bt.tick() bt.tick() assert bt.root.status == Status.FAILURE assert bt.root.children[0].status is None assert bt.root.children[1].status is None assert bt.root.children[2].status is None def test_sequence_node2(): xml_string = """ """ bt_factory = BehaviorTreeFactory() bt = bt_factory.build_tree(xml_string) bt.tick_while_running() assert bt.root.status == Status.SUCCESS assert bt.root.children[0].status is None assert bt.root.children[1].status is None assert bt.root.children[2].status is None def test_selector_node1(): xml_string = """ """ bt_factory = BehaviorTreeFactory() bt = bt_factory.build_tree(xml_string) bt.tick() assert bt.root.status == Status.RUNNING assert bt.root.children[0].status == Status.FAILURE assert bt.root.children[1].status is None assert bt.root.children[2].status is None bt.tick() assert bt.root.status == Status.SUCCESS assert bt.root.children[0].status is None assert bt.root.children[1].status is None assert bt.root.children[2].status is None def test_selector_node2(): xml_string = """ """ bt_factory = BehaviorTreeFactory() bt = bt_factory.build_tree(xml_string) bt.tick_while_running() assert bt.root.status == Status.FAILURE assert bt.root.children[0].status is None assert bt.root.children[1].status is None def test_while_do_else_node(): xml_string = """ """ class CountNode(ActionNode): def __init__(self, name, count_threshold): super().__init__(name) self.count = 0 self.count_threshold = count_threshold def tick(self): self.count += 1 if self.count >= self.count_threshold: return Status.FAILURE else: return Status.SUCCESS bt_factory = BehaviorTreeFactory() bt_factory.register_node_builder( "Count", lambda node: CountNode( node.attrib.get("name", CountNode.__name__), int(node.attrib["count_threshold"]), ), ) bt = bt_factory.build_tree(xml_string) bt.tick() assert bt.root.status == Status.RUNNING assert bt.root.children[0].status == Status.SUCCESS assert bt.root.children[1].status is Status.SUCCESS assert bt.root.children[2].status is None bt.tick() assert bt.root.status == Status.RUNNING assert bt.root.children[0].status == Status.SUCCESS assert bt.root.children[1].status is Status.SUCCESS assert bt.root.children[2].status is None bt.tick() assert bt.root.status == Status.SUCCESS assert bt.root.children[0].status is None assert bt.root.children[1].status is None assert bt.root.children[2].status is None def test_node_children(): # ControlNode Must have children xml_string = """ """ bt_factory = BehaviorTreeFactory() with pytest.raises(ValueError): bt_factory.build_tree(xml_string) # DecoratorNode Must have child xml_string = """ """ with pytest.raises(ValueError): bt_factory.build_tree(xml_string) # DecoratorNode Must have only one child xml_string = """ """ with pytest.raises(ValueError): bt_factory.build_tree(xml_string) # ActionNode Must have no children xml_string = """ """ with pytest.raises(ValueError): bt_factory.build_tree(xml_string) # WhileDoElse Must have exactly 2 or 3 children xml_string = """ """ with pytest.raises(ValueError): bt = bt_factory.build_tree(xml_string) bt.tick() xml_string = """ """ with pytest.raises(ValueError): bt = bt_factory.build_tree(xml_string) bt.tick() if __name__ == "__main__": conftest.run_this_test(__file__)