Add calculate_pages function that splits text into page boundaries by character offset. Includes tests for empty, single-page, multi-page, and zero-chars-per-page edge cases.
65 lines
1.4 KiB
Rust
65 lines
1.4 KiB
Rust
pub fn calculate_pages(text: &str, chars_per_page: usize) -> Vec<usize> {
|
|
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]);
|
|
}
|
|
}
|