summaryrefslogtreecommitdiff
path: root/examples/generic_fn_method.rs
blob: 7cf0d78e4e1014275c5db91cf7b45aeec66c90ff (plain)
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
use std::path::PathBuf;

use ridicule::mock;

trait Foo
{
    fn do_something<Callback>(&self, cb: Callback)
    where
        Callback: Fn(u64) -> String;

    fn do_something_else<Callback, Value>(&self, cb: Callback)
    where
        Callback: Fn(f32) -> Value;
}

mock! {
    MockFoo {}

    impl Foo for MockFoo
    {
        fn do_something<Callback>(&self, cb: Callback)
        where
            Callback: Fn(u64) -> String;

        fn do_something_else<Callback, Value>(&self, cb: Callback)
        where
            Callback: Fn(f32) -> Value;
        }
}

fn main()
{
    let mut mock_foo = MockFoo::new();

    mock_foo
        .expect_do_something()
        .returning(|_me, cb: fn(_) -> _| {
            println!("do_something was called");

            let cb_res = cb(42);

            println!("Received '{cb_res}' from callback");
        });

    mock_foo
        .expect_do_something_else()
        .returning(|_me, cb: fn(_) -> PathBuf| {
            println!("do_something_else was called");

            let cb_res = cb(255.255);

            println!("Received '{}' from callback", cb_res.display());
        });

    mock_foo.do_something((|num| format!("Hello there {num}")) as fn(_) -> _);

    mock_foo.do_something_else((|_| PathBuf::from(r"a/b/c.txt")) as fn(_) -> _);
}