const test = require('node:test') const assert = require('node:assert/strict') const { getBadgeProgress, getBadgePositions, getBadgeSegments, getBadgeDisplayLabel, getBadgeCelebration } = require('../utils/badge-state') const badges = [ { days: 3, name: '抖登' }, { days: 7, name: '中登' }, { days: 14, name: '老登' }, { days: 30, name: '神登' }, { days: 60, name: '上古神登' }, { days: 80, name: '洪荒神登' }, { days: 100, name: '究极登祖' } ] test('badge progress remains zero before the first milestone', () => { assert.equal(getBadgeProgress(badges, 1), 0) assert.equal(getBadgeProgress(badges, 2), 0) assert.equal(getBadgeProgress(badges, 3), 4) }) test('milestones use equal spacing and overall fill stays aligned', () => { assert.deepEqual(getBadgePositions(badges), [4, 19.3, 34.7, 50, 65.3, 80.7, 96]) assert.equal(getBadgeProgress(badges, 7), 19.3) assert.equal(getBadgeProgress(badges, 60), 65.3) assert.equal(getBadgeProgress(badges, 100), 100) }) test('only the active badge connection is partially green', () => { assert.deepEqual(getBadgeSegments(badges, 16), [ { left: 4, width: 15.3, progress: 100 }, { left: 19.3, width: 15.4, progress: 100 }, { left: 34.7, width: 15.3, progress: 12.5 }, { left: 50, width: 15.3, progress: 0 }, { left: 65.3, width: 15.4, progress: 0 }, { left: 80.7, width: 15.3, progress: 0 } ]) }) test('equal spacing keeps full unlocked badge names readable', () => { assert.equal(getBadgeDisplayLabel(badges[3], true), '神登') assert.equal(getBadgeDisplayLabel(badges[4], true), '上古神登') assert.equal(getBadgeDisplayLabel(badges[6], false), '100天') }) test('badge celebration keeps prior milestones seen after records are deleted', () => { const afterDeletion = getBadgeCelebration([3], []) assert.deepEqual(afterDeletion, { newly: [], seen: [3] }) const afterRetraining = getBadgeCelebration(afterDeletion.seen, [3]) assert.deepEqual(afterRetraining, { newly: [], seen: [3] }) }) test('badge celebration only reports milestones never seen before', () => { assert.deepEqual(getBadgeCelebration([3], [3, 7]), { newly: [7], seen: [3, 7] }) })