80 lines
2.1 KiB
Rust
80 lines
2.1 KiB
Rust
#![cfg_attr(not(feature = "std"), no_std)]
|
|
#![allow(dead_code)] // some code is tested for type checking only
|
|
|
|
use derive_more::TryFrom;
|
|
|
|
#[test]
|
|
fn test_with_repr() {
|
|
#[derive(TryFrom, Clone, Copy, Debug, Eq, PartialEq)]
|
|
#[repr(i16)]
|
|
#[try_from(repr)]
|
|
enum Enum {
|
|
A,
|
|
B = -21,
|
|
C,
|
|
D,
|
|
}
|
|
assert_eq!(Enum::A, Enum::try_from(0i16).unwrap());
|
|
assert_eq!(Enum::B, Enum::try_from(-21).unwrap());
|
|
assert_eq!(Enum::C, Enum::try_from(-20).unwrap());
|
|
assert_eq!(Enum::D, Enum::try_from(-19).unwrap());
|
|
assert!(Enum::try_from(-1).is_err());
|
|
}
|
|
|
|
#[test]
|
|
fn enum_without_repr() {
|
|
#[derive(TryFrom, Clone, Copy, Debug, Eq, PartialEq)]
|
|
#[try_from(repr)]
|
|
enum Enum {
|
|
A,
|
|
B = -21,
|
|
C,
|
|
D,
|
|
}
|
|
assert_eq!(Enum::A, Enum::try_from(0isize).unwrap());
|
|
assert_eq!(Enum::B, Enum::try_from(-21).unwrap());
|
|
assert_eq!(Enum::C, Enum::try_from(-20).unwrap());
|
|
assert_eq!(Enum::D, Enum::try_from(-19).unwrap());
|
|
assert!(Enum::try_from(-1).is_err());
|
|
}
|
|
|
|
#[test]
|
|
fn enum_with_complex_repr() {
|
|
#[derive(TryFrom, Clone, Copy, Debug, Eq, PartialEq)]
|
|
#[try_from(repr)]
|
|
#[repr(align(16), i32)]
|
|
enum Enum {
|
|
A,
|
|
B = -21,
|
|
C,
|
|
D,
|
|
}
|
|
assert_eq!(Enum::A, Enum::try_from(0i32).unwrap());
|
|
assert_eq!(Enum::B, Enum::try_from(-21).unwrap());
|
|
assert_eq!(Enum::C, Enum::try_from(-20).unwrap());
|
|
assert_eq!(Enum::D, Enum::try_from(-19).unwrap());
|
|
assert!(Enum::try_from(-1).is_err());
|
|
}
|
|
|
|
#[test]
|
|
fn test_discriminants_on_enum_with_fields() {
|
|
#[derive(TryFrom, Clone, Copy, Debug, Eq, PartialEq)]
|
|
#[try_from(repr)]
|
|
#[repr(i16)]
|
|
enum Enum {
|
|
A,
|
|
Discriminant = 5,
|
|
Field(usize),
|
|
Empty {},
|
|
FieldWithDiscriminant(u8, i64) = -14,
|
|
EmptyTuple(),
|
|
}
|
|
|
|
assert_eq!(Enum::A, Enum::try_from(0).unwrap());
|
|
assert_eq!(Enum::Discriminant, Enum::try_from(5).unwrap());
|
|
assert!(Enum::try_from(6).is_err());
|
|
assert_eq!(Enum::Empty {}, Enum::try_from(7).unwrap());
|
|
assert!(Enum::try_from(-14).is_err());
|
|
assert_eq!(Enum::EmptyTuple(), Enum::try_from(-13).unwrap());
|
|
}
|