Skip to content

Commit 843f90c

Browse files
committed
Add some more tests
Signed-off-by: Nick Cameron <[email protected]>
1 parent 2e0ca25 commit 843f90c

File tree

1 file changed

+42
-2
lines changed

1 file changed

+42
-2
lines changed

library/core/tests/any.rs

+42-2
Original file line numberDiff line numberDiff line change
@@ -138,12 +138,15 @@ struct SomeConcreteType {
138138
}
139139

140140
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)
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]
148151
fn 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

Comments
 (0)