forked from asomers/mockall
-
Notifications
You must be signed in to change notification settings - Fork 0
/
mock_return_dyn_trait.rs
85 lines (70 loc) · 1.52 KB
/
mock_return_dyn_trait.rs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
// vim: tw=80
//! a method that returns a reference to a trait object
#![deny(warnings)]
use mockall::*;
use std::fmt::Debug;
trait T: Debug + Sync {
fn mutate(&mut self) {}
}
impl T for u32 {}
trait Base {
fn as_t(&self) -> &dyn T;
}
trait Derived: Base {
fn as_base(&self) -> &dyn Base;
}
impl Base for u32 {
fn as_t(&self) -> &dyn T {
self
}
}
impl Derived for u32 {
fn as_base(&self) -> &dyn Base {
self
}
}
impl<Q> T for Q where Q: Debug + Sync + AsMut<dyn T> {}
mock!{
Foo {
fn foo(&self) -> &dyn Debug;
fn bar(&self) -> &'static dyn T;
fn baz(&mut self) -> &mut dyn T;
}
}
mock! {
Bar {}
impl Base for Bar {
fn as_t(&self) -> &dyn T;
}
impl Derived for Bar {
fn as_base(&self) -> &dyn Base;
}
}
#[test]
fn return_const() {
let mut mock = MockFoo::new();
mock.expect_foo()
.return_const(Box::new(42u32) as Box<dyn Debug>);
assert_eq!("42", format!("{:?}", mock.foo()));
}
#[test]
fn static_ref() {
let mut mock = MockFoo::new();
mock.expect_bar()
.return_const(&42u32 as &dyn T);
assert_eq!("42", format!("{:?}", mock.bar()));
}
#[test]
fn return_var() {
let mut mock = MockFoo::new();
mock.expect_baz()
.return_var(Box::new(42u32) as Box<dyn T>);
mock.baz().mutate();
}
#[test]
fn dyn_upcast() {
let mut mock = MockBar::new();
mock.expect_as_t()
.return_const(Box::new(42u32) as Box<dyn T>);
assert_eq!("42", format!("{:?}", mock.as_t()));
}