@@ -413,23 +413,23 @@ def func_repr(func):
413413 def test_copy_state (self ):
414414 from asyncio .futures import _copy_future_state
415415
416- f = self . _new_future ( loop = self . loop )
416+ f = concurrent . futures . Future ( )
417417 f .set_result (10 )
418418
419419 newf = self ._new_future (loop = self .loop )
420420 _copy_future_state (f , newf )
421421 self .assertTrue (newf .done ())
422422 self .assertEqual (newf .result (), 10 )
423423
424- f_exception = self . _new_future ( loop = self . loop )
424+ f_exception = concurrent . futures . Future ( )
425425 f_exception .set_exception (RuntimeError ())
426426
427427 newf_exception = self ._new_future (loop = self .loop )
428428 _copy_future_state (f_exception , newf_exception )
429429 self .assertTrue (newf_exception .done ())
430430 self .assertRaises (RuntimeError , newf_exception .result )
431431
432- f_cancelled = self . _new_future ( loop = self . loop )
432+ f_cancelled = concurrent . futures . Future ( )
433433 f_cancelled .cancel ()
434434
435435 newf_cancelled = self ._new_future (loop = self .loop )
@@ -441,7 +441,7 @@ def test_copy_state(self):
441441 except BaseException as e :
442442 f_exc = e
443443
444- f_conexc = self . _new_future ( loop = self . loop )
444+ f_conexc = concurrent . futures . Future ( )
445445 f_conexc .set_exception (f_exc )
446446
447447 newf_conexc = self ._new_future (loop = self .loop )
@@ -454,6 +454,56 @@ def test_copy_state(self):
454454 newf_tb = '' .join (traceback .format_tb (newf_exc .__traceback__ ))
455455 self .assertEqual (newf_tb .count ('raise concurrent.futures.InvalidStateError' ), 1 )
456456
457+ def test_copy_state_from_concurrent_futures (self ):
458+ """Test _copy_future_state from concurrent.futures.Future.
459+
460+ This tests the optimized path using _get_snapshot when available.
461+ """
462+ from asyncio .futures import _copy_future_state
463+
464+ # Test with a result
465+ f_concurrent = concurrent .futures .Future ()
466+ f_concurrent .set_result (42 )
467+ f_asyncio = self ._new_future (loop = self .loop )
468+ _copy_future_state (f_concurrent , f_asyncio )
469+ self .assertTrue (f_asyncio .done ())
470+ self .assertEqual (f_asyncio .result (), 42 )
471+
472+ # Test with an exception
473+ f_concurrent_exc = concurrent .futures .Future ()
474+ f_concurrent_exc .set_exception (ValueError ("test exception" ))
475+ f_asyncio_exc = self ._new_future (loop = self .loop )
476+ _copy_future_state (f_concurrent_exc , f_asyncio_exc )
477+ self .assertTrue (f_asyncio_exc .done ())
478+ with self .assertRaises (ValueError ) as cm :
479+ f_asyncio_exc .result ()
480+ self .assertEqual (str (cm .exception ), "test exception" )
481+
482+ # Test with cancelled state
483+ f_concurrent_cancelled = concurrent .futures .Future ()
484+ f_concurrent_cancelled .cancel ()
485+ f_asyncio_cancelled = self ._new_future (loop = self .loop )
486+ _copy_future_state (f_concurrent_cancelled , f_asyncio_cancelled )
487+ self .assertTrue (f_asyncio_cancelled .cancelled ())
488+
489+ # Test that destination already cancelled prevents copy
490+ f_concurrent_result = concurrent .futures .Future ()
491+ f_concurrent_result .set_result (10 )
492+ f_asyncio_precancelled = self ._new_future (loop = self .loop )
493+ f_asyncio_precancelled .cancel ()
494+ _copy_future_state (f_concurrent_result , f_asyncio_precancelled )
495+ self .assertTrue (f_asyncio_precancelled .cancelled ())
496+
497+ # Test exception type conversion
498+ f_concurrent_invalid = concurrent .futures .Future ()
499+ f_concurrent_invalid .set_exception (concurrent .futures .InvalidStateError ("invalid" ))
500+ f_asyncio_invalid = self ._new_future (loop = self .loop )
501+ _copy_future_state (f_concurrent_invalid , f_asyncio_invalid )
502+ self .assertTrue (f_asyncio_invalid .done ())
503+ with self .assertRaises (asyncio .exceptions .InvalidStateError ) as cm :
504+ f_asyncio_invalid .result ()
505+ self .assertEqual (str (cm .exception ), "invalid" )
506+
457507 def test_iter (self ):
458508 fut = self ._new_future (loop = self .loop )
459509
0 commit comments