import { describe, it, expect } from 'vitest'; import { generateTask, TARGETS, type Target } from './tasks'; describe('generateTask', () => { it.each(TARGETS)('produces a valid decomposition for target %i', (target) => { for (let i = 0; i < 50; i++) { const task = generateTask(target); expect(task.target).toBe(target); expect(task.given).toBeGreaterThanOrEqual(1); expect(task.given).toBeLessThanOrEqual(target - 1); expect(task.given + task.answer).toBe(target); } }); it('always includes the correct answer in choices', () => { for (const target of TARGETS) { for (let i = 0; i < 30; i++) { const task = generateTask(target); expect(task.choices).toContain(task.answer); } } }); it('produces choices without duplicates', () => { for (const target of TARGETS) { for (let i = 0; i < 30; i++) { const task = generateTask(target); const unique = new Set(task.choices); expect(unique.size).toBe(task.choices.length); } } }); it('returns 3 choices for targets >= 5', () => { for (const target of [5, 6, 7, 8, 9, 10] as Target[]) { const task = generateTask(target); expect(task.choices.length).toBe(3); } }); it('returns 3 choices for target 4 (3 possible answers total)', () => { const task = generateTask(4); expect(task.choices.length).toBe(3); }); it('avoids reusing the same given when possible', () => { const target: Target = 7; const prev = generateTask(target); let differed = 0; for (let i = 0; i < 50; i++) { const t = generateTask(target, prev); if (t.given !== prev.given) differed++; } expect(differed).toBe(50); }); });