Beispiel #1
0
def test_digraph_one_model_execute_next_event_at_infinity(
        digraph_one_model, mocker):
    model = list(digraph_one_model)[0]
    delta_int = mocker.patch.object(model, 'delta_int')
    simulator = devs.Simulator(digraph_one_model)
    simulator.execute_next_event()
    assert not delta_int.called
Beispiel #2
0
def test_delta_conf(mocker):
    source = TestAtomic()
    processor = TestAtomic()
    observer = TestAtomic()

    mocker.patch.object(source, 'ta', return_value=1.0)
    mocker.patch.object(source, 'output_func', return_value=(0, 1))
    mocker.patch.object(processor, 'ta', return_value=1.0)
    mocker.patch.object(processor, 'output_func', return_value=(0, 2))
    deltas = ['int', 'ext', 'conf']
    processor_delta_func = {
        delta: mocker.patch.object(processor, 'delta_{}'.format(delta))
        for delta in deltas
    }
    obs_delta_ext = mocker.patch.object(observer, 'delta_ext')

    digraph = devs.Digraph()
    digraph.add(source)
    digraph.add(processor)
    digraph.add(observer)
    digraph.couple(source, 0, processor, 0)
    digraph.couple(source, 0, observer, 0)
    digraph.couple(processor, 0, observer, 0)

    simulator = devs.Simulator(digraph)
    simulator.execute_next_event()

    assert not processor_delta_func['int'].called
    assert not processor_delta_func['ext'].called
    processor_delta_func['conf'].assert_called_once_with([(0, 1)])
    assert obs_delta_ext.call_count == 1
    assert obs_delta_ext.call_args[0][0] == 1.0
    assert len(obs_delta_ext.call_args[0][1]) == 2
    assert (0, 1) in obs_delta_ext.call_args[0][1]
    assert (0, 2) in obs_delta_ext.call_args[0][1]
Beispiel #3
0
def test_atomic_calls_output_func(atomic, mocker):
    output_func = mocker.patch.object(atomic,
                                      'output_func',
                                      return_value=(1, 2))
    mocker.patch.object(atomic, 'ta', return_value=1.0)
    simulator = devs.Simulator(atomic)
    assert not output_func.called
    simulator.execute_next_event()
    assert output_func.call_count == 1
Beispiel #4
0
def test_atomic_raises_error_if_returns_tuple_not_length_2(atomic, mocker):
    mocker.patch.object(atomic, 'output_func', return_value=(1, 2, 3))
    mocker.patch.object(atomic, 'ta', return_value=1.0)
    simulator = devs.Simulator(atomic)
    with pytest.raises(RuntimeError) as ex:
        simulator.execute_next_event()
    del simulator
    assert isinstance(ex.value, RuntimeError)
    exception_msg = str(ex.value)
    assert exception_msg.startswith("Python traceback follows:")
    assert "output_func needs to return tuple of length 2, got length 3" in exception_msg
Beispiel #5
0
def test_atomic_execute_next_event(atomic, mocker):
    mocker.patch.object(atomic, 'ta', return_value=1.0)
    devs_func = {
        func: mocker.patch.object(atomic, func)
        for func in ['delta_int', 'delta_ext', 'delta_conf', 'output_func']
    }
    simulator = devs.Simulator(atomic)
    simulator.execute_next_event()
    assert devs_func['delta_int'].call_count == 1
    assert devs_func['output_func'].call_count == 1
    assert not devs_func['delta_ext'].called
    assert not devs_func['delta_conf'].called
    assert simulator.next_event_time() == 2.0
Beispiel #6
0
def test_digraph_one_model_execute_next_event(digraph_one_model, mocker):
    model = list(digraph_one_model)[0]
    mocker.patch.object(model, 'ta', return_value=1.0)
    devs_func = {
        func: mocker.patch.object(model, func)
        for func in ['delta_int', 'delta_ext', 'delta_conf', 'output_func']
    }
    simulator = devs.Simulator(model)
    simulator.execute_next_event()
    assert devs_func['delta_int'].call_count == 1
    assert devs_func['output_func'].call_count == 1
    assert not devs_func['delta_ext'].called
    assert not devs_func['delta_conf'].called
    assert simulator.next_event_time() == 2.0
Beispiel #7
0
def test_simulator_exception_handled():
    source = Source()

    digraph = devs.Digraph()
    digraph.add(source)

    simulator = devs.Simulator(digraph)
    with pytest.raises(RuntimeError) as ex:
        simulator.execute_next_event()
    del simulator
    assert isinstance(ex.value, RuntimeError)
    exception_msg = str(ex.value)
    assert exception_msg.startswith("Python traceback follows:")
    assert "Intentional error in delta_int" in exception_msg
Beispiel #8
0
def test_digraph_two_models_execute_next_event(digraph_two_models, mocker):
    models = list(digraph_two_models)
    for model, ta in zip(models, [1.0, 1.2]):
        mocker.patch.object(model, 'ta', return_value=ta)
    delta_ints = [mocker.patch.object(model, 'delta_int') for model in models]
    simulator = devs.Simulator(digraph_two_models)
    assert not delta_ints[0].called
    simulator.execute_next_event()
    assert delta_ints[0].call_count == 1
    assert not delta_ints[1].called
    simulator.execute_next_event()
    assert delta_ints[0].call_count == 1
    assert delta_ints[1].call_count == 1
    assert simulator.next_event_time() == 2.0
Beispiel #9
0
def test_source_feeds_to_observer(mocker):
    source = TestAtomic()
    observer = TestAtomic()

    mocker.patch.object(source, 'ta', return_value=1.0)
    mocker.patch.object(source, 'output_func', return_value=(0, 1))
    obs_delta_ext = mocker.patch.object(observer, 'delta_ext')

    digraph = devs.Digraph()
    digraph.add(source)
    digraph.add(observer)
    digraph.couple(source, 0, observer, 0)

    simulator = devs.Simulator(digraph)
    simulator.execute_next_event()

    obs_delta_ext.assert_called_once_with(1.0, [(0, 1)])
Beispiel #10
0
def test_atomic_raises_error_if_returns_tuple_not_length_2(atomic, mocker):
    mocker.patch.object(atomic, 'output_func', return_value=(1, 2, 3))
    mocker.patch.object(atomic, 'ta', return_value=1.0)
    simulator = devs.Simulator(atomic)
    with pytest.raises(ValueError):
        simulator.execute_next_event()
Beispiel #11
0
def test_add_digraph_with_one_model(digraph_one_model):
    devs.Simulator(digraph_one_model)
Beispiel #12
0
def test_atomic_next_event_time(atomic, mocker):
    mocker.patch.object(atomic, 'ta', return_value=1.0)
    simulator = devs.Simulator(atomic)
    assert simulator.next_event_time() == 1.0
Beispiel #13
0
def test_atomic_no_event(atomic):
    simulator = devs.Simulator(atomic)
    assert simulator.next_event_time() == devs.infinity
Beispiel #14
0
def test_add_atomic_model(atomic):
    devs.Simulator(atomic)
Beispiel #15
0
def test_add_atomic_base_model_fails():
    model = devs.AtomicBase()

    with pytest.raises(TypeError):
        devs.Simulator(model)
Beispiel #16
0
def test_digraph_with_one_model_no_event(digraph_one_model):
    simulator = devs.Simulator(digraph_one_model)
    assert simulator.next_event_time() == devs.infinity
Beispiel #17
0
def test_add_digraph(digraph):
    devs.Simulator(digraph)
Beispiel #18
0
def test_digraph_with_one_model_next_event_time(digraph_one_model, mocker):
    model = list(digraph_one_model)[0]
    mocker.patch.object(model, 'ta', return_value=1.0)
    simulator = devs.Simulator(digraph_one_model)
    assert simulator.next_event_time() == 1.0
Beispiel #19
0
def test_digraph_execute_next_event(digraph):
    simulator = devs.Simulator(digraph)
    simulator.execute_next_event()
    assert simulator.next_event_time() == devs.infinity
Beispiel #20
0
def test_add_digraph_with_two_models_no_event(digraph_two_models):
    simulator = devs.Simulator(digraph_two_models)
    assert simulator.next_event_time() == devs.infinity
Beispiel #21
0
def test_atomic_execute_next_event_at_infinity_does_not_delta_int(
        atomic, mocker):
    delta_int = mocker.patch.object(atomic, 'delta_int')
    simulator = devs.Simulator(atomic)
    simulator.execute_next_event()
    assert not delta_int.called
Beispiel #22
0
def test_add_digraph_with_two_models_next_event_time(digraph_two_models,
                                                     mocker):
    models = list(digraph_two_models)
    mocker.patch.object(models[1], 'ta', return_value=1.0)
    simulator = devs.Simulator(digraph_two_models)
    assert simulator.next_event_time() == 1.0