test_attribute.rs 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336
  1. #[macro_use]
  2. mod macros;
  3. use syn::parse::Parser;
  4. use syn::{Attribute, Meta};
  5. #[test]
  6. fn test_meta_item_word() {
  7. let meta = test("#[foo]");
  8. snapshot!(meta, @r###"
  9. Path(Path {
  10. segments: [
  11. PathSegment {
  12. ident: "foo",
  13. arguments: None,
  14. },
  15. ],
  16. })
  17. "###);
  18. }
  19. #[test]
  20. fn test_meta_item_name_value() {
  21. let meta = test("#[foo = 5]");
  22. snapshot!(meta, @r###"
  23. Meta::NameValue {
  24. path: Path {
  25. segments: [
  26. PathSegment {
  27. ident: "foo",
  28. arguments: None,
  29. },
  30. ],
  31. },
  32. lit: 5,
  33. }
  34. "###);
  35. }
  36. #[test]
  37. fn test_meta_item_bool_value() {
  38. let meta = test("#[foo = true]");
  39. snapshot!(meta, @r###"
  40. Meta::NameValue {
  41. path: Path {
  42. segments: [
  43. PathSegment {
  44. ident: "foo",
  45. arguments: None,
  46. },
  47. ],
  48. },
  49. lit: Lit::Bool {
  50. value: true,
  51. },
  52. }
  53. "###);
  54. let meta = test("#[foo = false]");
  55. snapshot!(meta, @r###"
  56. Meta::NameValue {
  57. path: Path {
  58. segments: [
  59. PathSegment {
  60. ident: "foo",
  61. arguments: None,
  62. },
  63. ],
  64. },
  65. lit: Lit::Bool {
  66. value: false,
  67. },
  68. }
  69. "###);
  70. }
  71. #[test]
  72. fn test_meta_item_list_lit() {
  73. let meta = test("#[foo(5)]");
  74. snapshot!(meta, @r###"
  75. Meta::List {
  76. path: Path {
  77. segments: [
  78. PathSegment {
  79. ident: "foo",
  80. arguments: None,
  81. },
  82. ],
  83. },
  84. nested: [
  85. Lit(5),
  86. ],
  87. }
  88. "###);
  89. }
  90. #[test]
  91. fn test_meta_item_list_word() {
  92. let meta = test("#[foo(bar)]");
  93. snapshot!(meta, @r###"
  94. Meta::List {
  95. path: Path {
  96. segments: [
  97. PathSegment {
  98. ident: "foo",
  99. arguments: None,
  100. },
  101. ],
  102. },
  103. nested: [
  104. Meta(Path(Path {
  105. segments: [
  106. PathSegment {
  107. ident: "bar",
  108. arguments: None,
  109. },
  110. ],
  111. })),
  112. ],
  113. }
  114. "###);
  115. }
  116. #[test]
  117. fn test_meta_item_list_name_value() {
  118. let meta = test("#[foo(bar = 5)]");
  119. snapshot!(meta, @r###"
  120. Meta::List {
  121. path: Path {
  122. segments: [
  123. PathSegment {
  124. ident: "foo",
  125. arguments: None,
  126. },
  127. ],
  128. },
  129. nested: [
  130. Meta(Meta::NameValue {
  131. path: Path {
  132. segments: [
  133. PathSegment {
  134. ident: "bar",
  135. arguments: None,
  136. },
  137. ],
  138. },
  139. lit: 5,
  140. }),
  141. ],
  142. }
  143. "###);
  144. }
  145. #[test]
  146. fn test_meta_item_list_bool_value() {
  147. let meta = test("#[foo(bar = true)]");
  148. snapshot!(meta, @r###"
  149. Meta::List {
  150. path: Path {
  151. segments: [
  152. PathSegment {
  153. ident: "foo",
  154. arguments: None,
  155. },
  156. ],
  157. },
  158. nested: [
  159. Meta(Meta::NameValue {
  160. path: Path {
  161. segments: [
  162. PathSegment {
  163. ident: "bar",
  164. arguments: None,
  165. },
  166. ],
  167. },
  168. lit: Lit::Bool {
  169. value: true,
  170. },
  171. }),
  172. ],
  173. }
  174. "###);
  175. }
  176. #[test]
  177. fn test_meta_item_multiple() {
  178. let meta = test("#[foo(word, name = 5, list(name2 = 6), word2)]");
  179. snapshot!(meta, @r###"
  180. Meta::List {
  181. path: Path {
  182. segments: [
  183. PathSegment {
  184. ident: "foo",
  185. arguments: None,
  186. },
  187. ],
  188. },
  189. nested: [
  190. Meta(Path(Path {
  191. segments: [
  192. PathSegment {
  193. ident: "word",
  194. arguments: None,
  195. },
  196. ],
  197. })),
  198. Meta(Meta::NameValue {
  199. path: Path {
  200. segments: [
  201. PathSegment {
  202. ident: "name",
  203. arguments: None,
  204. },
  205. ],
  206. },
  207. lit: 5,
  208. }),
  209. Meta(Meta::List {
  210. path: Path {
  211. segments: [
  212. PathSegment {
  213. ident: "list",
  214. arguments: None,
  215. },
  216. ],
  217. },
  218. nested: [
  219. Meta(Meta::NameValue {
  220. path: Path {
  221. segments: [
  222. PathSegment {
  223. ident: "name2",
  224. arguments: None,
  225. },
  226. ],
  227. },
  228. lit: 6,
  229. }),
  230. ],
  231. }),
  232. Meta(Path(Path {
  233. segments: [
  234. PathSegment {
  235. ident: "word2",
  236. arguments: None,
  237. },
  238. ],
  239. })),
  240. ],
  241. }
  242. "###);
  243. }
  244. #[test]
  245. fn test_bool_lit() {
  246. let meta = test("#[foo(true)]");
  247. snapshot!(meta, @r###"
  248. Meta::List {
  249. path: Path {
  250. segments: [
  251. PathSegment {
  252. ident: "foo",
  253. arguments: None,
  254. },
  255. ],
  256. },
  257. nested: [
  258. Lit(Lit::Bool {
  259. value: true,
  260. }),
  261. ],
  262. }
  263. "###);
  264. }
  265. #[test]
  266. fn test_negative_lit() {
  267. let meta = test("#[form(min = -1, max = 200)]");
  268. snapshot!(meta, @r###"
  269. Meta::List {
  270. path: Path {
  271. segments: [
  272. PathSegment {
  273. ident: "form",
  274. arguments: None,
  275. },
  276. ],
  277. },
  278. nested: [
  279. Meta(Meta::NameValue {
  280. path: Path {
  281. segments: [
  282. PathSegment {
  283. ident: "min",
  284. arguments: None,
  285. },
  286. ],
  287. },
  288. lit: -1,
  289. }),
  290. Meta(Meta::NameValue {
  291. path: Path {
  292. segments: [
  293. PathSegment {
  294. ident: "max",
  295. arguments: None,
  296. },
  297. ],
  298. },
  299. lit: 200,
  300. }),
  301. ],
  302. }
  303. "###);
  304. }
  305. fn test(input: &str) -> Meta {
  306. let attrs = Attribute::parse_outer.parse_str(input).unwrap();
  307. assert_eq!(attrs.len(), 1);
  308. let attr = attrs.into_iter().next().unwrap();
  309. attr.parse_meta().unwrap()
  310. }