Пример #1
0
    def test_state_object_repr_method(self):
        some_state = State(name='Busy')
        pattern    = re.compile(r'\s0x.[a-z0-9]*')
        match      = pattern.search(some_state.__repr__())
        result     = some_state.__repr__().replace(match.group(0), '')

        assert result == '<State> Busy'
Пример #2
0
    def test_initializing_event_successfully(self):
        start_state = State(name='start')
        busy_state = State(name='busy')
        do_work_event = Event(name='do_work',
                              source_states=[start_state],
                              destination_state=busy_state)

        assert do_work_event.name == 'do_work'
Пример #3
0
    def test_event_object_str_method(self):
        start_state = State(name='start')
        busy_state = State(name='busy')
        do_work_event = Event(name='Do Work',
                              source_states=[start_state],
                              destination_state=busy_state)

        assert str(do_work_event) == '<Event Do Work>'
Пример #4
0
 def test_firing_event_successfully(self):
     start_state = State(name='start')
     busy_state  = State(name='busy')
     do_work_event = Event(name='do_work', source_states=[start_state], destination_state=busy_state)
     
     fsm = StateMachine(states=[start_state, busy_state], events=[do_work_event], initial_state=start_state)
     fsm.activate()
     
     assert fsm.fire_event(do_work_event)
Пример #5
0
 def test_can_fire_event_with_name_failure(self):
     start_state = State(name='start')
     busy_state  = State(name='busy')
     do_work_event = Event(name='do_work', source_states=[busy_state], destination_state=busy_state)
     
     fsm = StateMachine(states=[start_state, busy_state], events=[do_work_event], initial_state=start_state)
     fsm.activate()
     
     assert fsm.can_fire_event_with_name('do_work') == False
Пример #6
0
 def test_initial_state_is_not_a_valid_state(self):
     start_state = State(name='start')
     busy_state  = State(name='busy')
     do_work_event = Event(name='do_work', source_states=[start_state], destination_state=busy_state)
     
     with pytest.raises(StateMachineError) as context_manager:
         fsm = StateMachine(states=[start_state], events=[do_work_event], initial_state=busy_state)
     
     expected_exception = context_manager.value
     assert expected_exception.identifier == STATE_MACHINE.INITIAL_STATE_MUST_BE_ONE_OF_PROVIDED_STATES_IDENTIFIER
Пример #7
0
 def test_looking_up_event_by_name_successfully(self):
     start_state = State(name='start')
     busy_state  = State(name='busy')
     do_work_event = Event(name='do_work', source_states=[start_state], destination_state=busy_state)
     
     fsm = StateMachine(states=[start_state, busy_state], events=[do_work_event], initial_state=start_state)
     
     found_event = fsm.event_by_name('do_work')
     
     assert found_event == do_work_event
Пример #8
0
    def test_event_object_repr_method(self):
        start_state = State(name='start')
        busy_state = State(name='busy')
        do_work_event = Event(name='Do Work',
                              source_states=[start_state],
                              destination_state=busy_state)
        pattern = re.compile(r'\s0x.[a-z0-9]*')
        match = pattern.search(do_work_event.__repr__())
        result = do_work_event.__repr__().replace(match.group(0), '')

        assert result == '<Event> Do Work'
Пример #9
0
 def test_looking_up_event_by_name_returning_not_found(self):
     start_state = State(name='start')
     busy_state  = State(name='busy')
     do_work_event = Event(name='do_work', source_states=[start_state], destination_state=busy_state)
     
     fsm = StateMachine(states=[start_state, busy_state], events=[do_work_event], initial_state=start_state)
     
     with pytest.raises(StateMachineError) as context_manager:
         found_event = fsm.event_by_name('more_work')
     
     expected_exception = context_manager.value
     assert expected_exception.identifier == STATE_MACHINE.EVENT_NOT_FOUND_IDENTIFIER
Пример #10
0
    def test_initializing_event_failure_with_invalid_source_state(self):
        start_state = State(name='start')
        busy_state = State(name='busy')

        with pytest.raises(StateMachineEventError) as context:
            do_work_event = Event(name='do_work',
                                  source_states=['A', 'B', start_state],
                                  destination_state=busy_state)

        expected_exception = context.value

        assert expected_exception.identifier == STATE_MACHINE.INVALID_EVENT_SOURCE_STATES_IDENTIFIER
Пример #11
0
 def test_state_machine_is_in_correct_state(self):
     start_state = State(name='start')
     busy_state  = State(name='busy')
     do_work_event = Event(name='do_work', source_states=[start_state], destination_state=busy_state)
     
     fsm = StateMachine(states=set([start_state, busy_state]), 
                        events=set([do_work_event]), 
                        initial_state=start_state)
     
     fsm.activate()
     
     assert fsm.in_state(start_state)
Пример #12
0
 def test_in_state_by_name_for_wrong_current_state(self):
     start_state = State(name='start')
     busy_state  = State(name='busy')
     do_work_event = Event(name='do_work', source_states=[start_state], destination_state=busy_state)
     
     fsm = StateMachine(states=set([start_state, busy_state]), 
                        events=set([do_work_event]), 
                        initial_state=start_state)
     
     fsm.activate()
     
     assert fsm.in_state_by_name('busy') == False
Пример #13
0
 def test_firing_event_with_name_with_invalid_event_name(self):
     start_state = State(name='start')
     busy_state  = State(name='busy')
     do_work_event = Event(name='do_work', source_states=[start_state], destination_state=busy_state)
     
     fsm = StateMachine(states=[start_state, busy_state], events=[do_work_event], initial_state=busy_state)
     fsm.activate()
     
     with pytest.raises(StateMachineEventError) as context:
         fsm.fire_event_with_name('do_work')
     
     expected_exception = context.value
     assert expected_exception.identifier == STATE_MACHINE.INVALID_EVENT_IDENTIFIER
Пример #14
0
    def test_did_enter_state_callback_is_invoked(self):
        did_enter_mock = Mock()
        callbacks = StateCallbacks(did_enter_state=did_enter_mock)
        start_state = State(name='start', callbacks=callbacks)
        busy_state  = State(name='busy')
        do_work_event = Event(name='do_work', source_states=[start_state], destination_state=busy_state)

        fsm = StateMachine(states=[start_state, busy_state],
                           events=[do_work_event],
                           initial_state=start_state)

        fsm.activate()

        did_enter_mock.assert_called()
Пример #15
0
 def test_in_state_by_name_for_an_invalid_state(self):
     start_state = State(name='start')
     busy_state  = State(name='busy')
     do_work_event = Event(name='do_work', source_states=[start_state], destination_state=busy_state)
     
     fsm = StateMachine(states=set([start_state, busy_state]), 
                        events=set([do_work_event]), 
                        initial_state=start_state)
     
     fsm.activate()
     
     with pytest.raises(StateMachineError) as context:
         fsm.in_state_by_name('stop')
     
     expected_exception = context.value
     assert expected_exception.identifier == STATE_MACHINE.STATE_NOT_FOUND_IDENTIFIER
Пример #16
0
 def test_initialize_state_machine_with_invalid_events(self):
     start_state = State(name='start')
     
     with pytest.raises(StateMachineError) as context_manager:
         fsm = StateMachine(states=[start_state], events=[], initial_state=start_state)
     
     expected_exception = context_manager.value
     assert expected_exception.identifier == STATE_MACHINE.DOES_NOT_HAVE_EVENTS_IDENTIFIER
Пример #17
0
 def test_initialize_state_machine_with_invalid_intial_state(self):
     start_state = State(name='start')
     do_work_event = Event(name='do_work', source_states=[start_state], destination_state=start_state)
     
     with pytest.raises(StateMachineError) as context_manager:
         fsm = StateMachine(states=[start_state], events=[do_work_event], initial_state=None)
     
     expected_exception = context_manager.value
     assert expected_exception.identifier == STATE_MACHINE.DOES_NOT_HAVE_INITIAL_STATE_IDENTIFIER
Пример #18
0
    def test_event_did_fire_callback(self):
        start_state = State(name='start')
        busy_state = State(name='busy')
        did_fire_mock = Mock()

        do_work_info = EventCallbacks(did_fire_event=did_fire_mock)
        do_work_event = Event(name='do_work',
                              source_states=[start_state],
                              destination_state=busy_state,
                              callbacks=do_work_info)

        fsm = StateMachine(states=set([start_state, busy_state]),
                           events=set([do_work_event]),
                           initial_state=start_state)

        fsm.activate()

        assert fsm.is_active
        assert fsm.fire_event(do_work_event)
        did_fire_mock.assert_called()
Пример #19
0
    def test_event_should_fire_callback(self):
        start_state = State(name='start')
        busy_state = State(name='busy')

        def should_fire_callback(transition):
            return True

        do_work_info = EventCallbacks(should_fire_event=should_fire_callback)
        do_work_event = Event(name='do_work',
                              source_states=[start_state],
                              destination_state=busy_state,
                              callbacks=do_work_info)

        fsm = StateMachine(states=set([start_state, busy_state]),
                           events=set([do_work_event]),
                           initial_state=start_state)

        fsm.activate()

        assert fsm.is_active
        assert fsm.fire_event(do_work_event)
Пример #20
0
 def test_firing_event_that_is_declined(self):
     
     def decline_event(transition):
         return False
     
     start_state = State(name='start')
     busy_state  = State(name='busy')
     
     do_work_info  = EventCallbacks(should_fire_event=decline_event)
     do_work_event = Event(name='do_work',
                           source_states=[start_state], 
                           destination_state=busy_state, 
                           callbacks=do_work_info)
     
     fsm = StateMachine(states=[start_state, busy_state], events=[do_work_event], initial_state=start_state)
     fsm.activate()
     
     with pytest.raises(StateMachineEventError) as context_manager:
         fsm.fire_event(do_work_event)
     
     expected_exception = context_manager.value
     assert expected_exception.identifier == STATE_MACHINE.DECLINED_EVENT_IDENTIFIER
Пример #21
0
    def test_state_object_str_method(self):
        some_state = State(name='Busy')

        assert str(some_state) == '<State Busy>'
Пример #22
0
    def test_initializing_state_successfully(self):
        some_state = State(name='a_state')

        assert some_state.name == 'a_state'