1 //! When input is split across multiple attributes on one element,
2 //! darling should collapse that into one struct.
3 
4 use darling::{Error, FromDeriveInput};
5 use syn::parse_quote;
6 
7 #[derive(Debug, FromDeriveInput, PartialEq, Eq)]
8 #[darling(attributes(split))]
9 struct Lorem {
10     foo: String,
11     bar: bool,
12 }
13 
14 #[test]
split_attributes_accrue_to_instance()15 fn split_attributes_accrue_to_instance() {
16     let di = parse_quote! {
17         #[split(foo = "Hello")]
18         #[split(bar)]
19         pub struct Foo;
20     };
21 
22     let parsed = Lorem::from_derive_input(&di).unwrap();
23     assert_eq!(
24         parsed,
25         Lorem {
26             foo: "Hello".to_string(),
27             bar: true,
28         }
29     );
30 }
31 
32 #[test]
duplicates_across_split_attrs_error()33 fn duplicates_across_split_attrs_error() {
34     let di = parse_quote! {
35         #[split(foo = "Hello")]
36         #[split(foo = "World", bar)]
37         pub struct Foo;
38     };
39 
40     let pr = Lorem::from_derive_input(&di).unwrap_err();
41     assert!(pr.has_span());
42     assert_eq!(pr.to_string(), Error::duplicate_field("foo").to_string());
43 }
44 
45 #[test]
multiple_errors_accrue_to_instance()46 fn multiple_errors_accrue_to_instance() {
47     let di = parse_quote! {
48         #[split(foo = "Hello")]
49         #[split(foo = "World")]
50         pub struct Foo;
51     };
52 
53     let pr = Lorem::from_derive_input(&di);
54     let err: Error = pr.unwrap_err();
55     assert_eq!(2, err.len());
56     let mut errs = err.into_iter().peekable();
57     assert_eq!(
58         errs.peek().unwrap().to_string(),
59         Error::duplicate_field("foo").to_string()
60     );
61     assert!(errs.next().unwrap().has_span());
62     assert_eq!(
63         errs.next().unwrap().to_string(),
64         Error::missing_field("bar").to_string()
65     );
66     assert!(errs.next().is_none());
67 }
68