///|
/// ZIP magic detection tests
test "zip_magic_local_file_header" {
// PK\x03\x04
let data = Bytes::from_array([0x50, 0x4B, 0x03, 0x04, 0x00, 0x00])
json_inspect(bytes_has_zip_magic(data), content=true)
}
///|
test "zip_magic_eocd" {
// PK\x05\x06 (empty archive)
let data = Bytes::from_array([0x50, 0x4B, 0x05, 0x06, 0x00, 0x00])
json_inspect(bytes_has_zip_magic(data), content=true)
}
///|
test "zip_magic_invalid" {
let data = b"not a zip file"
json_inspect(bytes_has_zip_magic(data), content=false)
}
///|
test "zip_magic_too_short" {
let data = Bytes::from_array([0x50, 0x4B])
json_inspect(bytes_has_zip_magic(data), content=false)
}
///|
test "archive_to_bytes_empty" {
let archive = Archive::empty()
let bytes = archive.to_bytes()
// Empty archive: just EOCD (22 bytes)
json_inspect((bytes.length(), bytes_has_zip_magic(bytes)), content=[22, true])
}
///|
test "archive_to_bytes_single_file" {
let data = b"Hello ZIP!"
let file = @file.File::stored_of_bytes(data, 0, data.length())
let m = @member.make(@fpath.Fpath("hello.txt"), File(file))
let archive = Archive::empty()
archive.add(m)
let bytes = archive.to_bytes()
json_inspect((bytes.length() > 0, bytes_has_zip_magic(bytes)), content=[
true, true,
])
}
///|
test "archive_to_bytes_directory" {
let m = @member.make(@fpath.Fpath("mydir/"), Dir)
let archive = Archive::empty()
archive.add(m)
let bytes = archive.to_bytes()
json_inspect(bytes_has_zip_magic(bytes), content=true)
}
///|
test "archive_to_bytes_multiple_files" {
let data1 = b"file 1"
let data2 = b"file 2"
let file1 = @file.File::stored_of_bytes(data1, 0, data1.length())
let file2 = @file.File::stored_of_bytes(data2, 0, data2.length())
let m1 = @member.make(@fpath.Fpath("a.txt"), File(file1))
let m2 = @member.make(@fpath.Fpath("b.txt"), File(file2))
let archive = Archive::empty()
archive.add(m1)
archive.add(m2)
let bytes = archive.to_bytes()
json_inspect(
(
bytes.length() > 100,
// 2 files
bytes_has_zip_magic(bytes),
archive.member_count(),
),
content=[true, true, 2],
)
}