konnektoren_core/challenges/
challenge_variant.rs

1use serde::{Deserialize, Serialize};
2use std::fmt;
3use strum_macros::{EnumIter, IntoStaticStr};
4
5#[derive(
6    Default, Debug, Serialize, Deserialize, Clone, PartialEq, EnumIter, IntoStaticStr, Eq, Hash,
7)]
8#[serde(rename_all = "kebab-case")]
9#[strum(serialize_all = "kebab-case")]
10pub enum ChallengeVariant {
11    #[default]
12    MultipleChoice,
13    ContextualChoice,
14    MultipleChoiceCircle,
15    MultipleChoice4,
16    SortTable,
17    InformativeText,
18    InformativeMarkdown,
19    Custom,
20    CustomPackage,
21}
22
23impl fmt::Display for ChallengeVariant {
24    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
25        let s = match self {
26            ChallengeVariant::MultipleChoice => "Multiple Choice",
27            ChallengeVariant::ContextualChoice => "Contextual Choice",
28            ChallengeVariant::MultipleChoiceCircle => "Multiple Choice Circle",
29            ChallengeVariant::MultipleChoice4 => "Multiple Choice (4 Options)",
30            ChallengeVariant::SortTable => "Sort Table",
31            ChallengeVariant::InformativeText => "Informative Text",
32            ChallengeVariant::InformativeMarkdown => "Informative Markdown",
33            ChallengeVariant::Custom => "Custom",
34            ChallengeVariant::CustomPackage => "Custom Package",
35        };
36        write!(f, "{}", s)
37    }
38}
39
40#[cfg(test)]
41mod tests {
42    use super::*;
43    use strum::IntoEnumIterator;
44
45    #[test]
46    fn test_serde_serialization() {
47        let variant = ChallengeVariant::MultipleChoice;
48        let serialized = serde_json::to_string(&variant).unwrap();
49        assert_eq!(serialized, "\"multiple-choice\"");
50
51        let variant = ChallengeVariant::ContextualChoice;
52        let serialized = serde_json::to_string(&variant).unwrap();
53        assert_eq!(serialized, "\"contextual-choice\"");
54
55        let variant = ChallengeVariant::MultipleChoice4;
56        let serialized = serde_json::to_string(&variant).unwrap();
57        assert_eq!(serialized, "\"multiple-choice4\"");
58    }
59
60    #[test]
61    fn test_serde_deserialization() {
62        let variant: ChallengeVariant = serde_json::from_str("\"multiple-choice\"").unwrap();
63        assert_eq!(variant, ChallengeVariant::MultipleChoice);
64
65        let variant: ChallengeVariant = serde_json::from_str("\"contextual-choice\"").unwrap();
66        assert_eq!(variant, ChallengeVariant::ContextualChoice);
67
68        let variant: ChallengeVariant = serde_json::from_str("\"multiple-choice4\"").unwrap();
69        assert_eq!(variant, ChallengeVariant::MultipleChoice4);
70    }
71
72    #[test]
73    fn test_strum_into_static_str() {
74        assert_eq!(
75            <ChallengeVariant as Into<&'static str>>::into(ChallengeVariant::MultipleChoice),
76            "multiple-choice"
77        );
78        assert_eq!(
79            <ChallengeVariant as Into<&'static str>>::into(ChallengeVariant::ContextualChoice),
80            "contextual-choice"
81        );
82        assert_eq!(
83            <ChallengeVariant as Into<&'static str>>::into(ChallengeVariant::MultipleChoice4),
84            "multiple-choice4"
85        );
86    }
87
88    #[test]
89    fn test_variant_iteration() {
90        let variants: Vec<ChallengeVariant> = ChallengeVariant::iter().collect();
91        assert_eq!(variants.len(), 9);
92        assert!(variants.contains(&ChallengeVariant::MultipleChoice));
93        assert!(variants.contains(&ChallengeVariant::MultipleChoice4));
94        assert!(variants.contains(&ChallengeVariant::CustomPackage));
95    }
96
97    #[test]
98    fn test_variant_display() {
99        assert_eq!(
100            ChallengeVariant::MultipleChoice.to_string(),
101            "Multiple Choice"
102        );
103        assert_eq!(
104            ChallengeVariant::ContextualChoice.to_string(),
105            "Contextual Choice"
106        );
107        assert_eq!(
108            ChallengeVariant::MultipleChoice4.to_string(),
109            "Multiple Choice (4 Options)"
110        );
111    }
112
113    #[test]
114    fn test_default_variant() {
115        assert_eq!(
116            ChallengeVariant::default(),
117            ChallengeVariant::MultipleChoice
118        );
119    }
120
121    #[test]
122    fn test_all_variants_serde() {
123        for variant in ChallengeVariant::iter() {
124            let json = serde_json::to_string(&variant).unwrap();
125            let deserialized: ChallengeVariant = serde_json::from_str(&json).unwrap();
126            assert_eq!(variant, deserialized);
127        }
128    }
129}