use rapid_recorder::prelude::*;
use std::collections::hash_map::DefaultHasher;
use std::hash::{Hash, Hasher};
use strum_macros::EnumIter;
#[repr(u32)]
#[derive(EnumIter)]
enum BasicEnum {
Variant0,
Variant1,
Variant2,
}
impl_rapid_recorder_named_usize!(BasicEnum);
#[repr(u32)]
#[derive(EnumIter)]
enum ExplicitEnum {
VariantA = 5,
VariantB = 10,
VariantC = 42,
}
impl_rapid_recorder_named_usize!(ExplicitEnum);
#[test]
fn test_into_usize_conversion() {
assert_eq!(
<BasicEnum as Into<usize>>::into(BasicEnum::Variant0),
0usize
);
assert_eq!(
<BasicEnum as Into<usize>>::into(BasicEnum::Variant1),
1usize
);
assert_eq!(
<BasicEnum as Into<usize>>::into(BasicEnum::Variant2),
2usize
);
assert_eq!(
<ExplicitEnum as Into<usize>>::into(ExplicitEnum::VariantA),
5usize
);
assert_eq!(
<ExplicitEnum as Into<usize>>::into(ExplicitEnum::VariantB),
10usize
);
assert_eq!(
<ExplicitEnum as Into<usize>>::into(ExplicitEnum::VariantC),
42usize
);
}
#[test]
fn test_from_usize_conversion() {
assert!(matches!(BasicEnum::from(0usize), BasicEnum::Variant0));
assert!(matches!(BasicEnum::from(1usize), BasicEnum::Variant1));
assert!(matches!(BasicEnum::from(2usize), BasicEnum::Variant2));
assert!(matches!(ExplicitEnum::from(5usize), ExplicitEnum::VariantA));
assert!(matches!(
ExplicitEnum::from(10usize),
ExplicitEnum::VariantB
));
assert!(matches!(
ExplicitEnum::from(42usize),
ExplicitEnum::VariantC
));
}
#[test]
fn test_clone_impl() {
let original1 = BasicEnum::Variant1;
let cloned1 = original1.clone();
assert_eq!(original1, cloned1);
let original2 = ExplicitEnum::VariantB;
let cloned2 = original2.clone();
assert_eq!(original2, cloned2);
}
#[test]
fn test_eq_impl() {
assert_eq!(BasicEnum::Variant1, BasicEnum::Variant1);
assert_eq!(ExplicitEnum::VariantB, ExplicitEnum::VariantB);
assert_ne!(BasicEnum::Variant0, BasicEnum::Variant1);
assert_ne!(ExplicitEnum::VariantA, ExplicitEnum::VariantC);
}
#[test]
fn test_hash_impl() {
let mut hasher1 = DefaultHasher::new();
let mut hasher2 = DefaultHasher::new();
BasicEnum::Variant1.hash(&mut hasher1);
BasicEnum::Variant1.hash(&mut hasher2);
assert_eq!(hasher1.finish(), hasher2.finish());
let mut hasher1 = DefaultHasher::new();
let mut hasher2 = DefaultHasher::new();
BasicEnum::Variant0.hash(&mut hasher1);
BasicEnum::Variant1.hash(&mut hasher2);
assert_ne!(hasher1.finish(), hasher2.finish());
}
#[test]
fn test_roundtrip_conversion() {
let variants = [
BasicEnum::Variant0,
BasicEnum::Variant1,
BasicEnum::Variant2,
];
for variant in variants {
let as_usize: usize = variant.into();
let back_to_enum = BasicEnum::from(as_usize);
assert_eq!(variant, back_to_enum);
}
let variants = [
ExplicitEnum::VariantA,
ExplicitEnum::VariantB,
ExplicitEnum::VariantC,
];
for variant in variants {
let as_usize: usize = variant.into();
let back_to_enum = ExplicitEnum::from(as_usize);
assert_eq!(variant, back_to_enum);
}
}
#[test]
#[should_panic(expected = "doesn't match the actual number of enum variants")]
fn test_enum_variant_count_mismatch() {
let _recorder: RapidRecorder<DefaultIndexDimmension, BasicEnum> = RapidRecorder::new(100, 5);
}