Implement pagination algorithm with TDD

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.
This commit is contained in:
Developer
2026-05-13 23:24:25 +08:00
parent 79d2fcd75c
commit 46fe8c4da5

View File

@@ -0,0 +1,64 @@
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]);
}
}