use oxidize_pdf::compression::{compress, decompress};
use oxidize_pdf::{Document, Page};
#[test]
fn test_compress_decompress_pdf_content() {
let content = b"q\n\
BT\n\
/F1 12 Tf\n\
100 700 Td\n\
(Hello, World!) Tj\n\
ET\n\
Q";
let compressed = compress(content).unwrap();
assert!(!compressed.is_empty());
let decompressed = decompress(&compressed).unwrap();
assert_eq!(decompressed, content);
}
#[test]
fn test_compress_large_pdf_stream() {
let mut large_stream = Vec::new();
for i in 0..1000 {
large_stream.extend_from_slice(b"0 0 m\n");
large_stream.extend_from_slice(format!("{} {} l\n", i, i).as_bytes());
large_stream.extend_from_slice(b"S\n");
}
let compressed = compress(&large_stream).unwrap();
assert!(compressed.len() < large_stream.len() / 2);
let decompressed = decompress(&compressed).unwrap();
assert_eq!(decompressed, large_stream);
}
#[test]
fn test_compress_binary_pdf_data() {
let mut binary_data = Vec::new();
for i in 0..=255 {
binary_data.push(i as u8);
binary_data.push((255 - i) as u8);
}
let compressed = compress(&binary_data).unwrap();
assert!(!compressed.is_empty());
let decompressed = decompress(&compressed).unwrap();
assert_eq!(decompressed, binary_data);
}
#[test]
fn test_pdf_with_compressed_streams() {
let mut doc = Document::new();
let mut page = Page::new(595.0, 842.0);
let gc = page.graphics();
gc.save_state();
gc.begin_text();
for i in 0..10 {
let y = 700.0 - (i as f64 * 20.0);
gc.set_text_position(100.0, y);
let _ = gc.show_text(&format!("Line {}: This is a test of PDF compression", i));
}
gc.end_text();
gc.restore_state();
doc.add_page(page);
let pdf_bytes = doc.to_bytes().unwrap();
let pdf_str = String::from_utf8_lossy(&pdf_bytes);
assert!(pdf_str.contains("/FlateDecode") || pdf_str.contains("/Fl"));
}
#[test]
fn test_compress_empty_stream() {
let empty = b"";
let compressed = compress(empty).unwrap();
assert!(!compressed.is_empty());
let decompressed = decompress(&compressed).unwrap();
assert_eq!(decompressed, empty);
}
#[test]
fn test_compress_single_byte_patterns() {
let patterns = vec![
vec![0x00; 1000], vec![0xFF; 1000], vec![0xAA; 1000], vec![0x55; 1000], ];
for pattern in patterns {
let compressed = compress(&pattern).unwrap();
assert!(compressed.len() < 100);
let decompressed = decompress(&compressed).unwrap();
assert_eq!(decompressed, pattern);
}
}
#[test]
fn test_decompress_invalid_data_handling() {
let invalid_data = b"This is not compressed data!";
let result = decompress(invalid_data);
assert!(result.is_err());
let valid = compress(b"Valid data").unwrap();
if valid.len() > 5 {
let truncated = &valid[..valid.len() / 2];
let result = decompress(truncated);
assert!(result.is_err() || result.unwrap() != b"Valid data");
}
}
#[test]
fn test_compress_unicode_pdf_text() {
let unicode_text = "Hello 世界! 🎉 PDF Unicode test äöü €".as_bytes();
let compressed = compress(unicode_text).unwrap();
assert!(!compressed.is_empty());
let decompressed = decompress(&compressed).unwrap();
assert_eq!(decompressed, unicode_text);
let restored = String::from_utf8(decompressed).unwrap();
assert_eq!(restored, "Hello 世界! 🎉 PDF Unicode test äöü €");
}
#[test]
fn test_compress_mixed_content() {
let mut mixed = Vec::new();
mixed.extend_from_slice(b"BT /F1 12 Tf ");
mixed.extend_from_slice(&[0xFF, 0x00, 0xFF, 0x00]); mixed.extend_from_slice(b" 100 700 Td (Text) Tj ET");
let compressed = compress(&mixed).unwrap();
let decompressed = decompress(&compressed).unwrap();
assert_eq!(decompressed, mixed);
}