use tact_parser::download::DownloadManifest;
fn create_test_manifest_data() -> Vec<u8> {
let mut data = Vec::new();
data.extend_from_slice(b"DL"); data.push(3); data.push(16); data.push(1); data.extend_from_slice(&5u32.to_be_bytes()); data.extend_from_slice(&2u16.to_be_bytes()); data.push(2); data.push(0i8 as u8); data.extend_from_slice(&[0, 0, 0]);
data.extend_from_slice(&[1; 16]); data.extend_from_slice(&1000u64.to_le_bytes()[..5]); data.push(0); data.extend_from_slice(&0x12345678u32.to_be_bytes()); data.extend_from_slice(&[0xFF, 0x00]);
data.extend_from_slice(&[2; 16]); data.extend_from_slice(&2000u64.to_le_bytes()[..5]); data.push(1); data.extend_from_slice(&0x23456789u32.to_be_bytes()); data.extend_from_slice(&[0x00, 0xFF]);
data.extend_from_slice(&[3; 16]); data.extend_from_slice(&3000u64.to_le_bytes()[..5]); data.push(2); data.extend_from_slice(&0x3456789Au32.to_be_bytes()); data.extend_from_slice(&[0xAA, 0xBB]);
data.extend_from_slice(&[4; 16]); data.extend_from_slice(&4000u64.to_le_bytes()[..5]); data.push(3); data.extend_from_slice(&0x456789ABu32.to_be_bytes()); data.extend_from_slice(&[0xCC, 0xDD]);
data.extend_from_slice(&[5; 16]); data.extend_from_slice(&5000u64.to_le_bytes()[..5]); data.push(10); data.extend_from_slice(&0x56789ABCu32.to_be_bytes()); data.extend_from_slice(&[0xEE, 0xFF]);
data.extend_from_slice(b"Windows\0");
data.extend_from_slice(&2u16.to_be_bytes()); data.push(0b11110000);
data.extend_from_slice(b"enUS\0");
data.extend_from_slice(&1u16.to_be_bytes()); data.push(0b10101000);
data
}
#[test]
fn test_parse_download_manifest() {
let data = create_test_manifest_data();
let manifest = DownloadManifest::parse(&data).unwrap();
assert_eq!(manifest.header.version, 3);
assert_eq!(manifest.header.entry_count, 5);
assert_eq!(manifest.header.tag_count, 2);
assert!(manifest.header.has_checksum);
assert_eq!(manifest.header.flag_size, 2);
assert_eq!(manifest.entries.len(), 5);
assert_eq!(manifest.priority_order.len(), 5);
assert_eq!(manifest.priority_order[0], vec![1; 16]); assert_eq!(manifest.priority_order[1], vec![2; 16]); assert_eq!(manifest.priority_order[2], vec![3; 16]); assert_eq!(manifest.priority_order[3], vec![4; 16]); assert_eq!(manifest.priority_order[4], vec![5; 16]);
assert_eq!(manifest.tags.len(), 2);
assert_eq!(manifest.tags[0].name, "Windows");
assert_eq!(manifest.tags[0].tag_type, 2);
assert_eq!(manifest.tags[1].name, "enUS");
assert_eq!(manifest.tags[1].tag_type, 1);
}
#[test]
fn test_get_priority_files() {
let data = create_test_manifest_data();
let manifest = DownloadManifest::parse(&data).unwrap();
let essential = manifest.get_essential_files();
assert_eq!(essential.len(), 1);
assert_eq!(essential[0].priority, 0);
let high_priority = manifest.get_priority_files(1);
assert_eq!(high_priority.len(), 2);
let normal = manifest.get_priority_files(3);
assert_eq!(normal.len(), 4);
let all = manifest.get_priority_files(10);
assert_eq!(all.len(), 5);
}
#[test]
fn test_get_download_size() {
let data = create_test_manifest_data();
let manifest = DownloadManifest::parse(&data).unwrap();
assert_eq!(manifest.get_download_size(0), 1000);
assert_eq!(manifest.get_download_size(1), 3000);
assert_eq!(manifest.get_download_size(3), 10000);
assert_eq!(manifest.get_download_size(10), 15000); }
#[test]
fn test_get_files_for_tags() {
let data = create_test_manifest_data();
let manifest = DownloadManifest::parse(&data).unwrap();
let windows_files = manifest.get_files_for_tags(&["Windows"]);
assert_eq!(windows_files.len(), 4);
let enus_files = manifest.get_files_for_tags(&["enUS"]);
assert_eq!(enus_files.len(), 3);
let both_tags = manifest.get_files_for_tags(&["Windows", "enUS"]);
assert_eq!(both_tags.len(), 5); }
#[test]
fn test_version_compatibility() {
let mut data = Vec::new();
data.extend_from_slice(b"DL");
data.push(1); data.push(16); data.push(0); data.extend_from_slice(&0u32.to_be_bytes()); data.extend_from_slice(&0u16.to_be_bytes());
let manifest = DownloadManifest::parse(&data).unwrap();
assert_eq!(manifest.header.version, 1);
assert_eq!(manifest.header.flag_size, 0);
assert_eq!(manifest.header.base_priority, 0);
}
#[test]
fn test_entry_with_large_size() {
let mut data = Vec::new();
data.extend_from_slice(b"DL");
data.push(1);
data.push(16);
data.push(0);
data.extend_from_slice(&1u32.to_be_bytes());
data.extend_from_slice(&0u16.to_be_bytes());
data.extend_from_slice(&[0xAA; 16]);
data.extend_from_slice(&0xFFFFFFFFFFu64.to_le_bytes()[..5]); data.push(0);
let manifest = DownloadManifest::parse(&data).unwrap();
let entry = manifest.entries.get(&vec![0xAA; 16]).unwrap();
assert_eq!(entry.compressed_size, 0xFFFFFFFFFF); }
#[test]
fn test_negative_base_priority() {
let mut data = Vec::new();
data.extend_from_slice(b"DL");
data.push(3);
data.push(16);
data.push(0);
data.extend_from_slice(&1u32.to_be_bytes());
data.extend_from_slice(&0u16.to_be_bytes());
data.push(0); data.push(254u8); data.extend_from_slice(&[0, 0, 0]);
data.extend_from_slice(&[1; 16]);
data.extend_from_slice(&1000u64.to_le_bytes()[..5]);
data.push(0);
let manifest = DownloadManifest::parse(&data).unwrap();
assert_eq!(manifest.header.base_priority, -2);
let entry = manifest.entries.get(&vec![1; 16]).unwrap();
assert_eq!(entry.priority, 0 - (-2)); assert_eq!(entry.priority, 2);
}