@@ -138,12 +138,15 @@ struct SomeConcreteType {
138
138
}
139
139
140
140
impl 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 )
143
145
. provide_value :: < String , _ > ( || "bye" . to_owned ( ) ) ;
144
146
}
145
147
}
146
148
149
+ // Test the provide and request mechanisms with a by-reference trait object.
147
150
#[ test]
148
151
fn test_provider ( ) {
149
152
let obj: & dyn Provider = & SomeConcreteType { some_string : "hello" . to_owned ( ) } ;
@@ -152,3 +155,40 @@ fn test_provider() {
152
155
assert_eq ! ( & * request_value:: <String , _>( obj) . unwrap( ) , "bye" ) ;
153
156
assert_eq ! ( request_value:: <u8 , _>( obj) , None ) ;
154
157
}
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