1 #![allow(
2 clippy::assertions_on_result_states,
3 clippy::eq_op,
4 clippy::items_after_statements,
5 clippy::needless_pass_by_value,
6 clippy::shadow_unrelated,
7 clippy::wildcard_imports
8 )]
9
10 mod common;
11
12 use self::common::*;
13 use anyhow::{anyhow, ensure};
14 use std::cell::Cell;
15 use std::future;
16
17 #[test]
test_messages()18 fn test_messages() {
19 assert_eq!("oh no!", bail_literal().unwrap_err().to_string());
20 assert_eq!("oh no!", bail_fmt().unwrap_err().to_string());
21 assert_eq!("oh no!", bail_error().unwrap_err().to_string());
22 }
23
24 #[test]
test_ensure()25 fn test_ensure() {
26 let f = || {
27 ensure!(1 + 1 == 2, "This is correct");
28 Ok(())
29 };
30 assert!(f().is_ok());
31
32 let v = 1;
33 let f = || {
34 ensure!(v + v == 2, "This is correct, v: {}", v);
35 Ok(())
36 };
37 assert!(f().is_ok());
38
39 let f = || {
40 ensure!(v + v == 1, "This is not correct, v: {}", v);
41 Ok(())
42 };
43 assert!(f().is_err());
44
45 let f = || {
46 ensure!(v + v == 1);
47 Ok(())
48 };
49 assert_eq!(
50 f().unwrap_err().to_string(),
51 "Condition failed: `v + v == 1` (2 vs 1)",
52 );
53 }
54
55 #[test]
test_temporaries()56 fn test_temporaries() {
57 fn require_send_sync(_: impl Send + Sync) {}
58
59 require_send_sync(async {
60 // If anyhow hasn't dropped any temporary format_args it creates by the
61 // time it's done evaluating, those will stick around until the
62 // semicolon, which is on the other side of the await point, making the
63 // enclosing future non-Send.
64 future::ready(anyhow!("...")).await;
65 });
66
67 fn message(cell: Cell<&str>) -> &str {
68 cell.get()
69 }
70
71 require_send_sync(async {
72 future::ready(anyhow!(message(Cell::new("...")))).await;
73 });
74 }
75
76 #[test]
test_brace_escape()77 fn test_brace_escape() {
78 let err = anyhow!("unterminated ${{..}} expression");
79 assert_eq!("unterminated ${..} expression", err.to_string());
80 }
81