#![cfg(test)]
use pumpkin_conflict_resolvers::resolvers::ResolutionResolver;
use pumpkin_solver::Solver;
use pumpkin_solver::core::results::ProblemSolution;
use pumpkin_solver::core::results::solution_iterator::IteratedSolution;
use pumpkin_solver::core::termination::Indefinite;
#[test]
fn iterator_finds_all_solutions() {
let mut solver = Solver::default();
let constraint_tag = solver.new_constraint_tag();
let x = solver.new_bounded_integer(0, 2);
let y = solver.new_bounded_integer(0, 2);
let z = solver.new_bounded_integer(0, 2);
let _ = solver
.add_constraint(pumpkin_constraints::all_different(
vec![x, y, z],
constraint_tag,
))
.post();
let mut termination = Indefinite;
let mut brancher = solver.default_brancher();
let mut resolver = ResolutionResolver::default();
let mut solution_iterator =
solver.get_solution_iterator(&mut brancher, &mut termination, &mut resolver);
let mut number_of_solutions = 0;
let mut known_solutions = Vec::new();
loop {
match solution_iterator.next_solution() {
IteratedSolution::Solution(solution, _, _, _) => {
number_of_solutions += 1;
let value_x = solution.get_integer_value(x);
let value_y = solution.get_integer_value(y);
let value_z = solution.get_integer_value(z);
assert!(x != y && x != z && y != z);
assert!(!known_solutions.contains(&(value_x, value_y, value_z)));
known_solutions.push((value_x, value_y, value_z));
}
IteratedSolution::Finished => {
break;
}
IteratedSolution::Unknown => {
break;
}
IteratedSolution::Unsatisfiable => {
panic!("Problem should be satisfiable")
}
}
}
assert_eq!(number_of_solutions, 6)
}