package at.iaik.suraq.test; import java.util.ArrayList; import java.util.HashSet; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import at.iaik.suraq.main.Ackermann; import at.iaik.suraq.main.GraphReduction; import at.iaik.suraq.main.ITEEquationReduction; import at.iaik.suraq.main.SuraqOptions; import at.iaik.suraq.sexp.Token; import at.iaik.suraq.smtlib.Z3Proof; import at.iaik.suraq.smtlib.formula.AndFormula; import at.iaik.suraq.smtlib.formula.Formula; import at.iaik.suraq.smtlib.formula.ImpliesFormula; import at.iaik.suraq.util.DebugHelper; /** * This class tests if the Ackermann's reduction works. It is not possible to * perform all tests, only: * the given formula is unsatisfiable * the given * formula is valid * * @author chillebold * */ public class GraphReductionTest { // SuraqOptions options; protected Formula consequent = null; protected TestHelper th = new TestHelper(); public GraphReductionTest() { // options = SuraqOptions.getInstance(); } @Before public void setUp() { Ackermann.setActive(true); ITEEquationReduction.setActive(true); GraphReduction.setActive(true); SuraqOptions.kill(); SuraqOptions.reset(); Z3Proof.setInstanceCounter(0); } // first simple test @Test public void graphReductionSimple() { System.out .println("****************************************************"); System.out.println("Testcase: Live: " + "./rsc/test/gr1.smt2"); boolean result = testFile("./rsc/test/gr1.smt2", "./rsc/test/~gr1-reduced.smt2", "./rsc/test/~gr1-valid.smt2"); System.out .println(" live: " + (result ? "Success :-)" : "Failed :-(")); Assert.assertTrue(result); } // Tests boolean equivalences (must not be substituted) @Test public void graphReduction2() { System.out .println("****************************************************"); System.out.println("Testcase: Live: " + "./rsc/test/gr2.smt2"); boolean result = testFile("./rsc/test/gr2.smt2", "./rsc/test/~gr2-reduced.smt2", "./rsc/test/~gr2-valid.smt2"); System.out .println(" live: " + (result ? "Success :-)" : "Failed :-(")); Assert.assertTrue(result); } // Tests boolean equivalences with inner DomainVars @Test public void graphReduction3() { System.out .println("****************************************************"); System.out.println("Testcase: Live: " + "./rsc/test/gr3.smt2"); boolean result = testFile("./rsc/test/gr3.smt2", "./rsc/test/~gr3-reduced.smt2", "./rsc/test/~gr3-valid.smt2"); System.out .println(" live: " + (result ? "Success :-)" : "Failed :-(")); Assert.assertTrue(result); } // Tests recursive ite @Test public void graphReduction4() { System.out .println("****************************************************"); System.out.println("Testcase: Live: " + "./rsc/test/gr4.smt2"); boolean result = testFile("./rsc/test/gr4.smt2", "./rsc/test/~gr4-reduced.smt2", "./rsc/test/~gr4-valid.smt2"); System.out .println(" live: " + (result ? "Success :-)" : "Failed :-(")); Assert.assertTrue(result); } // Live: Staendig zum Herumprobieren @Test public void graphReductionMedium() { System.out .println("****************************************************"); System.out.println("Testcase: Live: " + "./rsc/test/a07.smt2"); boolean result = testFile("./rsc/test/a07.smt2", "./rsc/test/~a07-reduced.smt2", "./rsc/test/~a07-valid.smt2"); System.out .println(" live: " + (result ? "Success :-)" : "Failed :-(")); Assert.assertTrue(result); } // ///////////////////////////////////////////////////////////////////////////// protected boolean testFile(String filename, String outputFileName1, String outputFileName2) { Formula formula = th.getFormulaOfFile(filename); Formula old_formula = formula.deepFormulaCopy(); HashSet<Token> t = new HashSet<Token>(); // Ackermann Ackermann ack = new Ackermann(); formula = ack.performAckermann(formula, t); ITEEquationReduction itered = new ITEEquationReduction(); formula = itered.perform(formula, t); // formula = formula.removeDomainITE(formula, new HashSet<Token>()); DebugHelper.getInstance().formulaToFile(formula, "debug_ite.txt"); // Graph Reduction GraphReduction gr = new GraphReduction(); try { formula = gr.perform(formula, t); } catch (Exception ex) { ex.printStackTrace(); return false; } // Debug output of Ackermann's result to Filesystem String ackermannstr = th.transformFormulaToString(formula); th.writeFile(outputFileName1, ackermannstr); Formula x = formula; th.isFormulaSat(old_formula, "OLD"); th.isFormulaSat(formula, "GRAPHRED"); th.isFormulaValid(old_formula, "OLD"); th.isFormulaValid(formula, "GRAPHRED"); // this only works for VALID formulas ImpliesFormula f1 = ImpliesFormula.create(old_formula, x); ImpliesFormula f2 = ImpliesFormula.create(x, old_formula); ArrayList<Formula> f12 = new ArrayList<Formula>(); f12.add(f1); f12.add(f2); AndFormula equiv = AndFormula.generate(f12); // Test Output String z3InputStr = th.transformFormulaToString(equiv); th.writeFile(outputFileName2, z3InputStr); // Check if OK: boolean valid = th.isFormulaValid(equiv, "Formeln aequivalent"); if (valid) { System.out.println(" Z3 tells us UNSAT (valid). Good :-)"); return true; } else { System.err.println(" Z3 tells us SAT. Bad :-("); return false; } } }