@@ -239,10 +239,79 @@ async def check_set_and_wait():
239239 )
240240 )
241241
242- with pytest .raises (TimeoutError ):
242+ with pytest .raises (asyncio . TimeoutError ):
243243 await asyncio .gather (wait_and_set_read (), check_set_and_wait ())
244244
245245
246+ async def test_status_of_set_and_wait_for_value ():
247+ set_signal = epics_signal_rw (int , "pva://signal" )
248+ match_signal = epics_signal_rw (int , "pva://match_signal" )
249+
250+ async def set_match_signal_after_delay (value : Any , ** kwargs ):
251+ await asyncio .sleep (0.3 )
252+ await match_signal .set (value / 2 )
253+
254+ await set_signal .connect (mock = True )
255+ await match_signal .connect (mock = True )
256+ callback_on_mock_put (set_signal , set_match_signal_after_delay ) # type: ignore
257+
258+ status = await set_and_wait_for_value (set_signal , 2 )
259+ assert status .done
260+
261+ with pytest .raises (asyncio .TimeoutError ):
262+ status = await set_and_wait_for_value (set_signal , 4 , timeout = 0.1 )
263+
264+ with pytest .raises (asyncio .TimeoutError ):
265+ status = await set_and_wait_for_value (
266+ set_signal , 8 , timeout = 0.1 , wait_for_set_completion = False
267+ )
268+
269+ status = await set_and_wait_for_other_value (set_signal , 32 , match_signal , 16 )
270+ assert status .done
271+
272+ status = await set_and_wait_for_other_value (
273+ set_signal , 30 , match_signal , 15 , wait_for_set_completion = False
274+ )
275+ assert not status .done
276+ await status
277+
278+ with pytest .raises (asyncio .TimeoutError ):
279+ status = await set_and_wait_for_other_value (
280+ set_signal , 30 , match_signal , - 1 , timeout = 0.5
281+ )
282+
283+
284+ async def test_callable_match_value_set_and_wait_for_value ():
285+ set_signal = epics_signal_rw (int , "pva://signal" )
286+ match_signal = epics_signal_rw (int , "pva://match_signal" )
287+
288+ async def set_match_signal_after_delay (value : Any , ** kwargs ):
289+ await asyncio .sleep (0.3 )
290+ await match_signal .set (value / 2 )
291+
292+ await set_signal .connect (mock = True )
293+ await match_signal .connect (mock = True )
294+ callback_on_mock_put (set_signal , set_match_signal_after_delay ) # type: ignore
295+
296+ def _equals_x (value , x ):
297+ return value == x
298+
299+ status = await set_and_wait_for_value (
300+ set_signal , 10 , lambda val : _equals_x (val , 10 )
301+ )
302+ assert status .done
303+
304+ status = await set_and_wait_for_other_value (
305+ set_signal , 20 , match_signal , lambda val : _equals_x (val , 10 )
306+ )
307+ assert status .done
308+
309+ with pytest .raises (asyncio .TimeoutError ):
310+ status = await set_and_wait_for_other_value (
311+ set_signal , 30 , match_signal , lambda val : _equals_x (val , - 1 ), timeout = 0.5
312+ )
313+
314+
246315async def test_wait_for_value_with_value ():
247316 signal = epics_signal_rw (str , read_pv = "pva://signal" , name = "signal" )
248317 await signal .connect (mock = True )
0 commit comments