74 lines
2.3 KiB
TypeScript
74 lines
2.3 KiB
TypeScript
import { describe, it, expect } from "vitest";
|
|
import {
|
|
checkFractionAnswer,
|
|
checkIntegerAnswer,
|
|
checkDecimalAnswer,
|
|
checkRatioAnswer,
|
|
checkOrderingAnswer,
|
|
} from "./validation";
|
|
|
|
describe("checkIntegerAnswer", () => {
|
|
it("solves an exact match", () => {
|
|
expect(checkIntegerAnswer(6, 6).status).toBe("solved");
|
|
});
|
|
it("rejects a wrong value", () => {
|
|
expect(checkIntegerAnswer(5, 6).status).toBe("wrong");
|
|
});
|
|
});
|
|
|
|
describe("checkFractionAnswer", () => {
|
|
it("solves a fully simplified answer", () => {
|
|
expect(checkFractionAnswer(1, 2, 1, 2).status).toBe("solved");
|
|
});
|
|
|
|
// Regression: 5/10 is the right value but unsimplified — it must NOT be treated
|
|
// as fully solved (this is what let the score double-count before the fix).
|
|
it("flags a correct but unsimplified answer", () => {
|
|
expect(checkFractionAnswer(5, 10, 1, 2).status).toBe("unsimplified");
|
|
});
|
|
|
|
it("accepts any non-zero denominator for zero", () => {
|
|
expect(checkFractionAnswer(0, 5, 0, 1).status).toBe("solved");
|
|
});
|
|
|
|
it("rejects a wrong value", () => {
|
|
expect(checkFractionAnswer(3, 4, 1, 8).status).toBe("wrong");
|
|
});
|
|
|
|
it("rejects a zero denominator", () => {
|
|
const res = checkFractionAnswer(1, 0, 1, 2);
|
|
expect(res.status).toBe("wrong");
|
|
if (res.status === "wrong") expect(res.message).toMatch(/denominator/i);
|
|
});
|
|
});
|
|
|
|
describe("checkDecimalAnswer", () => {
|
|
it("solves within tolerance", () => {
|
|
expect(checkDecimalAnswer(3.14, 3.14).status).toBe("solved");
|
|
});
|
|
it("rejects outside tolerance", () => {
|
|
expect(checkDecimalAnswer(3.2, 3.14).status).toBe("wrong");
|
|
});
|
|
});
|
|
|
|
describe("checkRatioAnswer", () => {
|
|
it("solves an already-simplified ratio", () => {
|
|
expect(checkRatioAnswer([1, 2], [1, 2]).status).toBe("solved");
|
|
});
|
|
it("flags an equivalent but unsimplified ratio", () => {
|
|
expect(checkRatioAnswer([2, 4], [1, 2]).status).toBe("unsimplified");
|
|
});
|
|
it("rejects a non-equivalent ratio", () => {
|
|
expect(checkRatioAnswer([1, 3], [1, 2]).status).toBe("wrong");
|
|
});
|
|
});
|
|
|
|
describe("checkOrderingAnswer", () => {
|
|
it("solves a correct ascending order", () => {
|
|
expect(checkOrderingAnswer([-10, -8, -6, -4, -3, 5], [-10, -8, -6, -4, -3, 5]).status).toBe("solved");
|
|
});
|
|
it("rejects a wrong order", () => {
|
|
expect(checkOrderingAnswer([5, -10], [-10, 5]).status).toBe("wrong");
|
|
});
|
|
});
|