def test_submachines_machine(self): states, trans = make_submachines_machine(use_logging=False) hsm = HSM(states, trans) l0_start = get_state_by_sig(('left', 0, 'start'), hsm.flattened) s0_top = get_state_by_sig(('subs', 0, 'top'), hsm.flattened) s1_final = get_state_by_sig(('subs', 1, 'final'), hsm.flattened) tree = tree_from_state_set( set([l0_start, s0_top, s1_final]) ) assert len(tree) == 1 # only one root node assert self.extract_names(tree) == [ ('top', [ ('left', [ ('left[0].top', [ ('left[0].start', []) ]), ]), ('right', [ ('subs', [ ('subs[0].top', []), ('subs[1].top', [ ('subs[1].final', []), ]), ]), ]) ]), ]
def test_miro_machine(self): states, trans = make_miro_machine(use_logging=False) hsm = HSM(states, trans) s1 = get_state_by_sig(('s11',), hsm.flattened) s211 = get_state_by_sig(('s211',), hsm.flattened) tree = tree_from_state_set( set([s1, s211]) ) assert len(tree) == 1 # only one root node assert self.extract_names(tree) == [ ('top', [ ('s', [ ('s1', [ ('s11', []) ]), ('s2', [ ('s21', [ ('s211', []), ]) ]) ]), # ('final', []), # final should NOT be in the tree ]) ]
def test_run(self, state_name, Event, foo_before, foo_expected, exp_responding_state, exp_transition_target): mock_hsm = MockHSM() mock_hsm.data.foo = foo_before state = get_state_by_sig((state_name,), self.hsm.flattened) tree = tree_from_state_set(set([state])) resps = get_responses(tree, Event(), self.hsm.trans, mock_hsm) if exp_responding_state is None: assert resps == [] else: assert len(resps) == 1 # no orthogonal regions in this HSM resp_subtrees, trans = zip(*resps) assert resp_subtrees[0][0].name == exp_responding_state tran = trans[0] if exp_transition_target is not None: assert State.sig_to_name(tran.target) == exp_transition_target else: assert tran.target is None tran.action(None, mock_hsm) # this call might change 'foo' value # event is not relevant if foo_expected != 'ignored': assert mock_hsm.data.foo == foo_expected
def check(hsm, states, Event, exp_resp_states, exp_tran_targets): state_set = set([get_state_by_sig(sig, hsm.flattened) for sig in states]) tree = tree_from_state_set(state_set) resps = get_responses(tree, Event(), hsm.trans, None) if exp_resp_states or exp_tran_targets: resp_subtrees, trans = zip(*resps) assert len(resp_subtrees) == len(exp_resp_states) resp_sigs = set([st.sig for st, _ in resp_subtrees]) assert resp_sigs == set(exp_resp_states) assert len(trans) == len(exp_tran_targets) target_ids = set([tr.target for tr in trans]) assert target_ids == set(exp_tran_targets) else: assert resps == []
def test_choice(self, states, event, exp_resp_states, exp_tran_targets): state_set = set([get_state_by_sig((name,), self.hsm.flattened) for name in states]) tree = tree_from_state_set(state_set) resps = get_responses(tree, event, self.hsm.trans, None) print resps if exp_resp_states or exp_tran_targets: resp_subtrees, trans = zip(*resps) assert len(resp_subtrees) == len(exp_resp_states) resp_names = set([st.name for st, _ in resp_subtrees]) assert resp_names == set(exp_resp_states) assert len(trans) == len(exp_tran_targets) target_ids = set([State.sig_to_name(tr.target) for tr in trans]) assert target_ids == set(exp_tran_targets) else: assert resps == []