mod common;
use std::io;
use common::{collect_multi, collect_multi_from, golden_digits, one_million_path, TempYcd};
use ycd_reader::YcdMultiFileStream;
#[test]
fn multi_new_from_position_1_matches_new() {
let paths: Vec<String> = (0..3).map(one_million_path).collect();
let from_new = collect_multi(&paths, 1000).unwrap();
let from_new_from = collect_multi_from(&paths, 1000, 1).unwrap();
assert_eq!(from_new, from_new_from);
}
#[test]
fn multi_new_from_mid_first_file() {
let golden = golden_digits();
let paths: Vec<String> = (0..3).map(one_million_path).collect();
let start: i64 = 500_123;
let result = collect_multi_from(&paths, 1000, start).unwrap();
let expected = &golden[(start as usize - 1)..3_000_000];
assert_eq!(result, expected);
}
#[test]
fn multi_new_from_at_file_boundary() {
let golden = golden_digits();
let paths: Vec<String> = (0..3).map(one_million_path).collect();
let start: i64 = 1_000_001; let result = collect_multi_from(&paths, 1000, start).unwrap();
let expected = &golden[(start as usize - 1)..3_000_000];
assert_eq!(result, expected);
}
#[test]
fn multi_new_from_mid_second_file() {
let golden = golden_digits();
let paths: Vec<String> = (0..3).map(one_million_path).collect();
let start: i64 = 1_500_000;
let result = collect_multi_from(&paths, 1000, start).unwrap();
let expected = &golden[(start as usize - 1)..3_000_000];
assert_eq!(result, expected);
}
#[test]
fn multi_new_from_last_file_start() {
let golden = golden_digits();
let paths: Vec<String> = (0..3).map(one_million_path).collect();
let start: i64 = 2_000_001;
let result = collect_multi_from(&paths, 1000, start).unwrap();
let expected = &golden[(start as usize - 1)..3_000_000];
assert_eq!(result, expected);
}
#[test]
fn multi_new_from_last_digit() {
let golden = golden_digits();
let paths: Vec<String> = (0..3).map(one_million_path).collect();
let start: i64 = 3_000_000;
let result = collect_multi_from(&paths, 19, start).unwrap();
assert_eq!(result.len(), 1);
assert_eq!(result, &golden[2_999_999..3_000_000]);
}
#[test]
fn multi_new_from_crossing_file_boundary() {
let golden = golden_digits();
let paths: Vec<String> = (0..3).map(one_million_path).collect();
let start: i64 = 999_700; let result = collect_multi_from(&paths, 1000, start).unwrap();
let expected = &golden[(start as usize - 1)..3_000_000];
assert_eq!(result, expected);
}
#[test]
fn multi_new_from_generated_files() {
let f0 = TempYcd::valid("1234567890123456789", 19, 0, "\n", "").unwrap();
let f1 = TempYcd::valid("2345678901234567890", 19, 1, "\n", "").unwrap();
let f2 = TempYcd::valid("3456789012345678901", 19, 2, "\n", "").unwrap();
let all = "123456789012345678923456789012345678903456789012345678901";
let result = collect_multi_from(&[&f0.path, &f1.path, &f2.path], 19, 10).unwrap();
assert_eq!(result, &all[9..]);
let result = collect_multi_from(&[&f0.path, &f1.path, &f2.path], 19, 20).unwrap();
assert_eq!(result, &all[19..]);
let result = collect_multi_from(&[&f0.path, &f1.path, &f2.path], 19, 30).unwrap();
assert_eq!(result, &all[29..]);
}
#[test]
fn multi_new_from_errors() {
let paths: Vec<String> = (0..3).map(one_million_path).collect();
let empty: [&str; 0] = [];
assert_eq!(
YcdMultiFileStream::new_from(&empty, 19, 1)
.unwrap_err()
.kind(),
io::ErrorKind::InvalidInput
);
assert_eq!(
YcdMultiFileStream::new_from(&paths, 19, 0)
.unwrap_err()
.kind(),
io::ErrorKind::InvalidInput
);
assert_eq!(
YcdMultiFileStream::new_from(&paths, 19, -1)
.unwrap_err()
.kind(),
io::ErrorKind::InvalidInput
);
assert_eq!(
YcdMultiFileStream::new_from(&paths, 19, 3_000_001)
.unwrap_err()
.kind(),
io::ErrorKind::InvalidInput
);
assert_eq!(
YcdMultiFileStream::new_from(&paths, 1, 1)
.unwrap_err()
.kind(),
io::ErrorKind::InvalidInput
);
let f0 = TempYcd::valid("1234567890123456789", 19, 0, "\n", "").unwrap();
let f2 = TempYcd::valid("1234567890123456789", 19, 2, "\n", "").unwrap();
assert_eq!(
YcdMultiFileStream::new_from(&[&f0.path, &f2.path], 19, 1)
.unwrap_err()
.kind(),
io::ErrorKind::InvalidInput
);
}