package de.psi.alloy4smt.hysat;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import org.junit.Test;
public class HysatSolverTest {
@Test
public void simple() {
HysatSolver solver = new HysatSolver();
boolean b;
b = solver.addClause(new int[] {1, 2, 3});
assertTrue(b);
assertEquals(1, solver.numberOfClauses());
b = solver.addClause(new int[] { 1, 3, -4 });
assertTrue(b);
assertEquals(2, solver.numberOfClauses());
final String hysat =
"DECL\n" +
"\tboole cnf_1;\n" +
"\tboole cnf_2;\n" +
"\tboole cnf_3;\n" +
"\tboole cnf_4;\n" +
"EXPR\n" +
"\tcnf_1 or cnf_2 or cnf_3;\n" +
"\tcnf_1 or cnf_3 or !cnf_4;\n";
assertEquals(hysat, solver.toHysat());
}
@Test
public void intvariables() {
HysatSolver solver = new HysatSolver();
solver.addHysatVariable("lala", -1000, 1000);
solver.addHysatVariable("abc$3", 4, 2030);
assertEquals(
"DECL\n" +
"\tint [-1000, 1000] lala;\n" +
"\tint [4, 2030] abc_3;\n" +
"EXPR\n",
solver.toHysat());
}
@Test
public void expressions() {
HysatSolver solver = new HysatSolver();
solver.addHysatExpr("a * a + b * b = c * c");
solver.addHysatExpr("cnf -> {x + a$4 = z$3}");
assertEquals(
"DECL\n" +
"EXPR\n" +
"\ta * a + b * b = c * c;\n" +
"\tcnf -> {x + a_4 = z_3};\n",
solver.toHysat());
}
@Test
public void inputvars() {
HysatSolver solver = new HysatSolver();
solver.addVariables(20);
solver.addVariables(3);
assertEquals(23, solver.numberOfVariables());
solver.addClause(new int[] {-1, 2, 3});
assertEquals(
"DECL\n" +
"\t-- Number of input vars: 23\n" +
"\tboole cnf_1;\n" +
"\tboole cnf_2;\n" +
"\tboole cnf_3;\n" +
"EXPR\n" +
"\t!cnf_1 or cnf_2 or cnf_3;\n",
solver.toHysat());
}
@Test
public void mkhysatfile() throws IOException {
HysatSolver solver = new HysatSolver();
assertNull(solver.getHysatFile());
boolean r = solver.solve();
assertTrue(r);
assertNotNull(solver.getHysatFile());
assertTrue(solver.getHysatFile().exists());
StringBuilder sb = new StringBuilder();
BufferedReader br = new BufferedReader(new FileReader(solver.getHysatFile()));
while (br.ready()) { sb.append(br.readLine()); sb.append("\n"); }
br.close();
assertEquals(solver.toHysat(), sb.toString());
assertTrue(solver.getHysatFile().delete());
}
}