diff --git a/library/core/tests/any.rs b/library/core/tests/any.rs index 14a2b09c95e..cdc6fadbab7 100644 --- a/library/core/tests/any.rs +++ b/library/core/tests/any.rs @@ -138,12 +138,15 @@ struct SomeConcreteType { } impl Provider for SomeConcreteType { - fn provide<'a>(&'a self, req: &mut Demand<'a>) { - req.provide_ref::(&self.some_string) + fn provide<'a>(&'a self, demand: &mut Demand<'a>) { + demand + .provide_ref::(&self.some_string) + .provide_ref::(&self.some_string) .provide_value::(|| "bye".to_owned()); } } +// Test the provide and request mechanisms with a by-reference trait object. #[test] fn test_provider() { let obj: &dyn Provider = &SomeConcreteType { some_string: "hello".to_owned() }; @@ -152,3 +155,40 @@ fn test_provider() { assert_eq!(&*request_value::(obj).unwrap(), "bye"); assert_eq!(request_value::(obj), None); } + +// Test the provide and request mechanisms with a boxed trait object. +#[test] +fn test_provider_boxed() { + let obj: Box = Box::new(SomeConcreteType { some_string: "hello".to_owned() }); + + assert_eq!(&**request_ref::(&*obj).unwrap(), "hello"); + assert_eq!(&*request_value::(&*obj).unwrap(), "bye"); + assert_eq!(request_value::(&*obj), None); +} + +// Test the provide and request mechanisms with a concrete object. +#[test] +fn test_provider_concrete() { + let obj = SomeConcreteType { some_string: "hello".to_owned() }; + + assert_eq!(&**request_ref::(&obj).unwrap(), "hello"); + assert_eq!(&*request_value::(&obj).unwrap(), "bye"); + assert_eq!(request_value::(&obj), None); +} + +trait OtherTrait: Provider {} + +impl OtherTrait for SomeConcreteType {} + +impl dyn OtherTrait { + fn get_ref(&self) -> Option<&T> { + request_ref::(self) + } +} + +// Test the provide and request mechanisms via an intermediate trait. +#[test] +fn test_provider_intermediate() { + let obj: &dyn OtherTrait = &SomeConcreteType { some_string: "hello".to_owned() }; + assert_eq!(obj.get_ref::().unwrap(), "hello"); +}