summaryrefslogtreecommitdiffstats
path: root/tokio-test/src/macros.rs
blob: 4dbabd2963898a08f2d39f3ad677612f683e004e (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
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
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
//! A collection of useful macros for testing futures and tokio based code

/// Assert if a poll is ready
#[macro_export]
macro_rules! assert_ready {
    ($e:expr) => {{
        use $crate::codegen::futures::Async::Ready;
        match $e {
            Ok(Ready(v)) => v,
            Ok(_) => panic!("not ready"),
            Err(e) => panic!("error = {:?}", e),
        }
    }};
    ($e:expr, $($msg:tt),+) => {{
        use $crate::codegen::futures::Async::Ready;
        match $e {
            Ok(Ready(v)) => v,
            Ok(_) => {
                let msg = format_args!($($msg),+);
                panic!("not ready; {}", msg)
            }
            Err(e) => {
                let msg = format!($($msg),+);
                panic!("error = {:?}; {}", e, msg)
            }
        }
    }};
}

/// Asset if the poll is not ready
#[macro_export]
macro_rules! assert_not_ready {
    ($e:expr) => {{
        use $crate::codegen::futures::Async::{Ready, NotReady};
        match $e {
            Ok(NotReady) => {}
            Ok(Ready(v)) => panic!("ready; value = {:?}", v),
            Err(e) => panic!("error = {:?}", e),
        }
    }};
    ($e:expr, $($msg:tt),+) => {{
        use $crate::codegen::futures::Async::{Ready, NotReady};
        match $e {
            Ok(NotReady) => {}
            Ok(Ready(v)) => {
                let msg = format_args!($($msg),+);
                panic!("ready; value = {:?}; {}", v, msg)
            }
            Err(e) => {
                let msg = format_args!($($msg),+);
                panic!("error = {:?}; {}", e, msg)
            }
        }
    }};
}

/// Assert if a poll is ready and check for equality on the value
#[macro_export]
macro_rules! assert_ready_eq {
    ($e:expr, $expect:expr) => {
        use $crate::codegen::futures::Async::Ready;
        match $e {
            Ok(e) => assert_eq!(e, Ready($expect)),
            Err(e) => panic!("error = {:?}", e),
        }
    };

    ($e:expr, $expect:expr, $($msg:tt),+) => {
        use $crate::codegen::futures::Async::Ready;
        match $e {
            Ok(e) => assert_eq!(e, Ready($expect), $($msg)+),
            Err(e) => {
                let msg = format_args!($($msg),+);
                panic!("error = {:?}; {}", e, msg)
            }
        }
    };
}

/// Assert if the deadline has passed
#[macro_export]
macro_rules! assert_elapsed {
    ($e:expr) => {
        assert!($e.unwrap_err().is_elapsed());
    };

    ($e:expr, $($msg:expr),+) => {
        assert!($e.unwrap_err().is_elapsed(), $msg);
    };
}

#[cfg(test)]
mod tests {
    use futures::{future, Async, Future, Poll};

    #[test]
    fn assert_ready() {
        let mut fut = future::ok::<(), ()>(());
        assert_ready!(fut.poll());
        let mut fut = future::ok::<(), ()>(());
        assert_ready!(fut.poll(), "some message");
    }

    #[test]
    #[should_panic]
    fn assert_ready_err() {
        let mut fut = future::err::<(), ()>(());
        assert_ready!(fut.poll());
    }

    #[test]
    fn assert_not_ready() {
        let poll: Poll<(), ()> = Ok(Async::NotReady);
        assert_not_ready!(poll);
        assert_not_ready!(poll, "some message");
    }

    #[test]
    #[should_panic]
    fn assert_not_ready_err() {
        let mut fut = future::err::<(), ()>(());
        assert_not_ready!(fut.poll());
    }

    #[test]
    fn assert_ready_eq() {
        let mut fut = future::ok::<(), ()>(());
        assert_ready_eq!(fut.poll(), ());
    }

}