mirror of
https://github.com/loot/libloot.git
synced 2026-07-27 14:16:01 -07:00
It needed to be renamed to allow it to be published on crates.io, as there's already a parameterized_test crate there.
86 lines
2.4 KiB
Rust
86 lines
2.4 KiB
Rust
use std::path::Path;
|
|
|
|
use array_parameterized_test::{parameterized_test, test_parameter};
|
|
|
|
#[derive(Clone, Copy, Debug, Eq, PartialEq, Ord, PartialOrd, Hash)]
|
|
#[non_exhaustive]
|
|
pub enum GameType {
|
|
Oblivion,
|
|
Skyrim,
|
|
Fallout3,
|
|
FalloutNV,
|
|
Fallout4,
|
|
SkyrimSE,
|
|
Fallout4VR,
|
|
SkyrimVR,
|
|
Morrowind,
|
|
Starfield,
|
|
OpenMW,
|
|
OblivionRemastered,
|
|
}
|
|
|
|
fn has_ascii_extension(path: &Path, extension: &str) -> bool {
|
|
path.extension()
|
|
.is_some_and(|e| e.eq_ignore_ascii_case(extension))
|
|
}
|
|
|
|
fn has_plugin_file_extension(game_type: GameType, plugin_path: &Path) -> bool {
|
|
let extension = if game_type != GameType::OpenMW && has_ascii_extension(plugin_path, "ghost") {
|
|
plugin_path
|
|
.file_stem()
|
|
.and_then(|s| Path::new(s).extension())
|
|
} else {
|
|
plugin_path.extension()
|
|
};
|
|
|
|
if let Some(extension) = extension {
|
|
if extension.eq_ignore_ascii_case("esp")
|
|
|| extension.eq_ignore_ascii_case("esm")
|
|
|| (game_type == GameType::OpenMW
|
|
&& (extension.eq_ignore_ascii_case("omwaddon")
|
|
|| extension.eq_ignore_ascii_case("omwgame")
|
|
|| extension.eq_ignore_ascii_case("omwscripts")))
|
|
{
|
|
true
|
|
} else {
|
|
matches!(
|
|
game_type,
|
|
GameType::Fallout4
|
|
| GameType::Fallout4VR
|
|
| GameType::SkyrimSE
|
|
| GameType::SkyrimVR
|
|
| GameType::Starfield
|
|
) && extension.eq_ignore_ascii_case("esl")
|
|
}
|
|
} else {
|
|
false
|
|
}
|
|
}
|
|
|
|
#[cfg(test)]
|
|
mod tests {
|
|
use super::*;
|
|
#[test_parameter]
|
|
const ALL_GAME_TYPES: [GameType; 12] = [
|
|
GameType::Oblivion,
|
|
GameType::Skyrim,
|
|
GameType::Fallout3,
|
|
GameType::FalloutNV,
|
|
GameType::Fallout4,
|
|
GameType::SkyrimSE,
|
|
GameType::Fallout4VR,
|
|
GameType::SkyrimVR,
|
|
GameType::Morrowind,
|
|
GameType::Starfield,
|
|
GameType::OpenMW,
|
|
GameType::OblivionRemastered,
|
|
];
|
|
|
|
#[parameterized_test(ALL_GAME_TYPES)]
|
|
fn should_be_true_if_file_ends_in_dot_esp_or_dot_esm(game_type: GameType) {
|
|
assert!(has_plugin_file_extension(game_type, Path::new("file.esp")));
|
|
assert!(has_plugin_file_extension(game_type, Path::new("file.esm")));
|
|
assert!(!has_plugin_file_extension(game_type, Path::new("file.bsa")));
|
|
}
|
|
}
|