def test_new_transition_needs_existing_to_state(self):
        sm = StateMachine()
        sm.add(State('t'))

        with pytest.raises(AssertionError):
            t = Transition('f', ['t'])
            sm.add(t)
    def test_add_Transition(self):
        sm = StateMachine()
        sm.add(State('f'))
        sm.add(State('t'))

        t = Transition('f', ['t'])
        sm.add(t)
        assert sm.transitions == {'f': t}
    def test_can_transition(self):
        sm = StateMachine()
        sm.add(State('online', is_starting_state=True))
        sm.add(State('offline'))
        sm.add(State('error'))

        sm.add(Transition('online', ['offline', 'error']))

        assert sm.can_transition_to('offline')
        assert sm.can_transition_to('error')
    def test_cant_transition_without_starting_state(self):
        sm = StateMachine()
        sm.add(State('online'))
        sm.add(State('offline'))
        sm.add(State('error'))

        sm.add(Transition('online', ['offline', 'error']))

        with pytest.raises(Exception):
            sm.can_transition_to('offline')
            sm.can_transition_to('error')
    def test_transition(self):
        sm = StateMachine()
        sm.add(State('online', is_starting_state=True))
        sm.add(State('offline'))

        sm.add(Transition('online', ['offline']))
        sm.transition_to('offline')
    def test_hooks_order(self):
        result = []

        def hook(s):
            def h():
                result.append(s)

            return h

        sm = StateMachine()
        sm.add(
            State('online',
                  is_starting_state=True,
                  will_exit=hook('onwex'),
                  exited=hook('onex')))
        sm.add(State('offline', will_enter=hook('ofwen'),
                     entered=hook('ofen')))

        sm.add(
            Transition('online', ['offline'],
                       before=hook('tb'),
                       after=hook('ta')))
        sm.transition_to('offline')

        assert result == ['tb', 'onwex', 'ofwen', 'onex', 'ofen', 'ta']
    def test_transitions_arent_two_way(self):
        sm = StateMachine()
        sm.add(State('online', is_starting_state=True))
        sm.add(State('offline'))

        sm.add(Transition('offline', ['online']))

        assert not sm.can_transition_to('offline')
    def test_cant_transition_where_cant_transition_to(self):
        sm = StateMachine()
        sm.add(State('online', is_starting_state=True))
        sm.add(State('offline'))

        sm.add(Transition('offline', ['online']))

        assert not sm.can_transition_to('offline')
        with pytest.raises(Exception):
            sm.transition_to('offline')
    def test_adding_invalid_type(self):
        sm = StateMachine()

        with pytest.raises(Exception):
            sm.add('j')
    def test_add_state(self):
        sm = StateMachine()

        s = State('s')
        sm.add(s)
        assert sm.states == {'s': s}
示例#11
0
from statemachine import StateMachine
from fileparser import FileParser

input_file = 'SampleStateTransitions.csv'
output_file = 'output/StateMachine'
output_format = 'svg'

# Parse csv file
nodes, transitions = FileParser.parse(input_file)

# Create state machine and render it
state_machine = StateMachine(output_format)
state_machine.add(nodes, transitions)
state_machine.render(output_file)