1 use ::num_enum::UnsafeFromPrimitive;
2 
3 // Guard against https://github.com/illicitonion/num_enum/issues/27
4 mod alloc {}
5 mod core {}
6 mod num_enum {}
7 mod std {}
8 
9 #[test]
has_unsafe_from_primitive_number()10 fn has_unsafe_from_primitive_number() {
11     #[derive(Debug, Eq, PartialEq, UnsafeFromPrimitive)]
12     #[repr(u8)]
13     enum Enum {
14         Zero,
15         One,
16     }
17 
18     unsafe {
19         assert_eq!(Enum::unchecked_transmute_from(0_u8), Enum::Zero);
20         assert_eq!(Enum::unchecked_transmute_from(1_u8), Enum::One);
21     }
22 }
23 
24 #[test]
has_unsafe_from_primitive_number_with_alternatives_and_default_which_are_ignored()25 fn has_unsafe_from_primitive_number_with_alternatives_and_default_which_are_ignored() {
26     #[derive(Debug, Eq, PartialEq, UnsafeFromPrimitive)]
27     #[repr(u8)]
28     enum Enum {
29         Zero,
30         One,
31         #[num_enum(alternatives = [3, 4])]
32         Some,
33         #[num_enum(default)]
34         Many = 5,
35     }
36 
37     unsafe {
38         assert_eq!(Enum::unchecked_transmute_from(0_u8), Enum::Zero);
39         assert_eq!(Enum::unchecked_transmute_from(1_u8), Enum::One);
40         assert_eq!(Enum::unchecked_transmute_from(2_u8), Enum::Some);
41         assert_eq!(Enum::unchecked_transmute_from(5_u8), Enum::Many);
42         // Any other conversions would be undefined behavior.
43     }
44 
45     #[allow(deprecated)]
46     unsafe {
47         assert_eq!(Enum::from_unchecked(0_u8), Enum::Zero);
48         assert_eq!(Enum::from_unchecked(1_u8), Enum::One);
49         assert_eq!(Enum::from_unchecked(2_u8), Enum::Some);
50         assert_eq!(Enum::from_unchecked(5_u8), Enum::Many);
51     }
52 }
53 
54 #[test]
has_unsafe_from_primitive_number_with_alternatives_and_std_default_which_are_ignored()55 fn has_unsafe_from_primitive_number_with_alternatives_and_std_default_which_are_ignored() {
56     #[derive(Debug, Default, Eq, PartialEq, UnsafeFromPrimitive)]
57     #[repr(u8)]
58     enum Enum {
59         Zero,
60         One,
61         #[num_enum(alternatives = [3, 4])]
62         Some,
63         #[default]
64         Many = 5,
65     }
66 
67     unsafe {
68         assert_eq!(Enum::unchecked_transmute_from(0_u8), Enum::Zero);
69         assert_eq!(Enum::unchecked_transmute_from(1_u8), Enum::One);
70         assert_eq!(Enum::unchecked_transmute_from(2_u8), Enum::Some);
71         assert_eq!(Enum::unchecked_transmute_from(5_u8), Enum::Many);
72         // Any other conversions would be undefined behavior.
73     }
74 
75     #[allow(deprecated)]
76     unsafe {
77         assert_eq!(Enum::from_unchecked(0_u8), Enum::Zero);
78         assert_eq!(Enum::from_unchecked(1_u8), Enum::One);
79         assert_eq!(Enum::from_unchecked(2_u8), Enum::Some);
80         assert_eq!(Enum::from_unchecked(5_u8), Enum::Many);
81     }
82 }
83