Current section

Files

Jump to
fixpoint test constraints all_different all_different_binary_test.exs
Raw

test/constraints/all_different/all_different_binary_test.exs

defmodule CPSolverTest.Constraint.AllDifferent do
use ExUnit.Case, async: false
describe "AllDifferent" do
alias CPSolver.Propagator.NotEqual, as: PropagatorNotEqual
alias CPSolver.Constraint.AllDifferent.Binary, as: AllDifferent
alias CPSolver.IntVariable
alias CPSolver.Constraint
alias CPSolver.Model
test "propagators" do
domain = 1..3
variables = Enum.map(1..3, fn i -> IntVariable.new(domain, name: "x#{i}") end)
assert variables
|> AllDifferent.propagators()
|> Enum.map(fn %{mod: PropagatorNotEqual, args: [x, y, _]} ->
"#{x.name} != #{y.name}"
end)
|> Enum.sort() ==
["x1 != x2", "x1 != x3", "x2 != x3"]
end
test "produces all possible permutations" do
var_nums = 4
domain = 1..var_nums
variables = Enum.map(domain, fn _ -> IntVariable.new(domain) end)
permutations = Permutation.permute!(Enum.to_list(domain))
model = Model.new(variables, [Constraint.new(AllDifferent, variables)])
{:ok, result} = CPSolver.solve(model)
assert result.statistics.solution_count == MapSet.size(permutations)
assert result.solutions |> MapSet.new() == permutations
end
end
end