2222import com .google .common .testing .EqualsTester ;
2323import java .math .BigDecimal ;
2424import java .math .BigInteger ;
25+ import java .util .List ;
2526import java .util .Map ;
2627import org .junit .Test ;
2728import org .sosy_lab .java_smt .SolverContextFactory .Solvers ;
2829import org .sosy_lab .java_smt .api .ArrayFormula ;
2930import org .sosy_lab .java_smt .api .BitvectorFormula ;
3031import 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 ;
3134import org .sosy_lab .java_smt .api .FormulaType ;
3235import org .sosy_lab .java_smt .api .FunctionDeclaration ;
3336import org .sosy_lab .java_smt .api .NumeralFormula .IntegerFormula ;
3437import org .sosy_lab .java_smt .api .SolverException ;
38+ import org .sosy_lab .java_smt .api .visitors .FormulaTransformationVisitor ;
3539
3640public 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