summaryrefslogtreecommitdiff
path: root/subprojects/thiserror/tests/no-std/test.rs
blob: da7899cece2fb2e2f61de9f94efe56cdf7c0d255 (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
#![no_std]

use thiserror::Error;

#[derive(Error, Debug)]
pub enum Error {
    #[error("Error::E")]
    E(#[from] SourceError),
}

#[derive(Error, Debug)]
#[error("SourceError {field}")]
pub struct SourceError {
    pub field: i32,
}

#[cfg(test)]
mod tests {
    use crate::{Error, SourceError};
    use core::error::Error as _;
    use core::fmt::{self, Write};
    use core::mem;

    struct Buf<'a>(&'a mut [u8]);

    impl Write for Buf<'_> {
        fn write_str(&mut self, s: &str) -> fmt::Result {
            if s.len() <= self.0.len() {
                let (out, rest) = mem::take(&mut self.0).split_at_mut(s.len());
                out.copy_from_slice(s.as_bytes());
                self.0 = rest;
                Ok(())
            } else {
                Err(fmt::Error)
            }
        }
    }

    #[test]
    fn test() {
        let source = SourceError { field: -1 };
        let error = Error::from(source);

        let source = error
            .source()
            .unwrap()
            .downcast_ref::<SourceError>()
            .unwrap();

        let mut msg = [b'~'; 17];
        write!(Buf(&mut msg), "{error}").unwrap();
        assert_eq!(msg, *b"Error::E~~~~~~~~~");

        let mut msg = [b'~'; 17];
        write!(Buf(&mut msg), "{source}").unwrap();
        assert_eq!(msg, *b"SourceError -1~~~");
    }
}