@@ -423,4 +423,46 @@ mod tests {
423
423
true
424
424
} ) ) ;
425
425
}
426
+
427
+ #[ test]
428
+ #[ ignore = "overlapping contexts are not supported yet" ]
429
+ fn overlapping_contexts ( ) {
430
+ #[ derive( Debug , PartialEq ) ]
431
+ struct ValueA ( & ' static str ) ;
432
+ #[ derive( Debug , PartialEq ) ]
433
+ struct ValueB ( u64 ) ;
434
+
435
+ let outer_guard = Context :: new ( ) . with_value ( ValueA ( "a" ) ) . attach ( ) ;
436
+
437
+ // Only value `a` is set
438
+ let current = Context :: current ( ) ;
439
+ assert_eq ! ( current. get( ) , Some ( & ValueA ( "a" ) ) ) ;
440
+ assert_eq ! ( current. get:: <ValueB >( ) , None ) ;
441
+
442
+ let inner_guard = Context :: current_with_value ( ValueB ( 42 ) ) . attach ( ) ;
443
+ // Both values are set in inner context
444
+ let current = Context :: current ( ) ;
445
+ assert_eq ! ( current. get( ) , Some ( & ValueA ( "a" ) ) ) ;
446
+ assert_eq ! ( current. get( ) , Some ( & ValueB ( 42 ) ) ) ;
447
+
448
+ assert ! ( Context :: map_current( |cx| {
449
+ assert_eq!( cx. get( ) , Some ( & ValueA ( "a" ) ) ) ;
450
+ assert_eq!( cx. get( ) , Some ( & ValueB ( 42 ) ) ) ;
451
+ true
452
+ } ) ) ;
453
+
454
+ drop ( outer_guard) ;
455
+
456
+ // `inner_guard` is still alive so both `ValueA` and `ValueB` should still be accessible
457
+ let current = Context :: current ( ) ;
458
+ assert_eq ! ( current. get( ) , Some ( & ValueA ( "a" ) ) ) ;
459
+ assert_eq ! ( current. get( ) , Some ( & ValueB ( 42 ) ) ) ;
460
+
461
+ drop ( inner_guard) ;
462
+
463
+ // Both guards are dropped and neither value should be accessible.
464
+ let current = Context :: current ( ) ;
465
+ assert_eq ! ( current. get:: <ValueA >( ) , None ) ;
466
+ assert_eq ! ( current. get:: <ValueB >( ) , None ) ;
467
+ }
426
468
}
0 commit comments