use qbsdiff::Bsdiff;
use socket_patch_core::patch::diff::apply_diff;
use std::io::Cursor;
fn make_delta(before: &[u8], after: &[u8]) -> Vec<u8> {
let mut delta = Vec::new();
Bsdiff::new(before, after)
.compare(Cursor::new(&mut delta))
.expect("bsdiff compare");
delta
}
#[test]
fn text_delta_round_trip() {
let before = b"the quick brown fox jumps over the lazy dog";
let after = b"the quick brown cat jumps over the lazy dog";
let delta = make_delta(before, after);
let result = apply_diff(before, &delta).unwrap();
assert_eq!(result, after);
}
#[test]
fn binary_delta_round_trip() {
let before: Vec<u8> = (0..1024u32).map(|i| (i % 251) as u8).collect();
let mut after = before.clone();
for i in [10usize, 200, 500, 900] {
after[i] = after[i].wrapping_add(7);
}
let delta = make_delta(&before, &after);
let result = apply_diff(&before, &delta).unwrap();
assert_eq!(result, after);
}
#[test]
fn empty_to_nonempty() {
let before: &[u8] = b"";
let after = b"hello";
let delta = make_delta(before, after);
let result = apply_diff(before, &delta).unwrap();
assert_eq!(result, after);
}
#[test]
fn malformed_delta_errors() {
let bogus = b"not a real bsdiff delta header";
let result = apply_diff(b"anything", bogus);
assert!(result.is_err(), "expected Err on malformed delta");
}
#[test]
fn wrong_source_does_not_panic() {
let src_a = b"AAAAAAAAAAAAAAAAAAAA";
let src_b = b"BBBBBBBBBBBBBBBBBBBB";
let target = b"CCCCCCCCCCCCCCCCCCCC";
let delta = make_delta(src_a, target);
let _ = apply_diff(src_b, &delta);
}