| 1 |
|
| 2 |
|
| 3 |
use crate::constants; |
| 4 |
|
| 5 |
|
| 6 |
|
| 7 |
|
| 8 |
|
| 9 |
|
| 10 |
pub(super) fn build_pagination_range(current_page: u32, total_pages: u32) -> Vec<u32> { |
| 11 |
if total_pages <= constants::PAGINATION_WINDOW_SIZE { |
| 12 |
(1..=total_pages).collect() |
| 13 |
} else { |
| 14 |
let start = current_page.saturating_sub(2).max(1); |
| 15 |
let end = (start + 4).min(total_pages); |
| 16 |
let start = end.saturating_sub(4).max(1); |
| 17 |
(start..=end).collect() |
| 18 |
} |
| 19 |
} |
| 20 |
|
| 21 |
#[cfg(test)] |
| 22 |
mod tests { |
| 23 |
use super::*; |
| 24 |
|
| 25 |
#[test] |
| 26 |
fn pagination_small_total() { |
| 27 |
assert_eq!(build_pagination_range(1, 3), vec![1, 2, 3]); |
| 28 |
assert_eq!(build_pagination_range(2, 5), vec![1, 2, 3, 4, 5]); |
| 29 |
} |
| 30 |
|
| 31 |
#[test] |
| 32 |
fn pagination_large_at_start() { |
| 33 |
assert_eq!(build_pagination_range(1, 20), vec![1, 2, 3, 4, 5]); |
| 34 |
assert_eq!(build_pagination_range(2, 20), vec![1, 2, 3, 4, 5]); |
| 35 |
} |
| 36 |
|
| 37 |
#[test] |
| 38 |
fn pagination_large_at_middle() { |
| 39 |
assert_eq!(build_pagination_range(10, 20), vec![8, 9, 10, 11, 12]); |
| 40 |
} |
| 41 |
|
| 42 |
#[test] |
| 43 |
fn pagination_large_at_end() { |
| 44 |
assert_eq!(build_pagination_range(20, 20), vec![16, 17, 18, 19, 20]); |
| 45 |
assert_eq!(build_pagination_range(19, 20), vec![16, 17, 18, 19, 20]); |
| 46 |
} |
| 47 |
|
| 48 |
#[test] |
| 49 |
fn pagination_zero_pages() { |
| 50 |
assert_eq!(build_pagination_range(1, 0), Vec::<u32>::new()); |
| 51 |
} |
| 52 |
|
| 53 |
#[test] |
| 54 |
fn pagination_single_page() { |
| 55 |
assert_eq!(build_pagination_range(1, 1), vec![1]); |
| 56 |
} |
| 57 |
} |
| 58 |
|