57 lines
1.7 KiB
TypeScript
57 lines
1.7 KiB
TypeScript
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);
|
|
});
|
|
});
|