diff --git a/src/reader.rs b/src/reader.rs index e69de29..0f8aab2 100644 --- a/src/reader.rs +++ b/src/reader.rs @@ -0,0 +1,64 @@ +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]); + } +}