11use core:: error:: provide:: { MultiRequestBuilder , MultiResponse , Request } ;
22use core:: error:: { Error , request_ref, request_value} ;
33
4+ struct Invalid ;
5+ #[ derive( Debug , PartialEq , Eq ) ]
6+ struct Valid ;
7+
48// Test the `Request` API.
59#[ derive( Debug ) ]
610struct SomeConcreteType {
@@ -13,10 +17,6 @@ impl std::fmt::Display for SomeConcreteType {
1317 }
1418}
1519
16- struct Invalid ;
17- #[ derive( Debug , PartialEq , Eq ) ]
18- struct Valid ;
19-
2020impl std:: error:: Error for SomeConcreteType {
2121 fn provide < ' a > ( & ' a self , request : & mut Request < ' a > ) {
2222 request
@@ -128,6 +128,54 @@ fn test_error_combined_access_dyn() {
128128 assert_eq ! ( request. retrieve_value:: <* const ( ) >( ) , None ) ;
129129}
130130
131+ #[ derive( Debug ) ]
132+ struct ProvideMultipleTimes ;
133+
134+ impl std:: fmt:: Display for ProvideMultipleTimes {
135+ fn fmt ( & self , f : & mut std:: fmt:: Formatter < ' _ > ) -> std:: fmt:: Result {
136+ write ! ( f, "A" )
137+ }
138+ }
139+
140+ impl std:: error:: Error for ProvideMultipleTimes {
141+ fn provide < ' a > ( & ' a self , request : & mut Request < ' a > ) {
142+ let previous_satisfied_by_ref_of_string = request. would_be_satisfied_by_ref_of :: < String > ( ) ;
143+ request. provide_value :: < String > ( "good" . to_string ( ) ) ;
144+ assert ! (
145+ !request. would_be_satisfied_by_value_of:: <String >( ) ,
146+ "already provided String by value"
147+ ) ;
148+ // "overwriting" the String should just be ignored
149+ request. provide_value :: < String > ( "bad" . to_string ( ) ) ;
150+ // but providing a ref works
151+ if previous_satisfied_by_ref_of_string {
152+ assert ! ( request. would_be_satisfied_by_ref_of:: <String >( ) ) ;
153+ request. provide_ref :: < String > ( const { & String :: new ( ) } ) ;
154+ }
155+ }
156+ }
157+
158+ #[ test]
159+ fn test_provide_multiple_times_single ( ) {
160+ let obj = ProvideMultipleTimes ;
161+ let obj: & dyn Error = & obj;
162+
163+ assert_eq ! ( * request_ref:: <String >( & * obj) . unwrap( ) , String :: new( ) ) ;
164+ assert_eq ! ( request_value:: <String >( & * obj) . unwrap( ) , "good" ) ;
165+ }
166+
167+ #[ test]
168+ fn test_provide_multiple_times_multi ( ) {
169+ let obj = ProvideMultipleTimes ;
170+ let obj: & dyn Error = & obj;
171+
172+ let mut request =
173+ MultiRequestBuilder :: new ( ) . with_value :: < String > ( ) . with_ref :: < String > ( ) . request ( obj) ;
174+
175+ assert_eq ! ( * request. retrieve_ref:: <String >( ) . unwrap( ) , String :: new( ) ) ;
176+ assert_eq ! ( request. retrieve_value:: <String >( ) . unwrap( ) , "good" ) ;
177+ }
178+
131179fn assert_copy < T : Copy > ( _t : T ) { }
132180
133181#[ test]
0 commit comments