import test from 'node:test' import assert from 'node:assert/strict' import { readSource } from './helpers.ts' import { clampPage, isPageOutOfRange, totalPageCount } from '../src/pages/account/user-pagination.ts' test('test_task_044_user_pagination_normal_primary_path', () => { // 正常主路径:30 条 / 每页 15 → 2 页。 assert.equal(totalPageCount(30, 15), 2) }) test('test_task_044_user_pagination_normal_variant_input', () => { // 正常变体:非整倍总数向上取整;最后一页在界内。 assert.equal(totalPageCount(31, 15), 3) assert.equal(clampPage(2, 31, 15), 2) }) test('test_task_044_user_pagination_normal_repeated_operation_is_idempotent', () => { // 正常重复:纯函数结果稳定。 assert.equal(totalPageCount(50, 10), totalPageCount(50, 10)) assert.equal(clampPage(9, 50, 10), 5) }) test('test_task_044_user_pagination_boundary_empty_input', () => { // 边界空值:无数据时总页数为 0,仍允许第 1 页(空态)。 assert.equal(totalPageCount(0, 15), 0) assert.equal(clampPage(1, 0, 15), 1) assert.equal(clampPage(3, 0, 15), 1) }) test('test_task_044_user_pagination_boundary_single_item', () => { // 边界单元素:1 条 / 每页 15 → 1 页。 assert.equal(totalPageCount(1, 15), 1) assert.equal(clampPage(5, 1, 15), 1) }) test('test_task_044_user_pagination_boundary_limit_or_missing_field', () => { // 边界上限/越界请求:请求页超过末页被钳到末页。 assert.equal(clampPage(99, 30, 15), 2) assert.equal(isPageOutOfRange(3, 30, 15), true) assert.equal(isPageOutOfRange(2, 30, 15), false) }) test('test_task_044_user_pagination_invalid_input_rejected', () => { // 异常输入:非法数字/负页不抛错,按首页或末页安全处理。 assert.equal(clampPage(-5, 30, 15), 1) assert.equal(clampPage(Number.NaN, 30, 15), 1) assert.equal(isPageOutOfRange(Number.NaN, 30, 15), false) }) test('test_task_044_user_pagination_dependency_failure_returns_actionable_message', () => { // 依赖失败:删除/加载后若页码越界,页面按末页重新加载,不落在空列表。 const page = readSource('src/pages/account/UsersPage.vue') assert.match(page, /user-pagination/, '页面复用分页边界纯函数') assert.match(page, /filters\.page\s*=\s*last|totalPageCount/, '加载后对越界页码回钳') const mod = readSource('src/pages/account/user-pagination.ts') assert.match(mod, /export function totalPageCount/) assert.match(mod, /export function clampPage/) })