use crate::enums::EventType;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum DevelopmentalCategory {
Attachment,
#[allow(dead_code)]
Autonomy,
#[allow(dead_code)]
Initiative,
Industry,
Identity,
Intimacy,
Generativity,
Integrity,
Neutral,
}
impl DevelopmentalCategory {
#[must_use]
#[allow(dead_code)]
pub const fn all() -> [DevelopmentalCategory; 9] {
[
DevelopmentalCategory::Attachment,
DevelopmentalCategory::Autonomy,
DevelopmentalCategory::Initiative,
DevelopmentalCategory::Industry,
DevelopmentalCategory::Identity,
DevelopmentalCategory::Intimacy,
DevelopmentalCategory::Generativity,
DevelopmentalCategory::Integrity,
DevelopmentalCategory::Neutral,
]
}
#[must_use]
#[allow(dead_code)]
pub const fn name(&self) -> &'static str {
match self {
DevelopmentalCategory::Attachment => "Attachment",
DevelopmentalCategory::Autonomy => "Autonomy",
DevelopmentalCategory::Initiative => "Initiative",
DevelopmentalCategory::Industry => "Industry",
DevelopmentalCategory::Identity => "Identity",
DevelopmentalCategory::Intimacy => "Intimacy",
DevelopmentalCategory::Generativity => "Generativity",
DevelopmentalCategory::Integrity => "Integrity",
DevelopmentalCategory::Neutral => "Neutral",
}
}
}
impl From<&EventType> for DevelopmentalCategory {
fn from(event_type: &EventType) -> Self {
match event_type {
EventType::ExperienceBetrayalTrust => DevelopmentalCategory::Attachment,
EventType::AchieveGoalMajor => DevelopmentalCategory::Industry,
EventType::FailGoalMajor => DevelopmentalCategory::Industry,
EventType::GainPowerPersonal => DevelopmentalCategory::Industry,
EventType::LoseJobFired => DevelopmentalCategory::Industry,
EventType::LoseJobLayoff => DevelopmentalCategory::Industry,
EventType::LoseJobResigned => DevelopmentalCategory::Industry,
EventType::DevelopIllnessChronic => DevelopmentalCategory::Identity,
EventType::EndRelationshipRomantic => DevelopmentalCategory::Intimacy,
EventType::ExperienceConflictFamily => DevelopmentalCategory::Intimacy,
EventType::ExperienceConflictInterpersonal => DevelopmentalCategory::Intimacy,
EventType::ExperienceAwarenessMortality => DevelopmentalCategory::Integrity,
EventType::ReceiveDiagnosisTerminal => DevelopmentalCategory::Integrity,
EventType::ExperienceExclusionGroup => DevelopmentalCategory::Attachment,
EventType::ExperienceExclusionPeer => DevelopmentalCategory::Attachment,
EventType::ExperienceInclusionPeer => DevelopmentalCategory::Attachment,
EventType::ExperienceIsolationChronic => DevelopmentalCategory::Attachment,
EventType::ExperienceRejectionFamily => DevelopmentalCategory::Attachment,
EventType::ExperienceRejectionPeer => DevelopmentalCategory::Attachment,
EventType::LosePersonDeath => DevelopmentalCategory::Attachment,
EventType::LosePersonSuicide => DevelopmentalCategory::Attachment,
EventType::ExperienceRejectionRomantic => DevelopmentalCategory::Intimacy,
EventType::EngageSelfharmNonsuicidal => DevelopmentalCategory::Neutral,
EventType::ExperienceCombatMilitary => DevelopmentalCategory::Neutral,
EventType::ExperienceHumiliationPublic => DevelopmentalCategory::Neutral,
EventType::ExperienceShamingPublic => DevelopmentalCategory::Neutral,
EventType::ExperienceStrainFinancial => DevelopmentalCategory::Neutral,
EventType::ExperienceWarRegional => DevelopmentalCategory::Neutral,
EventType::FaceChargesLegal => DevelopmentalCategory::Neutral,
EventType::FaceEvictionHousing => DevelopmentalCategory::Neutral,
EventType::LoseAccessHealthcare => DevelopmentalCategory::Neutral,
EventType::LoseBenefitsGovernment => DevelopmentalCategory::Neutral,
EventType::LoseResourceSignificant => DevelopmentalCategory::Neutral,
EventType::ReceiveFeedbackBurden => DevelopmentalCategory::Industry,
EventType::ReceiveSupportEmotional => DevelopmentalCategory::Attachment,
EventType::ReceiveSupportFinancial => DevelopmentalCategory::Neutral,
EventType::ReceiveSupportPractical => DevelopmentalCategory::Neutral,
EventType::SufferAbuseChildhood => DevelopmentalCategory::Attachment,
EventType::SufferInjuryAccidental => DevelopmentalCategory::Neutral,
EventType::SufferViolencePhysical => DevelopmentalCategory::Neutral,
EventType::SurviveAttemptSuicide => DevelopmentalCategory::Neutral,
EventType::SurviveDisasterNatural => DevelopmentalCategory::Neutral,
EventType::UndergoDeploymentMilitary => DevelopmentalCategory::Neutral,
EventType::UndergoHospitalizationMedical => DevelopmentalCategory::Neutral,
EventType::UndergoImmigrationChosen => DevelopmentalCategory::Identity,
EventType::UndergoImmigrationForced => DevelopmentalCategory::Identity,
EventType::UndergoIncarcerationPrison => DevelopmentalCategory::Identity,
EventType::UndergoRelocationChosen => DevelopmentalCategory::Identity,
EventType::UndergoRelocationForced => DevelopmentalCategory::Identity,
EventType::UndergoRetirementForced => DevelopmentalCategory::Generativity,
EventType::UndergoRetirementVoluntary => DevelopmentalCategory::Generativity,
EventType::WitnessTraumaSevere => DevelopmentalCategory::Neutral,
EventType::WitnessViolencePhysical => DevelopmentalCategory::Neutral,
EventType::Custom => DevelopmentalCategory::Neutral,
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn all_returns_nine_categories() {
let all = DevelopmentalCategory::all();
assert_eq!(all.len(), 9);
}
#[test]
fn all_categories_have_names() {
for category in DevelopmentalCategory::all() {
assert!(!category.name().is_empty());
}
}
#[test]
fn category_equality() {
assert_eq!(
DevelopmentalCategory::Attachment,
DevelopmentalCategory::Attachment
);
assert_ne!(
DevelopmentalCategory::Attachment,
DevelopmentalCategory::Identity
);
}
#[test]
fn category_is_copy() {
let c1 = DevelopmentalCategory::Attachment;
let c2 = c1; assert_eq!(c1, c2);
}
#[test]
fn category_is_hashable() {
use std::collections::HashSet;
let mut set = HashSet::new();
set.insert(DevelopmentalCategory::Attachment);
set.insert(DevelopmentalCategory::Attachment);
assert_eq!(set.len(), 1);
set.insert(DevelopmentalCategory::Identity);
assert_eq!(set.len(), 2);
}
#[test]
fn category_debug_format() {
let category = DevelopmentalCategory::Attachment;
let debug = format!("{:?}", category);
assert!(debug.contains("Attachment"));
}
#[test]
fn betrayal_maps_to_attachment() {
assert_eq!(
DevelopmentalCategory::from(&EventType::ExperienceBetrayalTrust),
DevelopmentalCategory::Attachment
);
}
#[test]
fn achievement_maps_to_industry() {
assert_eq!(
DevelopmentalCategory::from(&EventType::AchieveGoalMajor),
DevelopmentalCategory::Industry
);
}
#[test]
fn chronic_illness_maps_to_identity() {
assert_eq!(
DevelopmentalCategory::from(&EventType::DevelopIllnessChronic),
DevelopmentalCategory::Identity
);
}
#[test]
fn relationship_end_maps_to_intimacy() {
assert_eq!(
DevelopmentalCategory::from(&EventType::EndRelationshipRomantic),
DevelopmentalCategory::Intimacy
);
}
#[test]
fn mortality_awareness_maps_to_integrity() {
assert_eq!(
DevelopmentalCategory::from(&EventType::ExperienceAwarenessMortality),
DevelopmentalCategory::Integrity
);
}
#[test]
fn neutral_events_map_to_neutral() {
assert_eq!(
DevelopmentalCategory::from(&EventType::EngageSelfharmNonsuicidal),
DevelopmentalCategory::Neutral
);
assert_eq!(
DevelopmentalCategory::from(&EventType::ExperienceCombatMilitary),
DevelopmentalCategory::Neutral
);
assert_eq!(
DevelopmentalCategory::from(&EventType::Custom),
DevelopmentalCategory::Neutral
);
}
#[test]
fn all_event_types_have_category_mapping() {
for event_type in EventType::all() {
let _ = DevelopmentalCategory::from(&event_type);
}
}
#[test]
fn neutral_category_name_is_neutral() {
assert_eq!(DevelopmentalCategory::Neutral.name(), "Neutral");
}
#[test]
fn attachment_name() {
assert_eq!(DevelopmentalCategory::Attachment.name(), "Attachment");
}
#[test]
fn identity_name() {
assert_eq!(DevelopmentalCategory::Identity.name(), "Identity");
}
#[test]
fn intimacy_name() {
assert_eq!(DevelopmentalCategory::Intimacy.name(), "Intimacy");
}
#[test]
fn generativity_name() {
assert_eq!(DevelopmentalCategory::Generativity.name(), "Generativity");
}
#[test]
fn integrity_name() {
assert_eq!(DevelopmentalCategory::Integrity.name(), "Integrity");
}
#[test]
fn autonomy_name() {
assert_eq!(DevelopmentalCategory::Autonomy.name(), "Autonomy");
}
#[test]
fn initiative_name() {
assert_eq!(DevelopmentalCategory::Initiative.name(), "Initiative");
}
#[test]
fn industry_name() {
assert_eq!(DevelopmentalCategory::Industry.name(), "Industry");
}
}