def test_signal_wait_a_while(): sim = Simulator() signal = Signal().turn_off() log = [] expectation = [3.0, 4.0] sim.add(wait_for, signal, expectation, 1.0, log) sim._schedule(3.0, signal.turn_on) sim.run() assert expectation == log
def test_schedule_multiple_events(): ll = [] sim = Simulator() sim._schedule(1.0, append, 1, ll) sim._schedule(0.7, append, 2, ll) sim._schedule(10.0, append, 3, ll) sim.run() assert ll == [2, 1, 3] assert sim.now() == 10.0
def test_schedule_recurring(): ll = [0] def _append(): if sim.now() <= 10.0: ll.append(ll[-1] + 1) sim._schedule(1.0, _append) else: sim.stop() sim = Simulator() sim._schedule(1.0, _append) sim.run() assert sim.now() == 11.0 assert ll == list(range(11))
def sim_cancellable(): ll = [] sim = Simulator() id_event = [] for n in [1, 3, 5]: id_event.append(sim._schedule(n, append, n, ll)) return ll, sim, id_event
def test_signal_waiter_turning_off(): def waiter_turning_off(signal: Signal, log: List[float]): signal.wait() signal.turn_off() log.append(now()) sim = Simulator() signal = Signal().turn_off() log_time = [] for n in range(5): sim.add(waiter_turning_off, signal, log_time) schedule_signal_on = [4.0, 9.0, 9.1, 200.0, 3000.0] for moment in schedule_signal_on: sim._schedule(moment, signal.turn_on) sim.run() assert schedule_signal_on == pytest.approx(log_time)
def test_schedule_functions(): def f1(sim, results): res = f"1 + {sim.now()}" results.append(res) def f2(sim, results): res = f"2 + {sim.now()}" results.append(res) sim = Simulator() results = [] sim._schedule(1, f1, sim, results) sim._schedule(2, f2, sim, results) sim._schedule(3, f1, sim, results) sim.run() assert ['1 + 1.0', '2 + 2.0', '1 + 3.0'] == results
def test_signal_toggling(): sim = Simulator() signal = Signal().turn_off() log = [] expectation = [3.0, 4.0, 10.0, 13.0, 14.0, 15.0] sim.add(wait_for, signal, expectation, 1.0, log) sim._schedule(3.0, signal.turn_on) sim._schedule(4.5, signal.turn_off) sim._schedule(10.0, signal.turn_on) sim._schedule(10.1, signal.turn_off) sim._schedule(13.0, signal.turn_on) sim.run() assert expectation == log
def test_progress_capture(): log = [] def capture(progress_min, _rt_remaining, mc): log.append(progress_min) a = 0 b = 0 def set_ab(new_a, new_b): nonlocal a, b a = new_a b = new_b def measure(): return (a, b) sim = Simulator() sim.add(track_progress, measure, [10, 10], 10.0, capture) sim._schedule(15.0, set_ab, 2, 0) sim._schedule(25.0, set_ab, 4, 1) sim._schedule(35.0, set_ab, 4, 6) sim._schedule(45.0, set_ab, 5, 9) sim._schedule(55.0, set_ab, 10, 10) sim.run(100.0) assert sim.now() == pytest.approx(60.0) assert log == pytest.approx([0.0, 0.0, 0.1, 0.4, 0.5, 1.0])
def test_schedule_negative(): sim = Simulator() ll = [] with pytest.raises(ValueError): sim._schedule(-0.5, append, 1, ll)
def test_schedule_1_event(): ll = [] sim = Simulator() sim._schedule(1.0, append, 1, ll) sim.run() assert ll == [1]