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))
  })
})