use packdir::pack::*;
use packdir::*;
use std::path::PathBuf;
#[test]
fn test_pack_name_validation() {
assert!(PackedDir::is_valid_packed_name("assets"));
assert!(PackedDir::is_valid_packed_name("my_bundle"));
assert!(PackedDir::is_valid_packed_name("bundle-name"));
assert!(PackedDir::is_valid_packed_name("bundle123"));
assert!(PackedDir::is_valid_packed_name("a"));
assert!(PackedDir::is_valid_packed_name("A"));
assert!(PackedDir::is_valid_packed_name("Bundle_Name-123"));
assert!(!PackedDir::is_valid_packed_name(""));
assert!(!PackedDir::is_valid_packed_name("123bundle"));
assert!(!PackedDir::is_valid_packed_name("bundle.name"));
assert!(!PackedDir::is_valid_packed_name("bundle name"));
assert!(!PackedDir::is_valid_packed_name("bundle@name"));
assert!(!PackedDir::is_valid_packed_name("bundle/name"));
assert!(!PackedDir::is_valid_packed_name("bundle\\name"));
}
#[test]
fn test_file_to_pack_normalize_path() {
let base_dir = PathBuf::from("/base/dir");
let file_path = PathBuf::from("/base/dir/subdir/file.txt");
let normalized = FileToPack::normalize_path_for_archive(&file_path, &base_dir);
assert_eq!(normalized, PathBuf::from("subdir/file.txt"));
let outside_file = PathBuf::from("/other/dir/file.txt");
let normalized_outside = FileToPack::normalize_path_for_archive(&outside_file, &base_dir);
assert_eq!(normalized_outside, PathBuf::from("file.txt"));
let no_filename = PathBuf::from("/other/dir/");
let normalized_no_name = FileToPack::normalize_path_for_archive(&no_filename, &base_dir);
assert_eq!(normalized_no_name, PathBuf::from("unknown"));
}
#[test]
fn test_compute_header_empty() {
let files = vec![];
let header = compute_header(&files).unwrap();
assert_eq!(header.len(), 13);
assert_eq!(&header[0..8], b"PACK DIR");
assert_eq!(header[8], VERSION);
let num_files = u32::from_le_bytes([header[9], header[10], header[11], header[12]]);
assert_eq!(num_files, 0);
}
#[test]
fn test_compute_header_with_files() {
let file1 = FileToPack {
path: PathBuf::from("test.txt"),
path_str: "test.txt".to_string(),
unpacked_size: 100,
packed_size: 80,
packed_data: vec![0; 80],
packer: Packer::Raw,
};
let file2 = FileToPack {
path: PathBuf::from("dir/nested.txt"),
path_str: "dir/nested.txt".to_string(),
unpacked_size: 200,
packed_size: 150,
packed_data: vec![0; 150],
packer: Packer::Gzip(Gzip::Level6),
};
let files = vec![file1, file2];
let header = compute_header(&files).unwrap();
assert_eq!(&header[0..8], b"PACK DIR");
assert_eq!(header[8], VERSION);
let num_files = u32::from_le_bytes([header[9], header[10], header[11], header[12]]);
assert_eq!(num_files, 2);
assert!(header.len() > 13); }
#[test]
fn test_compute_header_too_many_files() {
let files = vec![];
let header = compute_header(&files).unwrap();
assert!(header.len() >= 13);
}
#[test]
fn test_file_to_pack_path_normalization_edge_cases() {
let base = PathBuf::from("C:\\base");
let file = PathBuf::from("C:\\base\\sub\\file.txt");
let normalized = FileToPack::normalize_path_for_archive(&file, &base);
assert!(normalized.to_string_lossy().contains("file.txt"));
let same_path = PathBuf::from("/base/dir/file.txt");
let normalized_same = FileToPack::normalize_path_for_archive(&same_path, &same_path);
assert_eq!(normalized_same, PathBuf::from("unknown"));
let dir_path = PathBuf::from("/other/dir/");
let normalized_dir = FileToPack::normalize_path_for_archive(&dir_path, &PathBuf::from("/base"));
assert_eq!(normalized_dir, PathBuf::from("unknown"));
}
#[test]
fn test_signature_and_version_constants() {
assert_eq!(SIG, b"PACK DIR");
assert_eq!(VERSION, 1);
assert_eq!(SIG.len(), 8);
}
#[test]
fn test_packer_variations() {
let test_data = b"test data for packing";
let packers = vec![
Packer::Raw,
Packer::Gzip(Gzip::Level1),
Packer::Gzip(Gzip::Level6),
Packer::Gzip(Gzip::Level9),
Packer::Xz(Xz::Level1),
Packer::Xz(Xz::Level6),
Packer::Xz(Xz::Level9),
];
for packer in packers {
let packed = packer.pack(test_data).unwrap();
let unpacked = packer.unpack(&packed).unwrap();
assert_eq!(unpacked, test_data);
}
}