Example #1
0
def test_lifecycles_called(lifecycle_machine):
    machine = StateMachine(lifecycle_machine)
    lifecycles = machine.blueprint["lifecycles"]

    before_any = lifecycles["before"][0]["actions"][0]
    mock_before_any = create_autospec(before_any)
    lifecycles["before"][0]["actions"][0] = mock_before_any

    after_accepted = lifecycles["after"][0]["actions"][0]
    mock_after_accepted = create_autospec(after_accepted)
    lifecycles["after"][0]["actions"][0] = mock_after_accepted

    after_three = lifecycles["after"][0]["actions"][1]
    mock_after_three = create_autospec(after_three)
    lifecycles["after"][0]["actions"][1] = mock_after_three

    for event in range(2, 5):
        machine.transition(event)

        if event == 3:
            mock_after_accepted.assert_called_once()
            mock_after_accepted.assert_called_once()

    assert mock_before_any.call_count == 3
    assert mock_after_accepted.call_count == 1
    assert mock_after_three.call_count == 1
Example #2
0
def test_transition_accepted(simple_machine, event=3):
    machine = StateMachine(simple_machine)

    machine.transition(event)
    assert machine.state == event
    assert not machine.initial
    assert machine.accepted
    assert not machine.final
Example #3
0
def test_transition_function(simple_machine, event=1):
    mock_transition = MagicMock(return_value=event)
    simple_machine["transition"] = mock_transition
    machine = StateMachine(simple_machine)

    machine.transition(event)
    mock_transition.assert_called_once_with(machine.state, machine.context,
                                            event)
Example #4
0
def test_blueprint(simple_machine):
    machine = StateMachine(simple_machine)

    for state in simple_machine["validStates"]:
        assert machine.is_valid(state)

    for state in simple_machine["acceptedStates"]:
        assert machine.is_accepted(state)

    for state in simple_machine["finalStates"]:
        assert machine.is_final(state)

    assert machine.initial
    assert not machine.accepted
    assert not machine.final
Example #5
0
def test_transition_context(simple_machine, event=2):
    def transition(state, context, event):
        context["value"] = event
        return event

    simple_machine["transition"] = transition
    machine = StateMachine(simple_machine)

    assert machine.context == simple_machine.get("context", dict())

    machine.transition(event)

    assert machine.state == event
    assert machine.context["value"] == event
    assert not machine.initial
    assert not machine.accepted
    assert not machine.final
Example #6
0
def test_machine(binary_multiples):
    results = list()

    for _ in range(100):
        machine = StateMachine(binary_multiples)
        result = 0

        while not machine.is_accepted(machine.state) \
                or not result or result in results:
            event = choice(list(machine.blueprint["alphabet"]))

            machine.transition(event)

            result = machine.context["value"]

        print(f"{machine}: {result:b} ({result})")
        assert result % machine.context["divisor"] == 0
        results.append(result)
Example #7
0
def test_transition_final_state(simple_machine, event=4):
    machine = StateMachine(simple_machine)

    machine.transition(event)
    assert machine.state == event
    assert not machine.initial
    assert not machine.accepted

    assert machine.final
    assert machine.is_final(machine.state)

    with raises(StopMachine):
        machine.transition(event)
Example #8
0
def test_reset(simple_machine, event=3):
    def transition(state, context, event):
        context["value"] = event
        return event

    simple_machine["transition"] = transition
    machine = StateMachine(simple_machine)

    machine.transition(event)
    assert machine.context == {"value": event}

    machine.reset()
    assert machine.initial
    assert machine.context == simple_machine.get("context", dict())
Example #9
0
def test_lifecycles_context(lifecycle_machine):
    machine = StateMachine(lifecycle_machine)

    for event in range(2, 5):
        state = machine.state

        machine.transition(event)
        assert machine.context[f"before_{event}"] == state

        if event == 3:
            assert machine.context[f"after_accepted"] == machine.state
            assert machine.context[f"after_{event}"] == machine.state

    machine.reset()
    assert machine.context == {}
Example #10
0
def test_invalid_machine():
    with raises(ValueError):
        StateMachine(dict())
Example #11
0
def test_blueprint_invalid_initial_state(simple_machine):
    simple_machine["initialState"] = -1

    with raises(ValueError):
        StateMachine(simple_machine)
Example #12
0
def test_default_machine(default_machine):
    machine = StateMachine(default_machine)

    assert machine.context == dict()
    assert not machine.is_accepted(machine.state)
    assert not machine.is_final(machine.state)
Example #13
0
def test_transition_invalid_state(simple_machine, event=1):
    simple_machine["transition"] = lambda *_: -1
    machine = StateMachine(simple_machine)

    with raises(ValueError):
        machine.transition(event)
Example #14
0
def test_transition_invalid_event(simple_machine):
    machine = StateMachine(simple_machine)

    with raises(ValueError):
        machine.transition(-1)