thiserror_no_std_test/
test.rs1#![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}