1 use anyhow::anyhow;
2 use std::error::Error as StdError;
3 use std::fmt::{self, Display};
4 use std::io;
5
6 #[derive(Debug)]
7 enum TestError {
8 Io(io::Error),
9 }
10
11 impl Display for TestError {
fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result12 fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
13 match self {
14 TestError::Io(e) => Display::fmt(e, formatter),
15 }
16 }
17 }
18
19 impl StdError for TestError {
source(&self) -> Option<&(dyn StdError + 'static)>20 fn source(&self) -> Option<&(dyn StdError + 'static)> {
21 match self {
22 TestError::Io(io) => Some(io),
23 }
24 }
25 }
26
27 #[test]
test_literal_source()28 fn test_literal_source() {
29 let error = anyhow!("oh no!");
30 assert!(error.source().is_none());
31 }
32
33 #[test]
test_variable_source()34 fn test_variable_source() {
35 let msg = "oh no!";
36 let error = anyhow!(msg);
37 assert!(error.source().is_none());
38
39 let msg = msg.to_owned();
40 let error = anyhow!(msg);
41 assert!(error.source().is_none());
42 }
43
44 #[test]
test_fmt_source()45 fn test_fmt_source() {
46 let error = anyhow!("{} {}!", "oh", "no");
47 assert!(error.source().is_none());
48 }
49
50 #[test]
test_io_source()51 fn test_io_source() {
52 let io = io::Error::new(io::ErrorKind::Other, "oh no!");
53 let error = anyhow!(TestError::Io(io));
54 assert_eq!("oh no!", error.source().unwrap().to_string());
55 }
56
57 #[test]
test_anyhow_from_anyhow()58 fn test_anyhow_from_anyhow() {
59 let error = anyhow!("oh no!").context("context");
60 let error = anyhow!(error);
61 assert_eq!("oh no!", error.source().unwrap().to_string());
62 }
63