summaryrefslogtreecommitdiff
path: root/test/unit/api/solver_black.h
diff options
context:
space:
mode:
Diffstat (limited to 'test/unit/api/solver_black.h')
-rw-r--r--test/unit/api/solver_black.h204
1 files changed, 203 insertions, 1 deletions
diff --git a/test/unit/api/solver_black.h b/test/unit/api/solver_black.h
index 7c9af1714..4b5480dba 100644
--- a/test/unit/api/solver_black.h
+++ b/test/unit/api/solver_black.h
@@ -106,6 +106,15 @@ class SolverBlack : public CxxTest::TestSuite
void testResetAssertions();
+ void testMkSygusVar();
+ void testMkSygusGrammar();
+ void testSynthFun();
+ void testSynthInv();
+ void testAddSygusConstraint();
+ void testAddSygusInvConstraint();
+ void testGetSynthSolution();
+ void testGetSynthSolutions();
+
private:
std::unique_ptr<Solver> d_solver;
};
@@ -558,7 +567,7 @@ void SolverBlack::testMkString()
TS_ASSERT_EQUALS(d_solver->mkString("asdf\\nasdf").toString(),
"\"asdf\\u{5c}nasdf\"");
TS_ASSERT_EQUALS(d_solver->mkString("asdf\\u{005c}nasdf", true).toString(),
- "\"asdf\\u{5c}nasdf\"");
+ "\"asdf\\u{5c}nasdf\"");
}
void SolverBlack::testMkChar()
@@ -1217,3 +1226,196 @@ void SolverBlack::testResetAssertions()
d_solver->resetAssertions();
d_solver->checkSatAssuming({slt, ule});
}
+
+void SolverBlack::testMkSygusVar()
+{
+ Sort boolSort = d_solver->getBooleanSort();
+ Sort intSort = d_solver->getIntegerSort();
+ Sort funSort = d_solver->mkFunctionSort(intSort, boolSort);
+
+ TS_ASSERT_THROWS_NOTHING(d_solver->mkSygusVar(boolSort));
+ TS_ASSERT_THROWS_NOTHING(d_solver->mkSygusVar(funSort));
+ TS_ASSERT_THROWS_NOTHING(d_solver->mkSygusVar(boolSort, std::string("b")));
+ TS_ASSERT_THROWS_NOTHING(d_solver->mkSygusVar(funSort, ""));
+ TS_ASSERT_THROWS(d_solver->mkSygusVar(Sort()), CVC4ApiException&);
+ TS_ASSERT_THROWS(d_solver->mkSygusVar(d_solver->getNullSort(), "a"),
+ CVC4ApiException&);
+}
+
+void SolverBlack::testMkSygusGrammar()
+{
+ Term nullTerm;
+ Term boolTerm = d_solver->mkBoolean(true);
+ Term intTerm = d_solver->mkReal(1);
+
+ TS_ASSERT_THROWS_NOTHING(d_solver->mkSygusGrammar({}, {intTerm}));
+ TS_ASSERT_THROWS_NOTHING(d_solver->mkSygusGrammar({boolTerm}, {intTerm}));
+ TS_ASSERT_THROWS(d_solver->mkSygusGrammar({}, {}), CVC4ApiException&);
+ TS_ASSERT_THROWS(d_solver->mkSygusGrammar({}, {nullTerm}), CVC4ApiException&);
+ TS_ASSERT_THROWS(d_solver->mkSygusGrammar({nullTerm}, {intTerm}),
+ CVC4ApiException&);
+}
+
+void SolverBlack::testSynthFun()
+{
+ Sort null = d_solver->getNullSort();
+ Sort boolean = d_solver->getBooleanSort();
+ Sort integer = d_solver->getIntegerSort();
+ Sort boolToBool = d_solver->mkFunctionSort({boolean}, boolean);
+
+ Term nullTerm;
+ Term x = d_solver->mkVar(boolean);
+
+ Term start1 = d_solver->mkVar(boolean);
+ Term start2 = d_solver->mkVar(integer);
+
+ Grammar g1 = d_solver->mkSygusGrammar({x}, {start1});
+ g1.addRule(start1, d_solver->mkBoolean(false));
+
+ Grammar g2 = d_solver->mkSygusGrammar({x}, {start2});
+ g2.addRule(start2, d_solver->mkReal(0));
+
+ TS_ASSERT_THROWS_NOTHING(d_solver->synthFun("", {}, boolean));
+ TS_ASSERT_THROWS_NOTHING(d_solver->synthFun("f1", {x}, boolean));
+ TS_ASSERT_THROWS_NOTHING(d_solver->synthFun("f2", {x}, boolean, g1));
+
+ TS_ASSERT_THROWS(d_solver->synthFun("f3", {nullTerm}, boolean),
+ CVC4ApiException&);
+ TS_ASSERT_THROWS(d_solver->synthFun("f4", {}, null), CVC4ApiException&);
+ TS_ASSERT_THROWS(d_solver->synthFun("f5", {}, boolToBool), CVC4ApiException&);
+ TS_ASSERT_THROWS(d_solver->synthFun("f6", {x}, boolean, g2),
+ CVC4ApiException&);
+}
+
+void SolverBlack::testSynthInv()
+{
+ Sort boolean = d_solver->getBooleanSort();
+ Sort integer = d_solver->getIntegerSort();
+
+ Term nullTerm;
+ Term x = d_solver->mkVar(boolean);
+
+ Term start1 = d_solver->mkVar(boolean);
+ Term start2 = d_solver->mkVar(integer);
+
+ Grammar g1 = d_solver->mkSygusGrammar({x}, {start1});
+ g1.addRule(start1, d_solver->mkBoolean(false));
+
+ Grammar g2 = d_solver->mkSygusGrammar({x}, {start2});
+ g2.addRule(start2, d_solver->mkReal(0));
+
+ TS_ASSERT_THROWS_NOTHING(d_solver->synthInv("", {}));
+ TS_ASSERT_THROWS_NOTHING(d_solver->synthInv("i1", {x}));
+ TS_ASSERT_THROWS_NOTHING(d_solver->synthInv("i2", {x}, g1));
+
+ TS_ASSERT_THROWS(d_solver->synthInv("i3", {nullTerm}), CVC4ApiException&);
+ TS_ASSERT_THROWS(d_solver->synthInv("i4", {x}, g2), CVC4ApiException&);
+}
+
+void SolverBlack::testAddSygusConstraint()
+{
+ Term nullTerm;
+ Term boolTerm = d_solver->mkBoolean(true);
+ Term intTerm = d_solver->mkReal(1);
+
+ TS_ASSERT_THROWS_NOTHING(d_solver->addSygusConstraint(boolTerm));
+ TS_ASSERT_THROWS(d_solver->addSygusConstraint(nullTerm), CVC4ApiException&);
+ TS_ASSERT_THROWS(d_solver->addSygusConstraint(intTerm), CVC4ApiException&);
+}
+
+void SolverBlack::testAddSygusInvConstraint()
+{
+ Sort boolean = d_solver->getBooleanSort();
+ Sort real = d_solver->getRealSort();
+
+ Term nullTerm;
+ Term intTerm = d_solver->mkReal(1);
+
+ Term inv = d_solver->declareFun("inv", {real}, boolean);
+ Term pre = d_solver->declareFun("pre", {real}, boolean);
+ Term trans = d_solver->declareFun("trans", {real, real}, boolean);
+ Term post = d_solver->declareFun("post", {real}, boolean);
+
+ Term inv1 = d_solver->declareFun("inv1", {real}, real);
+
+ Term trans1 = d_solver->declareFun("trans1", {boolean, real}, boolean);
+ Term trans2 = d_solver->declareFun("trans2", {real, boolean}, boolean);
+ Term trans3 = d_solver->declareFun("trans3", {real, real}, real);
+
+ TS_ASSERT_THROWS_NOTHING(
+ d_solver->addSygusInvConstraint(inv, pre, trans, post));
+
+ TS_ASSERT_THROWS(d_solver->addSygusInvConstraint(nullTerm, pre, trans, post),
+ CVC4ApiException&);
+ TS_ASSERT_THROWS(d_solver->addSygusInvConstraint(inv, nullTerm, trans, post),
+ CVC4ApiException&);
+ TS_ASSERT_THROWS(d_solver->addSygusInvConstraint(inv, pre, nullTerm, post),
+ CVC4ApiException&);
+ TS_ASSERT_THROWS(d_solver->addSygusInvConstraint(inv, pre, trans, nullTerm),
+ CVC4ApiException&);
+
+ TS_ASSERT_THROWS(d_solver->addSygusInvConstraint(intTerm, pre, trans, post),
+ CVC4ApiException&);
+
+ TS_ASSERT_THROWS(d_solver->addSygusInvConstraint(inv1, pre, trans, post),
+ CVC4ApiException&);
+
+ TS_ASSERT_THROWS(d_solver->addSygusInvConstraint(inv, trans, trans, post),
+ CVC4ApiException&);
+
+ TS_ASSERT_THROWS(d_solver->addSygusInvConstraint(inv, pre, intTerm, post),
+ CVC4ApiException&);
+ TS_ASSERT_THROWS(d_solver->addSygusInvConstraint(inv, pre, pre, post),
+ CVC4ApiException&);
+ TS_ASSERT_THROWS(d_solver->addSygusInvConstraint(inv, pre, trans1, post),
+ CVC4ApiException&);
+ TS_ASSERT_THROWS(d_solver->addSygusInvConstraint(inv, pre, trans2, post),
+ CVC4ApiException&);
+ TS_ASSERT_THROWS(d_solver->addSygusInvConstraint(inv, pre, trans3, post),
+ CVC4ApiException&);
+
+ TS_ASSERT_THROWS(d_solver->addSygusInvConstraint(inv, pre, trans, trans),
+ CVC4ApiException&);
+}
+
+void SolverBlack::testGetSynthSolution()
+{
+ d_solver->setOption("lang", "sygus2");
+ d_solver->setOption("incremental", "false");
+
+ Term nullTerm;
+ Term x = d_solver->mkBoolean(false);
+ Term f = d_solver->synthFun("f", {}, d_solver->getBooleanSort());
+
+ TS_ASSERT_THROWS(d_solver->getSynthSolution(f), CVC4ApiException&);
+
+ d_solver->checkSynth();
+
+ TS_ASSERT_THROWS_NOTHING(d_solver->getSynthSolution(f));
+ TS_ASSERT_THROWS_NOTHING(d_solver->getSynthSolution(f));
+
+ TS_ASSERT_THROWS(d_solver->getSynthSolution(nullTerm), CVC4ApiException&);
+ TS_ASSERT_THROWS(d_solver->getSynthSolution(x), CVC4ApiException&);
+}
+
+void SolverBlack::testGetSynthSolutions()
+{
+ d_solver->setOption("lang", "sygus2");
+ d_solver->setOption("incremental", "false");
+
+ Term nullTerm;
+ Term x = d_solver->mkBoolean(false);
+ Term f = d_solver->synthFun("f", {}, d_solver->getBooleanSort());
+
+ TS_ASSERT_THROWS(d_solver->getSynthSolutions({}), CVC4ApiException&);
+ TS_ASSERT_THROWS(d_solver->getSynthSolutions({f}), CVC4ApiException&);
+
+ d_solver->checkSynth();
+
+ TS_ASSERT_THROWS_NOTHING(d_solver->getSynthSolutions({f}));
+ TS_ASSERT_THROWS_NOTHING(d_solver->getSynthSolutions({f, f}));
+
+ TS_ASSERT_THROWS(d_solver->getSynthSolutions({}), CVC4ApiException&);
+ TS_ASSERT_THROWS(d_solver->getSynthSolutions({nullTerm}), CVC4ApiException&);
+ TS_ASSERT_THROWS(d_solver->getSynthSolutions({x}), CVC4ApiException&);
+}
generated by cgit on debian on lair
contact matthew@masot.net with questions or feedback