level.test.js
1.25 KB
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))
})
})