#![allow(clippy::all)]
use ragc_common::types::Contig;
use ragc_core::LZDiff;
fn print_contig(label: &str, contig: &Contig) {
print!("{} len:{} data:", label, contig.len());
for (i, &byte) in contig.iter().enumerate() {
if i >= 50 {
break;
}
if i > 0 {
print!(" ");
}
print!("{byte}");
}
if contig.len() > 50 {
print!(" ...");
}
println!();
}
fn print_encoded(label: &str, encoded: &[u8]) {
print!("{} len:{} hex:", label, encoded.len());
for (i, &byte) in encoded.iter().enumerate() {
if i >= 100 {
break;
}
print!("{byte:02x}");
}
if encoded.len() > 100 {
print!("...");
}
println!();
}
fn test_encode_decode(reference: &Contig, target: &Contig, lz_diff: &mut LZDiff) {
let encoded = lz_diff.encode(target);
print_contig("reference", reference);
print_contig("target", target);
print_encoded("encoded", &encoded);
let mut decoded = lz_diff.decode(&encoded);
if encoded.is_empty() && target.len() == reference.len() {
decoded = reference.clone();
}
print_contig("decoded", &decoded);
println!(
"match:{}",
if *target == decoded { "true" } else { "false" }
);
}
fn test_simple_match() {
println!("# Test 1: Simple match");
let reference = vec![0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3];
let target = vec![0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3];
let mut lz_diff = LZDiff::new(18);
lz_diff.prepare(&reference);
test_encode_decode(&reference, &target, &mut lz_diff);
println!();
}
fn test_with_literals() {
println!("# Test 2: With literals");
let reference = vec![0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3];
let target = vec![0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0];
let mut lz_diff = LZDiff::new(18);
lz_diff.prepare(&reference);
test_encode_decode(&reference, &target, &mut lz_diff);
println!();
}
fn test_with_nruns() {
println!("# Test 3: With N-runs");
let reference = vec![0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3];
let target = vec![0, 0, 0, 0, 0, 4, 4, 4, 4, 4, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3];
let mut lz_diff = LZDiff::new(18);
lz_diff.prepare(&reference);
test_encode_decode(&reference, &target, &mut lz_diff);
println!();
}
fn test_short_sequence() {
println!("# Test 4: Short sequence (< min_match_len)");
let reference = vec![0, 1, 2, 3, 0, 1, 2, 3, 0, 1];
let target = vec![0, 1, 2, 3, 0, 1, 2, 3, 0, 1];
let mut lz_diff = LZDiff::new(18);
lz_diff.prepare(&reference);
test_encode_decode(&reference, &target, &mut lz_diff);
println!();
}
fn test_long_match() {
println!("# Test 5: Long match");
let mut reference = Vec::new();
for i in 0..50 {
reference.push((i % 4) as u8);
}
let target = reference.clone();
let mut lz_diff = LZDiff::new(18);
lz_diff.prepare(&reference);
test_encode_decode(&reference, &target, &mut lz_diff);
println!();
}
fn test_partial_match() {
println!("# Test 6: Partial match");
let mut reference = Vec::new();
for i in 0..30 {
reference.push((i % 4) as u8);
}
let mut target = Vec::new();
for i in 0..20 {
target.push((i % 4) as u8);
}
for i in 0..10 {
target.push(((i + 1) % 4) as u8); }
let mut lz_diff = LZDiff::new(18);
lz_diff.prepare(&reference);
test_encode_decode(&reference, &target, &mut lz_diff);
println!();
}
fn main() {
test_simple_match();
test_with_literals();
test_with_nruns();
test_short_sequence();
test_long_match();
test_partial_match();
}