mod playground; mod solver; mod mysolver; use mysolver::MySolver; use playground::Playground; use solver::Solver; #[cfg(test)] mod tests { // Note this useful idiom: importing names from outer (for mod tests) scope. use super::*; #[test] fn test_sudoku_1() { let field = r#"7 0 6 3 0 8 0 0 9 0 0 0 2 6 0 3 0 0 0 5 0 0 0 0 0 8 0 0 0 0 9 0 1 8 0 2 4 0 0 0 0 0 0 0 6 9 0 3 8 0 6 0 0 0 0 9 0 0 0 0 0 7 0 0 0 5 0 2 4 0 0 0 6 0 0 1 0 3 2 0 4"#; exec_test(field); } #[test] fn test_sudoku_2() { let field = r#"{0,0,4,1,0,0,3,0,0}, {0,7,0,0,0,8,0,0,1}, {0,0,0,0,0,0,7,0,9}, {8,0,3,0,5,9,0,0,2}, {0,0,9,6,0,1,5,0,0}, {1,0,0,8,2,0,9,0,4}, {6,0,1,0,0,0,0,0,0}, {4,0,0,3,0,0,0,9,0}, {0,0,8,0,0,4,2,0,0}};"#; exec_test(field); } #[test] fn test_sudoku_3() { let field = r#"{0,0,0,0,2,3,4,0,8}, {0,0,0,0,7,4,6,9,0}, {0,0,0,8,9,0,0,0,7}, {0,0,9,3,0,0,7,4,0}, {0,7,0,0,4,0,0,3,0}, {0,8,3,0,0,7,2,0,0}, {5,0,0,0,1,9,0,0,0}, {0,9,2,4,3,0,0,0,0}, {3,0,6,7,5,0,0,0,0}}"#; exec_test(field); } #[test] fn test_sudoku_4() { let field = r#"{0,0,0,0,6,0,0,3,0}, {0,9,6,0,0,5,0,0,4}, {0,0,0,7,0,1,0,6,0}, {0,1,0,0,0,3,0,9,5}, {0,4,9,0,1,0,7,2,0}, {7,3,0,5,0,0,0,1,0}, {0,6,0,9,0,7,0,0,0}, {4,0,0,8,0,0,9,5,0}, {0,2,0,0,5,0,0,0,0}}"#; exec_test(field); } #[test] fn test_sudoku_5() { let field = r#"{9,0,6,1,0,7,3,0,4}, {0,8,3,0,0,5,0,0,7}, {0,0,0,0,0,0,2,0,9}, {8,4,5,3,7,1,9,2,6}, {3,0,2,5,6,8,0,0,1}, {1,0,7,9,2,4,0,3,0}, {6,0,9,4,3,2,7,0,8}, {0,3,0,0,1,6,5,0,0}, {2,1,8,7,5,0,0,0,3}}"#; exec_test(field); } #[test] fn test_sudoku_6() { let field = r#"{0,8,0,0,0,0,0,0,0}, {0,0,0,6,3,0,0,4,1}, {0,0,0,5,0,0,0,0,0}, {0,0,0,0,0,0,0,9,0}, {0,0,0,0,0,0,0,5,0}, {9,0,0,0,0,0,0,0,0}, {0,0,0,8,0,2,0,0,0}, {0,5,0,0,9,0,0,0,0}, {0,0,0,4,5,0,9,0,0}}"#; exec_test(field); } #[test] fn test_sudoku_7() { let field = r#"{0,0,0,0,0,7,0,2,0}, {0,0,4,0,0,0,0,3,0}, {0,1,0,0,9,0,0,0,5}, {0,0,0,0,0,6,3,0,0}, {6,0,0,0,0,0,1,7,0}, {0,7,3,4,0,0,0,0,2}, {0,0,0,0,6,0,0,9,0}, {3,0,7,0,8,0,5,0,0}, {0,5,1,0,0,0,0,0,0}}"#; exec_test(field); } #[test] fn test_sudoku_8() { let field = r#"{0,0,0,0,0,0,0,1,0}, {0,3,0,0,0,4,0,0,0}, {0,0,0,0,0,0,3,9,0}, {0,4,0,8,0,2,0,0,0}, {5,0,0,0,0,0,0,0,0}, {0,0,9,0,6,0,2,5,0}, {8,0,0,0,3,0,9,0,0}, {9,0,0,4,0,0,0,8,0}, {1,0,0,6,0,9,0,0,5}}"#; exec_test(field); } /** * Tests if the solver can cope with * an empty board */ #[test] fn test_sudoku_empty() { let field = r#"{0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0}}"#; exec_test(field); } fn exec_test(field : &str) { let pg = Playground::from(field); let solver = MySolver::new(); let result = solver.solve(&pg); assert!(result.is_some()); let result_pg = result.unwrap(); assert!(result_pg.is_valid()); assert!(result_pg.is_solved()); assert!(result_pg.contains(&pg)); } } fn main() { let field = r#"{0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0}}"#; let pg = Playground::from(field); pg.print(); let solver = MySolver::new(); println!(""); if let Some(result) = solver.solve(&pg) { result.print(); if !result.contains(&pg) { println!("Solver modified predefined fields!") } if !result.is_valid() { println!("Solver has not correctly solved the sudoku!") } else if !result.is_solved() { println!("Solver was not able to solve the sudoku!") } assert!(result.contains(&pg)); } else { println!("Solver was not able to resolve the sodoku!") } }