Skip to content

Commit fc19753

Browse files
committed
Refactor singleShot timer code into a fixture
1 parent 187eab3 commit fc19753

File tree

1 file changed

+36
-23
lines changed

1 file changed

+36
-23
lines changed

pytestqt/_tests/test_wait_signal.py

Lines changed: 36 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
1-
import pytest
21
import time
32

3+
import pytest
4+
45
from pytestqt.qt_compat import QtCore, Signal
56

67

78
class Signaller(QtCore.QObject):
8-
99
signal = Signal()
1010
signal_2 = Signal()
1111

@@ -24,7 +24,7 @@ def explicit_wait(qtbot, signal, timeout, multiple, raising, raises):
2424
Explicit wait for the signal using blocker API.
2525
"""
2626
func = qtbot.waitSignals if multiple else qtbot.waitSignal
27-
blocker = func(signal, timeout, raising=raising)
27+
blocker = func(signal, timeout, raising=raising)
2828
assert not blocker.signal_triggered
2929
if raises:
3030
with pytest.raises(qtbot.SignalTimeoutError):
@@ -38,7 +38,7 @@ def context_manager_wait(qtbot, signal, timeout, multiple, raising, raises):
3838
"""
3939
Waiting for signal using context manager API.
4040
"""
41-
func = qtbot.waitSignals if multiple else qtbot.waitSignal
41+
func = qtbot.waitSignals if multiple else qtbot.waitSignal
4242
if raises:
4343
with pytest.raises(qtbot.SignalTimeoutError):
4444
with func(signal, timeout, raising=raising) as blocker:
@@ -66,24 +66,20 @@ def context_manager_wait(qtbot, signal, timeout, multiple, raising, raises):
6666
(context_manager_wait, 2000, 500, False, True),
6767
]
6868
)
69-
def test_signal_triggered(qtbot, wait_function, emit_delay, timeout,
69+
def test_signal_triggered(qtbot, single_shot, wait_function, emit_delay, timeout,
7070
expected_signal_triggered, raising):
7171
"""
7272
Testing for a signal in different conditions, ensuring we are obtaining
7373
the expected results.
7474
"""
7575
signaller = Signaller()
76-
77-
timer = QtCore.QTimer()
78-
timer.setSingleShot(True)
79-
timer.timeout.connect(signaller.signal.emit)
80-
timer.start(emit_delay)
76+
single_shot(signaller.signal, emit_delay)
8177

8278
start_time = time.time()
8379
raises = raising and not expected_signal_triggered
8480

8581
blocker = wait_function(qtbot, signaller.signal, timeout, raising=raising,
86-
raises=raises, multiple=False)
82+
raises=raises, multiple=False)
8783

8884
# Check that event loop exited.
8985
assert not blocker._loop.isRunning()
@@ -113,31 +109,27 @@ def test_signal_triggered(qtbot, wait_function, emit_delay, timeout,
113109
(context_manager_wait, 2000, 2000, 500, False, False),
114110
(context_manager_wait, 500, 2000, 1000, False, False),
115111
(context_manager_wait, 2000, 500, 1000, False, False),
112+
(context_manager_wait, 2000, 500, 1000, False, True),
113+
(context_manager_wait, 500, 2000, 1000, False, True),
116114
]
117115
)
118-
def test_signal_triggered_multiple(qtbot, wait_function, emit_delay_1,
116+
def test_signal_triggered_multiple(qtbot, single_shot, wait_function,
117+
emit_delay_1,
119118
emit_delay_2, timeout,
120119
expected_signal_triggered, raising):
121120
"""
122121
Testing for a signal in different conditions, ensuring we are obtaining
123122
the expected results.
124123
"""
125124
signaller = Signaller()
126-
127-
timer = QtCore.QTimer()
128-
timer.setSingleShot(True)
129-
timer.timeout.connect(signaller.signal.emit)
130-
timer.start(emit_delay_1)
131-
132-
timer2 = QtCore.QTimer()
133-
timer2.setSingleShot(True)
134-
timer2.timeout.connect(signaller.signal_2.emit)
135-
timer2.start(emit_delay_2)
125+
single_shot(signaller.signal, emit_delay_1)
126+
single_shot(signaller.signal_2, emit_delay_2)
136127

137128
raises = raising and not expected_signal_triggered
138129
start_time = time.time()
139130
blocker = wait_function(qtbot, [signaller.signal, signaller.signal_2],
140-
timeout, multiple=True, raising=raising, raises=raises)
131+
timeout, multiple=True, raising=raising,
132+
raises=raises)
141133

142134
# Check that event loop exited.
143135
assert not blocker._loop.isRunning()
@@ -175,3 +167,24 @@ def test_explicit_emit_multiple(qtbot):
175167
signaller.signal_2.emit()
176168

177169
assert waiting.signal_triggered
170+
171+
172+
@pytest.yield_fixture
173+
def single_shot():
174+
"""
175+
Fixture that provides a callback with signature: (signal, delay) that
176+
triggers that signal once after the given delay in ms.
177+
178+
The fixture is responsible for cleaning up after the timers.
179+
"""
180+
def shoot(signal, delay):
181+
timer = QtCore.QTimer()
182+
timer.setSingleShot(True)
183+
timer.timeout.connect(signal.emit)
184+
timer.start(delay)
185+
timers.append(timer)
186+
187+
timers = []
188+
yield shoot
189+
for t in timers:
190+
t.stop()

0 commit comments

Comments
 (0)