1#![allow(clippy::uninlined_format_args)]
2
3#[macro_use]
4mod macros;
5
6use syn::parse::Parser;
7use syn::{Attribute, Meta};
8
9#[test]
10fn test_meta_item_word() {
11 let meta = test("#[foo]");
12
13 snapshot!(meta, @r###"
14 Meta::Path {
15 segments: [
16 PathSegment {
17 ident: "foo",
18 },
19 ],
20 }
21 "###);
22}
23
24#[test]
25fn test_meta_item_name_value() {
26 let meta = test("#[foo = 5]");
27
28 snapshot!(meta, @r###"
29 Meta::NameValue {
30 path: Path {
31 segments: [
32 PathSegment {
33 ident: "foo",
34 },
35 ],
36 },
37 value: Expr::Lit {
38 lit: 5,
39 },
40 }
41 "###);
42}
43
44#[test]
45fn test_meta_item_bool_value() {
46 let meta = test("#[foo = true]");
47
48 snapshot!(meta, @r###"
49 Meta::NameValue {
50 path: Path {
51 segments: [
52 PathSegment {
53 ident: "foo",
54 },
55 ],
56 },
57 value: Expr::Lit {
58 lit: Lit::Bool {
59 value: true,
60 },
61 },
62 }
63 "###);
64
65 let meta = test("#[foo = false]");
66
67 snapshot!(meta, @r###"
68 Meta::NameValue {
69 path: Path {
70 segments: [
71 PathSegment {
72 ident: "foo",
73 },
74 ],
75 },
76 value: Expr::Lit {
77 lit: Lit::Bool {
78 value: false,
79 },
80 },
81 }
82 "###);
83}
84
85#[test]
86fn test_meta_item_list_lit() {
87 let meta = test("#[foo(5)]");
88
89 snapshot!(meta, @r###"
90 Meta::List {
91 path: Path {
92 segments: [
93 PathSegment {
94 ident: "foo",
95 },
96 ],
97 },
98 delimiter: MacroDelimiter::Paren,
99 tokens: TokenStream(`5`),
100 }
101 "###);
102}
103
104#[test]
105fn test_meta_item_list_word() {
106 let meta = test("#[foo(bar)]");
107
108 snapshot!(meta, @r###"
109 Meta::List {
110 path: Path {
111 segments: [
112 PathSegment {
113 ident: "foo",
114 },
115 ],
116 },
117 delimiter: MacroDelimiter::Paren,
118 tokens: TokenStream(`bar`),
119 }
120 "###);
121}
122
123#[test]
124fn test_meta_item_list_name_value() {
125 let meta = test("#[foo(bar = 5)]");
126
127 snapshot!(meta, @r###"
128 Meta::List {
129 path: Path {
130 segments: [
131 PathSegment {
132 ident: "foo",
133 },
134 ],
135 },
136 delimiter: MacroDelimiter::Paren,
137 tokens: TokenStream(`bar = 5`),
138 }
139 "###);
140}
141
142#[test]
143fn test_meta_item_list_bool_value() {
144 let meta = test("#[foo(bar = true)]");
145
146 snapshot!(meta, @r###"
147 Meta::List {
148 path: Path {
149 segments: [
150 PathSegment {
151 ident: "foo",
152 },
153 ],
154 },
155 delimiter: MacroDelimiter::Paren,
156 tokens: TokenStream(`bar = true`),
157 }
158 "###);
159}
160
161#[test]
162fn test_meta_item_multiple() {
163 let meta = test("#[foo(word, name = 5, list(name2 = 6), word2)]");
164
165 snapshot!(meta, @r###"
166 Meta::List {
167 path: Path {
168 segments: [
169 PathSegment {
170 ident: "foo",
171 },
172 ],
173 },
174 delimiter: MacroDelimiter::Paren,
175 tokens: TokenStream(`word , name = 5 , list (name2 = 6) , word2`),
176 }
177 "###);
178}
179
180#[test]
181fn test_bool_lit() {
182 let meta = test("#[foo(true)]");
183
184 snapshot!(meta, @r###"
185 Meta::List {
186 path: Path {
187 segments: [
188 PathSegment {
189 ident: "foo",
190 },
191 ],
192 },
193 delimiter: MacroDelimiter::Paren,
194 tokens: TokenStream(`true`),
195 }
196 "###);
197}
198
199#[test]
200fn test_negative_lit() {
201 let meta = test("#[form(min = -1, max = 200)]");
202
203 snapshot!(meta, @r###"
204 Meta::List {
205 path: Path {
206 segments: [
207 PathSegment {
208 ident: "form",
209 },
210 ],
211 },
212 delimiter: MacroDelimiter::Paren,
213 tokens: TokenStream(`min = - 1 , max = 200`),
214 }
215 "###);
216}
217
218fn test(input: &str) -> Meta {
219 let attrs = Attribute::parse_outer.parse_str(input).unwrap();
220
221 assert_eq!(attrs.len(), 1);
222 let attr = attrs.into_iter().next().unwrap();
223
224 attr.meta
225}
226