1import sys
2
3import pytest
4
5from ambassador.utils import Timer
6
7epsilon = 0.0001
8
9
10def feq(x: float, y: float) -> bool:
11 return abs(x - y) <= epsilon
12
13
14def test_Timer():
15 t1 = Timer("test1")
16 t2 = Timer("test2")
17
18 assert not t1.running, "t1 must not be running"
19 assert not t2.running, "t2 must not be running"
20
21 t1.start(100)
22 t2.start(100)
23
24 assert t1.running, "t1 must be running"
25 assert feq(t1.starttime, 100), "t1.starttime must be 100, got {t1.starttime}"
26 assert t1.cycles == 0
27
28 assert t2.running, "t2 must be running"
29 assert t2.starttime == 100
30 assert t2.cycles == 0
31
32 a2 = t2.stop(110)
33 assert feq(a2, 10), f"t2.stop() must be 10, got {a2}"
34 assert not t2.running, "t2 must not be running"
35 assert feq(t2.starttime, 100), "t2.starttime must be 100, got {t2.starttime}"
36 assert t2.cycles == 1
37
38 assert feq(t2.accumulated, 10), f"t2.accumulated must be 10, got {t2.accumulated}"
39 assert feq(t2.minimum, 10), f"t2.minimum must be 10, got {t2.minimum}"
40 assert feq(t2.maximum, 10), f"t2.maximum must be 10, got {t2.maximum}"
41 assert feq(t2.average, 10), f"t2.average must be 10, got {t2.average}"
42
43 t2.start(120)
44 assert t2.running, "t2 must be running"
45 assert feq(t2.starttime, 120), "t2.starttime must be 120, got {t2.starttime}"
46 assert t2.cycles == 1
47
48 a2 = t2.stop(140)
49 assert feq(a2, 30), f"t2.stop() must be 30, got {a2}"
50 assert not t2.running, "t2 must not be running"
51 assert t2.starttime == 120
52 assert t2.cycles == 2
53
54 assert feq(t2.accumulated, 30), f"t2.accumulated must be 30, got {t2.accumulated}"
55 assert feq(t2.minimum, 10), f"t2.minimum must be 10, got {t2.minimum}"
56 assert feq(t2.maximum, 20), f"t2.maximum must be 20, got {t2.maximum}"
57 assert feq(t2.average, 15), f"t2.average must be 15, got {t2.average}"
58
59 with t2:
60 assert t2.running, "t2 must be running"
61 # Don't assert t2.starttime() here, since we can't have set it.
62 assert t2.cycles == 2
63
64 t2.faketime(6)
65
66 assert feq(t2.accumulated, 36), f"t2.stop() must be 36, got {t2.accumulated}"
67 assert not t2.running, "t2 must not be running"
68 # Don't assert t2.starttime() here, since we can't have set it.
69 assert t2.cycles == 3
70
71 assert feq(t2.accumulated, 36), f"t2.accumulated must be 36, got {t2.accumulated}"
72 assert feq(t2.minimum, 6), f"t2.minimum must be 6, got {t2.minimum}"
73 assert feq(t2.maximum, 20), f"t2.maximum must be 20, got {t2.maximum}"
74 assert feq(t2.average, 12), f"t2.average must be 12, got {t2.average}"
75
76 a1 = t1.stop(300)
77 assert feq(a1, 200), f"t1.stop() must be 200, got {a1}"
78 assert not t1.running, "t1 must not be running"
79 assert t1.starttime == 100
80 assert t1.cycles == 1
81
82 assert feq(t1.accumulated, 200), f"t1.accumulated must be 200, got {t1.accumulated}"
83 assert feq(t1.minimum, 200), f"t1.minimum must be 200, got {t1.minimum}"
84 assert feq(t1.maximum, 200), f"t1.maximum must be 200, got {t1.maximum}"
85 assert feq(t1.average, 200), f"t1.average must be 200, got {t1.average}"
86
87 # Test calling stop twice...
88 a1 = t1.stop(300)
89 assert feq(a1, 200), f"t1.stop() must be 200, got {a1}"
90 assert not t1.running, "t1 must not be running"
91 assert t1.starttime == 100
92 assert t1.cycles == 1
93
94 assert feq(t1.accumulated, 200), f"t1.accumulated must be 200, got {t1.accumulated}"
95 assert feq(t1.minimum, 200), f"t1.minimum must be 200, got {t1.minimum}"
96 assert feq(t1.maximum, 200), f"t1.maximum must be 200, got {t1.maximum}"
97 assert feq(t1.average, 200), f"t1.average must be 200, got {t1.average}"
98
99 # Test calling start twice...
100 t1.start(400)
101 assert t1.running, "t1 must be running"
102 assert feq(t1.starttime, 400), "t1.starttime must be 400, got {t1.starttime}"
103 assert t1.cycles == 1
104
105 t1.start(500)
106 assert t1.running, "t1 must be running"
107 assert feq(t1.starttime, 500), "t1.starttime must be 500, got {t1.starttime}"
108 assert t1.cycles == 1
109
110 a1 = t1.stop(600)
111 assert feq(a1, 300), f"t1.stop() must be 300, got {a1}"
112 assert not t1.running, "t1 must not be running"
113 assert t1.starttime == 500
114 assert t1.cycles == 2
115
116 assert feq(t1.accumulated, 300), f"t1.accumulated must be 300, got {t1.accumulated}"
117 assert feq(t1.minimum, 100), f"t1.minimum must be 200, got {t1.minimum}"
118 assert feq(t1.maximum, 200), f"t1.maximum must be 300, got {t1.maximum}"
119 assert feq(t1.average, 150), f"t1.average must be 150, got {t1.average}"
120
121
122if __name__ == "__main__":
123 pytest.main(sys.argv)
View as plain text