diff --git a/crates/tests/class_hierarchy/Cargo.toml b/crates/tests/class_hierarchy/Cargo.toml new file mode 100644 index 0000000000..1f3c5c9d1c --- /dev/null +++ b/crates/tests/class_hierarchy/Cargo.toml @@ -0,0 +1,15 @@ +[package] +name = "test_class_hierarchy" +version = "0.0.0" +edition = "2021" +publish = false + +[lib] +doc = false +doctest = false + +[dependencies.windows] +path = "../../libs/windows" +features = [ + "Foundation", +] diff --git a/crates/tests/class_hierarchy/src/lib.rs b/crates/tests/class_hierarchy/src/lib.rs new file mode 100644 index 0000000000..8b13789179 --- /dev/null +++ b/crates/tests/class_hierarchy/src/lib.rs @@ -0,0 +1 @@ + diff --git a/crates/tests/class_hierarchy/tests/tests.rs b/crates/tests/class_hierarchy/tests/tests.rs new file mode 100644 index 0000000000..351edf4c03 --- /dev/null +++ b/crates/tests/class_hierarchy/tests/tests.rs @@ -0,0 +1,38 @@ +use windows::{core::*, Foundation::*}; + +#[test] +fn test() -> Result<()> { + let class: MemoryBuffer = MemoryBuffer::Create(10)?; + + call_class(&class)?; + call_interface((&class).into())?; + as_class(&class)?; + as_interface(&class)?; + + // `IMemoryBuffer` is `MemoryBuffer`'s default interface, even though it is not an exclusive interface. + // So this `into` cast should succeed without requiring a call to `QueryInterface`. + let interface: IMemoryBuffer = class.into(); + + call_interface(&interface)?; + as_interface(&interface)?; + + Ok(()) +} + +fn call_class(b: &MemoryBuffer) -> Result<()> { + assert_eq!(10, b.CreateReference()?.Capacity()?); + Ok(()) +} + +fn call_interface(b: &IMemoryBuffer) -> Result<()> { + assert_eq!(10, b.CreateReference()?.Capacity()?); + Ok(()) +} + +fn as_class>(b: P) -> Result<()> { + unsafe { call_class(&b.param().borrow().as_ref().unwrap()) } +} + +fn as_interface>(b: P) -> Result<()> { + unsafe { call_interface(&b.param().borrow().as_ref().unwrap()) } +}