94 lines
2.4 KiB
V
94 lines
2.4 KiB
V
module lz
|
|
|
|
const sample_data = ('The quick brown fox jumps over the lazy dog. '.repeat(12) +
|
|
'aaaaaaaaabbbbbbbbbcccccccccdddddddddeeeeeeeee').bytes()
|
|
|
|
fn test_roundtrip_all_formats() {
|
|
formats := [Format.lz77, .lz78, .lzw, .lz4, .lzss, .lzma, .lzma2, .lzjb]
|
|
for format in formats {
|
|
compressed := compress(sample_data, format)!
|
|
decompressed := decompress(compressed, format)!
|
|
assert decompressed == sample_data
|
|
}
|
|
}
|
|
|
|
fn test_format_specific_api_roundtrip() {
|
|
lz77_data := compress_lz77(sample_data)!
|
|
assert decompress_lz77(lz77_data)! == sample_data
|
|
|
|
lz78_data := compress_lz78(sample_data)!
|
|
assert decompress_lz78(lz78_data)! == sample_data
|
|
|
|
lzw_data := compress_lzw(sample_data)!
|
|
assert decompress_lzw(lzw_data)! == sample_data
|
|
|
|
lz4_data := compress_lz4(sample_data)!
|
|
assert decompress_lz4(lz4_data)! == sample_data
|
|
|
|
lzss_data := compress_lzss(sample_data)!
|
|
assert decompress_lzss(lzss_data)! == sample_data
|
|
|
|
lzma_data := compress_lzma(sample_data)!
|
|
assert decompress_lzma(lzma_data)! == sample_data
|
|
|
|
lzma2_data := compress_lzma2(sample_data)!
|
|
assert decompress_lzma2(lzma2_data)! == sample_data
|
|
|
|
lzjb_data := compress_lzjb(sample_data)!
|
|
assert decompress_lzjb(lzjb_data)! == sample_data
|
|
}
|
|
|
|
fn test_mismatched_format_fails() {
|
|
compressed := compress(sample_data, .lz77)!
|
|
decompress(compressed, .lz4) or {
|
|
assert err.msg().contains('format mismatch')
|
|
return
|
|
}
|
|
assert false
|
|
}
|
|
|
|
fn test_decoded_length_too_large_fails() {
|
|
mut corrupt := []u8{}
|
|
corrupt << stream_magic
|
|
corrupt << u8(Format.lz77)
|
|
encode_uvarint(mut corrupt, u64(1) << 31)
|
|
|
|
decompress_lz77(corrupt) or {
|
|
assert err.msg().contains('decoded length too large')
|
|
return
|
|
}
|
|
assert false
|
|
}
|
|
|
|
fn test_match_offset_too_large_fails() {
|
|
mut corrupt := []u8{}
|
|
corrupt << stream_magic
|
|
corrupt << u8(Format.lz77)
|
|
encode_uvarint(mut corrupt, u64(4))
|
|
corrupt << u8(0)
|
|
corrupt << `A`
|
|
corrupt << u8(0x80)
|
|
encode_uvarint(mut corrupt, u64(1) << 63)
|
|
|
|
decompress_lz77(corrupt) or {
|
|
assert err.msg().contains('bad match offset')
|
|
return
|
|
}
|
|
assert false
|
|
}
|
|
|
|
fn test_high_entropy_roundtrip_large_window_formats() {
|
|
mut data := []u8{len: 128 * 1024}
|
|
mut state := u32(0x9e3779b9)
|
|
for i in 0 .. data.len {
|
|
state = state * 1664525 + 1013904223
|
|
data[i] = u8(state >> 24)
|
|
}
|
|
|
|
for format in [Format.lz4, .lzma, .lzma2] {
|
|
compressed := compress(data, format)!
|
|
decompressed := decompress(compressed, format)!
|
|
assert decompressed == data
|
|
}
|
|
}
|