Skip to content

Commit c2de887

Browse files
Add unit test for satcheck_minisat2
Tests the basic behavior with and without assumptions.
1 parent 2558e3b commit c2de887

File tree

3 files changed

+91
-0
lines changed

3 files changed

+91
-0
lines changed

unit/Makefile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ SRC += analyses/ai/ai.cpp \
4545
solvers/floatbv/float_utils.cpp \
4646
solvers/lowering/byte_operators.cpp \
4747
solvers/prop/bdd_expr.cpp \
48+
solvers/sat/satcheck_minisat2.cpp \
4849
solvers/strings/array_pool/array_pool.cpp \
4950
solvers/strings/string_constraint_generator_valueof/calculate_max_string_length.cpp \
5051
solvers/strings/string_constraint_generator_valueof/get_numeric_value_from_character.cpp \
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
solvers/prop
2+
solvers/sat
3+
testing-utils
4+
util
Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
/*******************************************************************\
2+
3+
Module: Unit tests for satcheck_minisat2
4+
5+
Author: Peter Schrammel
6+
7+
\*******************************************************************/
8+
9+
/// \file
10+
/// Unit tests for satcheck_minisat2
11+
12+
#ifdef HAVE_MINISAT2
13+
14+
# include <testing-utils/use_catch.h>
15+
16+
# include <solvers/prop/literal.h>
17+
# include <solvers/sat/satcheck_minisat2.h>
18+
# include <util/cout_message.h>
19+
20+
SCENARIO("satcheck_minisat2", "[core][solvers][sat][satcheck_minisat2]")
21+
{
22+
console_message_handlert message_handler;
23+
24+
GIVEN("A satisfiable formula f")
25+
{
26+
satcheck_minisat_no_simplifiert satcheck(message_handler);
27+
literalt f = satcheck.new_variable();
28+
satcheck.l_set_to_true(f);
29+
30+
THEN("is indeed satisfiable")
31+
{
32+
REQUIRE(satcheck.prop_solve() == propt::resultt::P_SATISFIABLE);
33+
}
34+
THEN("is unsatisfiable under a false assumption")
35+
{
36+
bvt assumptions;
37+
assumptions.push_back(const_literal(false));
38+
satcheck.set_assumptions(assumptions);
39+
REQUIRE(satcheck.prop_solve() == propt::resultt::P_UNSATISFIABLE);
40+
}
41+
}
42+
43+
GIVEN("An unsatisfiable formula f && !f")
44+
{
45+
satcheck_minisat_no_simplifiert satcheck(message_handler);
46+
literalt f = satcheck.new_variable();
47+
satcheck.l_set_to_true(satcheck.land(f, !f));
48+
49+
THEN("is indeed unsatisfiable")
50+
{
51+
REQUIRE(satcheck.prop_solve() == propt::resultt::P_UNSATISFIABLE);
52+
}
53+
}
54+
55+
GIVEN("An unsatisfiable formula false implied by a")
56+
{
57+
satcheck_minisat_no_simplifiert satcheck(message_handler);
58+
literalt a = satcheck.new_variable();
59+
literalt a_implies_false = satcheck.lor(!a, const_literal(false));
60+
satcheck.l_set_to_true(a_implies_false);
61+
62+
THEN("is indeed unsatisfiable under assumption a")
63+
{
64+
bvt assumptions;
65+
assumptions.push_back(a);
66+
satcheck.set_assumptions(assumptions);
67+
REQUIRE(satcheck.prop_solve() == propt::resultt::P_UNSATISFIABLE);
68+
}
69+
THEN("is still unsatisfiable under assumption a and true")
70+
{
71+
bvt assumptions;
72+
assumptions.push_back(const_literal(true));
73+
assumptions.push_back(a);
74+
satcheck.set_assumptions(assumptions);
75+
REQUIRE(satcheck.prop_solve() == propt::resultt::P_UNSATISFIABLE);
76+
}
77+
THEN("becomes satisfiable when assumption a is lifted")
78+
{
79+
bvt assumptions;
80+
satcheck.set_assumptions(assumptions);
81+
REQUIRE(satcheck.prop_solve() == propt::resultt::P_SATISFIABLE);
82+
}
83+
}
84+
}
85+
86+
#endif

0 commit comments

Comments
 (0)