konnektoren_core/challenges/
challenge_variant.rs1use 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}