@@ -383,6 +383,115 @@ def sub(num):
383383 tp .shutdown ()
384384 self .assertEqual (results , list (range (10 )))
385385
386+ def test_token_contextmanager_with_default (self ):
387+ ctx = contextvars .Context ()
388+ c = contextvars .ContextVar ('c' , default = 42 )
389+
390+ def fun ():
391+ with c .set (36 ):
392+ self .assertEqual (c .get (), 36 )
393+
394+ self .assertEqual (c .get (), 42 )
395+
396+ ctx .run (fun )
397+
398+ def test_token_contextmanager_without_default (self ):
399+ ctx = contextvars .Context ()
400+ c = contextvars .ContextVar ('c' )
401+
402+ def fun ():
403+ with c .set (36 ):
404+ self .assertEqual (c .get (), 36 )
405+
406+ with self .assertRaisesRegex (LookupError , "<ContextVar name='c'" ):
407+ c .get ()
408+
409+ ctx .run (fun )
410+
411+ def test_token_contextmanager_on_exception (self ):
412+ ctx = contextvars .Context ()
413+ c = contextvars .ContextVar ('c' , default = 42 )
414+
415+ def fun ():
416+ with c .set (36 ):
417+ self .assertEqual (c .get (), 36 )
418+ raise ValueError ("custom exception" )
419+
420+ self .assertEqual (c .get (), 42 )
421+
422+ with self .assertRaisesRegex (ValueError , "custom exception" ):
423+ ctx .run (fun )
424+
425+ def test_token_contextmanager_reentrant (self ):
426+ ctx = contextvars .Context ()
427+ c = contextvars .ContextVar ('c' , default = 42 )
428+
429+ def fun ():
430+ token = c .set (36 )
431+ with self .assertRaisesRegex (
432+ RuntimeError ,
433+ "<Token .+ has already been used once"
434+ ):
435+ with token :
436+ with token :
437+ self .assertEqual (c .get (), 36 )
438+
439+ self .assertEqual (c .get (), 42 )
440+
441+ ctx .run (fun )
442+
443+ def test_token_contextmanager_multiple_c_set (self ):
444+ ctx = contextvars .Context ()
445+ c = contextvars .ContextVar ('c' , default = 42 )
446+
447+ def fun ():
448+ with c .set (36 ):
449+ self .assertEqual (c .get (), 36 )
450+ c .set (24 )
451+ self .assertEqual (c .get (), 24 )
452+ c .set (12 )
453+ self .assertEqual (c .get (), 12 )
454+
455+ self .assertEqual (c .get (), 42 )
456+
457+ ctx .run (fun )
458+
459+ def test_token_contextmanager_with_explicit_reset_the_same_token (self ):
460+ ctx = contextvars .Context ()
461+ c = contextvars .ContextVar ('c' , default = 42 )
462+
463+ def fun ():
464+ with self .assertRaisesRegex (
465+ RuntimeError ,
466+ "<Token .+ has already been used once"
467+ ):
468+ with c .set (36 ) as token :
469+ self .assertEqual (c .get (), 36 )
470+ c .reset (token )
471+
472+ self .assertEqual (c .get (), 42 )
473+
474+ self .assertEqual (c .get (), 42 )
475+
476+ ctx .run (fun )
477+
478+ def test_token_contextmanager_with_explicit_reset_another_token (self ):
479+ ctx = contextvars .Context ()
480+ c = contextvars .ContextVar ('c' , default = 42 )
481+
482+ def fun ():
483+ with c .set (36 ):
484+ self .assertEqual (c .get (), 36 )
485+
486+ token = c .set (24 )
487+ self .assertEqual (c .get (), 24 )
488+ c .reset (token )
489+ self .assertEqual (c .get (), 36 )
490+
491+ self .assertEqual (c .get (), 42 )
492+
493+ ctx .run (fun )
494+
386495
387496# HAMT Tests
388497
0 commit comments