You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
89 lines
2.2 KiB
Rust
89 lines
2.2 KiB
Rust
use std::fmt::Debug;
|
|
use crate::prelude::*;
|
|
|
|
#[derive(Clone, Debug, Eq, PartialEq)]
|
|
struct TestStruct {
|
|
a: u32,
|
|
test: String,
|
|
}
|
|
|
|
impl Default for TestStruct {
|
|
fn default() -> Self {
|
|
Self {
|
|
a: 5,
|
|
test: String::from("Hello World"),
|
|
}
|
|
}
|
|
}
|
|
|
|
trait ChangeStruct {
|
|
fn update(&mut self);
|
|
}
|
|
|
|
impl ChangeStruct for TestStruct {
|
|
fn update(&mut self) {
|
|
self.a = 6;
|
|
}
|
|
}
|
|
|
|
impl_trait_object!(TestStruct, dyn RawClone, dyn ChangeStruct, dyn Debug);
|
|
|
|
#[test]
|
|
fn it_creates_fat_pointers() {
|
|
let debug_vtable1 = __fat_pointer!(TestStruct as dyn Debug).vptr;
|
|
let dclone_vtable1 = __fat_pointer!(TestStruct as dyn RawClone).vptr;
|
|
let debug_vtable2 = __fat_pointer!(TestStruct as dyn Debug).vptr;
|
|
assert_eq!(debug_vtable1, debug_vtable2);
|
|
let dclone_vtable2 = __fat_pointer!(TestStruct as dyn RawClone).vptr;
|
|
assert_eq!(dclone_vtable1, dclone_vtable2);
|
|
}
|
|
|
|
#[test]
|
|
fn it_constructs() {
|
|
TestStruct::default().into_multitrait();
|
|
String::from("test").into_multitrait();
|
|
}
|
|
|
|
#[test]
|
|
fn it_downcasts_traits() {
|
|
let mto = TestStruct::default().into_multitrait();
|
|
let debug = mto.downcast_trait::<dyn Debug>().unwrap();
|
|
let _ = format!("{:?}", debug);
|
|
}
|
|
|
|
#[test]
|
|
fn it_downcasts_trait_mutable() {
|
|
let mut mto = TestStruct::default().into_multitrait();
|
|
let change_struct = mto.downcast_trait_mut::<dyn ChangeStruct>().unwrap();
|
|
change_struct.update();
|
|
}
|
|
|
|
#[test]
|
|
fn it_downcasts_boxed_traits() {
|
|
let mto = TestStruct::default().into_multitrait();
|
|
let boxed = mto.downcast_trait_boxed::<dyn Debug>().unwrap();
|
|
let _ = format!("{:?}", boxed);
|
|
}
|
|
|
|
#[test]
|
|
fn it_downcasts_to_original() {
|
|
let mut mto = TestStruct::default().into_multitrait();
|
|
{
|
|
mto.downcast_ref::<TestStruct>().unwrap();
|
|
}
|
|
{
|
|
mto.downcast_mut::<TestStruct>().unwrap();
|
|
}
|
|
let result = mto.downcast::<TestStruct>().unwrap();
|
|
assert_eq!(result.a, 5);
|
|
assert_eq!(result.test, String::from("Hello World"));
|
|
}
|
|
|
|
#[test]
|
|
fn it_tries_cloning() {
|
|
let mto = TestStruct::default().into_multitrait();
|
|
let mto2 = mto.try_clone().unwrap();
|
|
let obj1 = mto.downcast::<TestStruct>();
|
|
let obj2 = mto2.downcast::<TestStruct>();
|
|
assert_eq!(obj1, obj2);
|
|
} |