#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum Variant {
Monochrome,
Neutral,
TonalSpot,
Vibrant,
Expressive,
Fidelity,
Content,
Rainbow,
FruitSalad,
}
impl Default for Variant {
fn default() -> Self {
Variant::TonalSpot
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_variant_monochrome() {
let variant = Variant::Monochrome;
assert_eq!(variant, Variant::Monochrome);
}
#[test]
fn test_variant_neutral() {
let variant = Variant::Neutral;
assert_eq!(variant, Variant::Neutral);
}
#[test]
fn test_variant_tonal_spot() {
let variant = Variant::TonalSpot;
assert_eq!(variant, Variant::TonalSpot);
}
#[test]
fn test_variant_vibrant() {
let variant = Variant::Vibrant;
assert_eq!(variant, Variant::Vibrant);
}
#[test]
fn test_variant_expressive() {
let variant = Variant::Expressive;
assert_eq!(variant, Variant::Expressive);
}
#[test]
fn test_variant_fidelity() {
let variant = Variant::Fidelity;
assert_eq!(variant, Variant::Fidelity);
}
#[test]
fn test_variant_content() {
let variant = Variant::Content;
assert_eq!(variant, Variant::Content);
}
#[test]
fn test_variant_rainbow() {
let variant = Variant::Rainbow;
assert_eq!(variant, Variant::Rainbow);
}
#[test]
fn test_variant_fruit_salad() {
let variant = Variant::FruitSalad;
assert_eq!(variant, Variant::FruitSalad);
}
#[test]
fn test_variant_default_is_tonal_spot() {
assert_eq!(Variant::default(), Variant::TonalSpot);
}
#[test]
fn test_variant_clone() {
let variant = Variant::Vibrant;
let cloned = variant; assert_eq!(variant, cloned);
}
#[test]
fn test_variant_copy() {
let variant = Variant::Expressive;
let copied = variant;
assert_eq!(variant, copied);
}
#[test]
fn test_variant_debug() {
let variant = Variant::FruitSalad;
let debug_str = format!("{:?}", variant);
assert_eq!(debug_str, "FruitSalad");
}
#[test]
fn test_all_variants_are_distinct() {
let variants = [
Variant::Monochrome,
Variant::Neutral,
Variant::TonalSpot,
Variant::Vibrant,
Variant::Expressive,
Variant::Fidelity,
Variant::Content,
Variant::Rainbow,
Variant::FruitSalad,
];
for (i, &variant_a) in variants.iter().enumerate() {
for &variant_b in variants.iter().skip(i + 1) {
assert_ne!(variant_a, variant_b, "Variants should be distinct");
}
}
}
#[test]
fn test_variant_hash_consistency() {
use std::collections::hash_map::DefaultHasher;
use std::hash::{Hash, Hasher};
let variant1 = Variant::TonalSpot;
let variant2 = Variant::TonalSpot;
let mut hasher1 = DefaultHasher::new();
variant1.hash(&mut hasher1);
let hash1 = hasher1.finish();
let mut hasher2 = DefaultHasher::new();
variant2.hash(&mut hasher2);
let hash2 = hasher2.finish();
assert_eq!(hash1, hash2, "Equal variants should have equal hashes");
}
#[test]
fn test_variant_in_collection() {
use std::collections::HashSet;
let mut set = HashSet::new();
set.insert(Variant::TonalSpot);
set.insert(Variant::Vibrant);
set.insert(Variant::TonalSpot);
assert_eq!(set.len(), 2);
assert!(set.contains(&Variant::TonalSpot));
assert!(set.contains(&Variant::Vibrant));
assert!(!set.contains(&Variant::Rainbow));
}
}