121 lines
3.7 KiB
Rust
121 lines
3.7 KiB
Rust
use std::collections::HashMap;
|
|
use serde::{Deserialize, Serialize};
|
|
|
|
#[derive(Debug, Clone, Deserialize, Serialize)]
|
|
pub struct Player {
|
|
pub username: String,
|
|
}
|
|
|
|
#[derive(Debug, Clone, Deserialize, Serialize)]
|
|
pub struct Team {
|
|
pub name: String,
|
|
pub color: String,
|
|
pub players: Vec<Player>,
|
|
pub scores: HashMap<String, i32>,
|
|
}
|
|
|
|
impl Team {
|
|
pub fn add_scores(&mut self, scores: &HashMap<String, i32>) {
|
|
for (territory, score) in scores {
|
|
self.scores
|
|
.entry(territory.to_string())
|
|
.and_modify(|s| *s += score)
|
|
.or_insert(*score);
|
|
}
|
|
}
|
|
}
|
|
|
|
#[cfg(test)]
|
|
mod tests {
|
|
use super::*;
|
|
|
|
#[test]
|
|
fn test_player_score_new() {
|
|
let player = Player {
|
|
username: "testuser".to_string(),
|
|
team: "TestTeam".to_string(),
|
|
};
|
|
|
|
let player_score = PlayerScore::new(player.clone());
|
|
|
|
assert_eq!(player_score.player.username, "testuser");
|
|
assert_eq!(player_score.player.team, "TestTeam");
|
|
assert_eq!(player_score.total_score, 0);
|
|
assert!(player_score.territory_scores.is_empty());
|
|
}
|
|
|
|
#[test]
|
|
fn test_player_score_add_territory_score() {
|
|
let player = Player {
|
|
username: "testuser".to_string(),
|
|
team: "TestTeam".to_string(),
|
|
};
|
|
|
|
let mut player_score = PlayerScore::new(player);
|
|
|
|
player_score.add_territory_score("Capitol Hill".to_string(), 10);
|
|
assert_eq!(player_score.total_score, 10);
|
|
assert_eq!(player_score.territory_scores.get("Capitol Hill"), Some(&10));
|
|
|
|
player_score.add_territory_score("Downtown".to_string(), 5);
|
|
assert_eq!(player_score.total_score, 15);
|
|
assert_eq!(player_score.territory_scores.get("Downtown"), Some(&5));
|
|
|
|
// Add more points to existing territory
|
|
player_score.add_territory_score("Capitol Hill".to_string(), 3);
|
|
assert_eq!(player_score.total_score, 18);
|
|
assert_eq!(player_score.territory_scores.get("Capitol Hill"), Some(&13));
|
|
}
|
|
|
|
#[test]
|
|
fn test_team_score_new() {
|
|
let team_score = TeamScore::new("Red Team".to_string());
|
|
|
|
assert_eq!(team_score.team, "Red Team");
|
|
assert_eq!(team_score.total_score, 0);
|
|
assert!(team_score.territory_scores.is_empty());
|
|
}
|
|
|
|
#[test]
|
|
fn test_team_score_add_territory_score() {
|
|
let mut team_score = TeamScore::new("Blue Team".to_string());
|
|
|
|
team_score.add_territory_score("Capitol Hill".to_string(), 20);
|
|
assert_eq!(team_score.total_score, 20);
|
|
assert_eq!(team_score.territory_scores.get("Capitol Hill"), Some(&20));
|
|
|
|
team_score.add_territory_score("Downtown".to_string(), 15);
|
|
assert_eq!(team_score.total_score, 35);
|
|
assert_eq!(team_score.territory_scores.get("Downtown"), Some(&15));
|
|
|
|
// Add more points to existing territory
|
|
team_score.add_territory_score("Capitol Hill".to_string(), 10);
|
|
assert_eq!(team_score.total_score, 45);
|
|
assert_eq!(team_score.territory_scores.get("Capitol Hill"), Some(&30));
|
|
}
|
|
|
|
#[test]
|
|
fn test_multiple_territories() {
|
|
let player = Player {
|
|
username: "mapper".to_string(),
|
|
team: "Green Team".to_string(),
|
|
};
|
|
|
|
let mut player_score = PlayerScore::new(player);
|
|
|
|
let territories = vec![
|
|
("Capitol Hill", 5),
|
|
("Downtown", 10),
|
|
("Fremont", 3),
|
|
("Ballard", 7),
|
|
];
|
|
|
|
for (territory, score) in territories {
|
|
player_score.add_territory_score(territory.to_string(), score);
|
|
}
|
|
|
|
assert_eq!(player_score.total_score, 25);
|
|
assert_eq!(player_score.territory_scores.len(), 4);
|
|
}
|
|
}
|