ignis 0.1.0

A library for editing various 3DSFE formats.
Documentation
mod bin_archive;
mod bin_archive_reader;
mod bin_archive_writer;
mod deserialization;
mod serialization;

use serialization::SerializationState;

pub use bin_archive::BinArchive;
pub use bin_archive_reader::BinArchiveReader;
pub use bin_archive_writer::BinArchiveWriter;
pub use deserialization::from_bytes;

#[cfg(test)]
mod test {
    use super::*;
    use std::fs::OpenOptions;
    use std::io::Read;
    use std::path::PathBuf;

    #[test]
    fn serialization_round_trip_bad_size() {
        let bytes = load_test_file("ArchiveTest_BadSize.bin");
        test_archive_for_error(&bytes);
    }

    #[test]
    fn serialization_round_trip_bad_internal_pointer() {
        let bytes = load_test_file("ArchiveTest_BadInternalPointer.bin");
        test_archive_for_error(&bytes);
    }

    #[test]
    fn serialization_round_trip_file_size_mismatch() {
        let bytes = load_test_file("ArchiveTest_FileSizeMismatch.bin");
        test_archive_for_error(&bytes);
    }

    #[test]
    fn serialization_round_trip_mixed1() {
        let bytes = load_test_file("ArchiveTest_Mixed1.bin");
        test_archive_for_success(&bytes);
    }

    #[test]
    fn serialization_round_trip_mixed2() {
        let bytes = load_test_file("ArchiveTest_Mixed2.bin");
        test_archive_for_success(&bytes);
    }

    #[test]
    fn serialization_round_trip_only_text() {
        let bytes = load_test_file("ArchiveTest_OnlyText.bin");
        test_archive_for_success(&bytes);
    }

    fn test_archive_for_success(bytes: &[u8]) {
        let result = from_bytes(&bytes);
        assert!(result.is_ok());
        let result = result.unwrap().serialize();
        assert!(result.is_ok());
        let result_bytes = result.unwrap();
        assert_eq!(result_bytes, bytes);
    }

    fn test_archive_for_error(bytes: &[u8]) {
        let result = from_bytes(&bytes);
        assert!(result.is_err());
    }

    fn load_test_file(name: &str) -> Vec<u8> {
        let mut test_file_path = PathBuf::from(env!("CARGO_MANIFEST_DIR"));
        test_file_path.push("resources/test/");
        test_file_path.push(name);
        let mut file = OpenOptions::new().read(true).open(test_file_path).unwrap();
        let mut file_contents: Vec<u8> = Vec::new();
        file.read_to_end(&mut file_contents).unwrap();
        file_contents
    }
}