pub fn calculate_pages(text: &str, chars_per_page: usize) -> Vec { let mut pages = Vec::new(); pages.push(0); if text.is_empty() || chars_per_page == 0 { return pages; } let total_chars = text.chars().count(); if total_chars <= chars_per_page { pages.push(total_chars); return pages; } let mut pos = 0; while pos < total_chars { pos = (pos + chars_per_page).min(total_chars); pages.push(pos); } pages } #[cfg(test)] mod tests { use super::*; #[test] fn test_pagination_empty() { let pages = calculate_pages("", 100); assert_eq!(pages, vec![0]); } #[test] fn test_pagination_shorter_than_page() { let pages = calculate_pages("Hello World", 100); assert_eq!(pages, vec![0, 11]); } #[test] fn test_pagination_exact_fit() { let pages = calculate_pages("ABCD", 4); assert_eq!(pages, vec![0, 4]); } #[test] fn test_pagination_multiple_pages() { let text = "A".repeat(100); let pages = calculate_pages(&text, 30); assert_eq!(pages, vec![0, 30, 60, 90, 100]); } #[test] fn test_pagination_single_char() { let pages = calculate_pages("A", 1); assert_eq!(pages, vec![0, 1]); } #[test] fn test_pagination_zero_chars_per_page() { let pages = calculate_pages("test", 0); assert_eq!(pages, vec![0]); } }