use asar_rust::filesystem::{Filesystem, FilesystemEntry, ListOptions};
use std::path::Path;
#[test]
fn test_new_filesystem() {
let fs = Filesystem::new(Path::new("/test"));
assert_eq!(fs.root_path(), Path::new("/test"));
}
#[test]
fn test_insert_directory() {
let mut fs = Filesystem::new(Path::new("/test"));
fs.insert_directory(Path::new("/test/subdir"), false).unwrap();
let entry = fs.get_file("/subdir", true);
assert!(entry.is_ok());
assert!(entry.unwrap().is_directory());
}
#[test]
fn test_insert_file() {
let mut fs = Filesystem::new(Path::new("/test"));
fs.insert_file(Path::new("/test/file.txt"), 100, false, false, None).unwrap();
let entry = fs.get_file("/file.txt", true).unwrap();
assert!(entry.is_file());
if let FilesystemEntry::File(f) = entry {
assert_eq!(f.size, 100);
assert_eq!(f.offset, "0");
}
}
#[test]
fn test_insert_link() {
let mut fs = Filesystem::new(Path::new("/test"));
fs.insert_link(Path::new("/test/link"), "target".to_string(), false).unwrap();
let entry = fs.get_file("/link", false).unwrap();
assert!(entry.is_link());
}
#[test]
fn test_list_files() {
let mut fs = Filesystem::new(Path::new("/test"));
fs.insert_directory(Path::new("/test/dir"), false).unwrap();
fs.insert_file(Path::new("/test/file.txt"), 100, false, false, None).unwrap();
let files = fs.list_files(None);
assert_eq!(files.len(), 2);
assert!(files.contains(&"/dir".to_string()));
assert!(files.contains(&"/file.txt".to_string()));
}
#[test]
fn test_list_files_with_is_pack() {
let mut fs = Filesystem::new(Path::new("/test"));
fs.insert_file(Path::new("/test/packed.txt"), 100, false, false, None).unwrap();
fs.insert_file(Path::new("/test/unpacked.txt"), 100, false, true, None).unwrap();
let files = fs.list_files(Some(&ListOptions { is_pack: true }));
assert_eq!(files.len(), 2);
assert!(files.iter().any(|f| f.contains("pack") && f.contains("packed.txt")));
assert!(files.iter().any(|f| f.contains("unpack") && f.contains("unpacked.txt")));
}
#[test]
fn test_get_file_nonexistent() {
let fs = Filesystem::new(Path::new("/test"));
let result = fs.get_file("/nonexistent", true);
assert!(result.is_err());
}
#[test]
fn test_directory_unpack_flag_applies_to_children() {
let mut fs = Filesystem::new(Path::new("/test"));
fs.insert_directory(Path::new("/test/unpacked_dir"), true).unwrap();
fs.insert_file(Path::new("/test/unpacked_dir/file.txt"), 100, false, false, None).unwrap();
let entry = fs.get_file("/unpacked_dir/file.txt", true).unwrap();
if let FilesystemEntry::File(f) = entry {
assert!(f.unpacked);
} else {
panic!("Expected file entry");
}
}