@@ -67,7 +67,7 @@ def context_manager_wait(qtbot, signal, timeout, multiple, raising,
67
67
(context_manager_wait , 200 , 100 , False , True ),
68
68
]
69
69
)
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 ,
71
71
timeout , expected_signal_triggered , raising ):
72
72
"""
73
73
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,
76
76
signaller = Signaller ()
77
77
single_shot (signaller .signal , emit_delay )
78
78
79
- start_time = time .time ()
80
79
should_raise = raising and not expected_signal_triggered
81
80
81
+ stop_watch .start ()
82
82
blocker = wait_function (qtbot , signaller .signal , timeout , raising = raising ,
83
83
should_raise = should_raise , multiple = False )
84
84
@@ -88,12 +88,7 @@ def test_signal_triggered(qtbot, single_shot, wait_function, emit_delay,
88
88
# ensure that either signal was triggered or timeout occurred
89
89
assert blocker .signal_triggered == expected_signal_triggered
90
90
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 )
97
92
98
93
99
94
@pytest .mark .parametrize (
@@ -114,7 +109,7 @@ def test_signal_triggered(qtbot, single_shot, wait_function, emit_delay,
114
109
(context_manager_wait , 50 , 200 , 100 , False , True ),
115
110
]
116
111
)
117
- def test_signal_triggered_multiple (qtbot , single_shot , wait_function ,
112
+ def test_signal_triggered_multiple (qtbot , single_shot , stop_watch , wait_function ,
118
113
emit_delay_1 , emit_delay_2 , timeout ,
119
114
expected_signal_triggered , raising ):
120
115
"""
@@ -126,7 +121,8 @@ def test_signal_triggered_multiple(qtbot, single_shot, wait_function,
126
121
single_shot (signaller .signal_2 , emit_delay_2 )
127
122
128
123
should_raise = raising and not expected_signal_triggered
129
- start_time = time .time ()
124
+
125
+ stop_watch .start ()
130
126
blocker = wait_function (qtbot , [signaller .signal , signaller .signal_2 ],
131
127
timeout , multiple = True , raising = raising ,
132
128
should_raise = should_raise )
@@ -137,12 +133,7 @@ def test_signal_triggered_multiple(qtbot, single_shot, wait_function,
137
133
# ensure that either signal was triggered or timeout occurred
138
134
assert blocker .signal_triggered == expected_signal_triggered
139
135
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 )
146
137
147
138
148
139
def test_explicit_emit (qtbot ):
@@ -189,3 +180,33 @@ def shoot(signal, delay):
189
180
yield shoot
190
181
for t in timers :
191
182
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