import { describe, expect, it } from 'vitest'; import { shiftAnchor, periodRange, isoWeekNumber } from '../src/domain/periodNav'; describe('shiftAnchor 周期导航', () => { it('周:±7 天', () => { expect(shiftAnchor('2026-07-21', 'weekly', 1)).toBe('2026-07-28'); expect(shiftAnchor('2026-07-21', 'weekly', -1)).toBe('2026-07-14'); }); it('月:月末回退钳制(1月31日 → 2月28日)', () => { expect(shiftAnchor('2026-01-31', 'monthly', 1)).toBe('2026-02-28'); expect(shiftAnchor('2026-03-31', 'monthly', -1)).toBe('2026-02-28'); }); it('月:跨年', () => { expect(shiftAnchor('2026-12-15', 'monthly', 1)).toBe('2027-01-15'); expect(shiftAnchor('2026-01-15', 'monthly', -1)).toBe('2025-12-15'); }); it('年:±1 年', () => { expect(shiftAnchor('2026-07-21', 'annual', 1)).toBe('2027-07-21'); expect(shiftAnchor('2026-07-21', 'annual', -1)).toBe('2025-07-21'); }); it('多步 delta', () => { expect(shiftAnchor('2026-07-21', 'monthly', 3)).toBe('2026-10-21'); expect(shiftAnchor('2026-07-21', 'weekly', -2)).toBe('2026-07-07'); }); }); describe('periodRange 周期范围', () => { it('周:周一起周日止(周二 anchor)', () => { expect(periodRange('2026-07-21', 'weekly')).toEqual({ start: '2026-07-20', end: '2026-07-26' }); }); it('周:周日 anchor 属于本周(周一开头)', () => { expect(periodRange('2026-07-26', 'weekly')).toEqual({ start: '2026-07-20', end: '2026-07-26' }); }); it('月:整月', () => { expect(periodRange('2026-02-10', 'monthly')).toEqual({ start: '2026-02-01', end: '2026-02-28' }); }); it('年:整年', () => { expect(periodRange('2026-07-21', 'annual')).toEqual({ start: '2026-01-01', end: '2026-12-31' }); }); }); describe('isoWeekNumber ISO 周数', () => { it('2026-01-01 是第 1 周', () => { expect(isoWeekNumber('2026-01-01')).toBe(1); }); it('2026-07-20 是第 30 周', () => { expect(isoWeekNumber('2026-07-20')).toBe(30); }); });