242 lines
7.7 KiB
Rust
242 lines
7.7 KiB
Rust
#![cfg_attr(not(feature = "std"), no_std)]
|
|
#![allow(dead_code)] // some code is tested for type checking only
|
|
|
|
#[cfg(not(feature = "std"))]
|
|
extern crate alloc;
|
|
|
|
#[cfg(not(feature = "std"))]
|
|
use alloc::string::ToString;
|
|
|
|
use derive_more::TryInto;
|
|
|
|
// Ensure that the `TryInto` macro is hygienic and doesn't break when `Result`
|
|
// has been redefined.
|
|
type Result = ();
|
|
|
|
#[derive(TryInto, Clone, Copy, Debug, Eq, PartialEq)]
|
|
#[try_into(owned, ref, ref_mut)]
|
|
enum MixedInts {
|
|
SmallInt(i32),
|
|
NamedBigInt {
|
|
int: i64,
|
|
},
|
|
UnsignedWithIgnoredField(#[try_into(ignore)] bool, i64),
|
|
NamedUnsignedWithIgnoredField {
|
|
#[try_into(ignore)]
|
|
useless: bool,
|
|
x: i64,
|
|
},
|
|
TwoSmallInts(i32, i32),
|
|
NamedBigInts {
|
|
x: i64,
|
|
y: i64,
|
|
},
|
|
Unsigned(u32),
|
|
NamedUnsigned {
|
|
x: u32,
|
|
},
|
|
Unit,
|
|
#[try_into(ignore)]
|
|
Unit2,
|
|
}
|
|
|
|
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
|
|
struct Wrapper<'a, const Y: usize, U>(&'a [U; Y]);
|
|
|
|
enum Foo<'lt: 'static, T: Clone, const X: usize> {
|
|
X(Wrapper<'lt, X, T>),
|
|
}
|
|
|
|
#[test]
|
|
fn test_try_into() {
|
|
let mut i = MixedInts::SmallInt(42);
|
|
assert_eq!(42i32, i.try_into().unwrap());
|
|
assert_eq!(&42i32, <_ as TryInto<&i32>>::try_into(&i).unwrap());
|
|
assert_eq!(
|
|
&mut 42i32,
|
|
<_ as TryInto<&mut i32>>::try_into(&mut i).unwrap()
|
|
);
|
|
assert_eq!(
|
|
i64::try_from(i).unwrap_err().to_string(),
|
|
"Only NamedBigInt, UnsignedWithIgnoredField, NamedUnsignedWithIgnoredField can be converted to i64"
|
|
);
|
|
assert_eq!(i64::try_from(i).unwrap_err().input, MixedInts::SmallInt(42));
|
|
assert_eq!(
|
|
<(i32, i32)>::try_from(i).unwrap_err().to_string(),
|
|
"Only TwoSmallInts can be converted to (i32, i32)"
|
|
);
|
|
assert_eq!(
|
|
<(i64, i64)>::try_from(i).unwrap_err().to_string(),
|
|
"Only NamedBigInts can be converted to (i64, i64)"
|
|
);
|
|
assert_eq!(
|
|
u32::try_from(i).unwrap_err().to_string(),
|
|
"Only Unsigned, NamedUnsigned can be converted to u32"
|
|
);
|
|
assert_eq!(
|
|
<()>::try_from(i).unwrap_err().to_string(),
|
|
"Only Unit can be converted to ()"
|
|
);
|
|
|
|
let mut i = MixedInts::NamedBigInt { int: 42 };
|
|
assert_eq!(
|
|
i32::try_from(i).unwrap_err().to_string(),
|
|
"Only SmallInt can be converted to i32"
|
|
);
|
|
assert_eq!(42i64, i.try_into().unwrap());
|
|
assert_eq!(&42i64, <_ as TryInto<&i64>>::try_into(&i).unwrap());
|
|
assert_eq!(
|
|
&mut 42i64,
|
|
<_ as TryInto<&mut i64>>::try_into(&mut i).unwrap()
|
|
);
|
|
assert_eq!(
|
|
<(i32, i32)>::try_from(i).unwrap_err().to_string(),
|
|
"Only TwoSmallInts can be converted to (i32, i32)"
|
|
);
|
|
assert_eq!(
|
|
<(i64, i64)>::try_from(i).unwrap_err().to_string(),
|
|
"Only NamedBigInts can be converted to (i64, i64)"
|
|
);
|
|
assert_eq!(
|
|
u32::try_from(i).unwrap_err().to_string(),
|
|
"Only Unsigned, NamedUnsigned can be converted to u32"
|
|
);
|
|
assert_eq!(
|
|
<()>::try_from(i).unwrap_err().to_string(),
|
|
"Only Unit can be converted to ()"
|
|
);
|
|
|
|
let mut i = MixedInts::TwoSmallInts(42, 64);
|
|
assert_eq!(
|
|
i32::try_from(i).unwrap_err().to_string(),
|
|
"Only SmallInt can be converted to i32"
|
|
);
|
|
assert_eq!(
|
|
i64::try_from(i).unwrap_err().to_string(),
|
|
"Only NamedBigInt, UnsignedWithIgnoredField, NamedUnsignedWithIgnoredField can be converted to i64"
|
|
);
|
|
assert_eq!((42i32, 64i32), i.try_into().unwrap());
|
|
assert_eq!((&42i32, &64i32), (&i).try_into().unwrap());
|
|
assert_eq!((&mut 42i32, &mut 64i32), (&mut i).try_into().unwrap());
|
|
assert_eq!(
|
|
<(i64, i64)>::try_from(i).unwrap_err().to_string(),
|
|
"Only NamedBigInts can be converted to (i64, i64)"
|
|
);
|
|
assert_eq!(
|
|
u32::try_from(i).unwrap_err().to_string(),
|
|
"Only Unsigned, NamedUnsigned can be converted to u32"
|
|
);
|
|
assert_eq!(
|
|
<()>::try_from(i).unwrap_err().to_string(),
|
|
"Only Unit can be converted to ()"
|
|
);
|
|
|
|
let mut i = MixedInts::NamedBigInts { x: 42, y: 64 };
|
|
assert_eq!(
|
|
i32::try_from(i).unwrap_err().to_string(),
|
|
"Only SmallInt can be converted to i32"
|
|
);
|
|
assert_eq!(
|
|
i64::try_from(i).unwrap_err().to_string(),
|
|
"Only NamedBigInt, UnsignedWithIgnoredField, NamedUnsignedWithIgnoredField can be converted to i64"
|
|
);
|
|
assert_eq!(
|
|
<(i32, i32)>::try_from(i).unwrap_err().to_string(),
|
|
"Only TwoSmallInts can be converted to (i32, i32)"
|
|
);
|
|
assert_eq!((42i64, 64i64), i.try_into().unwrap());
|
|
assert_eq!((&42i64, &64i64), (&i).try_into().unwrap());
|
|
assert_eq!((&mut 42i64, &mut 64i64), (&mut i).try_into().unwrap());
|
|
assert_eq!(
|
|
u32::try_from(i).unwrap_err().to_string(),
|
|
"Only Unsigned, NamedUnsigned can be converted to u32"
|
|
);
|
|
assert_eq!(
|
|
<()>::try_from(i).unwrap_err().to_string(),
|
|
"Only Unit can be converted to ()"
|
|
);
|
|
|
|
let mut i = MixedInts::Unsigned(42);
|
|
assert_eq!(
|
|
i32::try_from(i).unwrap_err().to_string(),
|
|
"Only SmallInt can be converted to i32"
|
|
);
|
|
assert_eq!(
|
|
i64::try_from(i).unwrap_err().to_string(),
|
|
"Only NamedBigInt, UnsignedWithIgnoredField, NamedUnsignedWithIgnoredField can be converted to i64"
|
|
);
|
|
assert_eq!(
|
|
<(i32, i32)>::try_from(i).unwrap_err().to_string(),
|
|
"Only TwoSmallInts can be converted to (i32, i32)"
|
|
);
|
|
assert_eq!(
|
|
<(i64, i64)>::try_from(i).unwrap_err().to_string(),
|
|
"Only NamedBigInts can be converted to (i64, i64)"
|
|
);
|
|
assert_eq!(42u32, i.try_into().unwrap());
|
|
assert_eq!(&42u32, <_ as TryInto<&u32>>::try_into(&i).unwrap());
|
|
assert_eq!(
|
|
&mut 42u32,
|
|
<_ as TryInto<&mut u32>>::try_into(&mut i).unwrap()
|
|
);
|
|
assert_eq!(
|
|
<()>::try_from(i).unwrap_err().to_string(),
|
|
"Only Unit can be converted to ()"
|
|
);
|
|
|
|
let mut i = MixedInts::NamedUnsigned { x: 42 };
|
|
assert_eq!(
|
|
i32::try_from(i).unwrap_err().to_string(),
|
|
"Only SmallInt can be converted to i32"
|
|
);
|
|
assert_eq!(
|
|
i64::try_from(i).unwrap_err().to_string(),
|
|
"Only NamedBigInt, UnsignedWithIgnoredField, NamedUnsignedWithIgnoredField can be converted to i64"
|
|
);
|
|
assert_eq!(
|
|
i64::try_from(i).unwrap_err().to_string(),
|
|
"Only NamedBigInt, UnsignedWithIgnoredField, NamedUnsignedWithIgnoredField can be converted to i64"
|
|
);
|
|
assert_eq!(
|
|
<(i32, i32)>::try_from(i).unwrap_err().to_string(),
|
|
"Only TwoSmallInts can be converted to (i32, i32)"
|
|
);
|
|
assert_eq!(
|
|
<(i64, i64)>::try_from(i).unwrap_err().to_string(),
|
|
"Only NamedBigInts can be converted to (i64, i64)"
|
|
);
|
|
assert_eq!(42u32, i.try_into().unwrap());
|
|
assert_eq!(&42u32, <_ as TryInto<&u32>>::try_into(&i).unwrap());
|
|
assert_eq!(
|
|
&mut 42u32,
|
|
<_ as TryInto<&mut u32>>::try_into(&mut i).unwrap()
|
|
);
|
|
assert_eq!(
|
|
<()>::try_from(i).unwrap_err().to_string(),
|
|
"Only Unit can be converted to ()"
|
|
);
|
|
|
|
let i = MixedInts::Unit;
|
|
assert_eq!(
|
|
i32::try_from(i).unwrap_err().to_string(),
|
|
"Only SmallInt can be converted to i32"
|
|
);
|
|
assert_eq!(
|
|
i64::try_from(i).unwrap_err().to_string(),
|
|
"Only NamedBigInt, UnsignedWithIgnoredField, NamedUnsignedWithIgnoredField can be converted to i64"
|
|
);
|
|
assert_eq!(
|
|
<(i32, i32)>::try_from(i).unwrap_err().to_string(),
|
|
"Only TwoSmallInts can be converted to (i32, i32)"
|
|
);
|
|
assert_eq!(
|
|
<(i64, i64)>::try_from(i).unwrap_err().to_string(),
|
|
"Only NamedBigInts can be converted to (i64, i64)"
|
|
);
|
|
assert_eq!(
|
|
u32::try_from(i).unwrap_err().to_string(),
|
|
"Only Unsigned, NamedUnsigned can be converted to u32"
|
|
);
|
|
assert!(matches!(i.try_into().unwrap(), ()));
|
|
}
|