use crate::brain::tools::doc_parser::parse_page_range;
#[test]
fn single_page_number() {
assert_eq!(parse_page_range("5"), vec![5]);
}
#[test]
fn simple_range() {
assert_eq!(parse_page_range("1-3"), vec![1, 2, 3]);
}
#[test]
fn large_range_spans_correctly() {
let result = parse_page_range("1-30");
assert_eq!(result.len(), 30);
assert_eq!(result.first(), Some(&1));
assert_eq!(result.last(), Some(&30));
}
#[test]
fn comma_separated_singles() {
assert_eq!(parse_page_range("1,3,5"), vec![1, 3, 5]);
}
#[test]
fn mixed_singles_and_ranges() {
assert_eq!(
parse_page_range("5,7,10-15"),
vec![5, 7, 10, 11, 12, 13, 14, 15]
);
}
#[test]
fn whitespace_after_commas_is_ok() {
assert_eq!(parse_page_range("1, 2, 3"), vec![1, 2, 3]);
}
#[test]
fn whitespace_only_separator() {
assert_eq!(parse_page_range("1 2 3"), vec![1, 2, 3]);
}
#[test]
fn whitespace_around_range_dash() {
assert_eq!(parse_page_range("1 - 5"), vec![1, 2, 3, 4, 5]);
}
#[test]
fn duplicate_pages_are_deduped() {
assert_eq!(parse_page_range("1,1,2,2,3"), vec![1, 2, 3]);
}
#[test]
fn overlapping_ranges_are_deduped() {
assert_eq!(parse_page_range("1-3,2-4"), vec![1, 2, 3, 4]);
}
#[test]
fn output_is_sorted() {
assert_eq!(parse_page_range("5,1,3,2,4"), vec![1, 2, 3, 4, 5]);
}
#[test]
fn ranges_combined_with_singles_sort() {
assert_eq!(parse_page_range("10-12,1,5"), vec![1, 5, 10, 11, 12]);
}
#[test]
fn empty_string_returns_empty() {
assert_eq!(parse_page_range(""), Vec::<usize>::new());
}
#[test]
fn only_whitespace_returns_empty() {
assert_eq!(parse_page_range(" "), Vec::<usize>::new());
}
#[test]
fn only_commas_returns_empty() {
assert_eq!(parse_page_range(",,,"), Vec::<usize>::new());
}
#[test]
fn page_zero_is_rejected() {
assert_eq!(parse_page_range("0"), Vec::<usize>::new());
assert_eq!(parse_page_range("0,1"), vec![1]);
assert_eq!(parse_page_range("0-5"), Vec::<usize>::new());
}
#[test]
fn reversed_range_is_rejected() {
assert_eq!(parse_page_range("5-3"), Vec::<usize>::new());
}
#[test]
fn reversed_range_does_not_taint_valid_neighbours() {
assert_eq!(parse_page_range("1-3,5-3,7"), vec![1, 2, 3, 7]);
}
#[test]
fn non_numeric_tokens_are_dropped() {
assert_eq!(parse_page_range("abc"), Vec::<usize>::new());
assert_eq!(parse_page_range("1,abc,2"), vec![1, 2]);
assert_eq!(parse_page_range("first-third"), Vec::<usize>::new());
}
#[test]
fn negative_numbers_are_dropped() {
assert_eq!(parse_page_range("-5"), Vec::<usize>::new());
assert_eq!(parse_page_range("-1,2,3"), vec![2, 3]);
}
#[test]
fn malformed_range_with_one_side_missing() {
assert_eq!(parse_page_range("5-"), Vec::<usize>::new());
assert_eq!(parse_page_range("-5"), Vec::<usize>::new());
}
#[test]
fn single_page_range() {
assert_eq!(parse_page_range("7-7"), vec![7]);
}
#[test]
fn very_large_page_number() {
assert_eq!(parse_page_range("99999"), vec![99999]);
assert_eq!(parse_page_range("99998-99999"), vec![99998, 99999]);
}
#[test]
fn realistic_agent_input_pages_31_to_60_after_truncation() {
let result = parse_page_range("31-60");
assert_eq!(result.len(), 30);
assert_eq!(result[0], 31);
assert_eq!(result[29], 60);
}
#[test]
fn realistic_agent_input_with_summary_pages() {
assert_eq!(parse_page_range("1-3,32"), vec![1, 2, 3, 32]);
}