@@ -138,12 +138,15 @@ struct SomeConcreteType {
138138}
139139
140140impl Provider for SomeConcreteType {
141- fn provide < ' a > ( & ' a self , req : & mut Demand < ' a > ) {
142- req. provide_ref :: < String > ( & self . some_string )
141+ fn provide < ' a > ( & ' a self , demand : & mut Demand < ' a > ) {
142+ demand
143+ . provide_ref :: < String > ( & self . some_string )
144+ . provide_ref :: < str > ( & self . some_string )
143145 . provide_value :: < String , _ > ( || "bye" . to_owned ( ) ) ;
144146 }
145147}
146148
149+ // Test the provide and request mechanisms with a by-reference trait object.
147150#[ test]
148151fn test_provider ( ) {
149152 let obj: & dyn Provider = & SomeConcreteType { some_string : "hello" . to_owned ( ) } ;
@@ -152,3 +155,40 @@ fn test_provider() {
152155 assert_eq ! ( & * request_value:: <String , _>( obj) . unwrap( ) , "bye" ) ;
153156 assert_eq ! ( request_value:: <u8 , _>( obj) , None ) ;
154157}
158+
159+ // Test the provide and request mechanisms with a boxed trait object.
160+ #[ test]
161+ fn test_provider_boxed ( ) {
162+ let obj: Box < dyn Provider > = Box :: new ( SomeConcreteType { some_string : "hello" . to_owned ( ) } ) ;
163+
164+ assert_eq ! ( & * * request_ref:: <String , _>( & * obj) . unwrap( ) , "hello" ) ;
165+ assert_eq ! ( & * request_value:: <String , _>( & * obj) . unwrap( ) , "bye" ) ;
166+ assert_eq ! ( request_value:: <u8 , _>( & * obj) , None ) ;
167+ }
168+
169+ // Test the provide and request mechanisms with a concrete object.
170+ #[ test]
171+ fn test_provider_concrete ( ) {
172+ let obj = SomeConcreteType { some_string : "hello" . to_owned ( ) } ;
173+
174+ assert_eq ! ( & * * request_ref:: <String , _>( & obj) . unwrap( ) , "hello" ) ;
175+ assert_eq ! ( & * request_value:: <String , _>( & obj) . unwrap( ) , "bye" ) ;
176+ assert_eq ! ( request_value:: <u8 , _>( & obj) , None ) ;
177+ }
178+
179+ trait OtherTrait : Provider { }
180+
181+ impl OtherTrait for SomeConcreteType { }
182+
183+ impl dyn OtherTrait {
184+ fn get_ref < T : ' static + ?Sized > ( & self ) -> Option < & T > {
185+ request_ref :: < T , _ > ( self )
186+ }
187+ }
188+
189+ // Test the provide and request mechanisms via an intermediate trait.
190+ #[ test]
191+ fn test_provider_intermediate ( ) {
192+ let obj: & dyn OtherTrait = & SomeConcreteType { some_string : "hello" . to_owned ( ) } ;
193+ assert_eq ! ( obj. get_ref:: <str >( ) . unwrap( ) , "hello" ) ;
194+ }
0 commit comments