From eb99bdc06b1114c4e58b7a1d4007321f02a9d64b Mon Sep 17 00:00:00 2001 From: Roland Hummel Date: Sat, 2 Oct 2021 22:51:25 +0200 Subject: [PATCH 1/3] Add proper test to Backtracking/Sudoku This replaces the "main" test in the implementation file. --- Backtracking/Sudoku.js | 24 +------------- Backtracking/tests/Sudoku.test.js | 52 +++++++++++++++++++++++++++++++ 2 files changed, 53 insertions(+), 23 deletions(-) create mode 100644 Backtracking/tests/Sudoku.test.js diff --git a/Backtracking/Sudoku.js b/Backtracking/Sudoku.js index ae360bbe2..650758d5b 100644 --- a/Backtracking/Sudoku.js +++ b/Backtracking/Sudoku.js @@ -72,26 +72,4 @@ class Sudoku { } } -function main () { - // main function with an example - const sudokuBoard = new Sudoku([ - [3, 0, 6, 5, 0, 8, 4, 0, 0], - [5, 2, 0, 0, 0, 0, 0, 0, 0], - [0, 8, 7, 0, 0, 0, 0, 3, 1], - [0, 0, 3, 0, 1, 0, 0, 8, 0], - [9, 0, 0, 8, 6, 3, 0, 0, 5], - [0, 5, 0, 0, 9, 0, 6, 0, 0], - [1, 3, 0, 0, 0, 0, 2, 5, 0], - [0, 0, 0, 0, 0, 0, 0, 7, 4], - [0, 0, 5, 2, 0, 6, 3, 0, 0] - ]) - - sudokuBoard.printBoard() - - console.log('\n') - sudokuBoard.solve() - - sudokuBoard.printBoard() -} - -main() +export { Sudoku } diff --git a/Backtracking/tests/Sudoku.test.js b/Backtracking/tests/Sudoku.test.js new file mode 100644 index 000000000..a656d3653 --- /dev/null +++ b/Backtracking/tests/Sudoku.test.js @@ -0,0 +1,52 @@ +import { Sudoku } from '../Sudoku' + +const data = [ + [3, 0, 6, 5, 0, 8, 4, 0, 0], + [5, 2, 0, 0, 0, 0, 0, 0, 0], + [0, 8, 7, 0, 0, 0, 0, 3, 1], + [0, 0, 3, 0, 1, 0, 0, 8, 0], + [9, 0, 0, 8, 6, 3, 0, 0, 5], + [0, 5, 0, 0, 9, 0, 6, 0, 0], + [1, 3, 0, 0, 0, 0, 2, 5, 0], + [0, 0, 0, 0, 0, 0, 0, 7, 4], + [0, 0, 5, 2, 0, 6, 3, 0, 0] +] + +const solved = [ + [3, 1, 6, 5, 7, 8, 4, 9, 2], + [5, 2, 9, 1, 3, 4, 7, 6, 8], + [4, 8, 7, 6, 2, 9, 5, 3, 1], + [2, 6, 3, 4, 1, 5, 9, 8, 7], + [9, 7, 4, 8, 6, 3, 1, 2, 5], + [8, 5, 1, 7, 9, 2, 6, 4, 3], + [1, 3, 8, 9, 4, 7, 2, 5, 6], + [6, 9, 2, 3, 5, 1, 8, 7, 4], + [7, 4, 5, 2, 8, 6, 3, 1, 9], +] + +describe('Sudoku', () => { + it('should create a valid board successfully', () => { + expect(() => {new Sudoku(data)}).not.toThrow() + }) + + it('should find an empty cell', () => { + const board = new Sudoku(data) + const emptyCell = board.findEmptyCell() + expect(emptyCell).not.toEqual([-1, -1]) + }) + + it('should solve the board successfully', () => { + const board = new Sudoku(data) + board.solve() + + // should not have empty cells anymore + const emptyCell = board.findEmptyCell() + expect(emptyCell).toEqual([-1, -1]) + + // solved board should match our expectation + for (let i = 0; i < 9; i++) { + const section = board.getSection(i, [0, 9]) + expect(section).toEqual(solved[i]) + } + }) +}) \ No newline at end of file From 44fee4167fb93b4f349a50b033b6aceb5e93f7c7 Mon Sep 17 00:00:00 2001 From: Roland Hummel Date: Sun, 3 Oct 2021 10:15:35 +0200 Subject: [PATCH 2/3] Code style --- Backtracking/tests/Sudoku.test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Backtracking/tests/Sudoku.test.js b/Backtracking/tests/Sudoku.test.js index a656d3653..1154bdd85 100644 --- a/Backtracking/tests/Sudoku.test.js +++ b/Backtracking/tests/Sudoku.test.js @@ -49,4 +49,4 @@ describe('Sudoku', () => { expect(section).toEqual(solved[i]) } }) -}) \ No newline at end of file +}) From 2b3db6c1d5e810fc9dfd794ce512a2711af6acb1 Mon Sep 17 00:00:00 2001 From: Roland Hummel Date: Sun, 3 Oct 2021 15:11:15 +0200 Subject: [PATCH 3/3] Apply standard code style --- Backtracking/tests/Sudoku.test.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Backtracking/tests/Sudoku.test.js b/Backtracking/tests/Sudoku.test.js index 1154bdd85..092556f1c 100644 --- a/Backtracking/tests/Sudoku.test.js +++ b/Backtracking/tests/Sudoku.test.js @@ -21,12 +21,14 @@ const solved = [ [8, 5, 1, 7, 9, 2, 6, 4, 3], [1, 3, 8, 9, 4, 7, 2, 5, 6], [6, 9, 2, 3, 5, 1, 8, 7, 4], - [7, 4, 5, 2, 8, 6, 3, 1, 9], + [7, 4, 5, 2, 8, 6, 3, 1, 9] ] describe('Sudoku', () => { it('should create a valid board successfully', () => { - expect(() => {new Sudoku(data)}).not.toThrow() + // we deliberately want to check whether this constructor call fails or not + // eslint-disable-next-line no-new + expect(() => { new Sudoku(data) }).not.toThrow() }) it('should find an empty cell', () => {