diff --git a/sea_battle_backend/src/data/current_game_status.rs b/sea_battle_backend/src/data/current_game_status.rs index d97cf99..86e3558 100644 --- a/sea_battle_backend/src/data/current_game_status.rs +++ b/sea_battle_backend/src/data/current_game_status.rs @@ -194,6 +194,19 @@ impl CurrentGameStatus { None } + /// Get the size of the smallest un-sunk boat + pub fn get_size_of_smallest_un_sunk_boat(&self) -> Option { + let mut boats_size = self.rules.boats_list(); + boats_size.sort(); + + for boat in &self.opponent_map.sunk_boats { + let index = boats_size.iter().position(|b| *b == boat.len)?; + boats_size.remove(index); + } + + boats_size.first().cloned() + } + pub fn print_your_map(&self) { PrintableCurrentGameMapStatus(self.rules.clone(), self.your_map.clone()).print_map() } @@ -292,4 +305,40 @@ mod test { assert!(next_fire.is_some()); assert!(possible_next_strikes.contains(&next_fire.unwrap())) } + + #[test] + fn get_size_of_smallest_unsunk_boat_start_of_game() { + let status = CurrentGameStatus::default(); + let min_val = *status.rules.boats_list().iter().min().unwrap(); + assert_eq!(min_val, status.get_size_of_smallest_un_sunk_boat().unwrap()); + } + + #[test] + fn get_size_of_smallest_unsunk_boat_bigger_boat_sunk() { + let mut status = CurrentGameStatus::default(); + let min_val = *status.rules.boats_list().iter().min().unwrap(); + + status.opponent_map.sunk_boats.push(BoatPosition { + start: Coordinates::new(0, 0), + len: min_val + 1, + direction: BoatDirection::Left, + }); + assert_eq!(min_val, status.get_size_of_smallest_un_sunk_boat().unwrap()); + } + + #[test] + fn get_size_of_smallest_unsunk_boat_smallest_boat_sunk() { + let mut status = CurrentGameStatus::default(); + let mut boats_size = status.rules.boats_list(); + boats_size.sort(); + status.opponent_map.sunk_boats.push(BoatPosition { + start: Coordinates::new(0, 0), + len: boats_size[0], + direction: BoatDirection::Left, + }); + assert_eq!( + boats_size[1], + status.get_size_of_smallest_un_sunk_boat().unwrap() + ); + } }