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