]>
Commit | Line | Data |
---|---|---|
064997fb FG |
1 | //! proc-macro tests |
2 | ||
3 | #[macro_use] | |
4 | mod utils; | |
064997fb FG |
5 | use utils::*; |
6 | ||
2b03887a FG |
7 | use expect_test::expect; |
8 | ||
064997fb FG |
9 | #[test] |
10 | fn test_derive_empty() { | |
e8be2606 FG |
11 | assert_expand( |
12 | "DeriveEmpty", | |
13 | r#"struct S;"#, | |
14 | expect!["SUBTREE $$ 1 1"], | |
15 | expect!["SUBTREE $$ 42:2@0..100#0 42:2@0..100#0"], | |
16 | ); | |
064997fb FG |
17 | } |
18 | ||
19 | #[test] | |
20 | fn test_derive_error() { | |
21 | assert_expand( | |
22 | "DeriveError", | |
23 | r#"struct S;"#, | |
24 | expect![[r##" | |
4b012472 FG |
25 | SUBTREE $$ 1 1 |
26 | IDENT compile_error 1 | |
27 | PUNCH ! [alone] 1 | |
28 | SUBTREE () 1 1 | |
e8be2606 | 29 | LITERAL "#[derive(DeriveError)] struct S ;"1 |
4b012472 | 30 | PUNCH ; [alone] 1"##]], |
c0240ec0 | 31 | expect![[r##" |
e8be2606 FG |
32 | SUBTREE $$ 42:2@0..100#0 42:2@0..100#0 |
33 | IDENT compile_error 42:2@0..100#0 | |
34 | PUNCH ! [alone] 42:2@0..100#0 | |
35 | SUBTREE () 42:2@0..100#0 42:2@0..100#0 | |
36 | LITERAL "#[derive(DeriveError)] struct S ;"42:2@0..100#0 | |
37 | PUNCH ; [alone] 42:2@0..100#0"##]], | |
064997fb FG |
38 | ); |
39 | } | |
40 | ||
41 | #[test] | |
42 | fn test_fn_like_macro_noop() { | |
43 | assert_expand( | |
44 | "fn_like_noop", | |
45 | r#"ident, 0, 1, []"#, | |
46 | expect![[r#" | |
4b012472 FG |
47 | SUBTREE $$ 1 1 |
48 | IDENT ident 1 | |
49 | PUNCH , [alone] 1 | |
e8be2606 | 50 | LITERAL 01 |
4b012472 | 51 | PUNCH , [alone] 1 |
e8be2606 | 52 | LITERAL 11 |
4b012472 FG |
53 | PUNCH , [alone] 1 |
54 | SUBTREE [] 1 1"#]], | |
c0240ec0 | 55 | expect![[r#" |
e8be2606 FG |
56 | SUBTREE $$ 42:2@0..100#0 42:2@0..100#0 |
57 | IDENT ident 42:2@0..5#0 | |
58 | PUNCH , [alone] 42:2@5..6#0 | |
59 | LITERAL 042:2@7..8#0 | |
60 | PUNCH , [alone] 42:2@8..9#0 | |
61 | LITERAL 142:2@10..11#0 | |
62 | PUNCH , [alone] 42:2@11..12#0 | |
63 | SUBTREE [] 42:2@13..14#0 42:2@14..15#0"#]], | |
064997fb FG |
64 | ); |
65 | } | |
66 | ||
67 | #[test] | |
68 | fn test_fn_like_macro_clone_ident_subtree() { | |
69 | assert_expand( | |
70 | "fn_like_clone_tokens", | |
71 | r#"ident, []"#, | |
72 | expect![[r#" | |
4b012472 FG |
73 | SUBTREE $$ 1 1 |
74 | IDENT ident 1 | |
75 | PUNCH , [alone] 1 | |
76 | SUBTREE [] 1 1"#]], | |
c0240ec0 | 77 | expect![[r#" |
e8be2606 FG |
78 | SUBTREE $$ 42:2@0..100#0 42:2@0..100#0 |
79 | IDENT ident 42:2@0..5#0 | |
80 | PUNCH , [alone] 42:2@5..6#0 | |
81 | SUBTREE [] 42:2@7..8#0 42:2@7..8#0"#]], | |
064997fb FG |
82 | ); |
83 | } | |
84 | ||
85 | #[test] | |
86 | fn test_fn_like_macro_clone_raw_ident() { | |
87 | assert_expand( | |
88 | "fn_like_clone_tokens", | |
89 | "r#async", | |
90 | expect![[r#" | |
4b012472 FG |
91 | SUBTREE $$ 1 1 |
92 | IDENT r#async 1"#]], | |
c0240ec0 | 93 | expect![[r#" |
e8be2606 FG |
94 | SUBTREE $$ 42:2@0..100#0 42:2@0..100#0 |
95 | IDENT r#async 42:2@0..7#0"#]], | |
c0240ec0 FG |
96 | ); |
97 | } | |
98 | ||
99 | #[test] | |
100 | fn test_fn_like_fn_like_span_join() { | |
101 | assert_expand( | |
102 | "fn_like_span_join", | |
103 | "foo bar", | |
104 | expect![[r#" | |
105 | SUBTREE $$ 1 1 | |
106 | IDENT r#joined 1"#]], | |
107 | expect![[r#" | |
e8be2606 FG |
108 | SUBTREE $$ 42:2@0..100#0 42:2@0..100#0 |
109 | IDENT r#joined 42:2@0..11#0"#]], | |
c0240ec0 FG |
110 | ); |
111 | } | |
112 | ||
113 | #[test] | |
114 | fn test_fn_like_fn_like_span_ops() { | |
115 | assert_expand( | |
116 | "fn_like_span_ops", | |
117 | "set_def_site resolved_at_def_site start_span", | |
118 | expect![[r#" | |
119 | SUBTREE $$ 1 1 | |
120 | IDENT set_def_site 0 | |
121 | IDENT resolved_at_def_site 1 | |
122 | IDENT start_span 1"#]], | |
123 | expect![[r#" | |
e8be2606 FG |
124 | SUBTREE $$ 42:2@0..100#0 42:2@0..100#0 |
125 | IDENT set_def_site 41:1@0..150#0 | |
126 | IDENT resolved_at_def_site 42:2@13..33#0 | |
127 | IDENT start_span 42:2@34..34#0"#]], | |
064997fb FG |
128 | ); |
129 | } | |
130 | ||
131 | #[test] | |
132 | fn test_fn_like_mk_literals() { | |
133 | assert_expand( | |
134 | "fn_like_mk_literals", | |
135 | r#""#, | |
136 | expect![[r#" | |
4b012472 | 137 | SUBTREE $$ 1 1 |
e8be2606 FG |
138 | LITERAL b"byte_string"1 |
139 | LITERAL 'c'1 | |
140 | LITERAL "string"1 | |
141 | LITERAL 3.14f641 | |
142 | LITERAL 3.141 | |
143 | LITERAL 123i641 | |
144 | LITERAL 1231"#]], | |
c0240ec0 | 145 | expect![[r#" |
e8be2606 FG |
146 | SUBTREE $$ 42:2@0..100#0 42:2@0..100#0 |
147 | LITERAL b"byte_string"42:2@0..100#0 | |
148 | LITERAL 'c'42:2@0..100#0 | |
149 | LITERAL "string"42:2@0..100#0 | |
150 | LITERAL 3.14f6442:2@0..100#0 | |
151 | LITERAL 3.1442:2@0..100#0 | |
152 | LITERAL 123i6442:2@0..100#0 | |
153 | LITERAL 12342:2@0..100#0"#]], | |
064997fb FG |
154 | ); |
155 | } | |
156 | ||
157 | #[test] | |
158 | fn test_fn_like_mk_idents() { | |
064997fb FG |
159 | assert_expand( |
160 | "fn_like_mk_idents", | |
161 | r#""#, | |
162 | expect![[r#" | |
4b012472 FG |
163 | SUBTREE $$ 1 1 |
164 | IDENT standard 1 | |
165 | IDENT r#raw 1"#]], | |
c0240ec0 | 166 | expect![[r#" |
e8be2606 FG |
167 | SUBTREE $$ 42:2@0..100#0 42:2@0..100#0 |
168 | IDENT standard 42:2@0..100#0 | |
169 | IDENT r#raw 42:2@0..100#0"#]], | |
064997fb FG |
170 | ); |
171 | } | |
172 | ||
173 | #[test] | |
174 | fn test_fn_like_macro_clone_literals() { | |
175 | assert_expand( | |
176 | "fn_like_clone_tokens", | |
c620b35d FG |
177 | r###"1u16, 2_u32, -4i64, 3.14f32, "hello bridge", "suffixed"suffix, r##"raw"##, 'a', b'b', c"null""###, |
178 | expect![[r###" | |
4b012472 | 179 | SUBTREE $$ 1 1 |
e8be2606 | 180 | LITERAL 1u161 |
4b012472 | 181 | PUNCH , [alone] 1 |
e8be2606 | 182 | LITERAL 2_u321 |
4b012472 FG |
183 | PUNCH , [alone] 1 |
184 | PUNCH - [alone] 1 | |
e8be2606 | 185 | LITERAL 4i641 |
4b012472 | 186 | PUNCH , [alone] 1 |
e8be2606 | 187 | LITERAL 3.14f321 |
4b012472 | 188 | PUNCH , [alone] 1 |
e8be2606 | 189 | LITERAL "hello bridge"1 |
c620b35d | 190 | PUNCH , [alone] 1 |
e8be2606 | 191 | LITERAL "suffixed"suffix1 |
c620b35d | 192 | PUNCH , [alone] 1 |
e8be2606 | 193 | LITERAL r##"raw"##1 |
c620b35d | 194 | PUNCH , [alone] 1 |
e8be2606 | 195 | LITERAL 'a'1 |
c620b35d | 196 | PUNCH , [alone] 1 |
e8be2606 | 197 | LITERAL b'b'1 |
c620b35d | 198 | PUNCH , [alone] 1 |
e8be2606 | 199 | LITERAL c"null"1"###]], |
c620b35d | 200 | expect![[r###" |
e8be2606 FG |
201 | SUBTREE $$ 42:2@0..100#0 42:2@0..100#0 |
202 | LITERAL 1u1642:2@0..4#0 | |
203 | PUNCH , [alone] 42:2@4..5#0 | |
204 | LITERAL 2_u3242:2@6..11#0 | |
205 | PUNCH , [alone] 42:2@11..12#0 | |
206 | PUNCH - [alone] 42:2@13..14#0 | |
207 | LITERAL 4i6442:2@14..18#0 | |
208 | PUNCH , [alone] 42:2@18..19#0 | |
209 | LITERAL 3.14f3242:2@20..27#0 | |
210 | PUNCH , [alone] 42:2@27..28#0 | |
211 | LITERAL "hello bridge"42:2@29..43#0 | |
212 | PUNCH , [alone] 42:2@43..44#0 | |
213 | LITERAL "suffixed"suffix42:2@45..61#0 | |
214 | PUNCH , [alone] 42:2@61..62#0 | |
215 | LITERAL r##"raw"##42:2@63..73#0 | |
216 | PUNCH , [alone] 42:2@73..74#0 | |
217 | LITERAL 'a'42:2@75..78#0 | |
218 | PUNCH , [alone] 42:2@78..79#0 | |
219 | LITERAL b'b'42:2@80..84#0 | |
220 | PUNCH , [alone] 42:2@84..85#0 | |
221 | LITERAL c"null"42:2@86..93#0"###]], | |
064997fb FG |
222 | ); |
223 | } | |
224 | ||
225 | #[test] | |
226 | fn test_attr_macro() { | |
227 | // Corresponds to | |
228 | // #[proc_macro_test::attr_error(some arguments)] | |
229 | // mod m {} | |
230 | assert_expand_attr( | |
231 | "attr_error", | |
232 | r#"mod m {}"#, | |
233 | r#"some arguments"#, | |
234 | expect![[r##" | |
4b012472 FG |
235 | SUBTREE $$ 1 1 |
236 | IDENT compile_error 1 | |
237 | PUNCH ! [alone] 1 | |
238 | SUBTREE () 1 1 | |
e8be2606 | 239 | LITERAL "#[attr_error(some arguments)] mod m {}"1 |
4b012472 | 240 | PUNCH ; [alone] 1"##]], |
c0240ec0 | 241 | expect![[r##" |
e8be2606 FG |
242 | SUBTREE $$ 42:2@0..100#0 42:2@0..100#0 |
243 | IDENT compile_error 42:2@0..100#0 | |
244 | PUNCH ! [alone] 42:2@0..100#0 | |
245 | SUBTREE () 42:2@0..100#0 42:2@0..100#0 | |
246 | LITERAL "#[attr_error(some arguments)] mod m {}"42:2@0..100#0 | |
247 | PUNCH ; [alone] 42:2@0..100#0"##]], | |
064997fb FG |
248 | ); |
249 | } | |
250 | ||
251 | /// Tests that we find and classify all proc macros correctly. | |
252 | #[test] | |
253 | fn list_test_macros() { | |
254 | let res = list().join("\n"); | |
255 | ||
256 | expect![[r#" | |
e8be2606 FG |
257 | fn_like_noop [Bang] |
258 | fn_like_panic [Bang] | |
259 | fn_like_error [Bang] | |
260 | fn_like_clone_tokens [Bang] | |
261 | fn_like_mk_literals [Bang] | |
262 | fn_like_mk_idents [Bang] | |
263 | fn_like_span_join [Bang] | |
264 | fn_like_span_ops [Bang] | |
064997fb FG |
265 | attr_noop [Attr] |
266 | attr_panic [Attr] | |
267 | attr_error [Attr] | |
268 | DeriveEmpty [CustomDerive] | |
269 | DerivePanic [CustomDerive] | |
270 | DeriveError [CustomDerive]"#]] | |
271 | .assert_eq(&res); | |
272 | } |