Skip to content

Commit fc3de1e

Browse files
Add more tests for mgr.equal and mgr.distinct
1 parent fcf5910 commit fc3de1e

File tree

1 file changed

+80
-11
lines changed

1 file changed

+80
-11
lines changed

src/org/sosy_lab/java_smt/test/FormulaManagerTest.java

Lines changed: 80 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -22,34 +22,41 @@
2222
import com.google.common.testing.EqualsTester;
2323
import java.math.BigDecimal;
2424
import java.math.BigInteger;
25+
import java.util.List;
2526
import java.util.Map;
2627
import org.junit.Test;
2728
import org.sosy_lab.java_smt.SolverContextFactory.Solvers;
2829
import org.sosy_lab.java_smt.api.ArrayFormula;
2930
import org.sosy_lab.java_smt.api.BitvectorFormula;
3031
import org.sosy_lab.java_smt.api.BooleanFormula;
32+
import org.sosy_lab.java_smt.api.Formula;
33+
import org.sosy_lab.java_smt.api.FormulaManager;
3134
import org.sosy_lab.java_smt.api.FormulaType;
3235
import org.sosy_lab.java_smt.api.FunctionDeclaration;
3336
import org.sosy_lab.java_smt.api.NumeralFormula.IntegerFormula;
3437
import org.sosy_lab.java_smt.api.SolverException;
38+
import org.sosy_lab.java_smt.api.visitors.FormulaTransformationVisitor;
3539

3640
public class FormulaManagerTest extends SolverBasedTest0.ParameterizedSolverBasedTest0 {
3741

3842
@Test
39-
public void testEqualityWrongSorts() {
40-
// Check that an exception is thrown if the arguments to `=` don't have matching types
43+
public void testWrongSorts() {
44+
// Check that an exception is thrown if the arguments to `=` or `distinct` don't have matching
45+
// types
4146
var formulaType = imgr != null ? IntegerType : getBitvectorTypeWithSize(8);
4247

4348
var var1 = mgr.makeVariable(BooleanType, "var1");
4449
var var2 = mgr.makeVariable(formulaType, "var2");
4550

4651
assertThrows(IllegalArgumentException.class, () -> mgr.equal(var1, var2));
52+
assertThrows(IllegalArgumentException.class, () -> mgr.distinct(var1, var2));
4753

4854
if (bvmgr != null) {
4955
var bv1 = mgr.makeVariable(getBitvectorTypeWithSize(8), "bv1");
5056
var bv2 = mgr.makeVariable(getBitvectorTypeWithSize(16), "bv2");
5157

5258
assertThrows(IllegalArgumentException.class, () -> mgr.equal(bv1, bv2));
59+
assertThrows(IllegalArgumentException.class, () -> mgr.distinct(bv1, bv2));
5360
}
5461

5562
if (amgr != null) {
@@ -60,18 +67,21 @@ public void testEqualityWrongSorts() {
6067
var arr2 = mgr.makeVariable(getArrayType(rangeType, domainType), "arr2");
6168

6269
assertThrows(IllegalArgumentException.class, () -> mgr.equal(arr1, arr2));
70+
assertThrows(IllegalArgumentException.class, () -> mgr.distinct(arr1, arr2));
6371
}
6472
}
6573

6674
@Test
67-
public void testEqualityWrongNumberArgs() {
68-
// Check that an exception is thrown if `=` is called with fewer than 2 arguments
75+
public void testWrongNumberArgs() {
76+
// Check that an exception is thrown if `=` or `distinct` is called with fewer than 2 arguments
6977
var formulaType = imgr != null ? IntegerType : getBitvectorTypeWithSize(8);
70-
7178
var var1 = mgr.makeVariable(formulaType, "var1");
7279

7380
assertThrows(IllegalArgumentException.class, () -> mgr.equal());
81+
assertThrows(IllegalArgumentException.class, () -> mgr.distinct());
82+
7483
assertThrows(IllegalArgumentException.class, () -> mgr.equal(var1));
84+
assertThrows(IllegalArgumentException.class, () -> mgr.distinct(var1));
7585
}
7686

7787
@Test
@@ -95,8 +105,53 @@ public void testEquality() {
95105
}
96106
}
97107

108+
private class Rebuilder extends FormulaTransformationVisitor {
109+
Rebuilder(FormulaManager fmgr) {
110+
super(fmgr);
111+
}
112+
113+
@Override
114+
public Formula visitFreeVariable(Formula f, String name) {
115+
return mgr.makeVariable(mgr.getFormulaType(f), name);
116+
}
117+
118+
@SuppressWarnings("unchecked")
119+
@Override
120+
public Formula visitFunction(
121+
Formula f, List<Formula> args, FunctionDeclaration<?> functionDeclaration) {
122+
switch (functionDeclaration.getKind()) {
123+
case AND:
124+
return bmgr.and((List<BooleanFormula>) (List<?>) args);
125+
case NOT:
126+
return bmgr.not((BooleanFormula) args.get(0));
127+
case EQ:
128+
return mgr.equal(args);
129+
case DISTINCT:
130+
return mgr.distinct(args);
131+
default:
132+
throw new UnsupportedOperationException();
133+
}
134+
}
135+
}
136+
137+
@Test
138+
public void testEqualityVisitor() {
139+
assume().that(solver).isNotEqualTo(Solvers.BOOLECTOR);
140+
141+
var formulaType = imgr != null ? IntegerType : getBitvectorTypeWithSize(8);
142+
143+
var var1 = mgr.makeVariable(formulaType, "var1");
144+
var var2 = mgr.makeVariable(formulaType, "var2");
145+
var var3 = mgr.makeVariable(formulaType, "var3");
146+
147+
var f = mgr.equal(var1, var2, var3);
148+
var g = mgr.transformRecursively(f, new Rebuilder(mgr));
149+
150+
assertThat(f).isEqualTo(g);
151+
}
152+
98153
@Test
99-
public void testEqualityRewrites() {
154+
public void testEqualityParser() {
100155
// Check that we can recreate `=` terms from the parser
101156
requireParser();
102157

@@ -105,18 +160,16 @@ public void testEqualityRewrites() {
105160
var var1 = mgr.makeVariable(formulaType, "var1");
106161
var var2 = mgr.makeVariable(formulaType, "var2");
107162
var var3 = mgr.makeVariable(formulaType, "var3");
108-
var var4 = mgr.makeVariable(formulaType, "var4");
109163

110164
var formulaSort = imgr != null ? "Int" : "(_ BitVec 8)";
111165

112166
var str =
113167
String.format("(define-const %s %s)", var1, formulaSort)
114168
+ String.format("(define-const %s %s)", var2, formulaSort)
115169
+ String.format("(define-const %s %s)", var3, formulaSort)
116-
+ String.format("(define-const %s %s)", var4, formulaSort)
117-
+ String.format("(assert (= %s %s %s %s))", var1, var2, var3, var4);
170+
+ String.format("(assert (= %s %s %s))", var1, var2, var3);
118171

119-
var f = mgr.equal(var1, var2, var3, var4);
172+
var f = mgr.equal(var1, var2, var3);
120173
var g = mgr.parse(str);
121174

122175
assertThat(f).isEqualTo(g);
@@ -149,7 +202,23 @@ public void testDistinct() {
149202
}
150203

151204
@Test
152-
public void testDistinctRewrites() {
205+
public void testDistinctVisitor() {
206+
assume().that(solver).isNotEqualTo(Solvers.BOOLECTOR);
207+
208+
var formulaType = imgr != null ? IntegerType : getBitvectorTypeWithSize(8);
209+
210+
var var1 = mgr.makeVariable(formulaType, "var1");
211+
var var2 = mgr.makeVariable(formulaType, "var2");
212+
var var3 = mgr.makeVariable(formulaType, "var3");
213+
214+
var f = mgr.distinct(var1, var2, var3);
215+
var g = mgr.transformRecursively(f, new Rebuilder(mgr));
216+
217+
assertThat(f).isEqualTo(g);
218+
}
219+
220+
@Test
221+
public void testDistinctParser() {
153222
// Check that we can recreate `distinct` terms from the parser
154223
requireParser();
155224

0 commit comments

Comments
 (0)