import { arithmeticCategories, checkArithmeticAnswer, createSeededRng, generateArithmeticProblem, scoreArithmeticAttempt, type ArithmeticSessionConfig, type ArithmeticStar,} from "../src/lib/arithmetic"; function assert(condition: unknown, message: string): asserts condition { if (!condition) { throw new Error(message); }} const stars: ArithmeticStar[] = [1, 2, 3, 4, 5]; for (const category of arithmeticCategories) { for (const star of stars) { const config: ArithmeticSessionConfig = { mode: "standard", category: category.id, submode: category.id === "roots-powers" ? "sqrt" : undefined, star, runMode: "60s", magnitude: category.id.startsWith("big-") ? "thousands" : undefined, }; const rng = createSeededRng(star * 1000 + category.id.length); for (let index = 0; index < 25; index += 1) { const problem = generateArithmeticProblem(config, rng); assert(problem.expression.length > 0, `${category.id} produced empty expression`); assert(problem.canonicalAnswer.length > 0, `${category.id} produced empty answer`); assert( checkArithmeticAnswer(problem, problem.canonicalAnswer), `${category.id} failed canonical answer check` ); assert( scoreArithmeticAttempt({ correct: true, elapsedMs: 1000, problem }, config) > 0, `${category.id} failed positive scoring` ); assert( scoreArithmeticAttempt({ correct: false, elapsedMs: 1000, problem }, config) === 0, `${category.id} failed incorrect scoring` ); } }} const fractionConfig: ArithmeticSessionConfig = { mode: "standard", category: "division", star: 5, runMode: "60s",};const fractionProblem = { ...generateArithmeticProblem(fractionConfig, createSeededRng(9)), canonicalAnswer: "1/2", answerFormat: "fraction" as const,}; assert(checkArithmeticAnswer(fractionProblem, "0.5"), "0.5 should equal 1/2");assert(checkArithmeticAnswer(fractionProblem, "2/4"), "2/4 should equal 1/2");assert(!checkArithmeticAnswer(fractionProblem, "0.6"), "0.6 should not equal 1/2"); const binaryProblem = generateArithmeticProblem( { mode: "standard", category: "binary", star: 2, runMode: "60s" }, createSeededRng(12));assert(/^[01]+$/.test(binaryProblem.canonicalAnswer), "binary answer should be base two");assert(checkArithmeticAnswer(binaryProblem, binaryProblem.canonicalAnswer), "binary answer failed"); console.log("arithmetic tests passed");
import {
arithmeticCategories,
checkArithmeticAnswer,
createSeededRng,
generateArithmeticProblem,
scoreArithmeticAttempt,
type ArithmeticSessionConfig,
type ArithmeticStar,
} from "../src/lib/arithmetic";
function assert(condition: unknown, message: string): asserts condition {
if (!condition) {
throw new Error(message);
}
}
const stars: ArithmeticStar[] = [1, 2, 3, 4, 5];
for (const category of arithmeticCategories) {
for (const star of stars) {
const config: ArithmeticSessionConfig = {
mode: "standard",
category: category.id,
submode: category.id === "roots-powers" ? "sqrt" : undefined,
star,
runMode: "60s",
magnitude: category.id.startsWith("big-") ? "thousands" : undefined,
};
const rng = createSeededRng(star * 1000 + category.id.length);
for (let index = 0; index < 25; index += 1) {
const problem = generateArithmeticProblem(config, rng);
assert(problem.expression.length > 0, `${category.id} produced empty expression`);
assert(problem.canonicalAnswer.length > 0, `${category.id} produced empty answer`);
assert(
checkArithmeticAnswer(problem, problem.canonicalAnswer),
`${category.id} failed canonical answer check`
);
assert(
scoreArithmeticAttempt({ correct: true, elapsedMs: 1000, problem }, config) > 0,
`${category.id} failed positive scoring`
);
assert(
scoreArithmeticAttempt({ correct: false, elapsedMs: 1000, problem }, config) === 0,
`${category.id} failed incorrect scoring`
);
}
}
}
const fractionConfig: ArithmeticSessionConfig = {
mode: "standard",
category: "division",
star: 5,
runMode: "60s",
};
const fractionProblem = {
...generateArithmeticProblem(fractionConfig, createSeededRng(9)),
canonicalAnswer: "1/2",
answerFormat: "fraction" as const,
};
assert(checkArithmeticAnswer(fractionProblem, "0.5"), "0.5 should equal 1/2");
assert(checkArithmeticAnswer(fractionProblem, "2/4"), "2/4 should equal 1/2");
assert(!checkArithmeticAnswer(fractionProblem, "0.6"), "0.6 should not equal 1/2");
const binaryProblem = generateArithmeticProblem(
{ mode: "standard", category: "binary", star: 2, runMode: "60s" },
createSeededRng(12)
);
assert(/^[01]+$/.test(binaryProblem.canonicalAnswer), "binary answer should be base two");
assert(checkArithmeticAnswer(binaryProblem, binaryProblem.canonicalAnswer), "binary answer failed");
console.log("arithmetic tests passed");