#![feature(custom_test_frameworks)] #![feature(once_cell)] #![test_runner(datatest::runner)] use std::fs::File; use std::io::Read; use std::path::Path; use std::sync::Arc; use conquer_once::OnceCell; use pkmn_lib::dynamic_data::{DynamicLibrary, MoveChoice, PokemonBuilder, ScriptCategory, TurnChoice}; use pkmn_lib::static_data::EffectParameter; use crate::common::{library_loader, TestCase}; pub mod common; static LIBRARY: OnceCell> = OnceCell::uninit(); fn get_library<'a>() -> Arc { LIBRARY .get_or_init(|| { let start_time = chrono::Utc::now(); let lib = library_loader::load_library(); let end_time = chrono::Utc::now(); println!("Built library in {} ms", (end_time - start_time).num_milliseconds()); Arc::new(lib) }) .clone() } #[test] #[cfg_attr(miri, ignore)] fn validate_library_load() { let start_time = chrono::Utc::now(); library_loader::load_library(); let end_time = chrono::Utc::now(); println!("Built library in {} ms", (end_time - start_time).num_milliseconds()); } #[datatest::files("tests/test_cases", { input in r"^(.*)\.yaml" })] #[cfg_attr(miri, ignore)] fn integration_tests(input: &Path) { let mut str: String = "".to_string(); let mut file = File::open(input).unwrap(); file.read_to_string(&mut str).unwrap(); let test_case = serde_yaml::from_str::(&*str).unwrap(); println!("\tRunning integration test {}", test_case.name); test_case.run_test(get_library()); } #[test] #[cfg_attr(miri, ignore)] fn validate_script() { let lib = get_library(); let script = lib .load_script(0 as *const u8, ScriptCategory::Move, &"test".into()) .unwrap() .unwrap(); let parameters = [EffectParameter::String("foo".into())]; script.on_initialize(&lib, ¶meters); script.on_initialize(&lib, ¶meters); script.on_initialize(&lib, ¶meters); } #[test] #[cfg_attr(miri, ignore)] fn validate_script_2() { let lib = get_library(); let script = lib .load_script(0 as *const u8, ScriptCategory::Move, &"test".into()) .unwrap() .unwrap(); let user = Arc::new( PokemonBuilder::new(lib, "charizard".into(), 100) .learn_move("fire_blast".into()) .build(), ); script.on_before_turn(&TurnChoice::Move(MoveChoice::new( user.clone(), user.learned_moves().read().get(0).unwrap().as_ref().unwrap().clone(), 0, 0, ))); assert_eq!(user.current_health(), user.max_health() - 50); let mut speed: u32 = 100; script.change_speed( &TurnChoice::Move(MoveChoice::new( user.clone(), user.learned_moves().read().get(0).unwrap().as_ref().unwrap().clone(), 0, 0, )), &mut speed, ); assert_eq!(speed, 684); }