Skip to content

Commit d54cd87

Browse files
committed
Create stop_watch fixture to reduce test boilerplate
1 parent bcfb9a6 commit d54cd87

File tree

1 file changed

+37
-16
lines changed

1 file changed

+37
-16
lines changed

pytestqt/_tests/test_wait_signal.py

Lines changed: 37 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ def context_manager_wait(qtbot, signal, timeout, multiple, raising,
6767
(context_manager_wait, 200, 100, False, True),
6868
]
6969
)
70-
def test_signal_triggered(qtbot, single_shot, wait_function, emit_delay,
70+
def test_signal_triggered(qtbot, single_shot, stop_watch, wait_function, emit_delay,
7171
timeout, expected_signal_triggered, raising):
7272
"""
7373
Testing for a signal in different conditions, ensuring we are obtaining
@@ -76,9 +76,9 @@ def test_signal_triggered(qtbot, single_shot, wait_function, emit_delay,
7676
signaller = Signaller()
7777
single_shot(signaller.signal, emit_delay)
7878

79-
start_time = time.time()
8079
should_raise = raising and not expected_signal_triggered
8180

81+
stop_watch.start()
8282
blocker = wait_function(qtbot, signaller.signal, timeout, raising=raising,
8383
should_raise=should_raise, multiple=False)
8484

@@ -88,12 +88,7 @@ def test_signal_triggered(qtbot, single_shot, wait_function, emit_delay,
8888
# ensure that either signal was triggered or timeout occurred
8989
assert blocker.signal_triggered == expected_signal_triggered
9090

91-
# Check that we exited by the earliest parameter; timeout = None means
92-
# wait forever, so ensure we waited at most 4 times emit-delay
93-
if timeout is None:
94-
timeout = emit_delay * 4
95-
max_wait_ms = max(emit_delay, timeout)
96-
assert time.time() - start_time < (max_wait_ms / 1000.0)
91+
stop_watch.check(timeout, emit_delay)
9792

9893

9994
@pytest.mark.parametrize(
@@ -114,7 +109,7 @@ def test_signal_triggered(qtbot, single_shot, wait_function, emit_delay,
114109
(context_manager_wait, 50, 200, 100, False, True),
115110
]
116111
)
117-
def test_signal_triggered_multiple(qtbot, single_shot, wait_function,
112+
def test_signal_triggered_multiple(qtbot, single_shot, stop_watch, wait_function,
118113
emit_delay_1, emit_delay_2, timeout,
119114
expected_signal_triggered, raising):
120115
"""
@@ -126,7 +121,8 @@ def test_signal_triggered_multiple(qtbot, single_shot, wait_function,
126121
single_shot(signaller.signal_2, emit_delay_2)
127122

128123
should_raise = raising and not expected_signal_triggered
129-
start_time = time.time()
124+
125+
stop_watch.start()
130126
blocker = wait_function(qtbot, [signaller.signal, signaller.signal_2],
131127
timeout, multiple=True, raising=raising,
132128
should_raise=should_raise)
@@ -137,12 +133,7 @@ def test_signal_triggered_multiple(qtbot, single_shot, wait_function,
137133
# ensure that either signal was triggered or timeout occurred
138134
assert blocker.signal_triggered == expected_signal_triggered
139135

140-
# Check that we exited by the earliest parameter; timeout = None means
141-
# wait forever, so ensure we waited at most 4 times emit-delay
142-
if timeout is None:
143-
timeout = max(emit_delay_1, emit_delay_2) * 4
144-
max_wait_ms = max(emit_delay_1, emit_delay_2, timeout)
145-
assert time.time() - start_time < (max_wait_ms / 1000.0)
136+
stop_watch.check(timeout, emit_delay_1, emit_delay_2)
146137

147138

148139
def test_explicit_emit(qtbot):
@@ -189,3 +180,33 @@ def shoot(signal, delay):
189180
yield shoot
190181
for t in timers:
191182
t.stop()
183+
184+
185+
@pytest.fixture
186+
def stop_watch():
187+
"""
188+
Fixture that makes it easier for tests to ensure signals emitted and
189+
timeouts are being respected in waitSignal and waitSignals tests.
190+
"""
191+
192+
class StopWatch:
193+
194+
def __init__(self):
195+
self._start_time = None
196+
197+
def start(self):
198+
self._start_time = time.time()
199+
200+
def check(self, timeout, *delays):
201+
"""
202+
Make sure either timeout (if given) or at most of the given
203+
delays used to trigger a signal has passed.
204+
"""
205+
if timeout is None:
206+
timeout = max(delays) * 1.1 # 10% tolerance
207+
max_wait_ms = max(delays + (timeout,))
208+
assert time.time() - self._start_time < (max_wait_ms / 1000.0)
209+
210+
return StopWatch()
211+
212+

0 commit comments

Comments
 (0)