use rstest::rstest;
use crate::{match_never, match_when, Matched, UnmatchedError};
#[derive(Matched, Debug, PartialEq, Eq)]
#[matched_enum(value_type=i32, allow_runtime_configurable=true)]
enum Signature {
#[matches(1..)]
Positive,
#[matches(..0)]
Negative,
#[matches(0..1)]
Zero,
}
#[rstest]
#[case(0, Ok(Signature::Zero))]
#[case(1, Ok(Signature::Positive))]
#[case(i32::MAX, Ok(Signature::Positive))]
#[case(-1, Ok(Signature::Negative))]
#[case(i32::MIN, Ok(Signature::Negative))]
fn get_enum_from_default_matcher(
#[case] input: i32,
#[case] expected: Result<Signature, UnmatchedError>,
) {
let matcher = SignatureMatcher::<i32>::default();
assert_eq!(matcher.try_into_enum(&input), expected);
}
#[rstest]
#[case(0, Ok(Signature::Zero))]
#[case(1, Err(UnmatchedError{}))]
#[case(i32::MAX, Err(UnmatchedError{}))]
#[case(-1, Ok(Signature::Negative))]
#[case(i32::MIN, Ok(Signature::Negative))]
fn get_enum_with_unmatched_path(
#[case] input: i32,
#[case] expected: Result<Signature, UnmatchedError>,
) {
let matcher = SignatureMatcher::<i32> {
positive: match_never(),
..Default::default()
};
assert_eq!(matcher.try_into_enum(&input), expected);
}
#[rstest]
#[case(0, Ok(Signature::Positive))]
#[case(1, Ok(Signature::Positive))]
#[case(i32::MAX, Ok(Signature::Positive))]
#[case(-1, Ok(Signature::Positive))]
#[case(i32::MIN, Ok(Signature::Positive))]
fn get_enum_with_early_wild_card(
#[case] input: i32,
#[case] expected: Result<Signature, UnmatchedError>,
) {
let matcher = SignatureMatcher::<i32> {
positive: match_when!(_),
..Default::default()
};
assert_eq!(matcher.try_into_enum(&input), expected);
}