chunk-diff 0.2.0

A fast and memory-efficient library for computing the difference between two frames of rect.
Documentation
use crate::{
    encoder::{Config, Encoder},
    frame::Frame,
    hasher::xxhash::XxHasher,
    util::rect::Rect,
};
use rand::Rng;

#[test]
fn encode() {
    let mut data = vec![0; 320 * 180];
    let rect = Rect::new(160, 90);
    let full = Rect::new(320, 180);
    let config = Config::new(rect, full);
    let mut encoder = Encoder::<XxHasher>::new(config);

    {
        let frames = encoder.encode(&data);
        assert_eq!(frames.len(), 1);
        match frames.first().unwrap() {
            Frame::Changed(changed) => {
                assert_eq!(changed.chunk().point().x(), 0);
                assert_eq!(changed.chunk().point().y(), 0);
                assert_eq!(
                    changed
                        .data()
                        .iter()
                        .map(|y_slice| y_slice.iter())
                        .flatten()
                        .filter(|b| **b != 0)
                        .count(),
                    0
                );
            }
        }
    }

    {
        data[161] = 1;
        let frames = encoder.encode(&data);
        assert_eq!(frames.len(), 1);
        match frames.first().unwrap() {
            Frame::Changed(changed) => {
                assert_eq!(changed.chunk().point().x(), 160);
                assert_eq!(changed.chunk().point().y(), 0);
                assert_eq!(
                    changed
                        .data()
                        .iter()
                        .map(|y_slice| y_slice.iter())
                        .flatten()
                        .filter(|b| **b != 0)
                        .count(),
                    1
                );
                data[161] = 2;
                changed.apply(&mut data, &full);
                assert_eq!(data[161], 1);
            }
        }
    }

    {
        let frames = encoder.encode(&data);
        assert_eq!(frames.len(), 0);
    }
}

#[test]
fn encode_and_decode_4k() {
    let mut data = vec![0; 3840 * 2160];
    let rect = Rect::new(320, 180);
    let full = Rect::new(3840, 2160);
    let config = Config::new(rect, full);
    let mut rng = rand::thread_rng();
    let mut encoder = Encoder::<XxHasher>::new(config);
    let mut old_data = data.clone();
    let _ = encoder.encode(&data);

    (0..10).for_each(|_| {
        let start = rng.gen_range(0..3840 * 2160 - 10);
        data[start..start + 10]
            .copy_from_slice(&(0..10).map(|_| rng.gen::<u8>()).collect::<Vec<_>>());
    });

    let frames = encoder.encode(&data);
    frames.iter().for_each(|frame| match frame {
        Frame::Changed(changed) => changed.apply(&mut old_data, &full),
    });
    assert_eq!(data, old_data);
}