#![allow(dead_code)]
use double_derive::double;
#[test]
fn implement_double_instead_of_original_trait() {
#[double(MyEmptyTraitDummy)]
trait MyEmptyTrait {}
struct MyStruct;
impl MyEmptyTraitDummy for MyStruct {}
fn use_trait(_: impl MyEmptyTrait) {
}
use_trait(MyStruct);
}
#[test]
fn invoke_implemented_method_through_original_trait() {
#[double(DummyTrait)]
trait OrgTrait {
fn answer(&self) -> i32;
fn some_other_method(&self);
}
struct MyStruct;
impl DummyTrait for MyStruct {
fn answer(&self) -> i32 {
42
}
}
assert_eq!(42, OrgTrait::answer(&MyStruct));
}
#[tokio::test]
async fn async_method_invocation() {
#[double(DummyTrait)]
trait OrgTrait {
async fn answer(&self) -> i32;
async fn foobar(&self);
}
struct MyStruct;
impl DummyTrait for MyStruct {
async fn answer(&self) -> i32 {
42
}
}
assert_eq!(42, OrgTrait::answer(&MyStruct).await);
}
#[tokio::test]
async fn associated_method_invocation() {
#[double(DummyTrait)]
trait OrgTrait {
async fn answer() -> i32;
}
struct MyStruct;
impl DummyTrait for MyStruct {
async fn answer() -> i32 {
42
}
}
assert_eq!(42, <MyStruct as OrgTrait>::answer().await);
}