#![feature(custom_test_frameworks)] #![allow(clippy::borrowed_box)] use std::sync::Arc; use pkmn_lib::dynamic_data::{ Battle, BattleParty, DamageSource, DynamicLibrary, ExecutingMove, MoveChoice, PokemonBuilder, PokemonParty, ScriptCategory, ScriptContainer, ScriptOwnerData, TurnChoice, VolatileScriptsOwner, }; use crate::common::library_loader; pub mod common; pub mod datatests; fn get_library() -> Arc { library_loader::load_library().library } #[test] fn validate_library_load() { let start_time = chrono::Utc::now(); let result = library_loader::load_library(); let end_time = chrono::Utc::now(); println!( "Built library in {} ms\ \n\t- Types load time: {} ms\ \n\t- Natures load time: {} ms\ \n\t- Items load time: {} ms\ \n\t- Growth Rate load time: {} ms\ \n\t- Abilities load time: {} ms\ \n\t- Moves load time: {} ms\ \n\t- Species load time: {} ms\ \n\t- WASM load time: {} ms\ ", (end_time - start_time).num_milliseconds(), result.types_load_time.num_milliseconds(), result.natures_load_time.num_milliseconds(), result.items_load_time.num_milliseconds(), result.growth_rate_load_time.num_milliseconds(), result.abilities_load_time.num_milliseconds(), result.moves_load_time.num_milliseconds(), result.species_load_time.num_milliseconds(), result.wasm_load_time.num_milliseconds(), ); } #[test] fn load_non_existing_wasm_script() { let start_time = chrono::Utc::now(); let result = library_loader::load_library(); let end_time = chrono::Utc::now(); println!( "Built library in {} ms\ \n\t- Types load time: {} ms\ \n\t- Natures load time: {} ms\ \n\t- Items load time: {} ms\ \n\t- Growth Rate load time: {} ms\ \n\t- Abilities load time: {} ms\ \n\t- Moves load time: {} ms\ \n\t- Species load time: {} ms\ \n\t- WASM load time: {} ms\ ", (end_time - start_time).num_milliseconds(), result.types_load_time.num_milliseconds(), result.natures_load_time.num_milliseconds(), result.items_load_time.num_milliseconds(), result.growth_rate_load_time.num_milliseconds(), result.abilities_load_time.num_milliseconds(), result.moves_load_time.num_milliseconds(), result.species_load_time.num_milliseconds(), result.wasm_load_time.num_milliseconds(), ); let script = result .library .load_script(ScriptOwnerData::None, ScriptCategory::Move, &"_____non_existing".into()) .unwrap(); assert!(script.is_none()); } /// Assurance has the interesting properties that it creates a special data script internally, and /// deletes that data script through the get_owner functionality. #[test] fn validate_assurance() { let lib = get_library(); let p1 = Arc::new( PokemonBuilder::new(lib.clone(), "charizard".into(), 100) .learn_move("assurance".into()) .build() .unwrap(), ); let p2 = Arc::new( PokemonBuilder::new(lib.clone(), "venusaur".into(), 100) .build() .unwrap(), ); let party1 = BattleParty::new( Arc::new(PokemonParty::new_from_vec(vec![Some(p1.clone())])), vec![(0, 0)], ); let party2 = BattleParty::new( Arc::new(PokemonParty::new_from_vec(vec![Some(p2.clone())])), vec![(1, 0)], ); let battle = Battle::new(lib.clone(), vec![party1, party2], false, 2, 1, None); battle.sides()[0].set_pokemon(0, Some(p1.clone())).unwrap(); battle.sides()[1].set_pokemon(0, Some(p2.clone())).unwrap(); let script = lib .load_script(ScriptOwnerData::None, ScriptCategory::Move, &"assurance".into()) .unwrap() .unwrap(); let mv = p1.learned_moves().read()[0].as_ref().unwrap().clone(); let choice = TurnChoice::Move(MoveChoice::new(p1.clone(), mv.clone(), 1, 0)); script.on_before_turn(&choice); assert!(battle.sides()[1].has_volatile_script(&"assurance_data".into())); let executing_move = ExecutingMove::new( vec![], 1, p1, mv.clone(), mv.move_data().clone(), ScriptContainer::default(), ); let mut v = 20_u8; script.change_base_power(&executing_move, &p2, 0, &mut v); assert_eq!(v, 20_u8); let s = battle.sides()[1].get_volatile_script(&"assurance_data".into()); let binding = s.as_ref().unwrap().get().unwrap().read(); let data_script = binding.as_ref().unwrap(); data_script.on_damage(&p2, DamageSource::Misc, 100, 50); let mut v = 20_u8; script.change_base_power(&executing_move, &p2, 0, &mut v); assert_eq!(v, 40_u8); data_script.on_end_turn(); assert!(!battle.sides()[1].has_volatile_script(&"assurance_data".into())); }