|  | use darling::{Error, FromMeta}; | 
|  | use syn::parse_quote; | 
|  |  | 
|  | #[derive(Debug, FromMeta)] | 
|  | struct Meta { | 
|  | #[darling(default)] | 
|  | meta1: Option<String>, | 
|  | #[darling(default)] | 
|  | meta2: bool, | 
|  | } | 
|  |  | 
|  | #[test] | 
|  | fn nested_meta_meta_value() { | 
|  | let meta = Meta::from_list(&[parse_quote! { | 
|  | meta1 = "thefeature" | 
|  | }]) | 
|  | .unwrap(); | 
|  | assert_eq!(meta.meta1, Some("thefeature".to_string())); | 
|  | assert!(!meta.meta2); | 
|  | } | 
|  |  | 
|  | #[test] | 
|  | fn nested_meta_meta_bool() { | 
|  | let meta = Meta::from_list(&[parse_quote! { | 
|  | meta2 | 
|  | }]) | 
|  | .unwrap(); | 
|  | assert_eq!(meta.meta1, None); | 
|  | assert!(meta.meta2); | 
|  | } | 
|  |  | 
|  | #[test] | 
|  | fn nested_meta_lit_string_errors() { | 
|  | let err = Meta::from_list(&[parse_quote! { | 
|  | "meta2" | 
|  | }]) | 
|  | .unwrap_err(); | 
|  | assert_eq!( | 
|  | err.to_string(), | 
|  | Error::unsupported_format("literal").to_string() | 
|  | ); | 
|  | } | 
|  |  | 
|  | #[test] | 
|  | fn nested_meta_lit_integer_errors() { | 
|  | let err = Meta::from_list(&[parse_quote! { | 
|  | 2 | 
|  | }]) | 
|  | .unwrap_err(); | 
|  | assert_eq!( | 
|  | err.to_string(), | 
|  | Error::unsupported_format("literal").to_string() | 
|  | ); | 
|  | } | 
|  |  | 
|  | #[test] | 
|  | fn nested_meta_lit_bool_errors() { | 
|  | let err = Meta::from_list(&[parse_quote! { | 
|  | true | 
|  | }]) | 
|  | .unwrap_err(); | 
|  | assert_eq!( | 
|  | err.to_string(), | 
|  | Error::unsupported_format("literal").to_string() | 
|  | ); | 
|  | } | 
|  |  | 
|  | /// Tests behavior of FromMeta implementation for enums. | 
|  | mod enum_impl { | 
|  | use darling::{Error, FromMeta}; | 
|  | use syn::parse_quote; | 
|  |  | 
|  | /// A playback volume. | 
|  | #[derive(Debug, Clone, Copy, PartialEq, Eq, FromMeta)] | 
|  | enum Volume { | 
|  | Normal, | 
|  | Low, | 
|  | High, | 
|  | #[darling(rename = "dB")] | 
|  | Decibels(u8), | 
|  | } | 
|  |  | 
|  | #[test] | 
|  | fn string_for_unit_variant() { | 
|  | let volume = Volume::from_string("low").unwrap(); | 
|  | assert_eq!(volume, Volume::Low); | 
|  | } | 
|  |  | 
|  | #[test] | 
|  | fn single_value_list() { | 
|  | let unit_variant = Volume::from_list(&[parse_quote!(high)]).unwrap(); | 
|  | assert_eq!(unit_variant, Volume::High); | 
|  |  | 
|  | let newtype_variant = Volume::from_list(&[parse_quote!(dB = 100)]).unwrap(); | 
|  | assert_eq!(newtype_variant, Volume::Decibels(100)); | 
|  | } | 
|  |  | 
|  | #[test] | 
|  | fn empty_list_errors() { | 
|  | let err = Volume::from_list(&[]).unwrap_err(); | 
|  | assert_eq!(err.to_string(), Error::too_few_items(1).to_string()); | 
|  | } | 
|  |  | 
|  | #[test] | 
|  | fn multiple_values_list_errors() { | 
|  | let err = Volume::from_list(&[parse_quote!(low), parse_quote!(dB = 20)]).unwrap_err(); | 
|  | assert_eq!(err.to_string(), Error::too_many_items(1).to_string()); | 
|  | } | 
|  | } |