2022-06-17 17:53:33 +00:00
|
|
|
#![feature(custom_test_frameworks)]
|
2022-12-24 13:03:47 +00:00
|
|
|
#![allow(clippy::borrowed_box)]
|
2022-06-17 17:53:33 +00:00
|
|
|
|
2022-08-20 10:22:12 +00:00
|
|
|
use std::sync::Arc;
|
2022-06-17 17:53:33 +00:00
|
|
|
|
2022-09-16 09:01:37 +00:00
|
|
|
use pkmn_lib::dynamic_data::{
|
2023-01-03 11:58:23 +00:00
|
|
|
Battle, BattleParty, DamageSource, DynamicLibrary, ExecutingMove, MoveChoice, PokemonBuilder, PokemonParty,
|
2022-09-16 09:01:37 +00:00
|
|
|
ScriptCategory, ScriptContainer, ScriptOwnerData, TurnChoice, VolatileScriptsOwner,
|
|
|
|
};
|
2022-06-19 19:34:08 +00:00
|
|
|
|
2023-04-02 10:07:08 +00:00
|
|
|
use crate::common::library_loader;
|
2022-06-19 19:34:08 +00:00
|
|
|
|
2022-06-17 17:53:33 +00:00
|
|
|
pub mod common;
|
2023-04-02 10:07:08 +00:00
|
|
|
pub mod datatests;
|
2022-06-17 17:53:33 +00:00
|
|
|
|
2022-12-24 11:00:50 +00:00
|
|
|
fn get_library() -> Arc<dyn DynamicLibrary> {
|
2022-12-25 10:26:14 +00:00
|
|
|
library_loader::load_library().library
|
2022-07-18 08:16:47 +00:00
|
|
|
}
|
2022-06-17 17:53:33 +00:00
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn validate_library_load() {
|
2022-07-18 08:16:47 +00:00
|
|
|
let start_time = chrono::Utc::now();
|
2022-12-25 10:26:14 +00:00
|
|
|
let result = library_loader::load_library();
|
2022-07-18 08:16:47 +00:00
|
|
|
let end_time = chrono::Utc::now();
|
2022-12-25 10:26:14 +00:00
|
|
|
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(),
|
|
|
|
);
|
2022-06-17 17:53:33 +00:00
|
|
|
}
|
|
|
|
|
2022-09-16 09:01:37 +00:00
|
|
|
/// Assurance has the interesting properties that it creates a special data script internally, and
|
|
|
|
/// deletes that data script through the get_owner functionality.
|
|
|
|
#[test]
|
|
|
|
#[cfg_attr(miri, ignore)]
|
|
|
|
fn validate_assurance() {
|
|
|
|
let lib = get_library();
|
|
|
|
let p1 = Arc::new(
|
|
|
|
PokemonBuilder::new(lib.clone(), "charizard".into(), 100)
|
|
|
|
.learn_move("assurance".into())
|
|
|
|
.build(),
|
|
|
|
);
|
|
|
|
let p2 = Arc::new(PokemonBuilder::new(lib.clone(), "venusaur".into(), 100).build());
|
|
|
|
|
|
|
|
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()));
|
|
|
|
battle.sides()[1].set_pokemon(0, Some(p2.clone()));
|
|
|
|
|
|
|
|
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,
|
2022-10-14 14:53:30 +00:00
|
|
|
p1,
|
2022-09-16 09:01:37 +00:00
|
|
|
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());
|
2023-01-03 11:58:23 +00:00
|
|
|
let binding = s.as_ref().unwrap().get().unwrap().read();
|
|
|
|
let data_script = binding.as_ref().unwrap();
|
2022-09-16 09:01:37 +00:00
|
|
|
|
|
|
|
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()));
|
|
|
|
}
|