use crate::position::Position; pub struct Monster { life: usize, position: Position, } impl Monster { #[cfg(test)] pub fn new(life: usize) -> Self { Monster { life, position: Position::new(0, 0, 0), } } pub fn new_with_position(life: usize, position: Position) -> Self { Monster { life, position, } } #[cfg(test)] pub fn get_life(&self) -> usize { self.life } pub fn is_dead(&self) -> bool { self.life <= 0 } pub fn decrease_life(&mut self, by: usize) { self.life = self.life.saturating_sub(by); } #[cfg(test)] pub fn get_position(&mut self) -> &mut Position { &mut self.position } pub fn get_immutable_position(&self) -> &Position { &self.position } } #[test] fn monsters_can_move() { let mut m = Monster::new(2); assert_eq!(m.get_position(), &Position::new(0, 0, 0)); m.get_position().change(1, 2); assert_eq!(m.get_position(), &Position::new(0, 1, 2)); m.get_position().change(2, 1); assert_eq!(m.get_position(), &Position::new(0, 3, 3)); m.get_position().set(1, 2, 3); m.get_position().change(2, 1); assert_eq!(m.get_position(), &Position::new(1, 4, 4)); } #[test] fn monsters_can_die() { let mut m = Monster::new(2); assert_eq!(m.get_life(), 2); assert_eq!(m.is_dead(), false); m.decrease_life(1); assert_eq!(m.get_life(), 1); m.decrease_life(2); assert_eq!(m.get_life(), 0); assert_eq!(m.is_dead(), true); }