def test_add_fsm_to_state_when_memory_is_empty(self): fsm = FSM(1) nested_fsm = FSM('1_1') fsm.add_fsm_to_memory(1, nested_fsm) log.debug("test_add_fsm_to_state_when_memory_is_empty: %s" , fsm.memory) self.assertEqual(fsm.memory.get(1), [nested_fsm])
def test_add_fsm_to_state_when_memory_is_empty(self): fsm = FSM(1) nested_fsm = FSM('1_1') fsm.add_fsm_to_memory(1, nested_fsm) log.debug("test_add_fsm_to_state_when_memory_is_empty: %s", fsm.memory) self.assertEqual(fsm.memory.get(1), [nested_fsm])
class FSMBuilderState(object): def __init__(self, parent= None): self.state_gen = generate_ints() self.current_state = self.state_gen.next() if (parent is not None): self.parent = parent self.fsm = FSM(format_state_name(self.current_state, self.parent.get_current_state())) self.set_interrupt_transition = self.parent.set_interrupt_transition self.top_parent = parent.top_parent else: self.fsm = FSM(self.current_state) self.top_parent = self self.set_interrupt_transition = False self.start_new_par_branch = False # Choice States self.choice_start_state = [] self.choice_end_state = [] # Recursion states self.recursions_states = {} self.parent = parent def format_state_name(self, state): if self.parent is not None: return "%s_%s" %(self.parent.get_current_state(), state) else: return state def move_current_state(self, value = None): if value is None: self.current_state = self.state_gen.next() else: self.current_state = value return self.current_state def get_current_state(self): return self.current_state def add_transition(self, transition, assertion = None, transition_context = None): if assertion is not None: preprocess_assertion = Assertion.create(assertion) else: preprocess_assertion = assertion if self.parent is not None: suffix = self.parent.get_current_state() self.parent.fsm.add_nested_transition(transition, self.parent.get_current_state(), format_state_name(self.get_current_state(), suffix), format_state_name(self.move_current_state(), suffix), preprocess_assertion, transition_context) else: self.fsm.add_transition(transition, self.get_current_state(), self.move_current_state(), preprocess_assertion, transition_context) # We are in interrup block and want to set the first transition that occur as interrupt_transition # This is a global try catch. We assume that do wraps the whole program if self.set_interrupt_transition: self.set_interrupt_transition = False self.fsm.add_interrupt_transition(transition, self.interrupt_start_state)
def test_get_transition_from_memory_when_there_is_a_match(self): fsm = FSM(1) first_fsm = self.get_test_fsm() fsm.memory = {1: [first_fsm]} (_, _, next_state) = fsm.get_transition('a', 1) self.assertEqual(next_state,1) self.assertEqual(fsm.memory.get(1),[first_fsm])
def test_get_transition_from_memory_when_there_is_a_match(self): fsm = FSM(1) first_fsm = self.get_test_fsm() fsm.memory = {1: [first_fsm]} (_, _, next_state) = fsm.get_transition('a', 1) self.assertEqual(next_state, 1) self.assertEqual(fsm.memory.get(1), [first_fsm])
def test_get_normal_transition_when_there_is_a_match(self): fsm = FSM(1) fsm.state_transitions = {('b', 1): (None, None, 2)} first_fsm = self.get_test_fsm() fsm.memory = {2: [first_fsm]} (_, _, next_state) = fsm.get_transition('b', 1) self.assertEqual(next_state, 2) self.assertEqual(fsm.memory.get(2), [first_fsm])
def test_get_normal_transition_when_there_is_a_match(self): fsm = FSM(1) fsm.state_transitions = {('b', 1):(None, None, 2)} first_fsm = self.get_test_fsm() fsm.memory = {2: [first_fsm]} (_, _, next_state) = fsm.get_transition('b', 1) self.assertEqual(next_state,2) self.assertEqual(fsm.memory.get(2),[first_fsm])
def test_get_normal_transition_when_there_is_no_match_but_such_transition_exist(self): fsm = FSM(1) #fsm.state_transitions = {('b', 1):(None, 2)} first_fsm = FSM('1_1') first_fsm.state_transitions = {('a', '1_1'):(None, None, '1_2'), (fsm.END_PAR_TRANSITION, '1_2'): (None, None, 2)} fsm.memory = {2: [first_fsm]} (_, _, next_state) = fsm.get_transition( 'a', 2) log.debug("test_get_normal_transition_when_there_is_no_match_but_such_transition_exist:%s", fsm.memory) self.assertEqual(fsm.memory, {2:[]}) self.assertEqual(next_state, 2)
def test_add_fsm_to_state_that_is_not_in_memory_and_memory_is_not_empty(self): fsm = FSM(1) first_fsm = self.get_test_fsm() fsm.memory = {1: [first_fsm]} second_fsm = self.get_test_fsm() fsm.add_fsm_to_memory(2,second_fsm) log.debug('test_add_fsm_to_state_that_is_not_in_memory_and_memory_is_not_empty: %s', fsm.memory) self.assertEqual(len(fsm.memory),2) self.assertEqual(fsm.memory.get(1), [first_fsm]) self.assertEqual(fsm.memory.get(1), [second_fsm])
def test_add_fsm_to_state_that_is_already_in_memory(self): fsm = FSM(1) first_fsm = self.get_test_fsm() fsm.memory = {1: [first_fsm]} second_fsm = self.get_test_fsm() fsm.add_fsm_to_memory(1,second_fsm) log.debug("test_add_fsm_to_state_that_is_already_in_memory%s" ,fsm.memory) self.assertEqual(len(fsm.memory),1) self.assertEqual(fsm.memory.get(1), [first_fsm, second_fsm])
def test_add_fsm_to_state_that_is_already_in_memory(self): fsm = FSM(1) first_fsm = self.get_test_fsm() fsm.memory = {1: [first_fsm]} second_fsm = self.get_test_fsm() fsm.add_fsm_to_memory(1, second_fsm) log.debug("test_add_fsm_to_state_that_is_already_in_memory%s", fsm.memory) self.assertEqual(len(fsm.memory), 1) self.assertEqual(fsm.memory.get(1), [first_fsm, second_fsm])
def test_add_fsm_to_state_that_is_not_in_memory_and_memory_is_not_empty( self): fsm = FSM(1) first_fsm = self.get_test_fsm() fsm.memory = {1: [first_fsm]} second_fsm = self.get_test_fsm() fsm.add_fsm_to_memory(2, second_fsm) log.debug( 'test_add_fsm_to_state_that_is_not_in_memory_and_memory_is_not_empty: %s', fsm.memory) self.assertEqual(len(fsm.memory), 2) self.assertEqual(fsm.memory.get(1), [first_fsm]) self.assertEqual(fsm.memory.get(1), [second_fsm])
def __init__(self, parent= None): self.state_gen = generate_ints() self.current_state = self.state_gen.next() if (parent is not None): self.parent = parent self.fsm = FSM(format_state_name(self.current_state, self.parent.get_current_state())) self.set_interrupt_transition = self.parent.set_interrupt_transition self.top_parent = parent.top_parent else: self.fsm = FSM(self.current_state) self.top_parent = self self.set_interrupt_transition = False self.start_new_par_branch = False # Choice States self.choice_start_state = [] self.choice_end_state = [] # Recursion states self.recursions_states = {} self.parent = parent
def test_get_normal_transition_when_there_is_no_match_but_such_transition_exist( self): fsm = FSM(1) #fsm.state_transitions = {('b', 1):(None, 2)} first_fsm = FSM('1_1') first_fsm.state_transitions = { ('a', '1_1'): (None, None, '1_2'), (fsm.END_PAR_TRANSITION, '1_2'): (None, None, 2) } fsm.memory = {2: [first_fsm]} (_, _, next_state) = fsm.get_transition('a', 2) log.debug( "test_get_normal_transition_when_there_is_no_match_but_such_transition_exist:%s", fsm.memory) self.assertEqual(fsm.memory, {2: []}) self.assertEqual(next_state, 2)
def get_test_fsm(self): # build test data testData = FSM('1_1') testData.state_transitions = {('a', '1_1'):(None, None, '1_2')} return testData
def test_get_normal_transition_when_there_is_no_match(self): fsm = FSM(1) fsm.state_transitions = {('b', 1):(None, None, 2)} first_fsm = self.get_test_fsm() fsm.memory = {2: [first_fsm]} self.assertRaises(ExceptionFSM, fsm.get_transition, 'c', 1)
def test_get_normal_transition_when_there_is_no_match(self): fsm = FSM(1) fsm.state_transitions = {('b', 1): (None, None, 2)} first_fsm = self.get_test_fsm() fsm.memory = {2: [first_fsm]} self.assertRaises(ExceptionFSM, fsm.get_transition, 'c', 1)
def get_test_fsm(self): # build test data testData = FSM('1_1') testData.state_transitions = {('a', '1_1'): (None, None, '1_2')} return testData