Sebastian Thielrefactor; better tests12d14bf6 years agoHistory
152 lines · 5.4 KB · Rust
RawDownload
mod deflate_stream {    use crate::zlib::stream::DeflateWriter;    use crate::zlib::stream::InflateReader;    use std::io::{Read, Write};     #[test]    fn all_at_once() -> Result<(), Box<dyn std::error::Error>> {        let mut w = DeflateWriter::new(Vec::new());        assert_eq!(w.write(b"hello")?, 5);        w.flush()?;         let out = w.inner;        assert!(out.len() == 12 || out.len() == 13);         assert_deflate_buffer(out, b"hello")    }     fn assert_deflate_buffer(out: Vec<u8>, expected: &[u8]) -> Result<(), Box<dyn std::error::Error>> {        let mut actual = Vec::new();        InflateReader::from_read(out.as_slice()).read_to_end(&mut actual)?;        assert_eq!(actual, expected);        Ok(())    }     #[test]    fn big_file_small_writes() -> Result<(), Box<dyn std::error::Error>> {        let mut w = DeflateWriter::new(Vec::new());        let bytes =            include_bytes!("../../../../tests/fixtures/packs/pack-11fdfa9e156ab73caae3b6da867192221f2089c2.pack");        for chunk in bytes.chunks(2) {            assert_eq!(w.write(chunk)?, chunk.len());        }        w.flush()?;         assert_deflate_buffer(w.inner, bytes)    }     #[test]    fn big_file_a_few_big_writes() -> Result<(), Box<dyn std::error::Error>> {        let mut w = DeflateWriter::new(Vec::new());        let bytes =            include_bytes!("../../../../tests/fixtures/packs/pack-11fdfa9e156ab73caae3b6da867192221f2089c2.pack");        for chunk in bytes.chunks(4096 * 9) {            assert_eq!(w.write(chunk)?, chunk.len());        }        w.flush()?;         assert_deflate_buffer(w.inner, bytes)    }} mod deflate {    use crate::zlib::stream::{deflate::Deflate, Status};    use miniz_oxide::MZFlush;     #[test]    fn compress_all_data_at_once() {        let mut buf = [0u8; 16];        assert_eq!(            Deflate::default()                .compress(b"hello", &mut buf, MZFlush::Finish)                .expect("compression to memory to work"),            Status::StreamEnd        );    }     #[test]    fn output_too_small_try_finish() -> Result<(), Box<dyn std::error::Error>> {        let mut buf = [0u8; 6];        let mut deflate = Deflate::default();        let input = b"hello";        assert_eq!(deflate.compress(input, &mut buf, MZFlush::Finish)?, Status::Ok);        assert_eq!(deflate.total_in, 5);        assert_eq!(deflate.total_out, 6);        assert_eq!(            deflate.compress(&input[deflate.total_in as usize..], &mut buf, MZFlush::Finish)?,            Status::Ok        );        assert_eq!(deflate.total_in, 5);        assert!(deflate.total_out == 13 || deflate.total_out == 12);        assert_eq!(            deflate.compress(&input[deflate.total_in as usize..], &mut buf, MZFlush::Finish)?,            Status::StreamEnd        );        assert!(deflate.total_out == 13 || deflate.total_out == 12);        Ok(())    }     #[test]    fn output_too_small_do_not_try_to_finish() -> Result<(), Box<dyn std::error::Error>> {        let mut buf = [0u8; 6];        let mut deflate = Deflate::default();        let input = b"hellohellohellohellohellohellohellohellhellohellohellohellohellohellohellohellhellohellohellohellohellohellohellohellooohellohellohellohellohellohellohellohello";        assert_eq!(deflate.compress(input, &mut buf, MZFlush::None)?, Status::Ok);        assert_eq!(deflate.total_in, 160);        assert_eq!(deflate.total_out, 0);        assert_eq!(            deflate.compress(&input[deflate.total_in as usize..], &mut buf, MZFlush::None)?,            Status::BufError,            "the output buffer is too small to drop any information"        );        let mut buf = [0u8; 32];        assert_eq!(            deflate.compress(&input[deflate.total_in as usize..], &mut buf, MZFlush::None)?,            Status::BufError,            "after the first buf error, unless providing more input, probably nothing can be done"        );        assert_eq!(deflate.total_out, 0);        assert_eq!(            deflate.compress(&input[deflate.total_in as usize..], &mut buf, MZFlush::Finish)?,            Status::Ok,            "it wrote some data, but not all"        );        assert!(deflate.total_out == 31 || deflate.total_out == 32);        assert_eq!(            deflate.compress(&input[deflate.total_in as usize..], &mut buf, MZFlush::Finish)?,            Status::StreamEnd,        );        assert_eq!(deflate.total_out, 35);        Ok(())    }     #[test]    fn multiple_inputs_sufficient_output() -> Result<(), Box<dyn std::error::Error>> {        let mut buf = [0u8; 32];        let mut deflate = Deflate::default();        let input = b"hello";        let step = 2;        let mut cur = 0;        assert_eq!(            deflate.compress(&input[cur..cur + step], &mut buf, MZFlush::None)?,            Status::Ok        );        assert_eq!(deflate.total_in, 2);        assert_eq!(deflate.total_out, 0);        cur += step;        assert_eq!(            deflate.compress(&input[cur..cur + step], &mut buf, MZFlush::None)?,            Status::Ok        );        assert_eq!(deflate.total_in, 4);        assert_eq!(deflate.total_out, 0);        cur += step;        assert_eq!(            deflate.compress(&input[cur..], &mut buf, MZFlush::Finish)?,            Status::StreamEnd        );        assert_eq!(deflate.total_in, 5);        assert!(deflate.total_out == 13 || deflate.total_out == 12);        Ok(())    }}