This repository has been archived on 2023-11-10. You can view files and clone it, but cannot push or open issues or pull requests.
freecodecamp-projects/7-quality-assurance/4-sudoku-solver/tests/1_unit-tests.js

157 lines
5.2 KiB
JavaScript
Raw Normal View History

const chai = require("chai");
const assert = chai.assert;
import { puzzlesAndSolutions } from "../controllers/puzzle-strings";
const invalidStrings = [
"135762984946-8125772845961369451783281293674535B82419647329856158167342926:145378",
'56891372434268751"%=7254386685479231219538467734162895926345178473891652851726943',
"/////////////////////////////////////////////////////////////////////////////////",
"NyanNyanNyanNyanNyanNyanNyanNyanNyanNyanNyanNyanNyanNyanNyanNyanNyanNyanNyanNyan.",
];
const unsolvableStrings = [
"115..2.84..63.12.7.2..5.....9..1....8.2.3674.3.7.2..9.420..8..1..16....926969.37.",
"4206942069.......................................................................",
"111111111111111111111111111111111111111111111111111111111111111111111111111111111",
];
const Solver = require("../controllers/sudoku-solver.js");
let solver = new Solver();
suite("Unit Tests", () => {
suite("Validation", () => {
test("Logic handles a valid puzzle string of 81 characters", () => {
for (let i in puzzlesAndSolutions) {
assert.isTrue(solver.validate(puzzlesAndSolutions[i][0]));
}
});
test("Logic handles a puzzle string with invalid characters (not 1-9 or .)", () => {
for (let i in invalidStrings) {
assert.equal(
solver.validate(invalidStrings[i]).error,
"Invalid characters in puzzle",
invalidStrings[i]
);
}
});
test("Logic handles a puzzle string that is not 81 characters in length", () => {
assert.equal(
solver.validate("135762984946145378").error,
"Expected puzzle to be 81 characters long"
);
});
});
suite("Placement Checks", () => {
test("Login handles a valid row placement", () => {
const checks = [
solver.checkRowPlacement(puzzlesAndSolutions[0][0], "A", 2, 3),
solver.checkRowPlacement(puzzlesAndSolutions[0][1], "A", 2, 6),
solver.checkRowPlacement(puzzlesAndSolutions[0][2], "A", 1, 2),
];
for (let i in checks) {
assert.isTrue(checks[i]);
}
});
test("Logic handles an invalid row placement", () => {
const checks = [
solver.checkRowPlacement(puzzlesAndSolutions[0][0], "A", 2, 8),
solver.checkRowPlacement(puzzlesAndSolutions[0][1], "A", 2, 1),
solver.checkRowPlacement(puzzlesAndSolutions[0][2], "A", 1, 3),
];
for (let i in checks) {
assert.isFalse(checks[i]);
}
});
test("Login handles a valid column placement", () => {
const checks = [
solver.checkColPlacement(puzzlesAndSolutions[0][0], "A", 2, 3),
solver.checkColPlacement(puzzlesAndSolutions[0][1], "A", 2, 6),
solver.checkColPlacement(puzzlesAndSolutions[0][2], "A", 1, 2),
];
for (let i in checks) {
assert.isTrue(checks[i]);
}
});
test("Logic handles an invalid column placement", () => {
const checks = [
solver.checkColPlacement(puzzlesAndSolutions[0][0], "B", 2, 9),
solver.checkColPlacement(puzzlesAndSolutions[0][1], "B", 2, 8),
solver.checkColPlacement(puzzlesAndSolutions[0][2], "C", 3, 2),
];
for (let i in checks) {
assert.isFalse(checks[i]);
}
});
test("Logic handles a valid region (3x3 grid) placement", () => {
const checks = [
solver.checkRegionPlacement(puzzlesAndSolutions[0][0], "A", 2, 3),
solver.checkRegionPlacement(puzzlesAndSolutions[0][1], "A", 2, 6),
solver.checkRegionPlacement(puzzlesAndSolutions[0][2], "A", 1, 2),
];
for (let i in checks) {
assert.isTrue(checks[i]);
}
});
test("Logic handles an invalid region (3x3 grid) placement", () => {
const checks = [
solver.checkRegionPlacement(puzzlesAndSolutions[0][0], "C", 3, 5),
solver.checkRegionPlacement(puzzlesAndSolutions[0][1], "C", 3, 5),
solver.checkRegionPlacement(puzzlesAndSolutions[0][2], "C", 3, 5),
];
for (let i in checks) {
assert.isFalse(checks[i]);
}
});
});
suite("Solver", () => {
test("Valid puzzle strings pass the solver", () => {
for (let i in puzzlesAndSolutions) {
console.log(i);
assert.equal(
solver.solve(puzzlesAndSolutions[i][1]),
puzzlesAndSolutions[i][1]
);
}
});
test("Invalid puzzle strings fail the solver", () => {
for (let i in invalidStrings) {
assert.equal(
solver.solve(invalidStrings[i].error),
"Invalid characters in puzzle",
"invalid characters" + invalidStrings[i]
);
}
assert.equal(
solver.solve("135762984946145378").error,
"Expected puzzle to be 81 characters long",
"wrong length"
);
for (let i in unsolvableStrings) {
assert.equal(
solver.solve().error,
"Puzzle cannot be solved",
"not solvable" + unsolvableStrings[i]
);
}
});
test("Solver returns the expected solution for an incomplete puzzle", () => {
for (let i in puzzlesAndSolutions) {
assert.equal(
solver.solve(puzzlesAndSolutions[i][0]),
puzzlesAndSolutions[i][1],
puzzlesAndSolutions[i]
);
}
});
});
});
/*
TODO:
Valid puzzle strings pass the solver
*/