test_toolbox/
capture.rs

1/// Macro to capture `stdout` and `stderr` during the evaluation of a statement
2///
3/// ```rust
4/// # use test_toolbox::capture;
5/// let (out, err) = capture!{{
6///     println!("stdout example");
7///     eprint!("stderr example");
8/// }};
9///
10/// assert_eq!("stdout example\n", out);
11/// assert_eq!("stderr example", err);
12/// ```
13#[macro_export]
14macro_rules! capture {
15    ($eval:stmt) => {{
16        let mut out = $crate::gag::BufferRedirect::stdout().expect("redirected stdout required for test");
17        let mut err = $crate::gag::BufferRedirect::stderr().expect("redirected stderr required for test");
18
19        $eval
20
21        // manually flush buffers; stdout and stderr flush on newline
22        <std::io::Stdout as std::io::Write>::flush(&mut std::io::stdout()).expect("to flush stdout");
23        <std::io::Stderr as std::io::Write>::flush(&mut std::io::stderr()).expect("to flush stderr");
24
25        let mut stdout = String::new();
26        let mut stderr = String::new();
27
28        std::io::Read::read_to_string(&mut out, &mut stdout).expect("to copy captured stdout to string");
29        std::io::Read::read_to_string(&mut err, &mut stderr).expect("to copy captured stderr to string");
30
31        (stdout, stderr)
32    }}
33}