iof 0.5.0

Read from and write data to console or file in simple formats.
Documentation
use dimension::Dimension;
use fmt::Default;
use iof::*;
use std::io::Cursor;

#[test]
fn check_separator() {
    assert_eq!(<Vec<u32> as Dimension>::get_default_separator(), " ");
    assert_eq!(<Vec<i32> as Dimension>::get_default_separator(), " ");
    assert_eq!(<Vec<f64> as Dimension>::get_default_separator(), " ");
    assert_eq!(<Mat<u32> as Dimension>::get_default_separator(), "\n");
    assert_eq!(<Mat<i32> as Dimension>::get_default_separator(), "\n");
    assert_eq!(<Mat<f64> as Dimension>::get_default_separator(), "\n");
}

#[test]
#[should_panic = "not implemented: Default separator for dimension 0 is not supported."]
fn check_separator_scalar() {
    let _ = <f64 as Dimension>::get_default_separator();
}

#[test]
#[should_panic = "not implemented: Default separator for dimension 3 is not supported."]
fn check_separator_3_dim_tensor() {
    let _ = <Vec<Vec<Vec<f64>>> as Dimension>::get_default_separator();
}

#[test]
fn try_read() {
    for (s, i) in [
        ("0", 0u8),
        ("1", 1u8),
        ("2", 2u8),
        ("+2", 2u8),
        ("99", 99u8),
    ] {
        let mut reader = InputStream::new(s.as_bytes());

        let a: u32 = unwrap!(reader.try_read());
        assert_eq!(a, i.into());

        assert_eq!(reader.get_cur_line(), "");

        let mut reader = InputStream::new(s.as_bytes());

        let a: i32 = unwrap!(reader.try_read());
        assert_eq!(a, i.into());

        assert_eq!(reader.get_cur_line(), "");
    }
}

#[test]
#[cfg(feature = "c-compatible")]
fn try_read_truncated() {
    for (s, i, r) in [("0+", 0u8, "+"), ("10+", 10u8, "+")] {
        let mut reader = InputStream::new(s.as_bytes());

        let a: u32 = unwrap!(reader.try_read());
        assert_eq!(a, i.into());

        assert_eq!(reader.get_cur_line(), r);

        let mut reader = InputStream::new(s.as_bytes());

        let a: i32 = unwrap!(reader.try_read());
        assert_eq!(a, i.into());

        assert_eq!(reader.get_cur_line(), r);
    }
}

#[test]
fn try_read_error() {
    for s in ["+", "++", "x", ".", "", " "] {
        let reader = Cursor::new(s.as_bytes());
        let mut reader = InputStream::new(reader);

        let a: Result<u32, _> = reader.try_read();
        assert!(a.is_err());
        let a: Result<i32, _> = reader.try_read();
        assert!(a.is_err());
    }
}

#[test]
fn try_read_single_3() {
    let reader = Cursor::new("1 2 3".as_bytes());
    let mut reader = InputStream::new(reader);

    let a: u32 = reader.try_read_one().unwrap();
    assert_eq!(a, 1);

    let b: u32 = reader.try_read_one().unwrap();
    assert_eq!(b, 2);

    let c: u32 = reader.try_read_one().unwrap();
    assert_eq!(c, 3);

    assert!(<u32>::try_read_one_from(&mut reader, Default::new()).is_err());
}

#[test]
fn read_single_3() {
    let reader = Cursor::new("1 2 3".as_bytes());
    let mut reader = InputStream::new(reader);

    let a: u32 = reader.read_one();
    assert_eq!(a, 1);

    let b: u32 = reader.read_one();
    assert_eq!(b, 2);

    let c: u32 = reader.read_one();
    assert_eq!(c, 3);

    assert!(<u32>::try_read_from(&mut reader, Default::new()).is_err());
}

#[test]
fn read_3() {
    let reader = Cursor::new("1 2 3".as_bytes());
    let mut reader = InputStream::new(reader);

    let a: u32 = reader.read();
    assert_eq!(a, 1);

    let b: u32 = reader.read();
    assert_eq!(b, 2);

    let c: u32 = reader.read();
    assert_eq!(c, 3);

    assert!(<u32>::try_read_from(&mut reader, Default::new()).is_err());
}

#[test]
fn read_char_3() {
    let reader = Cursor::new("123".as_bytes());
    let mut reader = InputStream::new(reader);

    let a: u32 = reader.read_in_char();
    assert_eq!(a, 1);

    let b: u32 = reader.read_in_char();
    assert_eq!(b, 2);

    let c: u32 = reader.read_in_char();
    assert_eq!(c, 3);

    assert!(<u32>::try_read_in_char_from(&mut reader, Default::new()).is_err());
}

#[test]
fn read_char_in_3_lines() {
    let reader = Cursor::new("\n1\n2\n3".as_bytes());
    let mut reader = InputStream::new(reader);

    let a: u32 = reader.read_in_char();
    assert_eq!(a, 1);

    let b: u32 = reader.read_in_char();
    assert_eq!(b, 2);

    let c: u32 = reader.read_in_char();
    assert_eq!(c, 3);

    assert!(<u32>::try_read_in_char_from(&mut reader, Default::new()).is_err());
}

#[test]
fn read_one_then_all_in_line() {
    let reader = Cursor::new("1\n2 3 4\n 5 6 7".as_bytes());
    let mut reader = InputStream::new(reader);

    let a: u32 = reader.read_one();
    assert_eq!(a, 1);

    let b: Vec<u32> = reader.read_any_in_line();
    assert_eq!(b, []);

    let c: Vec<u32> = reader.read_any_in_line();
    assert_eq!(c, [2, 3, 4]);

    let d: Vec<u32> = reader.read_any_in_line();
    assert_eq!(d, [5, 6, 7]);

    assert!(<u32>::try_read_any_in_line_from(&mut reader, Default::new()).is_err());
}

#[test]
fn read_one_then_all_in_line_some() {
    let reader = Cursor::new("1\n2 3 4\n 5 6 7".as_bytes());
    let mut reader = InputStream::new(reader);

    let a: u32 = reader.read_one();
    assert_eq!(a, 1);

    let b: Vec<u32> = reader.read_some_in_line();
    assert_eq!(b, [2, 3, 4]);

    let c: Vec<u32> = reader.read_some_in_line();
    assert_eq!(c, [5, 6, 7]);

    assert!(<u32>::try_read_some_in_line_from(&mut reader, Default::new()).is_err());
}
#[test]
fn read_all() {
    let reader = Cursor::new("1 2\n 3 4\n 5 6 \n7".as_bytes());
    let mut reader = InputStream::new(reader);

    let a: Vec<u32> = reader.read_all();
    assert_eq!(a, [1, 2, 3, 4, 5, 6, 7]);

    assert!(<u32>::try_read_one_from(&mut reader, Default::new()).is_err());
}

#[test]
#[should_panic = "expect more characters before EOF"]
fn read_char_empty() {
    let reader = Cursor::new(" \n\n \n  \n ".as_bytes());
    let mut reader = InputStream::new(reader);

    let _: u32 = reader.read_in_char();
}

#[test]
#[cfg_attr(
    feature = "c-compatible",
    should_panic = "found unexpected character at the end of the string \"-\" during converting it to a value of \"u32\""
)]
#[cfg_attr(
    not(feature = "c-compatible"),
    should_panic = "error during converting a string \"-1\" to a value of `u32`: invalid digit found in string"
)]
fn read_sign_error() {
    let reader = Cursor::new("-1".as_bytes());
    let mut reader = InputStream::new(reader);

    let _: u32 = reader.read();
}

#[test]
#[cfg_attr(
    feature = "c-compatible",
    should_panic = "found unexpected character at the end of the string \"-\" during converting it to a value of \"u32\""
)]
#[cfg_attr(
    not(feature = "c-compatible"),
    should_panic = "error during converting a string \"-1\" to a value of `u32`: invalid digit found in string"
)]
fn try_read_sign_error() {
    let reader = Cursor::new("-1".as_bytes());
    let mut reader = InputStream::new(reader);

    let _: u32 = unwrap!(reader.try_read());
}

#[test]
#[should_panic = "expect more characters before EOF"]
fn read_empty() {
    let reader = Cursor::new("".as_bytes());
    let mut reader = InputStream::new(reader);

    let _: u32 = reader.read();
}

#[test]
#[should_panic = "expect more characters before EOF"]
fn try_read_empty() {
    let reader = Cursor::new("".as_bytes());
    let mut reader = InputStream::new(reader);

    let _: u32 = unwrap!(reader.try_read());
}

#[test]
#[should_panic = "error during converting a string \"1 2 3\" to a value of `u32`: invalid digit found in string"]
fn try_read_line_too_much() {
    let reader = Cursor::new("1 2 3".as_bytes());
    let mut reader = InputStream::new(reader);

    let _: u32 = unwrap!(reader.try_read_in_line_some_trimmed());
}

#[test]
#[should_panic = "error during converting a string \"-\" to a value of `i32`: invalid digit found in string"]
fn try_read_char_only_sign() {
    let reader = Cursor::new("-1".as_bytes());
    let mut reader = InputStream::new(reader);

    let _: i32 = unwrap!(reader.try_read_in_char());
}

#[test]
fn try_write_one_into() {
    let mut s = Vec::new();
    42.try_write_into(&mut s).unwrap();
    let s = String::from_utf8(s).unwrap();
    assert_eq!(s, "42");
}