blob: 821e37ac9f72ad3c192990941a7879e0210188e7 [file] [log] [blame]
Alex Crichtonccbb45d2017-05-23 10:58:24 -07001#![cfg(feature = "extra-traits")]
2
Arnavion02ef13f2017-04-25 00:54:31 -07003extern crate syn;
4use syn::*;
5
6macro_rules! assert_let {
7 ($p:pat = $e:expr) => {
8 assert_let!($p = $e; {})
9 };
10
11 ($p:pat = $e:expr; $body:block) => {
12 if let $p = $e
13 $body
14 else {
15 panic!("Expected to match {} but got {:?}", stringify!($p), $e)
16 }
17 };
18}
19
20#[test]
21#[cfg(feature = "full")]
22fn test_catch_expr() {
23 // Taken from tests/rust/src/test/run-pass/catch-expr.rs
24 let raw = r#"
25 struct catch {}
26
27 pub fn main() {
28 let catch_result = do catch {
29 let x = 5;
30 x
31 };
32 assert_eq!(catch_result, 5);
33
34 let mut catch = true;
35 while catch { catch = false; }
36 assert_eq!(catch, false);
37
38 catch = if catch { false } else { true };
39 assert_eq!(catch, true);
40
41 match catch {
42 _ => {}
43 };
44
45 let catch_err = do catch {
46 Err(22)?;
47 Ok(1)
48 };
49 assert_eq!(catch_err, Err(22));
50
51 let catch_okay: Result<i32, i32> = do catch {
52 if false { Err(25)?; }
53 Ok::<(), i32>(())?;
54 Ok(28)
55 };
56 assert_eq!(catch_okay, Ok(28));
57
58 let catch_from_loop: Result<i32, i32> = do catch {
59 for i in 0..10 {
60 if i < 5 { Ok::<i32, i32>(i)?; } else { Err(i)?; }
61 }
62 Ok(22)
63 };
64 assert_eq!(catch_from_loop, Err(5));
65
66 let cfg_init;
67 let _res: Result<(), ()> = do catch {
68 cfg_init = 5;
69 Ok(())
70 };
71 assert_eq!(cfg_init, 5);
72
73 let cfg_init_2;
74 let _res: Result<(), ()> = do catch {
75 cfg_init_2 = 6;
76 Err(())?;
77 Ok(())
78 };
79 assert_eq!(cfg_init_2, 6);
80
81 let my_string = "test".to_string();
82 let res: Result<&str, ()> = do catch {
83 Ok(&my_string)
84 };
85 assert_eq!(res, Ok("test"));
86 }
87 "#;
88
David Tolnayc7a5d3d2017-06-04 12:11:05 -070089 let actual: File = syn::parse_str(raw).unwrap();
Arnavion02ef13f2017-04-25 00:54:31 -070090
David Tolnayc6b55bc2017-11-09 22:48:38 -080091 assert_let!(Item::Struct(ItemStruct { ref ident, .. }) = actual.items[0]; {
David Tolnay63e3dee2017-06-03 20:13:17 -070092 assert_eq!(ident, "catch");
93 });
Arnavion02ef13f2017-04-25 00:54:31 -070094
David Tolnayc6b55bc2017-11-09 22:48:38 -080095 assert_let!(Item::Fn(ItemFn { ref block, .. }) = actual.items[1]; {
Alex Crichton62a0a592017-05-22 13:58:53 -070096 assert_let!(Stmt::Local(ref local) = block.stmts[0]; {
David Tolnay8b4d3022017-12-29 12:11:10 -050097 assert_let!(Local { init: Some((_, ref init_expr)), .. } = **local; {
David Tolnay8c91b882017-12-28 23:04:32 -050098 assert_let!(Expr::Catch(..) = **init_expr);
Arnavion02ef13f2017-04-25 00:54:31 -070099 });
100 });
101
Alex Crichton62a0a592017-05-22 13:58:53 -0700102 assert_let!(Stmt::Local(ref local) = block.stmts[2]; {
David Tolnay24237fb2017-12-29 02:15:26 -0500103 assert_let!(Pat::Ident(PatIdent { by_ref: None, mutability: Some(_), ref ident, .. }) = *local.pat; {
Arnavion02ef13f2017-04-25 00:54:31 -0700104 assert_eq!(ident, "catch");
105 });
106 });
107
Alex Crichton62a0a592017-05-22 13:58:53 -0700108 assert_let!(Stmt::Expr(ref expr) = block.stmts[3]; {
David Tolnay8c91b882017-12-28 23:04:32 -0500109 assert_let!(Expr::While(ExprWhile { ref cond, .. }) = **expr; {
110 assert_let!(Expr::Path(ExprPath { qself: None, ref path, .. }) = **cond; {
Alex Crichton62a0a592017-05-22 13:58:53 -0700111 assert_eq!(*path, "catch".into());
Arnavion02ef13f2017-04-25 00:54:31 -0700112 });
113 });
114 });
115
Alex Crichtonccbb45d2017-05-23 10:58:24 -0700116 assert_let!(Stmt::Semi(ref expr, _) = block.stmts[5]; {
David Tolnay8c91b882017-12-28 23:04:32 -0500117 assert_let!(Expr::Assign(ExprAssign { ref left, ref right, .. }) = **expr; {
118 assert_let!(Expr::Path(ExprPath { qself: None, ref path, .. }) = **left; {
Alex Crichton62a0a592017-05-22 13:58:53 -0700119 assert_eq!(*path, "catch".into());
Arnavion02ef13f2017-04-25 00:54:31 -0700120 });
121
David Tolnay8c91b882017-12-28 23:04:32 -0500122 assert_let!(Expr::If(ExprIf { ref cond, .. }) = **right; {
123 assert_let!(Expr::Path(ExprPath { qself: None, ref path, .. }) = **cond; {
Alex Crichton62a0a592017-05-22 13:58:53 -0700124 assert_eq!(*path, "catch".into());
Arnavion02ef13f2017-04-25 00:54:31 -0700125 });
126 });
127 });
128 });
129
Alex Crichtonccbb45d2017-05-23 10:58:24 -0700130 assert_let!(Stmt::Semi(ref expr, _) = block.stmts[7]; {
David Tolnay8c91b882017-12-28 23:04:32 -0500131 assert_let!(Expr::Match(ExprMatch { ref expr, .. }) = **expr; {
132 assert_let!(Expr::Path(ExprPath { qself: None, ref path, .. }) = **expr; {
Alex Crichton62a0a592017-05-22 13:58:53 -0700133 assert_eq!(*path, "catch".into());
Arnavion02ef13f2017-04-25 00:54:31 -0700134 });
135 });
136 });
137 });
138}