From 0ec07636a20a03a3833909013ee2e75eef401c3c Mon Sep 17 00:00:00 2001 From: mxhagen Date: Wed, 2 Apr 2025 14:00:21 +0200 Subject: [PATCH] add rudimentary tests for solvability of generated sudokus --- src/sudoku/generator.rs | 2 +- src/tests/generator.rs | 32 +++++++++++++++++++++++++++++++- 2 files changed, 32 insertions(+), 2 deletions(-) diff --git a/src/sudoku/generator.rs b/src/sudoku/generator.rs index 2d100c2..b0483a5 100644 --- a/src/sudoku/generator.rs +++ b/src/sudoku/generator.rs @@ -91,7 +91,7 @@ pub fn generate_sudoku(difficulty: Difficulty) -> Board { /// TODO: currently empty cells needs to be recreated /// on each recursive call, and are randomized anew /// each time, which is an unnecessary overhead. -fn solve_random(board: &mut Board) -> Result<(), ()> { +pub fn solve_random(board: &mut Board) -> Result<(), ()> { let mut empty_cells: Vec<(usize, usize)> = Vec::new(); let mut rows: Vec = (0..9).collect::>(); diff --git a/src/tests/generator.rs b/src/tests/generator.rs index 1891096..c313896 100644 --- a/src/tests/generator.rs +++ b/src/tests/generator.rs @@ -1,4 +1,4 @@ -use crate::{generate_sudoku, Board, Difficulty}; +use crate::{generator::*, Board}; #[test] fn generated_sudoku_uniqueness() { @@ -30,3 +30,33 @@ fn generated_sudoku_uniqueness() { iterations - uniques.len() ); } + + +#[test] +fn generated_sudoku_solvability_small() { + use Difficulty::*; + + let iterations = 20; + + for difficulty in [Easy, Mid, Hard, Expert] { + for _ in 0..iterations { + let mut sudoku = generate_sudoku(difficulty); + solve_random(&mut sudoku).expect("Generated sudoku not solvable"); + } + } +} + +#[test] +#[ignore] +fn generated_sudoku_solvability_large() { + use Difficulty::*; + + let iterations = 400; + + for difficulty in [Easy, Mid, Hard, Expert] { + for _ in 0..iterations { + let mut sudoku = generate_sudoku(difficulty); + solve_random(&mut sudoku).expect("Generated sudoku not solvable"); + } + } +}