Passed
Push — master ( 87fd0f...6004a9 )
by Konstantinos
56s
created

test_termination_condition.iterative_loop()   A

Complexity

Conditions 4

Size

Total Lines 35
Code Lines 31

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 31
dl 0
loc 35
rs 9.1359
c 0
b 0
f 0
cc 4
nop 0
1
import pytest
2
3
4
@pytest.fixture
5
def iterative_loop():
6
    def _max_iterations_loop(termination_condition):
7
        i = 0
8
        while not termination_condition.satisfied(i):
9
            print(f'_max_iterations_loop {i}')
10
            i += 1
11
        return i
12
13
    import time
14
    def _max_time_limit_loop(termination_condition):
15
        starting_time = time.time()
16
        i = 0
17
        duration = 0
18
        while not termination_condition.satisfied(duration):
19
            print(f'_max_time_limit_loop {i, duration}')
20
            duration += time.time() - starting_time
21
            i += 1
22
        return i
23
24
    def _convergence_loop(termination_condition):
25
        i = 0
26
        cost_improvement = 100
27
        while not termination_condition.satisfied(cost_improvement):
28
            print(f'_convergence_loop {i}')
29
            i += 1
30
            cost_improvement *= 0.1
31
        return i
32
33
    condition_type_2_loop = {
34
        'max-iterations': _max_iterations_loop,
35
        'time-limit': _max_time_limit_loop,
36
        'convergence': _convergence_loop,
37
    }
38
    return condition_type_2_loop
39
40
41
@pytest.fixture
42
def monkeypatch_time(monkeypatch):
43
    def patch(base_time: float, step: float):
44
        def __call__(self):
45
            self.i += 1
46
            return self.starting_timestamp + self.i * step
47
        mock_time_callable = type('TimeMock', (), {
48
            '__call__': __call__,
49
            'i': -1,
50
            'starting_timestamp': base_time,
51
        })()
52
53
        import time
54
        monkeypatch.setattr(time, 'time', mock_time_callable)
55
    return patch
56
57
58
@pytest.fixture(params=[
59
    ['max-iterations', [0], 0],
60
    ['max-iterations', [2], 2],
61
    ['time-limit', [1], 1],
62
    ['time-limit', [2], 2],
63
    ['convergence', [0.01], 5],
64
])
65
def termination_condition_data(request, termination_condition, iterative_loop, monkeypatch_time):
66
    monkeypatch_time(100, 1)
67
    return type('D', (), {
68
        'termination_condition': termination_condition(request.param[0], *request.param[1]),
69
        'loop': iterative_loop[request.param[0]],
70
        'expected_completed_iterations': request.param[2],
71
    })
72
73
def test_term(termination_condition_data):
74
    iterations = termination_condition_data.loop(termination_condition_data.termination_condition)
75
    assert iterations == termination_condition_data.expected_completed_iterations
76