packdir 0.1.0

Easily embed directories of binary file data
Documentation
#[cfg(feature = "enc-dec")]
#[cfg(test)]
mod test_packer_bincode {
    use packdir::*;

    #[test]
    fn test_packer_serialization() {
        let raw = Packer::Raw;
        let gzip = Packer::Gzip(Gzip::Level9);
        let xz = Packer::Xz(Xz::Level1);

        let config = bincode::config::standard();

        let raw_encoded = bincode::encode_to_vec(&raw, config).unwrap();
        let gzip_encoded = bincode::encode_to_vec(&gzip, config).unwrap();
        let xz_encoded = bincode::encode_to_vec(&xz, config).unwrap();

        let (raw_decoded, _): (Packer, usize) =
            bincode::decode_from_slice(&raw_encoded, config).unwrap();
        let (gzip_decoded, _): (Packer, usize) =
            bincode::decode_from_slice(&gzip_encoded, config).unwrap();
        let (xz_decoded, _): (Packer, usize) =
            bincode::decode_from_slice(&xz_encoded, config).unwrap();

        assert_eq!(raw, raw_decoded);
        assert_eq!(gzip, gzip_decoded);
        assert_eq!(xz, xz_decoded);
    }

    #[test]
    fn test_gzip_serialization() {
        let levels = vec![Gzip::Level1, Gzip::Level6, Gzip::Level9];

        let config = bincode::config::standard();

        for level in levels {
            let encoded = bincode::encode_to_vec(&level, config).unwrap();
            let (decoded, _): (Gzip, usize) = bincode::decode_from_slice(&encoded, config).unwrap();
            assert_eq!(level, decoded);
        }
    }

    #[test]
    fn test_xz_serialization() {
        let levels = vec![Xz::Level1, Xz::Level6, Xz::Level9];

        let config = bincode::config::standard();

        for level in levels {
            let encoded = bincode::encode_to_vec(&level, config).unwrap();
            let (decoded, _): (Xz, usize) = bincode::decode_from_slice(&encoded, config).unwrap();
            assert_eq!(level, decoded);
        }
    }
    #[test]
    fn test_serialization_consistency() {
        let config = bincode::config::standard();

        // Test that serialization is consistent across multiple runs
        let packer = Packer::Gzip(Gzip::Level5);

        let encoded1 = bincode::encode_to_vec(&packer, config).unwrap();
        let encoded2 = bincode::encode_to_vec(&packer, config).unwrap();

        assert_eq!(encoded1, encoded2);

        let (decoded1, _): (Packer, usize) = bincode::decode_from_slice(&encoded1, config).unwrap();
        let (decoded2, _): (Packer, usize) = bincode::decode_from_slice(&encoded2, config).unwrap();

        assert_eq!(packer, decoded1);
        assert_eq!(packer, decoded2);
        assert_eq!(decoded1, decoded2);
    }
}

use packdir::*;
#[test]
fn test_packer_u8_conversion() {
    assert_eq!(u8::from(Packer::Raw), 0);
    assert_eq!(u8::from(Packer::Gzip(Gzip::Level6)), 1);
    assert_eq!(u8::from(Packer::Xz(Xz::Level6)), 2);

    assert_eq!(Packer::try_from(0u8).unwrap(), Packer::Raw);
    assert_eq!(
        Packer::try_from(1u8).unwrap(),
        Packer::Gzip(Gzip::default())
    );
    assert_eq!(Packer::try_from(2u8).unwrap(), Packer::Xz(Xz::default()));

    assert!(Packer::try_from(255u8).is_err());
}

#[test]
fn test_packer_try_read_u8() {
    let data = vec![0, 1, 2, 255];
    let mut offset = 0;

    assert_eq!(
        Packer::try_read_u8(&data, &mut offset).unwrap(),
        Packer::Raw
    );
    assert_eq!(offset, 1);

    assert_eq!(
        Packer::try_read_u8(&data, &mut offset).unwrap(),
        Packer::Gzip(Gzip::default())
    );
    assert_eq!(offset, 2);

    assert_eq!(
        Packer::try_read_u8(&data, &mut offset).unwrap(),
        Packer::Xz(Xz::default())
    );
    assert_eq!(offset, 3);

    assert!(Packer::try_read_u8(&data, &mut offset).is_err());
}

#[test]
fn test_gzip_levels() {
    assert_eq!(Gzip::fast(), Gzip::Level1);
    assert_eq!(Gzip::best(), Gzip::Level9);
    assert_eq!(Gzip::default(), Gzip::Level6);

    let level = Gzip::Level3;
    assert_eq!(level.packer(), Packer::Gzip(level));

    let flate_level: flate2::Compression = (&level).into();
    assert_eq!(flate_level.level(), 3);
}

#[test]
fn test_xz_levels() {
    assert_eq!(Xz::fast(), Xz::Level1);
    assert_eq!(Xz::best(), Xz::Level9);
    assert_eq!(Xz::default(), Xz::Level6);

    let level = Xz::Level7;
    assert_eq!(level.packer(), Packer::Xz(level));
}

#[test]
fn test_compression_types() {
    let test_data = b"Hello, World! This is test data for compression.";

    let no_comp = Packer::Raw;
    let gzip_comp = Packer::Gzip(Gzip::default());
    let xz_comp = Packer::Xz(Xz::default());

    // Test no compression
    let compressed = no_comp.pack(test_data).unwrap();
    assert_eq!(compressed, test_data);
    let decompressed = no_comp.unpack(&compressed).unwrap();
    assert_eq!(decompressed, test_data);

    // Test gzip compression
    let compressed = gzip_comp.pack(test_data).unwrap();
    assert_ne!(compressed, test_data);
    let decompressed = gzip_comp.unpack(&compressed).unwrap();
    assert_eq!(decompressed, test_data);

    // Test xz compression
    let compressed = xz_comp.pack(test_data).unwrap();
    assert_ne!(compressed, test_data);
    let decompressed = xz_comp.unpack(&compressed).unwrap();
    assert_eq!(decompressed, test_data);
}

#[test]
fn test_compression_round_trip_large_data() {
    let test_data = "Hello, World! ".repeat(1000);
    let test_bytes = test_data.as_bytes();

    let packers = vec![
        Packer::Raw,
        Packer::Gzip(Gzip::Level1),
        Packer::Gzip(Gzip::Level9),
        Packer::Xz(Xz::Level1),
        Packer::Xz(Xz::Level6),
    ];

    for packer in packers {
        let compressed = packer.pack(test_bytes).unwrap();
        let decompressed = packer.unpack(&compressed).unwrap();
        assert_eq!(decompressed, test_bytes);

        // Test compression effectiveness
        match packer {
            Packer::Raw => assert_eq!(compressed.len(), test_bytes.len()),
            Packer::Gzip(_) | Packer::Xz(_) => {
                // Compressed data should be smaller for repetitive content
                assert!(compressed.len() < test_bytes.len());
            }
        }
    }
}

#[test]
fn test_empty_data_compression() {
    let empty_data = b"";
    let packers = vec![
        Packer::Raw,
        Packer::Gzip(Gzip::default()),
        Packer::Xz(Xz::default()),
    ];

    for packer in packers {
        let compressed = packer.pack(empty_data).unwrap();
        let decompressed = packer.unpack(&compressed).unwrap();
        assert_eq!(decompressed, empty_data);
    }
}

#[test]
fn test_single_byte_compression() {
    let single_byte = b"A";
    let packers = vec![
        Packer::Raw,
        Packer::Gzip(Gzip::default()),
        Packer::Xz(Xz::default()),
    ];

    for packer in packers {
        let compressed = packer.pack(single_byte).unwrap();
        let decompressed = packer.unpack(&compressed).unwrap();
        assert_eq!(decompressed, single_byte);
    }
}

#[test]
fn test_packer_equality() {
    assert_eq!(Packer::Raw, Packer::Raw);
    assert_eq!(Packer::Gzip(Gzip::Level6), Packer::Gzip(Gzip::Level6));
    assert_eq!(Packer::Xz(Xz::Level1), Packer::Xz(Xz::Level1));

    assert_ne!(Packer::Raw, Packer::Gzip(Gzip::Level6));
    assert_ne!(Packer::Gzip(Gzip::Level1), Packer::Gzip(Gzip::Level9));
    assert_ne!(Packer::Xz(Xz::Level1), Packer::Xz(Xz::Level9));
}

#[test]
fn test_gzip_compression_conversion() {
    let gzip_level = Gzip::Level5;
    let flate_level: flate2::Compression = (&gzip_level).into();
    assert_eq!(flate_level.level(), 5);

    let gzip_best = Gzip::best();
    let flate_best: flate2::Compression = (&gzip_best).into();
    assert_eq!(flate_best.level(), 9);
}

#[test]
fn test_xz_compression_levels() {
    // Test that XZ levels correspond to correct u32 values
    assert_eq!(Xz::Level1 as u32, 1);
    assert_eq!(Xz::Level6 as u32, 6);
    assert_eq!(Xz::Level9 as u32, 9);
}

#[test]
fn test_invalid_compression_data() {
    let invalid_gzip = b"invalid gzip data";
    let invalid_xz = b"invalid xz data";

    let gzip_packer = Packer::Gzip(Gzip::default());
    let xz_packer = Packer::Xz(Xz::default());

    assert!(gzip_packer.unpack(invalid_gzip).is_err());
    assert!(xz_packer.unpack(invalid_xz).is_err());
}

#[test]
fn test_packer_debug_display() {
    let packers = vec![
        Packer::Raw,
        Packer::Gzip(Gzip::Level1),
        Packer::Xz(Xz::Level9),
    ];

    for packer in packers {
        let debug_str = format!("{packer:?}");
        assert!(!debug_str.is_empty());
    }
}