charred 2.2.0

charred char checking
Documentation
use crate::error::{TapeError, TapeResult};
use crate::input_reader::InputReader;
use std::io::Cursor;

fn get_reader() -> InputReader {
    let data = "ABCDEFG HIJKLMNOP 12345567890\nSecond Line\n\n";
    InputReader::new(Cursor::new(data))
}

#[tokio::test]
async fn it_peeks() {
    let mut reader = get_reader();
    assert_eq!(reader.peek().await.unwrap(), 'A');
    assert_eq!(reader.peek().await.unwrap(), 'A');
    assert_eq!(reader.peek().await.unwrap(), 'A');
}

#[tokio::test]
async fn it_reads_the_previous() {
    let mut reader = get_reader();
    assert!(reader.previous().await.is_none());
    reader.consume().await.unwrap();
    assert_eq!(reader.previous().await.unwrap(), 'A');
    assert_eq!(reader.previous().await.unwrap(), 'A');
    reader.consume().await.unwrap();
    assert_eq!(reader.previous().await.unwrap(), 'B');
}

#[tokio::test]
async fn it_consumes() {
    let mut reader = get_reader();
    assert_eq!(reader.consume().await.unwrap(), 'A');
    assert_eq!(reader.consume().await.unwrap(), 'B');
    assert_eq!(reader.consume().await.unwrap(), 'C');
}

#[tokio::test]
async fn it_checks_for_eof() {
    let mut reader = get_reader();
    assert!(!is_eof(reader.seek_to(29).await));
    assert!(!reader.check_eof().await);
    assert!(!is_eof(reader.seek_to(47).await));
    assert!(is_eof(reader.consume().await.map(|_| ())));
    assert!(reader.check_eof().await);
}

fn is_eof(result: TapeResult<()>) -> bool {
    match result {
        Err(TapeError::EOF) => true,
        _ => false,
    }
}