zahlzerlegung/src/lib/game/tasks.test.ts
2026-04-28 01:54:27 +02:00

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