61 lines
2.2 KiB
Rust
61 lines
2.2 KiB
Rust
// SPDX-License-Identifier: GPL-3.0-or-later
|
|
use molotov_core::assets::asset::AssetFile;
|
|
use molotov_core::assets::c_api::*;
|
|
use molotov_core::assets::manager::AssetManager;
|
|
use tempfile::tempdir;
|
|
|
|
#[test]
|
|
fn test_aasset_read_invalid_handle_returns_error_negative_one() {
|
|
unsafe {
|
|
// Invalid or null pointer must return -1, never fake 0
|
|
let ret = AAsset_read(std::ptr::null_mut(), std::ptr::null_mut(), 16);
|
|
assert_eq!(ret, -1, "Invalid handle or null buffer must return -1");
|
|
|
|
let bogus_handle = 0x9999 as *mut ();
|
|
let mut buf = [0u8; 16];
|
|
let ret2 = AAsset_read(bogus_handle, buf.as_mut_ptr() as *mut _, 16);
|
|
assert_eq!(ret2, -1, "Stale or closed handle must return -1");
|
|
}
|
|
}
|
|
|
|
#[test]
|
|
fn test_empty_asset_get_buffer_returns_null() {
|
|
let empty_asset = AssetFile::new(vec![]);
|
|
assert_eq!(empty_asset.length(), 0);
|
|
assert!(
|
|
empty_asset.get_buffer().is_null(),
|
|
"Empty asset get_buffer must return NULL, never dangling pointer 0x1"
|
|
);
|
|
}
|
|
|
|
#[test]
|
|
fn test_seek_overflow_does_not_panic() {
|
|
let mut asset = AssetFile::new(b"SAMPLE".to_vec());
|
|
// Seeking with i64::MAX from SEEK_CUR must return -1 using checked arithmetic
|
|
let ret = asset.seek(i64::MAX, 1);
|
|
assert_eq!(ret, -1);
|
|
}
|
|
|
|
#[test]
|
|
fn test_path_normalization_and_disk_mod_resolution() {
|
|
let temp = tempdir().unwrap();
|
|
let mods_dir = temp.path().join("mods");
|
|
std::fs::create_dir_all(&mods_dir).unwrap();
|
|
|
|
let custom_sound = mods_dir.join("content/sounds/ouch.ogg");
|
|
if let Some(parent) = custom_sound.parent() {
|
|
std::fs::create_dir_all(parent).unwrap();
|
|
}
|
|
std::fs::write(&custom_sound, b"CUSTOM_DISK_MOD_DATA").unwrap();
|
|
|
|
let mut mgr = AssetManager::new_with_mods_dir(Some(mods_dir));
|
|
mgr.add_asset("content/sounds/ouch.ogg", b"BASE_DATA".to_vec());
|
|
|
|
// Should resolve path with Windows backslashes and leading slashes
|
|
let asset = mgr.open(r"\content\sounds\ouch.ogg").expect("Should open with backslash normalization");
|
|
let mut out = vec![0u8; asset.length() as usize];
|
|
let mut asset_mut = asset;
|
|
asset_mut.read(&mut out);
|
|
|
|
assert_eq!(&out, b"CUSTOM_DISK_MOD_DATA", "Must resolve disk mod overlay with normalized path");
|
|
}
|