use delta_kit::{apply_delta, compute_delta};
type TestResult = Result<(), Box<dyn std::error::Error>>;
#[test]
fn golden_prefix_suffix_delta() -> TestResult {
let base = b"Hello, World!";
let target = b"Hello, Rust!";
let (_c, delta) = compute_delta(base, target);
let mut expected = Vec::new();
expected.push(0x01u8);
expected.extend_from_slice(&7u64.to_le_bytes());
expected.extend_from_slice(&1u64.to_le_bytes());
expected.extend_from_slice(&12u64.to_le_bytes());
expected.extend_from_slice(b"Rust");
assert_eq!(delta, expected, "0x01 encoding must match the wire spec");
assert_eq!(apply_delta(base, &delta)?, target.to_vec());
Ok(())
}
#[test]
fn golden_full_delta() -> TestResult {
let base = [0u8, 0, 0, 0];
let target = [1u8, 2, 3];
let (_c, delta) = compute_delta(&base, &target);
assert_eq!(
delta,
vec![0x00, 1, 2, 3],
"0x00 encoding must match the wire spec"
);
assert_eq!(apply_delta(&base, &delta)?, target.to_vec());
Ok(())
}
#[test]
fn golden_instruction_stream_layout() -> TestResult {
let base = b"ABCDEFGH";
let mut d = Vec::new();
d.push(0x02);
d.extend_from_slice(&10u64.to_le_bytes()); d.extend_from_slice(&3u32.to_le_bytes()); d.push(0x01); d.extend_from_slice(&0u64.to_le_bytes());
d.extend_from_slice(&4u32.to_le_bytes()); d.push(0x02); d.extend_from_slice(&2u32.to_le_bytes());
d.extend_from_slice(b"XY");
d.push(0x01); d.extend_from_slice(&4u64.to_le_bytes());
d.extend_from_slice(&4u32.to_le_bytes());
let out = apply_delta(base, &d)?;
assert_eq!(out, b"ABCDXYEFGH".to_vec());
Ok(())
}
#[test]
fn golden_instruction_header_is_thirteen_bytes() -> TestResult {
let base = b"0123456789";
let mut d = Vec::new();
d.push(0x02);
d.extend_from_slice(&9u64.to_le_bytes()); d.extend_from_slice(&3u32.to_le_bytes());
d.push(0x01);
d.extend_from_slice(&0u64.to_le_bytes());
d.extend_from_slice(&2u32.to_le_bytes()); d.push(0x02);
d.extend_from_slice(&1u32.to_le_bytes());
d.push(b'Q'); d.push(0x01);
d.extend_from_slice(&4u64.to_le_bytes());
d.extend_from_slice(&6u32.to_le_bytes());
let out = apply_delta(base, &d)?;
assert_eq!(out, b"01Q456789".to_vec());
Ok(())
}
#[test]
fn base_copy_returned_by_compute() {
let base = b"keep me";
let target = b"keep me too";
let (base_copy, _delta) = compute_delta(base, target);
assert_eq!(base_copy, base.to_vec());
}