refactor: group achievements mod

This commit is contained in:
Asger Juul Brunshøj 2023-06-19 08:21:02 +02:00
parent 100535ab9d
commit 05139b19bc
6 changed files with 141 additions and 144 deletions

View File

@ -1,13 +1,8 @@
use crate::services::confirm::ConfirmService;
use crate::services::rest::RestService;
use common::Achievement;
use common::DeleteAchievement;
use common::ToggleAchievement;
use common::UpdateAchievementTimeOfReveal;
use std::ops::Deref;
use wasm_bindgen::JsCast;
use wasm_bindgen_futures::spawn_local;
use yew::classes;
use yew::function_component;
use yew::html;
use yew::use_state;

View File

@ -1,7 +1,6 @@
use crate::components::achievement::AchievementComponent;
use crate::components::milestone::MilestoneComponent;
use chrono::NaiveTime;
use common::Achievement;
use crate::util::group_achievements::group_achievements;
use yew::functional::*;
use yew::prelude::*;
use yew_router::prelude::*;
@ -101,139 +100,3 @@ pub fn Root() -> Html {
</>
}
}
fn group_achievements(mut achievements: Vec<Achievement>) -> Vec<(Option<NaiveTime>, Vec<Achievement>)> {
// Sort the achievements by time_of_reveal.
achievements.sort_by_key(|a| a.time_of_reveal);
let mut grouped_achievements: Vec<(Option<NaiveTime>, Vec<Achievement>)> = Vec::new();
let mut current_time_of_reveal: Option<NaiveTime> = None;
let mut current_group: Vec<Achievement> = Vec::new();
for achievement in achievements {
if current_time_of_reveal == achievement.time_of_reveal {
current_group.push(achievement);
continue;
}
if !current_group.is_empty() {
grouped_achievements.push((current_time_of_reveal, current_group));
}
current_time_of_reveal = achievement.time_of_reveal;
current_group = vec![achievement];
}
if !current_group.is_empty() {
grouped_achievements.push((current_time_of_reveal, current_group));
}
grouped_achievements
}
#[cfg(test)]
mod tests {
use super::*;
use uuid::Uuid;
#[test]
fn test_group_achievements() {
let time1 = NaiveTime::from_hms_opt(12, 0, 0).unwrap();
let time2 = NaiveTime::from_hms_opt(13, 0, 0).unwrap();
let mut achievements = vec![
Achievement {
goal: "Goal 1".to_string(),
completed: true,
uuid: Uuid::new_v4(),
time_of_reveal: Some(time1),
},
Achievement {
goal: "Goal 2".to_string(),
completed: false,
uuid: Uuid::new_v4(),
time_of_reveal: Some(time1),
},
Achievement {
goal: "Goal 3".to_string(),
completed: true,
uuid: Uuid::new_v4(),
time_of_reveal: Some(time2),
},
];
let grouped = group_achievements(achievements);
assert_eq!(grouped.len(), 2);
assert_eq!(grouped[0].0, Some(time1));
assert_eq!(grouped[0].1.len(), 2);
assert_eq!(grouped[1].0, Some(time2));
assert_eq!(grouped[1].1.len(), 1);
}
#[test]
fn test_group_achievements_empty_vec() {
let achievements = vec![];
let grouped = group_achievements(achievements);
assert_eq!(grouped.len(), 0);
}
#[test]
fn test_group_achievements_group_none_values() {
let time1 = NaiveTime::from_hms_opt(12, 0, 0).unwrap();
let achievements = vec![
Achievement {
goal: "Goal 1".to_string(),
completed: true,
uuid: Uuid::new_v4(),
time_of_reveal: Some(time1),
},
Achievement {
goal: "Goal 2".to_string(),
completed: false,
uuid: Uuid::new_v4(),
time_of_reveal: None,
},
Achievement {
goal: "Goal 3".to_string(),
completed: true,
uuid: Uuid::new_v4(),
time_of_reveal: None,
},
];
let grouped = group_achievements(achievements);
assert_eq!(grouped.len(), 2);
assert_eq!(grouped[0].0, None);
assert_eq!(grouped[0].1.len(), 2);
assert_eq!(grouped[1].0, Some(time1));
assert_eq!(grouped[1].1.len(), 1);
}
#[test]
fn test_group_achievements_all_none() {
let achievements = vec![
Achievement {
goal: "Goal 1".to_string(),
completed: true,
uuid: Uuid::new_v4(),
time_of_reveal: None,
},
Achievement {
goal: "Goal 2".to_string(),
completed: false,
uuid: Uuid::new_v4(),
time_of_reveal: None,
},
Achievement {
goal: "Goal 3".to_string(),
completed: true,
uuid: Uuid::new_v4(),
time_of_reveal: None,
},
];
let grouped = group_achievements(achievements);
assert_eq!(grouped.len(), 1);
assert_eq!(grouped[0].0, None);
assert_eq!(grouped[0].1.len(), 3);
}
}

View File

@ -17,6 +17,7 @@ use yew_router::Switch;
mod components;
pub mod event_bus;
mod services;
pub mod util;
#[derive(Debug, Clone, Copy, PartialEq, Routable)]
enum Route {

View File

@ -0,0 +1,138 @@
use chrono::NaiveTime;
use common::Achievement;
pub fn group_achievements(mut achievements: Vec<Achievement>) -> Vec<(Option<NaiveTime>, Vec<Achievement>)> {
// Sort the achievements by time_of_reveal.
achievements.sort_by_key(|a| a.time_of_reveal);
let mut grouped_achievements: Vec<(Option<NaiveTime>, Vec<Achievement>)> = Vec::new();
let mut current_time_of_reveal: Option<NaiveTime> = None;
let mut current_group: Vec<Achievement> = Vec::new();
for achievement in achievements {
if current_time_of_reveal == achievement.time_of_reveal {
current_group.push(achievement);
continue;
}
if !current_group.is_empty() {
grouped_achievements.push((current_time_of_reveal, current_group));
}
current_time_of_reveal = achievement.time_of_reveal;
current_group = vec![achievement];
}
if !current_group.is_empty() {
grouped_achievements.push((current_time_of_reveal, current_group));
}
grouped_achievements
}
#[cfg(test)]
mod tests {
use super::*;
use uuid::Uuid;
#[test]
fn test_group_achievements() {
let time1 = NaiveTime::from_hms_opt(12, 0, 0).unwrap();
let time2 = NaiveTime::from_hms_opt(13, 0, 0).unwrap();
let mut achievements = vec![
Achievement {
goal: "Goal 1".to_string(),
completed: true,
uuid: Uuid::new_v4(),
time_of_reveal: Some(time1),
},
Achievement {
goal: "Goal 2".to_string(),
completed: false,
uuid: Uuid::new_v4(),
time_of_reveal: Some(time1),
},
Achievement {
goal: "Goal 3".to_string(),
completed: true,
uuid: Uuid::new_v4(),
time_of_reveal: Some(time2),
},
];
let grouped = group_achievements(achievements);
assert_eq!(grouped.len(), 2);
assert_eq!(grouped[0].0, Some(time1));
assert_eq!(grouped[0].1.len(), 2);
assert_eq!(grouped[1].0, Some(time2));
assert_eq!(grouped[1].1.len(), 1);
}
#[test]
fn test_group_achievements_empty_vec() {
let achievements = vec![];
let grouped = group_achievements(achievements);
assert_eq!(grouped.len(), 0);
}
#[test]
fn test_group_achievements_group_none_values() {
let time1 = NaiveTime::from_hms_opt(12, 0, 0).unwrap();
let achievements = vec![
Achievement {
goal: "Goal 1".to_string(),
completed: true,
uuid: Uuid::new_v4(),
time_of_reveal: Some(time1),
},
Achievement {
goal: "Goal 2".to_string(),
completed: false,
uuid: Uuid::new_v4(),
time_of_reveal: None,
},
Achievement {
goal: "Goal 3".to_string(),
completed: true,
uuid: Uuid::new_v4(),
time_of_reveal: None,
},
];
let grouped = group_achievements(achievements);
assert_eq!(grouped.len(), 2);
assert_eq!(grouped[0].0, None);
assert_eq!(grouped[0].1.len(), 2);
assert_eq!(grouped[1].0, Some(time1));
assert_eq!(grouped[1].1.len(), 1);
}
#[test]
fn test_group_achievements_all_none() {
let achievements = vec![
Achievement {
goal: "Goal 1".to_string(),
completed: true,
uuid: Uuid::new_v4(),
time_of_reveal: None,
},
Achievement {
goal: "Goal 2".to_string(),
completed: false,
uuid: Uuid::new_v4(),
time_of_reveal: None,
},
Achievement {
goal: "Goal 3".to_string(),
completed: true,
uuid: Uuid::new_v4(),
time_of_reveal: None,
},
];
let grouped = group_achievements(achievements);
assert_eq!(grouped.len(), 1);
assert_eq!(grouped[0].0, None);
assert_eq!(grouped[0].1.len(), 3);
}
}

View File

@ -0,0 +1 @@
pub mod group_achievements;

View File

@ -57,4 +57,3 @@ deploy-nginx-conf:
# List logs with journalctl
logs-prod:
ssh plul@ajb.dk journalctl -u achievements-backend