use crate::common_usings::*; use pkmn_lib_interface::PkmnResult; script!(Acrobatics, "acrobatics"); impl Script for Acrobatics { fn new() -> Self { Self {} } fn get_name(&self) -> &'static str { Self::get_const_name() } fn get_capabilities(&self) -> &[ScriptCapabilities] { &[ScriptCapabilities::ChangeBasePower] } fn change_base_power( &self, mv: ExecutingMove, _target: Pokemon, _hit: u8, base_power: &mut u8, ) -> PkmnResult<()> { if mv.user().held_item()?.is_none() { if *base_power >= 128_u8 { *base_power = 255 } else { *base_power *= 2; } } Ok(()) } fn as_any(&self) -> &dyn Any { self } } #[cfg(test)] mod tests { use super::*; use alloc::rc::Rc; use pkmn_lib_interface::app_interface::{MockExecutingMove, MockItem, MockPokemon}; fn mock_executing_move(has_held_item: bool) -> ExecutingMove { let mut mv = MockExecutingMove::new(); mv.expect_user().returning(move || { let mut user = MockPokemon::new(); user.expect_held_item().returning(move || { Ok(if has_held_item { Some(Rc::new(MockItem::new())) } else { None }) }); Rc::new(user) }); Rc::new(mv) } #[test] fn without_held_item_doubles_power() { let mv = mock_executing_move(false); let script = Acrobatics::new(); let mut base_power = 50u8; script .change_base_power(mv, Rc::new(MockPokemon::new()), 0, &mut base_power) .unwrap(); assert_eq!(100, base_power); } #[test] fn without_held_item_does_not_overflow() { let mv = mock_executing_move(false); let script = Acrobatics::new(); let mut base_power = 200u8; script .change_base_power(mv, Rc::new(MockPokemon::new()), 0, &mut base_power) .unwrap(); assert_eq!(255, base_power); } #[test] fn with_held_item_does_nothing() { let mv = mock_executing_move(true); let script = Acrobatics::new(); let mut base_power = 50u8; script .change_base_power(mv, Rc::new(MockPokemon::new()), 0, &mut base_power) .unwrap(); assert_eq!(50, base_power); } }