use crate::{error::ReaclibError, Format, Iter};
use std::io::{self, Cursor};
#[test]
fn empty() {
let reader = Cursor::new(include_str!("v1/empty"));
let mut iter = Iter::new(reader, Format::Reaclib1);
assert!(iter.next().is_none());
}
#[test]
fn single() {
let reader = Cursor::new(include_str!("v1/single"));
let mut iter = Iter::new(reader, Format::Reaclib1);
assert!(iter.next().is_some());
assert!(iter.next().is_none());
}
#[test]
fn chapter_unset() {
let reader = Cursor::new(include_str!("v1/chapter_unset"));
let mut iter = Iter::new(reader, Format::Reaclib1);
assert_eq!(iter.next().unwrap(), Err(ReaclibError::ChapterUnset));
assert!(iter.next().is_none());
}
#[test]
fn multi_chapter() {
let reader = Cursor::new(include_str!("v1/multi_chapter"));
let mut iter = Iter::new(reader, Format::Reaclib1);
let set = iter.next().unwrap().unwrap();
assert_eq!(set.reactants.len(), 1);
assert_eq!(set.products.len(), 4);
let set = iter.next().unwrap().unwrap();
assert_eq!(set.reactants.len(), 1);
assert_eq!(set.products.len(), 4);
let set = iter.next().unwrap().unwrap();
assert_eq!(set.reactants.len(), 1);
assert_eq!(set.products.len(), 4);
let set = iter.next().unwrap().unwrap();
assert_eq!(set.reactants.len(), 1);
assert_eq!(set.products.len(), 1);
let set = iter.next().unwrap().unwrap();
assert_eq!(set.reactants.len(), 2);
assert_eq!(set.products.len(), 4);
let set = iter.next().unwrap().unwrap();
assert_eq!(set.reactants.len(), 2);
assert_eq!(set.products.len(), 4);
assert!(iter.next().is_none());
}
#[test]
fn unfinished_line() {
let reader = Cursor::new(include_str!("v1/unfinished_line_1"));
let mut iter = Iter::new(reader, Format::Reaclib1);
assert!(iter.next().unwrap().is_ok());
assert!(iter.next().is_none());
let reader = Cursor::new(include_str!("v1/unfinished_line_2"));
let mut iter = Iter::new(reader, Format::Reaclib1);
assert!(iter.next().unwrap().is_ok());
assert!(iter.next().is_none());
let reader = Cursor::new(include_str!("v1/unfinished_line_3"));
let mut iter = Iter::new(reader, Format::Reaclib1);
assert!(iter.next().unwrap().is_ok());
assert!(iter.next().is_none());
let reader = Cursor::new(include_str!("v1/unfinished_line_4"));
let mut iter = Iter::new(reader, Format::Reaclib1);
assert_eq!(iter.next().unwrap(), Err(ReaclibError::TooShortLine));
assert!(iter.next().is_none());
let reader = Cursor::new(include_str!("v1/unfinished_line_5"));
let mut iter = Iter::new(reader, Format::Reaclib1);
assert_eq!(iter.next().unwrap(), Err(ReaclibError::TooShortLine));
assert!(iter.next().is_none());
let reader = Cursor::new(include_str!("v1/unfinished_line_6"));
let mut iter = Iter::new(reader, Format::Reaclib1);
assert!(iter.next().unwrap().is_ok());
assert!(iter.next().is_none());
}
#[test]
fn too_few_lines() {
let reader = Cursor::new(include_str!("v1/too_few_lines"));
let mut iter = Iter::new(reader, Format::Reaclib1);
assert!(iter.next().unwrap().is_ok());
assert_eq!(iter.next().unwrap(), Err(ReaclibError::TooFewLines));
assert!(iter.next().is_none());
}
#[test]
fn str_index() {
let reader = Cursor::new(include_str!("v1/str_index_1"));
let mut iter = Iter::new(reader, Format::Reaclib1);
assert_eq!(iter.next().unwrap(), Err(ReaclibError::StrIndex));
assert!(iter.next().is_none());
let reader = Cursor::new(include_str!("v1/str_index_2"));
let mut iter = Iter::new(reader, Format::Reaclib1);
assert!(matches!(
iter.next().unwrap(),
Err(ReaclibError::ParseFloat(_))
));
assert!(iter.next().is_none());
}
#[test]
fn non_utf8() {
let reader = Cursor::new(include_bytes!("v1/non_utf8"));
let mut iter = Iter::new(reader, Format::Reaclib1);
assert_eq!(
iter.next().unwrap(),
Err(ReaclibError::Io(io::ErrorKind::InvalidData))
);
}
#[test]
fn unknown_chapter() {
let reader = Cursor::new(include_str!("v1/unknown_chapter"));
let mut iter = Iter::new(reader, Format::Reaclib1);
assert!(iter.next().unwrap().is_ok());
assert_eq!(iter.next().unwrap(), Err(ReaclibError::UnknownChapter(12)));
}
#[test]
fn unknown_resonance() {
use crate::Resonance as R;
let reader = Cursor::new(include_str!("v1/unknown_resonance"));
let mut iter = Iter::new(reader, Format::Reaclib1);
assert_eq!(iter.next().unwrap().unwrap().resonance, R::Resonant);
assert_eq!(iter.next().unwrap().unwrap().resonance, R::NonResonant);
assert_eq!(iter.next().unwrap().unwrap().resonance, R::NonResonant);
assert_eq!(iter.next().unwrap().unwrap().resonance, R::Weak);
assert_eq!(iter.next().unwrap().unwrap().resonance, R::S);
assert!(matches!(
iter.next().unwrap(),
Err(ReaclibError::UnknownResonance(_))
));
}
#[test]
fn io_error() {
use std::{fs::File, io::BufReader};
let reader = File::open("src").unwrap();
let reader = BufReader::new(reader);
let mut iter = Iter::new(reader, Format::Reaclib1);
assert!(matches!(iter.next().unwrap(), Err(ReaclibError::Io(_))));
}
#[test]
fn parse_error() {
let reader = Cursor::new(include_str!("v1/parse_int_error"));
let mut iter = Iter::new(reader, Format::Reaclib1);
assert!(matches!(
iter.next().unwrap(),
Err(ReaclibError::ParseInt(_))
));
let reader = Cursor::new(include_str!("v1/parse_float_error_1"));
let mut iter = Iter::new(reader, Format::Reaclib1);
assert!(matches!(
iter.next().unwrap(),
Err(ReaclibError::ParseFloat(_))
));
let reader = Cursor::new(include_str!("v1/parse_float_error_2"));
let mut iter = Iter::new(reader, Format::Reaclib1);
assert!(matches!(
iter.next().unwrap(),
Err(ReaclibError::ParseFloat(_))
));
}
#[test]
fn multi() {
let reader = Cursor::new(include_str!("v1/multi"));
let iter = Iter::new(reader, Format::Reaclib1);
assert!(matches!(iter.collect::<Result<Vec<_>, _>>(), Ok(_)));
}
#[test]
fn multi_v2() {
let reader = Cursor::new(include_str!("v2/multi"));
let iter = Iter::new(reader, Format::Reaclib1);
assert!(matches!(iter.collect::<Result<Vec<_>, _>>(), Err(_)));
}