package aima.test.core.unit.search.csp;
import java.util.ArrayList;
import java.util.List;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import aima.core.search.csp.Assignment;
import aima.core.search.csp.CSP;
import aima.core.search.csp.Constraint;
import aima.core.search.csp.Domain;
import aima.core.search.csp.TreeCspSolver;
import aima.core.search.csp.Variable;
import aima.core.search.csp.examples.NotEqualConstraint;
public class TreeCspSolverTest {
private static final Variable WA = new Variable("wa");
private static final Variable NT = new Variable("nt");
private static final Variable Q = new Variable("q");
private static final Variable NSW = new Variable("nsw");
private static final Variable V = new Variable("v");
private static final Constraint<Variable, String> C1 = new NotEqualConstraint<>(WA, NT);
private static final Constraint<Variable, String> C2 = new NotEqualConstraint<>(NT, Q);
private static final Constraint<Variable, String> C3 = new NotEqualConstraint<>(Q, NSW);
private static final Constraint<Variable, String> C4 = new NotEqualConstraint<>(NSW, V);
private Domain<String> colors;
private List<Variable> variables;
@Before
public void setUp() {
variables = new ArrayList<>();
variables.add(WA);
variables.add(NT);
variables.add(Q);
variables.add(NSW);
variables.add(V);
colors = new Domain<>("red", "green", "blue");
}
@Test
public void testConstraintNetwork() {
CSP<Variable, String> csp = new CSP<>(variables);
csp.addConstraint(C1);
csp.addConstraint(C2);
csp.addConstraint(C3);
csp.addConstraint(C4);
Assert.assertNotNull(csp.getConstraints());
Assert.assertEquals(4, csp.getConstraints().size());
Assert.assertNotNull(csp.getConstraints(WA));
Assert.assertEquals(1, csp.getConstraints(WA).size());
Assert.assertNotNull(csp.getConstraints(NT));
Assert.assertEquals(2, csp.getConstraints(NT).size());
Assert.assertNotNull(csp.getConstraints(Q));
Assert.assertEquals(2, csp.getConstraints(Q).size());
Assert.assertNotNull(csp.getConstraints(NSW));
Assert.assertEquals(2, csp.getConstraints(NSW).size());
}
@Test
public void testDomainChanges() {
Domain<String> colors2 = new Domain<>(colors.asList());
Assert.assertEquals(colors, colors2);
CSP<Variable, String> csp = new CSP<>(variables);
csp.addConstraint(C1);
Assert.assertNotNull(csp.getDomain(WA));
Assert.assertEquals(0, csp.getDomain(WA).size());
Assert.assertNotNull(csp.getConstraints(WA));
csp.setDomain(WA, colors);
Assert.assertEquals(colors, csp.getDomain(WA));
Assert.assertEquals(3, csp.getDomain(WA).size());
Assert.assertEquals("red", csp.getDomain(WA).get(0));
CSP<Variable, String> cspCopy = csp.copyDomains();
Assert.assertNotNull(cspCopy.getDomain(WA));
Assert.assertEquals(3, cspCopy.getDomain(WA).size());
Assert.assertEquals("red", cspCopy.getDomain(WA).get(0));
Assert.assertNotNull(cspCopy.getDomain(NT));
Assert.assertEquals(0, cspCopy.getDomain(NT).size());
Assert.assertNotNull(cspCopy.getConstraints(NT));
Assert.assertEquals(C1, cspCopy.getConstraints(NT).get(0));
cspCopy.removeValueFromDomain(WA, "red");
Assert.assertEquals(2, cspCopy.getDomain(WA).size());
Assert.assertEquals("green", cspCopy.getDomain(WA).get(0));
Assert.assertEquals(3, csp.getDomain(WA).size());
Assert.assertEquals("red", csp.getDomain(WA).get(0));
}
@Test
public void testCSPSolver() {
CSP<Variable, String> csp = new CSP<>(variables);
csp.addConstraint(C1);
csp.addConstraint(C2);
csp.addConstraint(C3);
csp.addConstraint(C4);
csp.setDomain(WA, colors);
csp.setDomain(NT, colors);
csp.setDomain(Q, colors);
csp.setDomain(NSW, colors);
csp.setDomain(V, colors);
TreeCspSolver<Variable, String> treeCSPSolver = new TreeCspSolver<>();
Assignment<Variable, String> assignment = treeCSPSolver.solve(csp);
Assert.assertNotNull(assignment);
Assert.assertTrue(assignment.isComplete(csp.getVariables()));
Assert.assertTrue(assignment.isSolution(csp));
}
}