1 use ::std::convert::TryFrom;
2 
3 use ::num_enum::{FromPrimitive, TryFromPrimitive};
4 
5 // Guard against https://github.com/illicitonion/num_enum/issues/27
6 mod alloc {}
7 mod core {}
8 mod num_enum {}
9 mod std {}
10 
11 #[test]
has_from_primitive_number()12 fn has_from_primitive_number() {
13     #[derive(Debug, Eq, PartialEq, FromPrimitive)]
14     #[repr(u8)]
15     enum Enum {
16         Zero = 0,
17         #[num_enum(default)]
18         NonZero = 1,
19     }
20 
21     let zero = Enum::from_primitive(0_u8);
22     assert_eq!(zero, Enum::Zero);
23 
24     let one = Enum::from_primitive(1_u8);
25     assert_eq!(one, Enum::NonZero);
26 
27     let two = Enum::from_primitive(2_u8);
28     assert_eq!(two, Enum::NonZero);
29 }
30 
31 #[test]
has_from_primitive_number_standard_default_attribute()32 fn has_from_primitive_number_standard_default_attribute() {
33     #[derive(Debug, Eq, PartialEq, FromPrimitive)]
34     #[repr(u8)]
35     enum Enum {
36         Zero = 0,
37         #[default]
38         NonZero = 1,
39     }
40 
41     let zero = Enum::from_primitive(0_u8);
42     assert_eq!(zero, Enum::Zero);
43 
44     let one = Enum::from_primitive(1_u8);
45     assert_eq!(one, Enum::NonZero);
46 
47     let two = Enum::from_primitive(2_u8);
48     assert_eq!(two, Enum::NonZero);
49 }
50 
51 #[test]
from_primitive_number()52 fn from_primitive_number() {
53     #[derive(Debug, Eq, PartialEq, FromPrimitive)]
54     #[repr(u8)]
55     enum Enum {
56         #[num_enum(default)]
57         Whatever = 0,
58     }
59 
60     // #[derive(FromPrimitive)] generates implementations for the following traits:
61     //
62     // - `FromPrimitive<T>`
63     // - `From<T>`
64     // - `TryFromPrimitive<T>`
65     // - `TryFrom<T>`
66     let from_primitive = Enum::from_primitive(0_u8);
67     assert_eq!(from_primitive, Enum::Whatever);
68 
69     let from = Enum::from(0_u8);
70     assert_eq!(from, Enum::Whatever);
71 
72     let try_from_primitive = Enum::try_from_primitive(0_u8);
73     assert_eq!(try_from_primitive, Ok(Enum::Whatever));
74 
75     let try_from = Enum::try_from(0_u8);
76     assert_eq!(try_from, Ok(Enum::Whatever));
77 }
78