use assert2::check;
use assert2::let_assert;
use syn::LitInt;
use syn::{Expr, Ident};
use crate::Parse;
#[derive(Parse)]
enum EnumWithUnnamedVariants {
SumOfInts(LitInt, syn::token::Add, LitInt),
Expression(Expr),
Identifier(Ident), }
#[test]
fn first_variant_is_parsed_when_it_matches() {
let variant = syn::parse_str::<EnumWithUnnamedVariants>("1 + 1239874").unwrap();
let_assert!(EnumWithUnnamedVariants::SumOfInts(int1, comma, int2) = variant);
check!(int1 == syn::parse_str::<LitInt>("1").unwrap());
check!(comma == syn::parse_str::<syn::token::Add>("+").unwrap());
check!(int2 == syn::parse_str::<LitInt>("1239874").unwrap());
}
#[test]
fn second_variant_is_parsed_when_first_cannot_be_matched() {
let variant = syn::parse_str::<EnumWithUnnamedVariants>("a+1239874").unwrap();
let expression = syn::parse_str::<Expr>("a+1239874").unwrap();
let_assert!(EnumWithUnnamedVariants::Expression(parsed_expression) = variant);
check!(parsed_expression == expression);
}
#[test]
fn expressions_are_correctly_parsed() {
let variant =
syn::parse_str::<EnumWithUnnamedVariants>("this.looks(&like) == an + expression").unwrap();
let expression = syn::parse_str::<Expr>("this.looks(&like) == an + expression").unwrap();
let_assert!(EnumWithUnnamedVariants::Expression(parsed_expression) = variant);
check!(parsed_expression == expression);
}
#[test]
fn the_first_working_parsed_is_chosen() {
let variant = syn::parse_str::<EnumWithUnnamedVariants>("this_could_also_be_an_ident").unwrap();
let expression = syn::parse_str::<Expr>("this_could_also_be_an_ident").unwrap();
let_assert!(EnumWithUnnamedVariants::Expression(parsed_expression) = variant);
check!(parsed_expression == expression);
}
#[test]
fn parsing_gives_error_if_none_of_the_variants_can_be_parsed() {
let variant = syn::parse_str::<EnumWithUnnamedVariants>("---this cannot be parsed---");
check!(variant.is_err());
}