use std::cmp::{max, min}; use crate::position::Position; pub struct Player { name: String, position: Position, life: i16, max_life: i16, } impl Player { pub fn new(name: &str, max_life: i16) -> Player { Player { name: name.to_string(), position: Position::new(0, 0, 0), life: max_life, max_life, } } pub fn get_name(&self) -> String { return self.name.clone(); } pub fn change_life(&mut self, by: i16) { self.life = max(0, min(self.max_life, self.life + by)); } pub fn get_life(&self) -> i16 { self.life } pub fn get_position(&mut self) -> &mut Position { &mut self.position } } #[test] fn test_get_name() { let p = Player { name: "Teddy Tester".to_string(), position: Position::new(0, 1, 1), life: 5, max_life: 10, }; assert_eq!(p.get_name(), "Teddy Tester"); } #[test] fn test_change_life() { let mut p = Player { name: "Teddy Tester".to_string(), position: Position::new(0, 1, 1), life: 5, max_life: 10, }; assert_eq!(p.life, 5); p.change_life(-2); assert_eq!(p.life, 3); p.change_life(10); assert_eq!(p.life, 10); p.change_life(-12); assert_eq!(p.life, 0); } #[test] fn player_can_move() { let mut p = Player::new("Teddy Tester", 10); assert_eq!(p.get_position(), &Position::new(0, 0, 0)); p.get_position().change(1, 2); assert_eq!(p.get_position(), &Position::new(0, 1, 2)); p.get_position().change(2, 1); assert_eq!(p.get_position(), &Position::new(0, 3, 3)); p.get_position().set(1, 2, 3); p.get_position().change(2, 1); assert_eq!(p.get_position(), &Position::new(1, 4, 4)); }