import { describe, expect, it } from 'vitest' import { levelForXp, MAX_LEVEL, weekStart } from '../src/level.js' import { maxRarityForLevel } from '../src/rarity.js' describe('SM-03 levelForXp 与稀有度上限的边界值', () => { it.each([[0, 1], [99, 1], [100, 2], [299, 2], [300, 3], [4499, 9], [4500, 10], [1_000_000, 10]])('xp %i → level %i', (xp, level) => { expect(levelForXp(xp)).toBe(level) }) it('升级解锁更高稀有度:1 级到 3,2 级到 4,满级封顶 10', () => { expect(maxRarityForLevel(levelForXp(99))).toBe(3) expect(maxRarityForLevel(levelForXp(100))).toBe(4) expect(maxRarityForLevel(levelForXp(4500))).toBe(10) expect(MAX_LEVEL).toBe(10) }) it('非法 XP 直接 throw', () => { expect(() => levelForXp(-1)).toThrow(/xp invalid/) expect(() => levelForXp(1.5)).toThrow(/xp invalid/) }) }) describe('周起点:周一 00:00 UTC', () => { it.each([ ['2026-10-12T00:00:00.000Z', '2026-10-12T00:00:00.000Z'], ['2026-10-14T15:30:00.000Z', '2026-10-12T00:00:00.000Z'], ['2026-10-18T23:59:59.999Z', '2026-10-12T00:00:00.000Z'], ['2026-10-19T00:00:00.000Z', '2026-10-19T00:00:00.000Z'], ])('%s → %s', (now, start) => { expect(weekStart(new Date(now))).toEqual(new Date(start)) }) })