]>
git.proxmox.com Git - rustc.git/blob - vendor/anyhow/tests/test_context.rs
2 // Clippy bug: https://github.com/rust-lang/rust-clippy/issues/7422
3 clippy
::nonstandard_macro_braces
,
8 use crate::drop
::{DetectDrop, Flag}
;
9 use anyhow
::{Context, Error, Result}
;
10 use std
::fmt
::{self, Display}
;
13 // https://github.com/dtolnay/anyhow/issues/18
15 fn test_inference() -> Result
<()> {
17 let y
: u32 = x
.parse().context("...")?
;
22 macro_rules
! context_type
{
26 message
: &'
static str,
30 impl Display
for $name
{
31 fn fmt(&self, f
: &mut fmt
::Formatter
) -> fmt
::Result
{
32 f
.write_str(self.message
)
38 context_type
!(HighLevel
);
39 context_type
!(MidLevel
);
41 #[derive(Error, Debug)]
44 message
: &'
static str,
55 fn none(&self) -> bool
{
56 !self.low
.get() && !self.mid
.get() && !self.high
.get()
59 fn all(&self) -> bool
{
60 self.low
.get() && self.mid
.get() && self.high
.get()
64 fn make_chain() -> (Error
, Dropped
) {
65 let dropped
= Dropped
{
72 message
: "no such file or directory",
73 drop
: DetectDrop
::new(&dropped
.low
),
76 // impl Context for Result<T, E>
77 let mid
= Err
::<(), LowLevel
>(low
)
79 message
: "failed to load config",
80 drop
: DetectDrop
::new(&dropped
.mid
),
84 // impl Context for Result<T, Error>
85 let high
= Err
::<(), Error
>(mid
)
87 message
: "failed to start server",
88 drop
: DetectDrop
::new(&dropped
.high
),
96 fn test_downcast_ref() {
97 let (err
, dropped
) = make_chain();
99 assert
!(!err
.is
::<String
>());
100 assert
!(err
.downcast_ref
::<String
>().is_none());
102 assert
!(err
.is
::<HighLevel
>());
103 let high
= err
.downcast_ref
::<HighLevel
>().unwrap();
104 assert_eq
!(high
.to_string(), "failed to start server");
106 assert
!(err
.is
::<MidLevel
>());
107 let mid
= err
.downcast_ref
::<MidLevel
>().unwrap();
108 assert_eq
!(mid
.to_string(), "failed to load config");
110 assert
!(err
.is
::<LowLevel
>());
111 let low
= err
.downcast_ref
::<LowLevel
>().unwrap();
112 assert_eq
!(low
.to_string(), "no such file or directory");
114 assert
!(dropped
.none());
116 assert
!(dropped
.all());
120 fn test_downcast_high() {
121 let (err
, dropped
) = make_chain();
123 let err
= err
.downcast
::<HighLevel
>().unwrap();
124 assert
!(!dropped
.high
.get());
125 assert
!(dropped
.low
.get() && dropped
.mid
.get());
128 assert
!(dropped
.all());
132 fn test_downcast_mid() {
133 let (err
, dropped
) = make_chain();
135 let err
= err
.downcast
::<MidLevel
>().unwrap();
136 assert
!(!dropped
.mid
.get());
137 assert
!(dropped
.low
.get() && dropped
.high
.get());
140 assert
!(dropped
.all());
144 fn test_downcast_low() {
145 let (err
, dropped
) = make_chain();
147 let err
= err
.downcast
::<LowLevel
>().unwrap();
148 assert
!(!dropped
.low
.get());
149 assert
!(dropped
.mid
.get() && dropped
.high
.get());
152 assert
!(dropped
.all());
156 fn test_unsuccessful_downcast() {
157 let (err
, dropped
) = make_chain();
159 let err
= err
.downcast
::<String
>().unwrap_err();
160 assert
!(dropped
.none());
163 assert
!(dropped
.all());
167 fn test_root_cause() {
168 let (err
, _
) = make_chain();
170 assert_eq
!(err
.root_cause().to_string(), "no such file or directory");