uo-rust-libs 0.1.0

Data readers for various Ultima Online client mul files
Documentation
use byteorder::{LittleEndian, WriteBytesExt};
use std::{
    collections::HashSet,
    io::{Cursor, Result, Write},
};

use crate::{
    map::diff::{MapDiffReader, StaticLocationDiffReader},
    mul::tests::simple_from_vecs,
    tests::map::helpers::{raw_block, raw_static_location},
};

fn raw_map() -> Result<Vec<u8>> {
    let mut data = Cursor::new(vec![]);
    for _ in 0..2 {
        data.write_all(&raw_block(3)?)?;
    }
    Ok(data.into_inner())
}

fn raw_references() -> Result<Vec<u8>> {
    let mut data = Cursor::new(vec![]);
    data.write_u32::<LittleEndian>(1234)?;
    data.write_u32::<LittleEndian>(5678)?;
    Ok(data.into_inner())
}

fn raw_static_locations() -> Result<Vec<u8>> {
    let mut data = Cursor::new(vec![]);
    data.write_all(&raw_static_location(23)?)?;
    Ok(data.into_inner())
}

#[test]
fn test_map_diff_read() {
    let reader = Cursor::new(raw_map().unwrap());
    let references = Cursor::new(raw_references().unwrap());
    let mut diff_reader = MapDiffReader::from_readable(references, reader, 8).unwrap();
    let missing_entry = diff_reader.read(1235);
    assert!(missing_entry.is_none());
    let known_entry = diff_reader.read(1234);
    assert!(known_entry.is_some());
    assert_eq!(known_entry.unwrap().unwrap().cells[0].graphic, 3);
}

#[test]
fn test_map_diff_read_all() {
    let reader = Cursor::new(raw_map().unwrap());
    let references = Cursor::new(raw_references().unwrap());
    let mut diff_reader = MapDiffReader::from_readable(references, reader, 8).unwrap();
    let patches = diff_reader.read_all();
    assert_eq!(
        patches.keys().collect::<HashSet<&u32>>(),
        HashSet::from_iter(&[1234, 5678])
    );
}

#[test]
fn test_static_diff_read() {
    let mul_reader = simple_from_vecs(vec![
        (raw_static_locations().unwrap(), 0, 0),
        (raw_static_locations().unwrap(), 0, 0),
    ]);
    let references = Cursor::new(raw_references().unwrap());
    let mut diff_reader =
        StaticLocationDiffReader::from_mul_reader(references, mul_reader, 8).unwrap();
    let missing_entry = diff_reader.read(1235);
    assert!(missing_entry.is_none());
    let known_entry = diff_reader.read(1234);
    assert!(known_entry.is_some());
    assert_eq!(known_entry.unwrap().unwrap().len(), 1);
}

#[test]
fn test_static_diff_read_all() {
    let mul_reader = simple_from_vecs(vec![
        (raw_static_locations().unwrap(), 0, 0),
        (raw_static_locations().unwrap(), 0, 0),
    ]);
    let references = Cursor::new(raw_references().unwrap());
    let mut diff_reader =
        StaticLocationDiffReader::from_mul_reader(references, mul_reader, 8).unwrap();
    let patches = diff_reader.read_all();
    assert_eq!(
        patches.keys().collect::<HashSet<&u32>>(),
        HashSet::from_iter(&[1234, 5678])
    );
}