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