| use ::num_enum::UnsafeFromPrimitive; |
| |
| // Guard against https://github.com/illicitonion/num_enum/issues/27 |
| mod alloc {} |
| mod core {} |
| mod num_enum {} |
| mod std {} |
| |
| #[test] |
| fn has_unsafe_from_primitive_number() { |
| #[derive(Debug, Eq, PartialEq, UnsafeFromPrimitive)] |
| #[repr(u8)] |
| enum Enum { |
| Zero, |
| One, |
| } |
| |
| unsafe { |
| assert_eq!(Enum::unchecked_transmute_from(0_u8), Enum::Zero); |
| assert_eq!(Enum::unchecked_transmute_from(1_u8), Enum::One); |
| } |
| } |
| |
| #[test] |
| fn has_unsafe_from_primitive_number_with_alternatives_and_default_which_are_ignored() { |
| #[derive(Debug, Eq, PartialEq, UnsafeFromPrimitive)] |
| #[repr(u8)] |
| enum Enum { |
| Zero, |
| One, |
| #[num_enum(alternatives = [3, 4])] |
| Some, |
| #[num_enum(default)] |
| Many = 5, |
| } |
| |
| unsafe { |
| assert_eq!(Enum::unchecked_transmute_from(0_u8), Enum::Zero); |
| assert_eq!(Enum::unchecked_transmute_from(1_u8), Enum::One); |
| assert_eq!(Enum::unchecked_transmute_from(2_u8), Enum::Some); |
| assert_eq!(Enum::unchecked_transmute_from(5_u8), Enum::Many); |
| // Any other conversions would be undefined behavior. |
| } |
| |
| #[allow(deprecated)] |
| unsafe { |
| assert_eq!(Enum::from_unchecked(0_u8), Enum::Zero); |
| assert_eq!(Enum::from_unchecked(1_u8), Enum::One); |
| assert_eq!(Enum::from_unchecked(2_u8), Enum::Some); |
| assert_eq!(Enum::from_unchecked(5_u8), Enum::Many); |
| } |
| } |
| |
| #[test] |
| fn has_unsafe_from_primitive_number_with_alternatives_and_std_default_which_are_ignored() { |
| #[derive(Debug, Default, Eq, PartialEq, UnsafeFromPrimitive)] |
| #[repr(u8)] |
| enum Enum { |
| Zero, |
| One, |
| #[num_enum(alternatives = [3, 4])] |
| Some, |
| #[default] |
| Many = 5, |
| } |
| |
| unsafe { |
| assert_eq!(Enum::unchecked_transmute_from(0_u8), Enum::Zero); |
| assert_eq!(Enum::unchecked_transmute_from(1_u8), Enum::One); |
| assert_eq!(Enum::unchecked_transmute_from(2_u8), Enum::Some); |
| assert_eq!(Enum::unchecked_transmute_from(5_u8), Enum::Many); |
| // Any other conversions would be undefined behavior. |
| } |
| |
| #[allow(deprecated)] |
| unsafe { |
| assert_eq!(Enum::from_unchecked(0_u8), Enum::Zero); |
| assert_eq!(Enum::from_unchecked(1_u8), Enum::One); |
| assert_eq!(Enum::from_unchecked(2_u8), Enum::Some); |
| assert_eq!(Enum::from_unchecked(5_u8), Enum::Many); |
| } |
| } |