@@ -460,4 +460,46 @@ mod tests {
460
460
true
461
461
} ) ) ;
462
462
}
463
+
464
+ #[ test]
465
+ #[ ignore = "overlapping contexts are not supported yet" ]
466
+ fn overlapping_contexts ( ) {
467
+ #[ derive( Debug , PartialEq ) ]
468
+ struct ValueA ( & ' static str ) ;
469
+ #[ derive( Debug , PartialEq ) ]
470
+ struct ValueB ( u64 ) ;
471
+
472
+ let outer_guard = Context :: new ( ) . with_value ( ValueA ( "a" ) ) . attach ( ) ;
473
+
474
+ // Only value `a` is set
475
+ let current = Context :: current ( ) ;
476
+ assert_eq ! ( current. get( ) , Some ( & ValueA ( "a" ) ) ) ;
477
+ assert_eq ! ( current. get:: <ValueB >( ) , None ) ;
478
+
479
+ let inner_guard = Context :: current_with_value ( ValueB ( 42 ) ) . attach ( ) ;
480
+ // Both values are set in inner context
481
+ let current = Context :: current ( ) ;
482
+ assert_eq ! ( current. get( ) , Some ( & ValueA ( "a" ) ) ) ;
483
+ assert_eq ! ( current. get( ) , Some ( & ValueB ( 42 ) ) ) ;
484
+
485
+ assert ! ( Context :: map_current( |cx| {
486
+ assert_eq!( cx. get( ) , Some ( & ValueA ( "a" ) ) ) ;
487
+ assert_eq!( cx. get( ) , Some ( & ValueB ( 42 ) ) ) ;
488
+ true
489
+ } ) ) ;
490
+
491
+ drop ( outer_guard) ;
492
+
493
+ // `inner_guard` is still alive so both `ValueA` and `ValueB` should still be accessible
494
+ let current = Context :: current ( ) ;
495
+ assert_eq ! ( current. get( ) , Some ( & ValueA ( "a" ) ) ) ;
496
+ assert_eq ! ( current. get( ) , Some ( & ValueB ( 42 ) ) ) ;
497
+
498
+ drop ( inner_guard) ;
499
+
500
+ // Both guards are dropped and neither value should be accessible.
501
+ let current = Context :: current ( ) ;
502
+ assert_eq ! ( current. get:: <ValueA >( ) , None ) ;
503
+ assert_eq ! ( current. get:: <ValueB >( ) , None ) ;
504
+ }
463
505
}
0 commit comments