diff --git a/Cargo.lock b/Cargo.lock index 08562c35..4ba65a55 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -418,49 +418,6 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" -[[package]] -name = "futures-core" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" - -[[package]] -name = "futures-macro" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "futures-task" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" - -[[package]] -name = "futures-timer" -version = "3.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f288b0a4f20f9a56b5d1da57e2227c661b7b16168e2f72365f57b63326e29b24" - -[[package]] -name = "futures-util" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" -dependencies = [ - "futures-core", - "futures-macro", - "futures-task", - "pin-project-lite", - "pin-utils", - "slab", -] - [[package]] name = "generic-array" version = "0.14.7" @@ -494,12 +451,6 @@ dependencies = [ "wasi 0.14.2+wasi-0.2.4", ] -[[package]] -name = "glob" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8d1add55171497b4705a648c6b583acafb01d58050a51727785f0b2c8e0a2b2" - [[package]] name = "hashbrown" version = "0.14.5" @@ -602,10 +553,9 @@ dependencies = [ "libloadorder", "log", "loot-condition-interpreter", + "parameterized-test", "petgraph", "rayon", - "rstest", - "rstest_reuse", "rustc-hash", "saphyr", "saphyr-parser", @@ -829,6 +779,15 @@ dependencies = [ "hashbrown 0.14.5", ] +[[package]] +name = "parameterized-test" +version = "0.1.0" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "pelite" version = "0.10.0" @@ -905,47 +864,17 @@ dependencies = [ "serde", ] -[[package]] -name = "pin-project-lite" -version = "0.2.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" - -[[package]] -name = "pin-utils" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" - [[package]] name = "portable-atomic" version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "350e9b48cbc6b0e028b0473b114454c6316e57336ee184ceab6e53f72c178b3e" -[[package]] -name = "ppv-lite86" -version = "0.2.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" -dependencies = [ - "zerocopy", -] - -[[package]] -name = "proc-macro-crate" -version = "3.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edce586971a4dfaa28950c6f18ed55e0406c1ab88bbce2c6f6293a7aaba73d35" -dependencies = [ - "toml_edit", -] - [[package]] name = "proc-macro2" -version = "1.0.94" +version = "1.0.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a31971752e70b8b2686d7e46ec17fb38dad4051d94024c88df49b667caea9c84" +checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778" dependencies = [ "unicode-ident", ] @@ -1039,36 +968,6 @@ version = "5.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "74765f6d916ee2faa39bc8e68e4f3ed8949b48cccdac59983d287a7cb71ce9c5" -[[package]] -name = "rand" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" -dependencies = [ - "libc", - "rand_chacha", - "rand_core", -] - -[[package]] -name = "rand_chacha" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" -dependencies = [ - "ppv-lite86", - "rand_core", -] - -[[package]] -name = "rand_core" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" -dependencies = [ - "getrandom 0.2.15", -] - [[package]] name = "rayon" version = "1.10.0" @@ -1129,53 +1028,6 @@ version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" -[[package]] -name = "relative-path" -version = "1.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba39f3699c378cd8970968dcbff9c43159ea4cfbd88d43c00b22f2ef10a435d2" - -[[package]] -name = "rstest" -version = "0.25.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fc39292f8613e913f7df8fa892b8944ceb47c247b78e1b1ae2f09e019be789d" -dependencies = [ - "futures-timer", - "futures-util", - "rstest_macros", - "rustc_version", -] - -[[package]] -name = "rstest_macros" -version = "0.25.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f168d99749d307be9de54d23fd226628d99768225ef08f6ffb52e0182a27746" -dependencies = [ - "cfg-if", - "glob", - "proc-macro-crate", - "proc-macro2", - "quote", - "regex", - "relative-path", - "rustc_version", - "syn", - "unicode-ident", -] - -[[package]] -name = "rstest_reuse" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3a8fb4672e840a587a66fc577a5491375df51ddb88f2a2c2a792598c326fe14" -dependencies = [ - "quote", - "rand", - "syn", -] - [[package]] name = "rust-ini" version = "0.21.1" @@ -1194,15 +1046,6 @@ version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d" -[[package]] -name = "rustc_version" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" -dependencies = [ - "semver", -] - [[package]] name = "rustix" version = "1.0.5" @@ -1294,15 +1137,6 @@ version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" -[[package]] -name = "slab" -version = "0.4.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" -dependencies = [ - "autocfg", -] - [[package]] name = "strsim" version = "0.11.1" @@ -1397,23 +1231,6 @@ dependencies = [ "crunchy", ] -[[package]] -name = "toml_datetime" -version = "0.6.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" - -[[package]] -name = "toml_edit" -version = "0.22.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17b4795ff5edd201c7cd6dca065ae59972ce77d1b80fa0a84d94950ece7d1474" -dependencies = [ - "indexmap", - "toml_datetime", - "winnow", -] - [[package]] name = "trim-in-place" version = "0.1.7" @@ -1688,15 +1505,6 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" -[[package]] -name = "winnow" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63d3fcd9bba44b03821e7d699eeee959f3126dcc4aa8e4ae18ec617c2a5cea10" -dependencies = [ - "memchr", -] - [[package]] name = "wit-bindgen-rt" version = "0.39.0" @@ -1705,23 +1513,3 @@ checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" dependencies = [ "bitflags", ] - -[[package]] -name = "zerocopy" -version = "0.8.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2586fea28e186957ef732a5f8b3be2da217d65c5969d4b1e17f973ebbe876879" -dependencies = [ - "zerocopy-derive", -] - -[[package]] -name = "zerocopy-derive" -version = "0.8.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a996a8f63c5c4448cd959ac1bab0aaa3306ccfd060472f85943ee0750f0169be" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] diff --git a/Cargo.toml b/Cargo.toml index 369d7899..5b2cf756 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -23,12 +23,11 @@ loot-condition-interpreter.workspace = true windows = { version = "0.61.1", features = ["Win32_Storage_FileSystem"] } [dev-dependencies] -rstest = "0.25.0" -rstest_reuse = "0.7.0" +parameterized-test = { path = "./parameterized-test" } tempfile = "3.17.1" [workspace] -members = ["cxx", "ffi-errors", "nodejs", "pyo3"] +members = ["cxx", "ffi-errors", "nodejs", "parameterized-test", "pyo3"] [workspace.dependencies] esplugin = "6.1.2" diff --git a/parameterized-test/Cargo.toml b/parameterized-test/Cargo.toml new file mode 100644 index 00000000..959defc9 --- /dev/null +++ b/parameterized-test/Cargo.toml @@ -0,0 +1,12 @@ +[package] +name = "parameterized-test" +version = "0.1.0" +edition = "2024" + +[dependencies] +proc-macro2 = "1.0.95" +quote = "1.0.40" +syn = { version = "2.0.100", features = ["full"] } + +[lib] +proc-macro = true diff --git a/parameterized-test/src/lib.rs b/parameterized-test/src/lib.rs new file mode 100644 index 00000000..272be6b0 --- /dev/null +++ b/parameterized-test/src/lib.rs @@ -0,0 +1,140 @@ +use proc_macro::{TokenStream, TokenTree}; +use quote::{ToTokens, format_ident, quote}; +use syn::{Expr, ExprLit, FnArg, Ident, ItemConst, ItemFn, Lit, Pat, PatIdent, PatType, parse}; + +#[proc_macro_attribute] +pub fn parameterized_test(input: TokenStream, annotated_item: TokenStream) -> TokenStream { + let macro_name: Ident = parse(input).unwrap(); + + let test: ItemFn = parse(annotated_item.clone()).unwrap(); + + let Some(FnArg::Typed(PatType { + pat: type_pattern, .. + })) = test.sig.inputs.first() + else { + panic!("Expected the first test function argument a type pattern"); + }; + + let Pat::Ident(PatIdent { + ident: inner_func_arg_name, + .. + }) = type_pattern.as_ref() + else { + panic!("Expected the first test function argument pattern to be an ident"); + }; + + let inner_func_name = test.sig.ident.clone(); + + quote! { + mod #inner_func_name { + use super::*; + + #test + + #macro_name!{#inner_func_name, #inner_func_arg_name} + } + } + .into() +} + +#[proc_macro_attribute] +pub fn test_parameter(_input: TokenStream, annotated_item: TokenStream) -> TokenStream { + let item: ItemConst = parse(annotated_item.clone()).unwrap(); + + let Expr::Array(array) = item.expr.as_ref() else { + panic!("Expected expression to be an array"); + }; + + let values: Vec<_> = array + .elems + .iter() + .map(|n| match n { + Expr::Path(path) => path.path.segments.last().unwrap().ident.to_token_stream(), + Expr::Lit(ExprLit { + lit: Lit::Int(lit_int), + .. + }) => lit_int.to_token_stream(), + _ => panic!("Expected array element to be a path or int literal"), + }) + .collect(); + + let annotated_item = proc_macro2::TokenStream::from(annotated_item); + + let const_item_name = item.ident; + let macro_name = format_ident!("{}_macro", &const_item_name); + + let macro_output = quote! { + macro_rules! #macro_name { + ( $inner_test_name:ident, $inner_test_arg_name:ident ) => { + parameterized_test::generate_tests!{ + $inner_test_name, + $inner_test_arg_name, + #const_item_name, + [#(#values),*] + } + }; + } + + #[allow(unused_imports)] + pub(crate) use #macro_name as #const_item_name; + + #annotated_item + }; + + macro_output.into() +} + +#[proc_macro] +pub fn generate_tests(item: TokenStream) -> TokenStream { + let mut item_iter = item.into_iter(); + let TokenTree::Ident(inner_test_name) = item_iter.next().unwrap() else { + panic!("Expected an ident for the inner_test_name"); + }; + + let _ = item_iter.next(); + + let TokenTree::Ident(inner_test_param_name) = item_iter.next().unwrap() else { + panic!("Expected an ident for the inner_test_param_name"); + }; + + let _ = item_iter.next(); + + let TokenTree::Ident(const_item_name) = item_iter.next().unwrap() else { + panic!("Expected an ident for the const_item_name"); + }; + + let _ = item_iter.next(); + + let TokenTree::Group(const_item_values) = item_iter.next().unwrap() else { + panic!("Expected a group for the const_item_values"); + }; + + let inner_test_name: Ident = parse(TokenTree::from(inner_test_name).into()).unwrap(); + let const_item_name: Ident = parse(TokenTree::from(const_item_name).into()).unwrap(); + + let tokens: proc_macro2::TokenStream = const_item_values + .stream() + .into_iter() + .step_by(2) + .enumerate() + .flat_map(|(i, value)| { + let suffix = match value { + TokenTree::Ident(ident) => ident.to_string(), + TokenTree::Literal(literal) => literal.to_string(), + _ => panic!("Expected const item value to be an ident or literal"), + }; + + let test_name = format_ident!("{inner_test_param_name}_{i:02}_{suffix}"); + + quote! { + #[test] + #[allow(non_snake_case)] + fn #test_name() { + #inner_test_name(#const_item_name[#i]); + } + } + }) + .collect(); + + tokens.into() +} diff --git a/src/archive/find.rs b/src/archive/find.rs index 03c3497d..796708f7 100644 --- a/src/archive/find.rs +++ b/src/archive/find.rs @@ -201,14 +201,14 @@ mod tests { mod find_associated_archives { use std::path::absolute; - use rstest_reuse::apply; + use parameterized_test::parameterized_test; use tempfile::TempDir; use super::*; use crate::tests::{ - BLANK_DIFFERENT_ESM, BLANK_DIFFERENT_ESP, BLANK_ESM, BLANK_ESP, - BLANK_MASTER_DEPENDENT_ESM, all_game_types, copy_file, source_plugins_path, + ALL_GAME_TYPES, BLANK_DIFFERENT_ESM, BLANK_DIFFERENT_ESP, BLANK_ESM, BLANK_ESP, + BLANK_MASTER_DEPENDENT_ESM, copy_file, source_plugins_path, }; const NON_ASCII_ESP: &str = "non\u{00C1}scii.esp"; @@ -281,7 +281,7 @@ mod tests { } } - #[apply(all_game_types)] + #[parameterized_test(ALL_GAME_TYPES)] fn should_return_empty_vec_if_no_matching_archives_are_found(game_type: GameType) { let fixture = Fixture::new(game_type); @@ -294,7 +294,7 @@ mod tests { assert!(archives.is_empty()); } - #[apply(all_game_types)] + #[parameterized_test(ALL_GAME_TYPES)] fn should_find_an_archive_that_exactly_matches_an_esm_file_basename_except_for_morrowind_and_oblivion( game_type: GameType, ) { @@ -316,7 +316,7 @@ mod tests { } } - #[apply(all_game_types)] + #[parameterized_test(ALL_GAME_TYPES)] fn should_find_an_archive_that_exactly_matches_a_non_ascii_esp_file_basename_except_for_morrowind_and_starfield( game_type: GameType, ) { @@ -338,7 +338,7 @@ mod tests { } } - #[apply(all_game_types)] + #[parameterized_test(ALL_GAME_TYPES)] fn should_find_an_archive_that_starts_with_an_esp_file_basename_except_for_morrowind_and( game_type: GameType, ) { @@ -357,7 +357,7 @@ mod tests { } } - #[apply(all_game_types)] + #[parameterized_test(ALL_GAME_TYPES)] fn should_find_an_archive_that_starts_with_an_esm_file_basename_only_for_fallout( game_type: GameType, ) { @@ -382,7 +382,7 @@ mod tests { } } - #[apply(all_game_types)] + #[parameterized_test(ALL_GAME_TYPES)] fn should_find_an_archive_that_starts_with_an_esp_file_basename_only_for_oblivion_and_fallout( game_type: GameType, ) { diff --git a/src/archive/parse.rs b/src/archive/parse.rs index de988b32..0ffb8255 100644 --- a/src/archive/parse.rs +++ b/src/archive/parse.rs @@ -137,7 +137,7 @@ mod tests { io::SeekFrom, }; - use rstest::rstest; + use parameterized_test::{parameterized_test, test_parameter}; use tempfile::tempdir; use super::*; @@ -246,8 +246,11 @@ mod tests { assert_eq!(expected_file_hash, *value.first().unwrap()); } - #[rstest] - fn should_support_ba2_versions(#[values(1, 2, 3, 7, 8)] version: u32) { + #[test_parameter] + const BA2_VERSIONS: [u32; 5] = [1, 2, 3, 7, 8]; + + #[parameterized_test(BA2_VERSIONS)] + fn should_support_ba2_versions(version: u32) { use std::io::{Seek, Write}; let tmp_dir = tempdir().unwrap(); diff --git a/src/game.rs b/src/game.rs index 63ed2d04..3b1fa27b 100644 --- a/src/game.rs +++ b/src/game.rs @@ -805,13 +805,13 @@ impl GameCache { mod tests { use super::*; - use rstest_reuse::apply; + use parameterized_test::parameterized_test; use crate::{ metadata::{File, PluginMetadata}, tests::{ - BLANK_DIFFERENT_ESM, BLANK_DIFFERENT_ESP, BLANK_ESM, BLANK_ESP, - BLANK_MASTER_DEPENDENT_ESM, Fixture, all_game_types, + ALL_GAME_TYPES, BLANK_DIFFERENT_ESM, BLANK_DIFFERENT_ESP, BLANK_ESM, BLANK_ESP, + BLANK_MASTER_DEPENDENT_ESM, Fixture, }, }; @@ -903,7 +903,7 @@ mod tests { use super::*; #[cfg(windows)] - #[apply(all_game_types)] + #[parameterized_test(ALL_GAME_TYPES)] fn should_succeed_if_given_valid_game_path(game_type: GameType) { let fixture = Fixture::new(game_type); @@ -911,7 +911,7 @@ mod tests { } #[cfg(not(windows))] - #[apply(all_game_types)] + #[parameterized_test(ALL_GAME_TYPES)] fn should_succeed_for_morrowind_if_given_valid_game_path(game_type: GameType) { let fixture = Fixture::new(game_type); @@ -975,7 +975,7 @@ mod tests { mod with_local_path { use super::*; - #[apply(all_game_types)] + #[parameterized_test(ALL_GAME_TYPES)] fn should_succeed_if_given_valid_paths(game_type: GameType) { let fixture = Fixture::new(game_type); @@ -1090,7 +1090,7 @@ mod tests { } } - #[apply(all_game_types)] + #[parameterized_test(ALL_GAME_TYPES)] fn should_set_default_additional_data_paths(game_type: GameType) { let fixture = Fixture::new(game_type); @@ -1271,7 +1271,7 @@ mod tests { use crate::tests::{NON_ASCII_ESM, NON_PLUGIN_FILE}; - #[apply(all_game_types)] + #[parameterized_test(ALL_GAME_TYPES)] fn should_return_true_for_a_valid_non_ascii_plugin(game_type: GameType) { let fixture = Fixture::new(game_type); @@ -1291,7 +1291,7 @@ mod tests { assert!(game.is_valid_plugin(Path::new(NON_ASCII_ESM))); } - #[apply(all_game_types)] + #[parameterized_test(ALL_GAME_TYPES)] fn should_return_true_for_an_omwscripts_plugin(game_type: GameType) { let fixture = Fixture::new(game_type); @@ -1312,7 +1312,7 @@ mod tests { } } - #[apply(all_game_types)] + #[parameterized_test(ALL_GAME_TYPES)] fn should_return_false_for_a_non_plugin_file(game_type: GameType) { let fixture = Fixture::new(game_type); @@ -1326,7 +1326,7 @@ mod tests { assert!(!game.is_valid_plugin(Path::new(NON_PLUGIN_FILE))); } - #[apply(all_game_types)] + #[parameterized_test(ALL_GAME_TYPES)] fn should_return_false_for_an_empty_file(game_type: GameType) { let fixture = Fixture::new(game_type); @@ -1343,7 +1343,7 @@ mod tests { assert!(!game.is_valid_plugin(&empty_file_path)); } - #[apply(all_game_types)] + #[parameterized_test(ALL_GAME_TYPES)] fn should_try_ghosted_path_if_given_plugin_does_not_exist_unless_game_is_openmw( game_type: GameType, ) { @@ -1413,7 +1413,7 @@ mod tests { use super::*; - #[apply(all_game_types)] + #[parameterized_test(ALL_GAME_TYPES)] fn should_load_the_headers_of_the_given_plugins(game_type: GameType) { let fixture = Fixture::new(game_type); @@ -1514,7 +1514,7 @@ mod tests { use super::*; - #[apply(all_game_types)] + #[parameterized_test(ALL_GAME_TYPES)] fn should_fully_load_the_given_plugins(game_type: GameType) { let fixture = Fixture::new(game_type); @@ -1584,7 +1584,7 @@ mod tests { assert_ne!(plugin2, plugin3); } - #[apply(all_game_types)] + #[parameterized_test(ALL_GAME_TYPES)] fn should_error_if_loading_a_plugin_with_a_master_that_is_not_loaded_if_game_is_morrowind_or_starfield( game_type: GameType, ) { @@ -1626,7 +1626,7 @@ mod tests { } } - #[apply(all_game_types)] + #[parameterized_test(ALL_GAME_TYPES)] fn should_not_error_if_loading_a_plugin_with_a_master_that_is_also_being_loaded_if_game_is_morrowind_or_starfield( game_type: GameType, ) { @@ -1653,7 +1653,7 @@ mod tests { assert!(game.plugin(BLANK_MASTER_DEPENDENT_ESM).is_some()); } - #[apply(all_game_types)] + #[parameterized_test(ALL_GAME_TYPES)] fn should_not_error_if_loading_a_plugin_with_a_master_that_is_already_loaded_if_game_is_morrowind_or_starfield( game_type: GameType, ) { @@ -1684,7 +1684,7 @@ mod tests { mod load_plugins_common { use super::*; - #[apply(all_game_types)] + #[parameterized_test(ALL_GAME_TYPES)] fn should_find_archives_in_additional_data_paths(game_type: GameType) { let fixture = Fixture::new(game_type); diff --git a/src/plugin/mod.rs b/src/plugin/mod.rs index e625bd1b..778e5924 100644 --- a/src/plugin/mod.rs +++ b/src/plugin/mod.rs @@ -453,17 +453,19 @@ fn extract_version(description: &str) -> Result, Box