use const_reify::{HasModulus, Modular};
#[test]
fn trait_objects_have_consistent_behavior() {
let objects: Vec<&dyn HasModulus> = vec![
&Modular::<1>,
&Modular::<2>,
&Modular::<3>,
&Modular::<4>,
&Modular::<5>,
&Modular::<6>,
&Modular::<7>,
&Modular::<8>,
];
for (i, obj) in objects.iter().enumerate() {
assert_eq!(obj.modulus(), (i + 1) as u64);
}
}
#[test]
fn trait_object_size_is_two_pointers() {
assert_eq!(
std::mem::size_of::<&dyn HasModulus>(),
2 * std::mem::size_of::<usize>()
);
}
#[test]
fn zero_sized_modular_types() {
assert_eq!(std::mem::size_of::<Modular<0>>(), 0);
assert_eq!(std::mem::size_of::<Modular<42>>(), 0);
assert_eq!(std::mem::size_of::<Modular<255>>(), 0);
}
#[test]
fn different_const_values_produce_different_vtables() {
let a: &dyn HasModulus = &Modular::<10>;
let b: &dyn HasModulus = &Modular::<20>;
assert_ne!(a.modulus(), b.modulus());
assert_eq!(a.modulus(), 10);
assert_eq!(b.modulus(), 20);
}