test_meta.rs 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378
  1. #![allow(clippy::shadow_unrelated, clippy::too_many_lines)]
  2. #[macro_use]
  3. mod macros;
  4. use syn::{Meta, MetaList, MetaNameValue, NestedMeta};
  5. #[test]
  6. fn test_parse_meta_item_word() {
  7. let input = "hello";
  8. snapshot!(input as Meta, @r###"
  9. Path(Path {
  10. segments: [
  11. PathSegment {
  12. ident: "hello",
  13. arguments: None,
  14. },
  15. ],
  16. })
  17. "###);
  18. }
  19. #[test]
  20. fn test_parse_meta_name_value() {
  21. let input = "foo = 5";
  22. let (inner, meta) = (input, input);
  23. snapshot!(inner as MetaNameValue, @r###"
  24. MetaNameValue {
  25. path: Path {
  26. segments: [
  27. PathSegment {
  28. ident: "foo",
  29. arguments: None,
  30. },
  31. ],
  32. },
  33. lit: 5,
  34. }
  35. "###);
  36. snapshot!(meta as Meta, @r###"
  37. Meta::NameValue {
  38. path: Path {
  39. segments: [
  40. PathSegment {
  41. ident: "foo",
  42. arguments: None,
  43. },
  44. ],
  45. },
  46. lit: 5,
  47. }
  48. "###);
  49. assert_eq!(meta, inner.into());
  50. }
  51. #[test]
  52. fn test_parse_meta_name_value_with_keyword() {
  53. let input = "static = 5";
  54. let (inner, meta) = (input, input);
  55. snapshot!(inner as MetaNameValue, @r###"
  56. MetaNameValue {
  57. path: Path {
  58. segments: [
  59. PathSegment {
  60. ident: "static",
  61. arguments: None,
  62. },
  63. ],
  64. },
  65. lit: 5,
  66. }
  67. "###);
  68. snapshot!(meta as Meta, @r###"
  69. Meta::NameValue {
  70. path: Path {
  71. segments: [
  72. PathSegment {
  73. ident: "static",
  74. arguments: None,
  75. },
  76. ],
  77. },
  78. lit: 5,
  79. }
  80. "###);
  81. assert_eq!(meta, inner.into());
  82. }
  83. #[test]
  84. fn test_parse_meta_name_value_with_bool() {
  85. let input = "true = 5";
  86. let (inner, meta) = (input, input);
  87. snapshot!(inner as MetaNameValue, @r###"
  88. MetaNameValue {
  89. path: Path {
  90. segments: [
  91. PathSegment {
  92. ident: "true",
  93. arguments: None,
  94. },
  95. ],
  96. },
  97. lit: 5,
  98. }
  99. "###);
  100. snapshot!(meta as Meta, @r###"
  101. Meta::NameValue {
  102. path: Path {
  103. segments: [
  104. PathSegment {
  105. ident: "true",
  106. arguments: None,
  107. },
  108. ],
  109. },
  110. lit: 5,
  111. }
  112. "###);
  113. assert_eq!(meta, inner.into());
  114. }
  115. #[test]
  116. fn test_parse_meta_item_list_lit() {
  117. let input = "foo(5)";
  118. let (inner, meta) = (input, input);
  119. snapshot!(inner as MetaList, @r###"
  120. MetaList {
  121. path: Path {
  122. segments: [
  123. PathSegment {
  124. ident: "foo",
  125. arguments: None,
  126. },
  127. ],
  128. },
  129. nested: [
  130. Lit(5),
  131. ],
  132. }
  133. "###);
  134. snapshot!(meta as Meta, @r###"
  135. Meta::List {
  136. path: Path {
  137. segments: [
  138. PathSegment {
  139. ident: "foo",
  140. arguments: None,
  141. },
  142. ],
  143. },
  144. nested: [
  145. Lit(5),
  146. ],
  147. }
  148. "###);
  149. assert_eq!(meta, inner.into());
  150. }
  151. #[test]
  152. fn test_parse_meta_item_multiple() {
  153. let input = "foo(word, name = 5, list(name2 = 6), word2)";
  154. let (inner, meta) = (input, input);
  155. snapshot!(inner as MetaList, @r###"
  156. MetaList {
  157. path: Path {
  158. segments: [
  159. PathSegment {
  160. ident: "foo",
  161. arguments: None,
  162. },
  163. ],
  164. },
  165. nested: [
  166. Meta(Path(Path {
  167. segments: [
  168. PathSegment {
  169. ident: "word",
  170. arguments: None,
  171. },
  172. ],
  173. })),
  174. Meta(Meta::NameValue {
  175. path: Path {
  176. segments: [
  177. PathSegment {
  178. ident: "name",
  179. arguments: None,
  180. },
  181. ],
  182. },
  183. lit: 5,
  184. }),
  185. Meta(Meta::List {
  186. path: Path {
  187. segments: [
  188. PathSegment {
  189. ident: "list",
  190. arguments: None,
  191. },
  192. ],
  193. },
  194. nested: [
  195. Meta(Meta::NameValue {
  196. path: Path {
  197. segments: [
  198. PathSegment {
  199. ident: "name2",
  200. arguments: None,
  201. },
  202. ],
  203. },
  204. lit: 6,
  205. }),
  206. ],
  207. }),
  208. Meta(Path(Path {
  209. segments: [
  210. PathSegment {
  211. ident: "word2",
  212. arguments: None,
  213. },
  214. ],
  215. })),
  216. ],
  217. }
  218. "###);
  219. snapshot!(meta as Meta, @r###"
  220. Meta::List {
  221. path: Path {
  222. segments: [
  223. PathSegment {
  224. ident: "foo",
  225. arguments: None,
  226. },
  227. ],
  228. },
  229. nested: [
  230. Meta(Path(Path {
  231. segments: [
  232. PathSegment {
  233. ident: "word",
  234. arguments: None,
  235. },
  236. ],
  237. })),
  238. Meta(Meta::NameValue {
  239. path: Path {
  240. segments: [
  241. PathSegment {
  242. ident: "name",
  243. arguments: None,
  244. },
  245. ],
  246. },
  247. lit: 5,
  248. }),
  249. Meta(Meta::List {
  250. path: Path {
  251. segments: [
  252. PathSegment {
  253. ident: "list",
  254. arguments: None,
  255. },
  256. ],
  257. },
  258. nested: [
  259. Meta(Meta::NameValue {
  260. path: Path {
  261. segments: [
  262. PathSegment {
  263. ident: "name2",
  264. arguments: None,
  265. },
  266. ],
  267. },
  268. lit: 6,
  269. }),
  270. ],
  271. }),
  272. Meta(Path(Path {
  273. segments: [
  274. PathSegment {
  275. ident: "word2",
  276. arguments: None,
  277. },
  278. ],
  279. })),
  280. ],
  281. }
  282. "###);
  283. assert_eq!(meta, inner.into());
  284. }
  285. #[test]
  286. fn test_parse_nested_meta() {
  287. let input = "5";
  288. snapshot!(input as NestedMeta, @"Lit(5)");
  289. let input = "list(name2 = 6)";
  290. snapshot!(input as NestedMeta, @r###"
  291. Meta(Meta::List {
  292. path: Path {
  293. segments: [
  294. PathSegment {
  295. ident: "list",
  296. arguments: None,
  297. },
  298. ],
  299. },
  300. nested: [
  301. Meta(Meta::NameValue {
  302. path: Path {
  303. segments: [
  304. PathSegment {
  305. ident: "name2",
  306. arguments: None,
  307. },
  308. ],
  309. },
  310. lit: 6,
  311. }),
  312. ],
  313. })
  314. "###);
  315. }
  316. #[test]
  317. fn test_parse_path() {
  318. let input = "::serde::Serialize";
  319. snapshot!(input as Meta, @r###"
  320. Path(Path {
  321. leading_colon: Some,
  322. segments: [
  323. PathSegment {
  324. ident: "serde",
  325. arguments: None,
  326. },
  327. PathSegment {
  328. ident: "Serialize",
  329. arguments: None,
  330. },
  331. ],
  332. })
  333. "###);
  334. let input = "::serde::Serialize";
  335. snapshot!(input as NestedMeta, @r###"
  336. Meta(Path(Path {
  337. leading_colon: Some,
  338. segments: [
  339. PathSegment {
  340. ident: "serde",
  341. arguments: None,
  342. },
  343. PathSegment {
  344. ident: "Serialize",
  345. arguments: None,
  346. },
  347. ],
  348. }))
  349. "###);
  350. }