pub use enum_variant_eq_derive;
pub trait EnumVariantEq {
fn enum_variant_eq(&self, other: &Self) -> bool;
}
#[cfg(test)]
mod tests {
use super::EnumVariantEq;
use super::enum_variant_eq_derive::EnumVariantEq;
#[derive(Debug, EnumVariantEq)]
#[allow(unused)]
enum EmptyEnum {}
#[derive(Debug, EnumVariantEq)]
#[allow(unused)]
#[repr(usize)]
enum TestEnum {
Unit = 8,
EmptyUnNamed() = 9,
UnNamed(i8) = 15,
UnNamed2(i8, u8),
EmptyNamed {} = 19,
Named { x: i8 },
Named2 { x: i8, y: u8 },
}
#[allow(unused)]
macro_rules! asserts {
(! $( $a:expr, $b:expr ; )* ) => {
$(
assert!( ! $a.enum_variant_eq(&$b) );
)*
};
( $( $a:expr, $b:expr ; )* ) => {
$(
assert!( $a.enum_variant_eq(&$b) );
)*
};
}
#[test]
fn tests() {
{
use TestEnum::*;
asserts!{
Unit, Unit;
EmptyUnNamed(), EmptyUnNamed();
UnNamed(3), UnNamed(4);
UnNamed2(3, 5), UnNamed2(4, 6);
UnNamed2(3, 5), UnNamed2(3, 5);
EmptyNamed {}, EmptyNamed {};
Named { x: 3 }, Named { x: 4 };
Named2 { x: 6, y: 8 }, Named2 { x: 7, y: 9 };
Named2 { x: 7, y: 8 }, Named2 { x: 7, y: 8 };
}
asserts!{!
Unit, EmptyUnNamed();
EmptyUnNamed(), UnNamed(7);
UnNamed(8), UnNamed2(12, 16);
UnNamed2(17, 18), EmptyNamed {};
EmptyNamed {}, Named { x: 8 };
Named { x: 9 }, Named2 { x: 12, y: 15 };
Named2 { x: 3, y: 8 }, Unit;
}
}
}
#[test]
fn generic_test() {
#[derive(Debug, EnumVariantEq)]
enum Test<'a, T> {
A(&'a T),
No,
}
use Test::*;
assert!(A(&Vec::new()).enum_variant_eq(&A(&vec![1, 2])));
assert!(No::<()>.enum_variant_eq(&No));
}
}