1 use darling::{Error, FromMeta};
2 use syn::parse_quote;
3 
4 #[derive(Debug, FromMeta)]
5 struct Meta {
6     #[darling(default)]
7     meta1: Option<String>,
8     #[darling(default)]
9     meta2: bool,
10 }
11 
12 #[test]
nested_meta_meta_value()13 fn nested_meta_meta_value() {
14     let meta = Meta::from_list(&[parse_quote! {
15         meta1 = "thefeature"
16     }])
17     .unwrap();
18     assert_eq!(meta.meta1, Some("thefeature".to_string()));
19     assert!(!meta.meta2);
20 }
21 
22 #[test]
nested_meta_meta_bool()23 fn nested_meta_meta_bool() {
24     let meta = Meta::from_list(&[parse_quote! {
25         meta2
26     }])
27     .unwrap();
28     assert_eq!(meta.meta1, None);
29     assert!(meta.meta2);
30 }
31 
32 #[test]
nested_meta_lit_string_errors()33 fn nested_meta_lit_string_errors() {
34     let err = Meta::from_list(&[parse_quote! {
35         "meta2"
36     }])
37     .unwrap_err();
38     assert_eq!(
39         err.to_string(),
40         Error::unsupported_format("literal").to_string()
41     );
42 }
43 
44 #[test]
nested_meta_lit_integer_errors()45 fn nested_meta_lit_integer_errors() {
46     let err = Meta::from_list(&[parse_quote! {
47         2
48     }])
49     .unwrap_err();
50     assert_eq!(
51         err.to_string(),
52         Error::unsupported_format("literal").to_string()
53     );
54 }
55 
56 #[test]
nested_meta_lit_bool_errors()57 fn nested_meta_lit_bool_errors() {
58     let err = Meta::from_list(&[parse_quote! {
59         true
60     }])
61     .unwrap_err();
62     assert_eq!(
63         err.to_string(),
64         Error::unsupported_format("literal").to_string()
65     );
66 }
67 
68 /// Tests behavior of FromMeta implementation for enums.
69 mod enum_impl {
70     use darling::{Error, FromMeta};
71     use syn::parse_quote;
72 
73     /// A playback volume.
74     #[derive(Debug, Clone, Copy, PartialEq, Eq, FromMeta)]
75     enum Volume {
76         Normal,
77         Low,
78         High,
79         #[darling(rename = "dB")]
80         Decibels(u8),
81     }
82 
83     #[test]
string_for_unit_variant()84     fn string_for_unit_variant() {
85         let volume = Volume::from_string("low").unwrap();
86         assert_eq!(volume, Volume::Low);
87     }
88 
89     #[test]
single_value_list()90     fn single_value_list() {
91         let unit_variant = Volume::from_list(&[parse_quote!(high)]).unwrap();
92         assert_eq!(unit_variant, Volume::High);
93 
94         let newtype_variant = Volume::from_list(&[parse_quote!(dB = 100)]).unwrap();
95         assert_eq!(newtype_variant, Volume::Decibels(100));
96     }
97 
98     #[test]
empty_list_errors()99     fn empty_list_errors() {
100         let err = Volume::from_list(&[]).unwrap_err();
101         assert_eq!(err.to_string(), Error::too_few_items(1).to_string());
102     }
103 
104     #[test]
multiple_values_list_errors()105     fn multiple_values_list_errors() {
106         let err = Volume::from_list(&[parse_quote!(low), parse_quote!(dB = 20)]).unwrap_err();
107         assert_eq!(err.to_string(), Error::too_many_items(1).to_string());
108     }
109 }
110