Skip to main content

thiserror_no_std_test/
test.rs

1#![no_std]
2
3use thiserror::Error;
4
5#[derive(Error, Debug)]
6pub enum Error {
7    #[error("Error::E")]
8    E(#[from] SourceError),
9}
10
11#[derive(Error, Debug)]
12#[error("SourceError {field}")]
13pub struct SourceError {
14    pub field: i32,
15}
16
17#[cfg(test)]
18mod tests {
19    use core::{
20        error::Error as _,
21        fmt::{self, Write},
22        mem,
23    };
24
25    use crate::{Error, SourceError};
26
27    struct Buf<'a>(&'a mut [u8]);
28
29    impl Write for Buf<'_> {
30        fn write_str(&mut self, s: &str) -> fmt::Result {
31            if s.len() <= self.0.len() {
32                let (out, rest) = mem::take(&mut self.0).split_at_mut(s.len());
33                out.copy_from_slice(s.as_bytes());
34                self.0 = rest;
35                Ok(())
36            } else {
37                Err(fmt::Error)
38            }
39        }
40    }
41
42    #[test]
43    fn test() {
44        let source = SourceError {
45            field: -1,
46        };
47        let error = Error::from(source);
48
49        let source = error.source().unwrap().downcast_ref::<SourceError>().unwrap();
50
51        let mut msg = [b'~'; 17];
52        write!(Buf(&mut msg), "{error}").unwrap();
53        assert_eq!(msg, *b"Error::E~~~~~~~~~");
54
55        let mut msg = [b'~'; 17];
56        write!(Buf(&mut msg), "{source}").unwrap();
57        assert_eq!(msg, *b"SourceError -1~~~");
58    }
59}