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__)