ensured_bufreader 0.2.0

A Bufreader ensures N bytes in buffer.
Documentation
use std::io::{BufRead, ErrorKind, Read};

use ensured_bufreader::{EnsuredBufReader, DEFAULT_ENSURED_BYTES};

#[test]
#[should_panic]
fn capacity_is_smaller_than_ensure_not_allowed() {
    let r: &[u8] = &[];
    let _ = EnsuredBufReader::with_capacity_and_ensured_size(100, 101, r);
}

#[test]
#[should_panic]
fn ensure_is_0_not_allowed_with_capacity_and_ensure() {
    let r: &[u8] = &[];
    let _ = EnsuredBufReader::with_capacity_and_ensured_size(1024, 0, r);
}

#[test]
fn read_long() {
    let short = "aÀあ\u{1F600}".as_bytes();
    let mut input = Vec::with_capacity(short.len() * 32 * 1024);
    for _ in 0..32 * 1024 {
        input.extend_from_slice(short);
    }

    let mut r = EnsuredBufReader::new(input.as_slice());

    let mut read_bytes = Vec::<u8>::with_capacity(input.len());
    let mut read_buf = [0u8; 256];

    loop {
        let n = r.read(&mut read_buf).unwrap();

        let bs = &read_buf[..n];
        read_bytes.extend_from_slice(bs);

        if n < DEFAULT_ENSURED_BYTES {
            break;
        }
    }

    assert_eq!(
        input,
        read_bytes,
        "with capacity ={}, ensure = {}",
        r.get_capacity(),
        r.get_ensured_size()
    );
}

#[test]
fn fill_buf_short() {
    let input = "aÀあ\u{1F600}".as_bytes();

    let mut r = EnsuredBufReader::new(input);
    let mut read_bytes = Vec::<u8>::with_capacity(input.len());

    loop {
        let buf = r.fill_buf().unwrap();
        read_bytes.extend_from_slice(buf);
        let n = buf.len();
        r.consume(n);

        if n < DEFAULT_ENSURED_BYTES {
            break;
        }
    }

    assert_eq!(
        input,
        read_bytes.as_slice(),
        "with capacity ={}, ensure = {}",
        r.get_capacity(),
        r.get_ensured_size()
    );
}

#[test]
fn fill_buf_long() {
    let short = "aÀあ\u{1F600}".as_bytes();
    let mut input = Vec::with_capacity(short.len() * 32 * 1024);
    for _ in 0..32 * 1024 {
        input.extend_from_slice(short);
    }

    let mut r = EnsuredBufReader::new(input.as_slice());

    let mut read_bytes = Vec::<u8>::with_capacity(input.len());

    loop {
        let buf = r.fill_buf().unwrap();
        read_bytes.extend_from_slice(buf);
        let n = buf.len();
        r.consume(n);

        if n < DEFAULT_ENSURED_BYTES {
            break;
        }
    }

    assert_eq!(
        input,
        read_bytes,
        "with capacity ={}, ensure = {}",
        r.get_capacity(),
        r.get_ensured_size()
    );
}

#[test]
fn works_with_given_buffer() {
    let short = "aÀあ\u{1F600}".as_bytes();
    let mut input = Vec::with_capacity(short.len() * 32 * 1024);
    for _ in 0..32 * 1024 {
        input.extend_from_slice(short);
    }

    let mut buf = [0u8; 2 * DEFAULT_ENSURED_BYTES];
    let mut r = EnsuredBufReader::from_mut_ref(&mut buf, input.as_slice());

    let mut read_bytes = Vec::<u8>::with_capacity(input.len());

    loop {
        let buf = r.fill_buf().unwrap();
        read_bytes.extend_from_slice(buf);
        let n = buf.len();
        r.consume(n);

        if n < DEFAULT_ENSURED_BYTES {
            break;
        }
    }

    assert_eq!(
        input,
        read_bytes,
        "with capacity ={}, ensure = {}",
        r.get_capacity(),
        r.get_ensured_size()
    );
}

#[test]
fn fill_buf_to_expected_size_returns_error_when_expected_size_is_too_large() {
    let short = "aÀあ\u{1F600}".as_bytes();
    let mut input = Vec::with_capacity(short.len() * 32 * 1024);
    for _ in 0..256 {
        input.extend_from_slice(short);
    }

    let mut r = EnsuredBufReader::with_capacity_and_ensured_size(512, 1, input.as_slice());

    let err = r.fill_buf_to_expected_size(513).unwrap_err();
    assert_eq!(err.kind(), ErrorKind::InvalidInput);
}