konnektoren_core/challenges/ordering/
mod.rs

1use schemars::JsonSchema;
2use serde::{Deserialize, Serialize};
3
4#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, JsonSchema)]
5pub struct Ordering {
6    /// Unique identifier for the challenge
7    pub id: String,
8    /// Display name of the challenge
9    pub name: String,
10    /// Description of the challenge
11    pub description: String,
12    /// List of ordering items
13    pub items: Vec<OrderingItem>,
14}
15
16impl Default for Ordering {
17    fn default() -> Self {
18        let data = include_str!("../../../assets/ordering_default.yml");
19        serde_yaml::from_str(data).unwrap()
20    }
21}
22
23#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Default, JsonSchema)]
24pub struct OrderingItem {
25    /// Elements to be ordered
26    pub elements: Vec<String>,
27    /// Correct order (indices)
28    pub correct_order: Vec<usize>,
29}
30
31#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Default, JsonSchema)]
32pub struct OrderingResult {
33    /// User's ordering (indices)
34    pub order: Vec<usize>,
35}
36
37#[cfg(test)]
38mod tests {
39    use super::*;
40
41    #[test]
42    fn new_ordering() {
43        let id = "123".to_string();
44        let name = "Test".to_string();
45        let description = "Description".to_string();
46        let items = vec![
47            OrderingItem {
48                elements: vec!["A".to_string(), "B".to_string(), "C".to_string()],
49                correct_order: vec![0, 1, 2],
50            },
51            OrderingItem {
52                elements: vec!["D".to_string(), "E".to_string(), "F".to_string()],
53                correct_order: vec![2, 1, 0],
54            },
55        ];
56        let ordering = Ordering {
57            id,
58            name,
59            description,
60            items,
61        };
62        assert_eq!(ordering.id, "123");
63        assert_eq!(ordering.name, "Test");
64        assert_eq!(ordering.description, "Description");
65        assert_eq!(ordering.items.len(), 2);
66        assert_eq!(ordering.items[0].elements.len(), 3);
67        assert_eq!(ordering.items[0].correct_order.len(), 3);
68        assert_eq!(ordering.items[1].elements.len(), 3);
69        assert_eq!(ordering.items[1].correct_order.len(), 3);
70    }
71
72    #[test]
73    fn test_ordering_deserialization() {
74        let yaml = r#"
75        id: "ordering-example"
76        name: "Ordering Example"
77        description: "Order the elements correctly"
78        items:
79          - elements:
80              - "First element"
81              - "Second element"
82              - "Third element"
83            correct_order: [0, 1, 2]
84          - elements:
85              - "Apple"
86              - "Banana"
87              - "Orange"
88            correct_order: [2, 0, 1]
89        "#;
90
91        let ordering: Ordering = serde_yaml::from_str(yaml).unwrap();
92        assert_eq!(ordering.id, "ordering-example");
93        assert_eq!(ordering.name, "Ordering Example");
94        assert_eq!(ordering.description, "Order the elements correctly");
95        assert_eq!(ordering.items.len(), 2);
96
97        let first_item = &ordering.items[0];
98        assert_eq!(first_item.elements.len(), 3);
99        assert_eq!(first_item.correct_order, vec![0, 1, 2]);
100
101        let second_item = &ordering.items[1];
102        assert_eq!(second_item.elements.len(), 3);
103        assert_eq!(second_item.correct_order, vec![2, 0, 1]);
104    }
105
106    #[test]
107    fn test_ordering_result() {
108        let result = OrderingResult {
109            order: vec![2, 0, 1],
110        };
111        assert_eq!(result.order, vec![2, 0, 1]);
112    }
113
114    #[test]
115    fn test_ordering_result_default() {
116        let result = OrderingResult::default();
117        assert!(result.order.is_empty());
118    }
119}