use multi_any::{Meta, MultiAny, multi_any};
use std::any::TypeId;
#[test]
fn test_wrong_dyn_trait_type() {
#[multi_any]
trait Trait {}
#[multi_any]
trait WrongTrait {}
struct Bar;
impl Trait for Bar {}
impl WrongTrait for Bar {}
impl MultiAny for Bar {
fn get_metadata(&self, type_id: TypeId) -> Option<Meta> {
_ = type_id;
Meta::try_from(self, TypeId::of::<dyn WrongTrait>(), |v| v as &dyn Trait)
}
}
let bar: Box<dyn MultiAny> = Box::new(Bar);
assert!(bar.downcast_ref::<dyn Trait>().is_none());
assert!(bar.downcast_ref::<dyn WrongTrait>().is_none());
}
#[test]
#[should_panic = "Wrong Metadata type"]
fn test_wrong_dyn_trait_type_panic() {
#[multi_any]
trait Trait {}
#[multi_any]
trait WrongTrait {}
struct Bar;
impl Trait for Bar {}
impl WrongTrait for Bar {}
impl MultiAny for Bar {
fn get_metadata(&self, type_id: TypeId) -> Option<Meta> {
_ = type_id;
Meta::try_from(self, TypeId::of::<dyn WrongTrait>(), |v| {
v as &dyn WrongTrait
})
}
}
let bar: Box<dyn MultiAny> = Box::new(Bar);
bar.downcast_ref::<dyn Trait>();
}
#[test]
#[should_panic = "Wrong Data type"]
fn test_wrong_data_type_panic() {
#[multi_any]
trait Trait {}
struct Bar;
struct Baz;
impl Trait for Bar {}
impl Trait for Baz {}
impl MultiAny for Bar {
fn get_metadata(&self, type_id: TypeId) -> Option<Meta> {
Meta::try_from(&Baz, type_id, |v| v as &dyn Trait)
}
}
let bar: Box<dyn MultiAny> = Box::new(Bar);
bar.downcast_ref::<dyn Trait>();
}