167 lines
4.1 KiB
Rust
167 lines
4.1 KiB
Rust
use ::num_enum::FromPrimitive;
|
|
|
|
// Guard against https://github.com/illicitonion/num_enum/issues/27
|
|
mod alloc {}
|
|
mod core {}
|
|
mod num_enum {}
|
|
mod std {}
|
|
|
|
macro_rules! has_from_primitive_number {
|
|
( $type:ty ) => {
|
|
paste::paste! {
|
|
#[test]
|
|
fn [<has_from_primitive_number_ $type>]() {
|
|
#[derive(Debug, Eq, PartialEq, FromPrimitive)]
|
|
#[repr($type)]
|
|
enum Enum {
|
|
Zero = 0,
|
|
#[num_enum(default)]
|
|
NonZero = 1,
|
|
}
|
|
|
|
let zero = Enum::from_primitive(0 as $type);
|
|
assert_eq!(zero, Enum::Zero);
|
|
|
|
let one = Enum::from_primitive(1 as $type);
|
|
assert_eq!(one, Enum::NonZero);
|
|
|
|
let two = Enum::from_primitive(2 as $type);
|
|
assert_eq!(two, Enum::NonZero);
|
|
}
|
|
}
|
|
};
|
|
}
|
|
|
|
has_from_primitive_number!(u8);
|
|
has_from_primitive_number!(u16);
|
|
has_from_primitive_number!(u32);
|
|
has_from_primitive_number!(u64);
|
|
has_from_primitive_number!(usize);
|
|
has_from_primitive_number!(i8);
|
|
has_from_primitive_number!(i16);
|
|
has_from_primitive_number!(i32);
|
|
has_from_primitive_number!(i64);
|
|
has_from_primitive_number!(isize);
|
|
// repr with 128-bit type is unstable
|
|
// has_from_primitive_number!(u128);
|
|
// has_from_primitive_number!(i128);
|
|
|
|
#[test]
|
|
fn has_from_primitive_number_standard_default_attribute() {
|
|
#[derive(Debug, Eq, PartialEq, FromPrimitive)]
|
|
#[repr(u8)]
|
|
enum Enum {
|
|
Zero = 0,
|
|
#[default]
|
|
NonZero = 1,
|
|
}
|
|
|
|
let zero = Enum::from_primitive(0_u8);
|
|
assert_eq!(zero, Enum::Zero);
|
|
|
|
let one = Enum::from_primitive(1_u8);
|
|
assert_eq!(one, Enum::NonZero);
|
|
|
|
let two = Enum::from_primitive(2_u8);
|
|
assert_eq!(two, Enum::NonZero);
|
|
}
|
|
|
|
#[test]
|
|
fn from_primitive_number() {
|
|
#[derive(Debug, Eq, PartialEq, FromPrimitive)]
|
|
#[repr(u8)]
|
|
enum Enum {
|
|
#[num_enum(default)]
|
|
Whatever = 0,
|
|
}
|
|
|
|
// #[derive(FromPrimitive)] generates implementations for the following traits:
|
|
//
|
|
// - `FromPrimitive<T>`
|
|
// - `From<T>`
|
|
// - `TryFromPrimitive<T>`
|
|
// - `TryFrom<T>`
|
|
let from_primitive = Enum::from_primitive(0_u8);
|
|
assert_eq!(from_primitive, Enum::Whatever);
|
|
|
|
let from = Enum::from(0_u8);
|
|
assert_eq!(from, Enum::Whatever);
|
|
|
|
let from_primitive = Enum::from_primitive(1_u8);
|
|
assert_eq!(from_primitive, Enum::Whatever);
|
|
|
|
let from = Enum::from(1_u8);
|
|
assert_eq!(from, Enum::Whatever);
|
|
}
|
|
|
|
#[test]
|
|
fn from_primitive_number_catch_all() {
|
|
#[derive(Debug, Eq, PartialEq, FromPrimitive)]
|
|
#[repr(u8)]
|
|
enum Enum {
|
|
Zero = 0,
|
|
#[num_enum(catch_all)]
|
|
NonZero(u8),
|
|
}
|
|
|
|
let zero = Enum::from_primitive(0_u8);
|
|
assert_eq!(zero, Enum::Zero);
|
|
|
|
let one = Enum::from_primitive(1_u8);
|
|
assert_eq!(one, Enum::NonZero(1_u8));
|
|
|
|
let two = Enum::from_primitive(2_u8);
|
|
assert_eq!(two, Enum::NonZero(2_u8));
|
|
}
|
|
|
|
#[test]
|
|
fn from_primitive_number_catch_all_in_middle() {
|
|
#[derive(Debug, PartialEq, Eq, FromPrimitive)]
|
|
#[repr(u8)]
|
|
enum Enum {
|
|
Zero = 0,
|
|
#[num_enum(catch_all)]
|
|
Else(u8) = 2,
|
|
One = 1,
|
|
}
|
|
|
|
let zero = Enum::from_primitive(0_u8);
|
|
assert_eq!(zero, Enum::Zero);
|
|
|
|
let one = Enum::from_primitive(1_u8);
|
|
assert_eq!(one, Enum::One);
|
|
|
|
let two = Enum::from_primitive(2_u8);
|
|
assert_eq!(two, Enum::Else(2_u8));
|
|
|
|
let three = Enum::from_primitive(3_u8);
|
|
assert_eq!(three, Enum::Else(3_u8));
|
|
}
|
|
|
|
#[cfg(feature = "complex-expressions")]
|
|
#[test]
|
|
fn from_primitive_number_with_inclusive_range() {
|
|
#[derive(Debug, Eq, PartialEq, FromPrimitive)]
|
|
#[repr(u8)]
|
|
enum Enum {
|
|
Zero = 0,
|
|
#[num_enum(alternatives = [2..=255])]
|
|
NonZero,
|
|
}
|
|
|
|
let zero = Enum::from_primitive(0_u8);
|
|
assert_eq!(zero, Enum::Zero);
|
|
|
|
let one = Enum::from_primitive(1_u8);
|
|
assert_eq!(one, Enum::NonZero);
|
|
|
|
let two = Enum::from_primitive(2_u8);
|
|
assert_eq!(two, Enum::NonZero);
|
|
|
|
let three = Enum::from_primitive(3_u8);
|
|
assert_eq!(three, Enum::NonZero);
|
|
|
|
let twofivefive = Enum::from_primitive(255_u8);
|
|
assert_eq!(twofivefive, Enum::NonZero);
|
|
}
|