|
| 1 | +import os |
| 2 | +import pytest |
| 3 | + |
| 4 | +from dynamic_stack_decider.parser import DsdParser, Tree |
| 5 | +from dynamic_stack_decider.tree import DecisionTreeElement, ActionTreeElement, SequenceTreeElement |
| 6 | + |
| 7 | + |
| 8 | +@pytest.fixture() |
| 9 | +def dsd_tree(): |
| 10 | + parser = DsdParser() |
| 11 | + yield parser.parse(os.path.join(os.path.dirname(__file__), 'test.dsd')) |
| 12 | + |
| 13 | + |
| 14 | +def test_root_element(dsd_tree: Tree): |
| 15 | + root_element = dsd_tree.root_element |
| 16 | + assert isinstance(root_element, DecisionTreeElement) |
| 17 | + assert root_element.name == 'FirstDecision' |
| 18 | + |
| 19 | +def test_possible_results(dsd_tree: Tree): |
| 20 | + assert set(dsd_tree.root_element.children.keys()) == \ |
| 21 | + {'ACTION', 'DECISION', 'SUBBEHAVIOR', 'SEQUENCE', 'PARAMETERS', |
| 22 | + 'LINE_COMMENT', 'BLOCK_COMMENT', 'COMPLICATED_COMMENT', |
| 23 | + 'MULTIPLE_PARAMETERS', 'SECOND_SUBBEHAVIOR_1', 'SECOND_SUBBEHAVIOR_2', |
| 24 | + 'PARAMETER_DECISION', 'PARAMETER_SUBBEHAVIOR', 'NESTED_PARAMETER_SUBBEHAVIOR', |
| 25 | + 'SEQUENCE_TREE'} |
| 26 | + |
| 27 | +def test_following_elements(dsd_tree: Tree): |
| 28 | + first_child = dsd_tree.root_element.get_child('ACTION') |
| 29 | + assert first_child.name == 'FirstAction' |
| 30 | + assert isinstance(first_child, ActionTreeElement) |
| 31 | + |
| 32 | + second_child = dsd_tree.root_element.get_child('DECISION') |
| 33 | + assert second_child.name == 'SecondDecision' |
| 34 | + assert isinstance(second_child, DecisionTreeElement) |
| 35 | + |
| 36 | +def test_nested_decision(dsd_tree: Tree): |
| 37 | + decision_child = dsd_tree.root_element.get_child('DECISION') |
| 38 | + assert set(decision_child.children.keys()) == {'FIRST', 'SECOND'} |
| 39 | + assert decision_child.get_child('FIRST').name == 'FirstAction' |
| 40 | + assert isinstance(decision_child.get_child('FIRST'), ActionTreeElement) |
| 41 | + assert decision_child.get_child('SECOND').name == 'SecondAction' |
| 42 | + assert isinstance(decision_child.get_child('SECOND'), ActionTreeElement) |
| 43 | + |
| 44 | +def test_sub_behavior(dsd_tree: Tree): |
| 45 | + sub_behavior_root_decision = dsd_tree.root_element.get_child('SUBBEHAVIOR') |
| 46 | + assert sub_behavior_root_decision.name == 'ThirdDecision' |
| 47 | + assert set(sub_behavior_root_decision.children.keys()) == {'FIRST', 'SECOND'} |
| 48 | + assert sub_behavior_root_decision.get_child('FIRST').name == 'FirstAction' |
| 49 | + assert isinstance(sub_behavior_root_decision.get_child('FIRST'), ActionTreeElement) |
| 50 | + assert sub_behavior_root_decision.get_child('SECOND').name == 'SecondAction' |
| 51 | + assert isinstance(sub_behavior_root_decision.get_child('SECOND'), ActionTreeElement) |
| 52 | + |
| 53 | +def test_sequence_element(dsd_tree: Tree): |
| 54 | + sequence_element = dsd_tree.root_element.get_child('SEQUENCE') |
| 55 | + assert isinstance(sequence_element, SequenceTreeElement) |
| 56 | + assert len(sequence_element.action_elements) == 2 |
| 57 | + first_action = sequence_element.action_elements[0] |
| 58 | + assert first_action.name == 'FirstAction' |
| 59 | + assert isinstance(first_action, ActionTreeElement) |
| 60 | + second_action = sequence_element.action_elements[1] |
| 61 | + assert second_action.name == 'SecondAction' |
| 62 | + assert isinstance(second_action, ActionTreeElement) |
| 63 | + |
| 64 | +def test_action_parameters(dsd_tree: Tree): |
| 65 | + parameter_element = dsd_tree.root_element.get_child('PARAMETERS') |
| 66 | + assert parameter_element.name == 'FirstAction' |
| 67 | + assert isinstance(parameter_element, ActionTreeElement) |
| 68 | + assert parameter_element.parameters == {'key': 'value'} |
| 69 | + |
| 70 | +def test_decision_parameters(dsd_tree: Tree): |
| 71 | + parameter_element = dsd_tree.root_element.get_child('PARAMETER_DECISION') |
| 72 | + assert parameter_element.name == 'FirstDecision' |
| 73 | + assert isinstance(parameter_element, DecisionTreeElement) |
| 74 | + assert parameter_element.parameters == {'key': 'value'} |
| 75 | + |
| 76 | +def test_line_comment(dsd_tree: Tree): |
| 77 | + comment_element = dsd_tree.root_element.get_child('LINE_COMMENT') |
| 78 | + assert comment_element.name == 'FirstAction' |
| 79 | + assert isinstance(comment_element, ActionTreeElement) |
| 80 | + |
| 81 | +def test_block_comment(dsd_tree: Tree): |
| 82 | + comment_element = dsd_tree.root_element.get_child('BLOCK_COMMENT') |
| 83 | + assert comment_element.name == 'FirstAction' |
| 84 | + assert isinstance(comment_element, ActionTreeElement) |
| 85 | + assert comment_element.parameters == {'key': 'value'} |
| 86 | + |
| 87 | +def test_complicated_comment(dsd_tree: Tree): |
| 88 | + comment_element = dsd_tree.root_element.get_child('COMPLICATED_COMMENT') |
| 89 | + assert comment_element.name == 'FirstAction' |
| 90 | + assert isinstance(comment_element, ActionTreeElement) |
| 91 | + |
| 92 | +def test_multiple_parameters(dsd_tree: Tree): |
| 93 | + parameter_element = dsd_tree.root_element.get_child('MULTIPLE_PARAMETERS') |
| 94 | + assert parameter_element.name == 'FirstAction' |
| 95 | + assert isinstance(parameter_element, ActionTreeElement) |
| 96 | + assert parameter_element.parameters == {'key1': 'value1', 'key2': 'value2'} |
| 97 | + |
| 98 | +def test_multiple_subbehavior_references(dsd_tree: Tree): |
| 99 | + sub_behavior_1_root_decision = dsd_tree.root_element.get_child('SECOND_SUBBEHAVIOR_1') |
| 100 | + sub_behavior_2_root_decision = dsd_tree.root_element.get_child('SECOND_SUBBEHAVIOR_2') |
| 101 | + assert sub_behavior_1_root_decision.name == sub_behavior_2_root_decision.name |
| 102 | + assert sub_behavior_1_root_decision.activation_reason == 'SECOND_SUBBEHAVIOR_1' |
| 103 | + assert sub_behavior_2_root_decision.activation_reason == 'SECOND_SUBBEHAVIOR_2' |
| 104 | + |
| 105 | +def test_parameter_subbehavior(dsd_tree: Tree): |
| 106 | + parameter_subbehavior_decision = dsd_tree.root_element.get_child('PARAMETER_SUBBEHAVIOR') |
| 107 | + first_action = parameter_subbehavior_decision.get_child('FIRST') |
| 108 | + assert first_action.parameters == {'key': 'value1'} |
| 109 | + action_sequence = parameter_subbehavior_decision.get_child('SECOND') |
| 110 | + assert action_sequence.action_elements[0].parameters == {'key': 'value2'} |
| 111 | + assert action_sequence.action_elements[1].parameters == {'key': 'value2'} |
| 112 | + |
| 113 | +def test_nested_parameter_subbehavior(dsd_tree: Tree): |
| 114 | + subbehavior_decision = dsd_tree.root_element.get_child('NESTED_PARAMETER_SUBBEHAVIOR') |
| 115 | + inner_subbehavior_decision = subbehavior_decision.get_child('FIRST') |
| 116 | + first_action = inner_subbehavior_decision.get_child('FIRST') |
| 117 | + assert first_action.parameters == {'key': 'nested1'} |
| 118 | + action_sequence = inner_subbehavior_decision.get_child('SECOND') |
| 119 | + assert action_sequence.action_elements[0].parameters == {'key': 'nested2'} |
| 120 | + assert action_sequence.action_elements[1].parameters == {'key': 'nested2'} |
| 121 | + |
| 122 | +def test_sequence_tree(dsd_tree: Tree): |
| 123 | + sequence_tree = dsd_tree.root_element.get_child('SEQUENCE_TREE') |
| 124 | + assert isinstance(sequence_tree, SequenceTreeElement) |
| 125 | + assert sequence_tree.action_elements[0].name == 'FirstAction' |
| 126 | + assert sequence_tree.action_elements[1].name == 'SecondAction' |
0 commit comments