#![warn(missing_docs)]
mod compress;
mod compressor;
mod optimize;
const INITIAL_OFFSET: usize = 1;
const MAX_OFFSET_ZX0: usize = 32640;
const MAX_OFFSET_ZX7: usize = 2176;
pub use compressor::{
CompressionResult,
Compressor
};
pub fn compress(input: &[u8]) -> Vec<u8> {
Compressor::new().compress(input).output
}
#[cfg(test)]
mod tests {
use super::Compressor;
#[test]
fn defaults() {
let input = std::fs::read("src/lib.rs").unwrap();
let reference = reference::Compressor::new().compress(&input);
let result = Compressor::new().compress(&input);
assert_eq!(result.output, reference.output);
assert_eq!(result.delta, reference.delta);
}
#[test]
fn defaults_with_prefix() {
let input = std::fs::read("src/lib.rs").unwrap();
for skip in (0..input.len()).step_by(512) {
let reference = reference::Compressor::new().skip(skip).compress(&input);
unsafe { reference::reset(); }
let result = Compressor::new().skip(skip).compress(&input);
assert_eq!(result.output, reference.output);
assert_eq!(result.delta, reference.delta);
}
}
#[test]
fn backwards_mode() {
let input = std::fs::read("src/lib.rs").unwrap();
let reference = reference::Compressor::new().backwards_mode(true).compress(&input);
unsafe { reference::reset(); }
let result = Compressor::new().backwards_mode(true).compress(&input);
assert_eq!(result.output, reference.output);
assert_eq!(result.delta, reference.delta);
}
#[test]
fn backwards_mode_with_suffix() {
let input = std::fs::read("src/lib.rs").unwrap();
for skip in (0..input.len()).step_by(512) {
let reference = reference::Compressor::new().backwards_mode(true).skip(skip).compress(&input);
unsafe { reference::reset(); }
let result = Compressor::new().backwards_mode(true).skip(skip).compress(&input);
assert_eq!(result.output, reference.output);
assert_eq!(result.delta, reference.delta);
}
}
#[test]
fn quick_mode() {
let input = std::fs::read("src/lib.rs").unwrap();
let reference = reference::Compressor::new().quick_mode(true).compress(&input);
unsafe { reference::reset(); }
let result = Compressor::new().quick_mode(true).compress(&input);
assert_eq!(result.output, reference.output);
assert_eq!(result.delta, reference.delta);
}
#[test]
fn classic_mode() {
let input = std::fs::read("src/lib.rs").unwrap();
let reference = reference::Compressor::new().classic_mode(true).compress(&input);
unsafe { reference::reset(); }
let result = Compressor::new().classic_mode(true).compress(&input);
assert_eq!(result.output, reference.output);
assert_eq!(result.delta, reference.delta);
}
#[test]
fn progress_callback() {
let input = std::fs::read("src/lib.rs").unwrap();
let called = std::cell::RefCell::new(false);
Compressor::new().progress_callback(|progress| {
*called.borrow_mut() = true;
assert!(progress >= 0.0);
assert!(progress <= 1.0);
}).compress(&input);
assert!(*called.borrow());
}
}