1 |
|
/****************************************************************************** |
2 |
|
* Top contributors (to current version): |
3 |
|
* Aina Niemetz, Makai Mann, Andrew Reynolds |
4 |
|
* |
5 |
|
* This file is part of the cvc5 project. |
6 |
|
* |
7 |
|
* Copyright (c) 2009-2021 by the authors listed in the file AUTHORS |
8 |
|
* in the top-level source directory and their institutional affiliations. |
9 |
|
* All rights reserved. See the file COPYING in the top-level source |
10 |
|
* directory for licensing information. |
11 |
|
* **************************************************************************** |
12 |
|
* |
13 |
|
* Black box testing of the Term class. |
14 |
|
*/ |
15 |
|
|
16 |
|
#include "test_api.h" |
17 |
|
|
18 |
|
namespace cvc5 { |
19 |
|
|
20 |
|
using namespace api; |
21 |
|
|
22 |
|
namespace test { |
23 |
|
|
24 |
128 |
class TestApiBlackTerm : public TestApi |
25 |
|
{ |
26 |
|
}; |
27 |
|
|
28 |
41 |
TEST_F(TestApiBlackTerm, eq) |
29 |
|
{ |
30 |
4 |
Sort uSort = d_solver.mkUninterpretedSort("u"); |
31 |
4 |
Term x = d_solver.mkVar(uSort, "x"); |
32 |
4 |
Term y = d_solver.mkVar(uSort, "y"); |
33 |
4 |
Term z; |
34 |
|
|
35 |
2 |
ASSERT_TRUE(x == x); |
36 |
2 |
ASSERT_FALSE(x != x); |
37 |
2 |
ASSERT_FALSE(x == y); |
38 |
2 |
ASSERT_TRUE(x != y); |
39 |
2 |
ASSERT_FALSE((x == z)); |
40 |
2 |
ASSERT_TRUE(x != z); |
41 |
|
} |
42 |
|
|
43 |
41 |
TEST_F(TestApiBlackTerm, getId) |
44 |
|
{ |
45 |
4 |
Term n; |
46 |
4 |
ASSERT_THROW(n.getId(), CVC5ApiException); |
47 |
4 |
Term x = d_solver.mkVar(d_solver.getIntegerSort(), "x"); |
48 |
2 |
ASSERT_NO_THROW(x.getId()); |
49 |
4 |
Term y = x; |
50 |
2 |
ASSERT_EQ(x.getId(), y.getId()); |
51 |
|
|
52 |
4 |
Term z = d_solver.mkVar(d_solver.getIntegerSort(), "z"); |
53 |
2 |
ASSERT_NE(x.getId(), z.getId()); |
54 |
|
} |
55 |
|
|
56 |
41 |
TEST_F(TestApiBlackTerm, getKind) |
57 |
|
{ |
58 |
4 |
Sort uSort = d_solver.mkUninterpretedSort("u"); |
59 |
4 |
Sort intSort = d_solver.getIntegerSort(); |
60 |
4 |
Sort boolSort = d_solver.getBooleanSort(); |
61 |
4 |
Sort funSort1 = d_solver.mkFunctionSort(uSort, intSort); |
62 |
4 |
Sort funSort2 = d_solver.mkFunctionSort(intSort, boolSort); |
63 |
|
|
64 |
4 |
Term n; |
65 |
4 |
ASSERT_THROW(n.getKind(), CVC5ApiException); |
66 |
4 |
Term x = d_solver.mkVar(uSort, "x"); |
67 |
2 |
ASSERT_NO_THROW(x.getKind()); |
68 |
4 |
Term y = d_solver.mkVar(uSort, "y"); |
69 |
2 |
ASSERT_NO_THROW(y.getKind()); |
70 |
|
|
71 |
4 |
Term f = d_solver.mkVar(funSort1, "f"); |
72 |
2 |
ASSERT_NO_THROW(f.getKind()); |
73 |
4 |
Term p = d_solver.mkVar(funSort2, "p"); |
74 |
2 |
ASSERT_NO_THROW(p.getKind()); |
75 |
|
|
76 |
4 |
Term zero = d_solver.mkInteger(0); |
77 |
2 |
ASSERT_NO_THROW(zero.getKind()); |
78 |
|
|
79 |
4 |
Term f_x = d_solver.mkTerm(APPLY_UF, f, x); |
80 |
2 |
ASSERT_NO_THROW(f_x.getKind()); |
81 |
4 |
Term f_y = d_solver.mkTerm(APPLY_UF, f, y); |
82 |
2 |
ASSERT_NO_THROW(f_y.getKind()); |
83 |
4 |
Term sum = d_solver.mkTerm(PLUS, f_x, f_y); |
84 |
2 |
ASSERT_NO_THROW(sum.getKind()); |
85 |
4 |
Term p_0 = d_solver.mkTerm(APPLY_UF, p, zero); |
86 |
2 |
ASSERT_NO_THROW(p_0.getKind()); |
87 |
4 |
Term p_f_y = d_solver.mkTerm(APPLY_UF, p, f_y); |
88 |
2 |
ASSERT_NO_THROW(p_f_y.getKind()); |
89 |
|
|
90 |
|
// Sequence kinds do not exist internally, test that the API properly |
91 |
|
// converts them back. |
92 |
4 |
Sort seqSort = d_solver.mkSequenceSort(intSort); |
93 |
4 |
Term s = d_solver.mkConst(seqSort, "s"); |
94 |
4 |
Term ss = d_solver.mkTerm(SEQ_CONCAT, s, s); |
95 |
2 |
ASSERT_EQ(ss.getKind(), SEQ_CONCAT); |
96 |
|
} |
97 |
|
|
98 |
41 |
TEST_F(TestApiBlackTerm, getSort) |
99 |
|
{ |
100 |
4 |
Sort bvSort = d_solver.mkBitVectorSort(8); |
101 |
4 |
Sort intSort = d_solver.getIntegerSort(); |
102 |
4 |
Sort boolSort = d_solver.getBooleanSort(); |
103 |
4 |
Sort funSort1 = d_solver.mkFunctionSort(bvSort, intSort); |
104 |
4 |
Sort funSort2 = d_solver.mkFunctionSort(intSort, boolSort); |
105 |
|
|
106 |
4 |
Term n; |
107 |
4 |
ASSERT_THROW(n.getSort(), CVC5ApiException); |
108 |
4 |
Term x = d_solver.mkVar(bvSort, "x"); |
109 |
2 |
ASSERT_NO_THROW(x.getSort()); |
110 |
2 |
ASSERT_EQ(x.getSort(), bvSort); |
111 |
4 |
Term y = d_solver.mkVar(bvSort, "y"); |
112 |
2 |
ASSERT_NO_THROW(y.getSort()); |
113 |
2 |
ASSERT_EQ(y.getSort(), bvSort); |
114 |
|
|
115 |
4 |
Term f = d_solver.mkVar(funSort1, "f"); |
116 |
2 |
ASSERT_NO_THROW(f.getSort()); |
117 |
2 |
ASSERT_EQ(f.getSort(), funSort1); |
118 |
4 |
Term p = d_solver.mkVar(funSort2, "p"); |
119 |
2 |
ASSERT_NO_THROW(p.getSort()); |
120 |
2 |
ASSERT_EQ(p.getSort(), funSort2); |
121 |
|
|
122 |
4 |
Term zero = d_solver.mkInteger(0); |
123 |
2 |
ASSERT_NO_THROW(zero.getSort()); |
124 |
2 |
ASSERT_EQ(zero.getSort(), intSort); |
125 |
|
|
126 |
4 |
Term f_x = d_solver.mkTerm(APPLY_UF, f, x); |
127 |
2 |
ASSERT_NO_THROW(f_x.getSort()); |
128 |
2 |
ASSERT_EQ(f_x.getSort(), intSort); |
129 |
4 |
Term f_y = d_solver.mkTerm(APPLY_UF, f, y); |
130 |
2 |
ASSERT_NO_THROW(f_y.getSort()); |
131 |
2 |
ASSERT_EQ(f_y.getSort(), intSort); |
132 |
4 |
Term sum = d_solver.mkTerm(PLUS, f_x, f_y); |
133 |
2 |
ASSERT_NO_THROW(sum.getSort()); |
134 |
2 |
ASSERT_EQ(sum.getSort(), intSort); |
135 |
4 |
Term p_0 = d_solver.mkTerm(APPLY_UF, p, zero); |
136 |
2 |
ASSERT_NO_THROW(p_0.getSort()); |
137 |
2 |
ASSERT_EQ(p_0.getSort(), boolSort); |
138 |
4 |
Term p_f_y = d_solver.mkTerm(APPLY_UF, p, f_y); |
139 |
2 |
ASSERT_NO_THROW(p_f_y.getSort()); |
140 |
2 |
ASSERT_EQ(p_f_y.getSort(), boolSort); |
141 |
|
} |
142 |
|
|
143 |
41 |
TEST_F(TestApiBlackTerm, getOp) |
144 |
|
{ |
145 |
4 |
Sort intsort = d_solver.getIntegerSort(); |
146 |
4 |
Sort bvsort = d_solver.mkBitVectorSort(8); |
147 |
4 |
Sort arrsort = d_solver.mkArraySort(bvsort, intsort); |
148 |
4 |
Sort funsort = d_solver.mkFunctionSort(intsort, bvsort); |
149 |
|
|
150 |
4 |
Term x = d_solver.mkConst(intsort, "x"); |
151 |
4 |
Term a = d_solver.mkConst(arrsort, "a"); |
152 |
4 |
Term b = d_solver.mkConst(bvsort, "b"); |
153 |
|
|
154 |
2 |
ASSERT_FALSE(x.hasOp()); |
155 |
4 |
ASSERT_THROW(x.getOp(), CVC5ApiException); |
156 |
|
|
157 |
4 |
Term ab = d_solver.mkTerm(SELECT, a, b); |
158 |
4 |
Op ext = d_solver.mkOp(BITVECTOR_EXTRACT, 4, 0); |
159 |
4 |
Term extb = d_solver.mkTerm(ext, b); |
160 |
|
|
161 |
2 |
ASSERT_TRUE(ab.hasOp()); |
162 |
2 |
ASSERT_FALSE(ab.getOp().isIndexed()); |
163 |
|
// can compare directly to a Kind (will invoke Op constructor) |
164 |
2 |
ASSERT_TRUE(extb.hasOp()); |
165 |
2 |
ASSERT_TRUE(extb.getOp().isIndexed()); |
166 |
2 |
ASSERT_EQ(extb.getOp(), ext); |
167 |
|
|
168 |
4 |
Term f = d_solver.mkConst(funsort, "f"); |
169 |
4 |
Term fx = d_solver.mkTerm(APPLY_UF, f, x); |
170 |
|
|
171 |
2 |
ASSERT_FALSE(f.hasOp()); |
172 |
4 |
ASSERT_THROW(f.getOp(), CVC5ApiException); |
173 |
2 |
ASSERT_TRUE(fx.hasOp()); |
174 |
4 |
std::vector<Term> children(fx.begin(), fx.end()); |
175 |
|
// testing rebuild from op and children |
176 |
2 |
ASSERT_EQ(fx, d_solver.mkTerm(fx.getOp(), children)); |
177 |
|
|
178 |
|
// Test Datatypes Ops |
179 |
4 |
Sort sort = d_solver.mkParamSort("T"); |
180 |
4 |
DatatypeDecl listDecl = d_solver.mkDatatypeDecl("paramlist", sort); |
181 |
4 |
DatatypeConstructorDecl cons = d_solver.mkDatatypeConstructorDecl("cons"); |
182 |
4 |
DatatypeConstructorDecl nil = d_solver.mkDatatypeConstructorDecl("nil"); |
183 |
2 |
cons.addSelector("head", sort); |
184 |
2 |
cons.addSelectorSelf("tail"); |
185 |
2 |
listDecl.addConstructor(cons); |
186 |
2 |
listDecl.addConstructor(nil); |
187 |
4 |
Sort listSort = d_solver.mkDatatypeSort(listDecl); |
188 |
|
Sort intListSort = |
189 |
4 |
listSort.instantiate(std::vector<Sort>{d_solver.getIntegerSort()}); |
190 |
4 |
Term c = d_solver.mkConst(intListSort, "c"); |
191 |
4 |
Datatype list = listSort.getDatatype(); |
192 |
|
// list datatype constructor and selector operator terms |
193 |
4 |
Term consOpTerm = list.getConstructorTerm("cons"); |
194 |
4 |
Term nilOpTerm = list.getConstructorTerm("nil"); |
195 |
4 |
Term headOpTerm = list["cons"].getSelectorTerm("head"); |
196 |
4 |
Term tailOpTerm = list["cons"].getSelectorTerm("tail"); |
197 |
|
|
198 |
4 |
Term nilTerm = d_solver.mkTerm(APPLY_CONSTRUCTOR, nilOpTerm); |
199 |
|
Term consTerm = d_solver.mkTerm( |
200 |
4 |
APPLY_CONSTRUCTOR, consOpTerm, d_solver.mkInteger(0), nilTerm); |
201 |
4 |
Term headTerm = d_solver.mkTerm(APPLY_SELECTOR, headOpTerm, consTerm); |
202 |
4 |
Term tailTerm = d_solver.mkTerm(APPLY_SELECTOR, tailOpTerm, consTerm); |
203 |
|
|
204 |
2 |
ASSERT_TRUE(nilTerm.hasOp()); |
205 |
2 |
ASSERT_TRUE(consTerm.hasOp()); |
206 |
2 |
ASSERT_TRUE(headTerm.hasOp()); |
207 |
2 |
ASSERT_TRUE(tailTerm.hasOp()); |
208 |
|
|
209 |
|
// Test rebuilding |
210 |
2 |
children.clear(); |
211 |
2 |
children.insert(children.begin(), headTerm.begin(), headTerm.end()); |
212 |
2 |
ASSERT_EQ(headTerm, d_solver.mkTerm(headTerm.getOp(), children)); |
213 |
|
} |
214 |
|
|
215 |
41 |
TEST_F(TestApiBlackTerm, isNull) |
216 |
|
{ |
217 |
4 |
Term x; |
218 |
2 |
ASSERT_TRUE(x.isNull()); |
219 |
2 |
x = d_solver.mkVar(d_solver.mkBitVectorSort(4), "x"); |
220 |
2 |
ASSERT_FALSE(x.isNull()); |
221 |
|
} |
222 |
|
|
223 |
41 |
TEST_F(TestApiBlackTerm, notTerm) |
224 |
|
{ |
225 |
4 |
Sort bvSort = d_solver.mkBitVectorSort(8); |
226 |
4 |
Sort intSort = d_solver.getIntegerSort(); |
227 |
4 |
Sort boolSort = d_solver.getBooleanSort(); |
228 |
4 |
Sort funSort1 = d_solver.mkFunctionSort(bvSort, intSort); |
229 |
4 |
Sort funSort2 = d_solver.mkFunctionSort(intSort, boolSort); |
230 |
|
|
231 |
4 |
ASSERT_THROW(Term().notTerm(), CVC5ApiException); |
232 |
4 |
Term b = d_solver.mkTrue(); |
233 |
2 |
ASSERT_NO_THROW(b.notTerm()); |
234 |
4 |
Term x = d_solver.mkVar(d_solver.mkBitVectorSort(8), "x"); |
235 |
4 |
ASSERT_THROW(x.notTerm(), CVC5ApiException); |
236 |
4 |
Term f = d_solver.mkVar(funSort1, "f"); |
237 |
4 |
ASSERT_THROW(f.notTerm(), CVC5ApiException); |
238 |
4 |
Term p = d_solver.mkVar(funSort2, "p"); |
239 |
4 |
ASSERT_THROW(p.notTerm(), CVC5ApiException); |
240 |
4 |
Term zero = d_solver.mkInteger(0); |
241 |
4 |
ASSERT_THROW(zero.notTerm(), CVC5ApiException); |
242 |
4 |
Term f_x = d_solver.mkTerm(APPLY_UF, f, x); |
243 |
4 |
ASSERT_THROW(f_x.notTerm(), CVC5ApiException); |
244 |
4 |
Term sum = d_solver.mkTerm(PLUS, f_x, f_x); |
245 |
4 |
ASSERT_THROW(sum.notTerm(), CVC5ApiException); |
246 |
4 |
Term p_0 = d_solver.mkTerm(APPLY_UF, p, zero); |
247 |
2 |
ASSERT_NO_THROW(p_0.notTerm()); |
248 |
4 |
Term p_f_x = d_solver.mkTerm(APPLY_UF, p, f_x); |
249 |
2 |
ASSERT_NO_THROW(p_f_x.notTerm()); |
250 |
|
} |
251 |
|
|
252 |
41 |
TEST_F(TestApiBlackTerm, andTerm) |
253 |
|
{ |
254 |
4 |
Sort bvSort = d_solver.mkBitVectorSort(8); |
255 |
4 |
Sort intSort = d_solver.getIntegerSort(); |
256 |
4 |
Sort boolSort = d_solver.getBooleanSort(); |
257 |
4 |
Sort funSort1 = d_solver.mkFunctionSort(bvSort, intSort); |
258 |
4 |
Sort funSort2 = d_solver.mkFunctionSort(intSort, boolSort); |
259 |
|
|
260 |
4 |
Term b = d_solver.mkTrue(); |
261 |
4 |
ASSERT_THROW(Term().andTerm(b), CVC5ApiException); |
262 |
4 |
ASSERT_THROW(b.andTerm(Term()), CVC5ApiException); |
263 |
2 |
ASSERT_NO_THROW(b.andTerm(b)); |
264 |
4 |
Term x = d_solver.mkVar(d_solver.mkBitVectorSort(8), "x"); |
265 |
4 |
ASSERT_THROW(x.andTerm(b), CVC5ApiException); |
266 |
4 |
ASSERT_THROW(x.andTerm(x), CVC5ApiException); |
267 |
4 |
Term f = d_solver.mkVar(funSort1, "f"); |
268 |
4 |
ASSERT_THROW(f.andTerm(b), CVC5ApiException); |
269 |
4 |
ASSERT_THROW(f.andTerm(x), CVC5ApiException); |
270 |
4 |
ASSERT_THROW(f.andTerm(f), CVC5ApiException); |
271 |
4 |
Term p = d_solver.mkVar(funSort2, "p"); |
272 |
4 |
ASSERT_THROW(p.andTerm(b), CVC5ApiException); |
273 |
4 |
ASSERT_THROW(p.andTerm(x), CVC5ApiException); |
274 |
4 |
ASSERT_THROW(p.andTerm(f), CVC5ApiException); |
275 |
4 |
ASSERT_THROW(p.andTerm(p), CVC5ApiException); |
276 |
4 |
Term zero = d_solver.mkInteger(0); |
277 |
4 |
ASSERT_THROW(zero.andTerm(b), CVC5ApiException); |
278 |
4 |
ASSERT_THROW(zero.andTerm(x), CVC5ApiException); |
279 |
4 |
ASSERT_THROW(zero.andTerm(f), CVC5ApiException); |
280 |
4 |
ASSERT_THROW(zero.andTerm(p), CVC5ApiException); |
281 |
4 |
ASSERT_THROW(zero.andTerm(zero), CVC5ApiException); |
282 |
4 |
Term f_x = d_solver.mkTerm(APPLY_UF, f, x); |
283 |
4 |
ASSERT_THROW(f_x.andTerm(b), CVC5ApiException); |
284 |
4 |
ASSERT_THROW(f_x.andTerm(x), CVC5ApiException); |
285 |
4 |
ASSERT_THROW(f_x.andTerm(f), CVC5ApiException); |
286 |
4 |
ASSERT_THROW(f_x.andTerm(p), CVC5ApiException); |
287 |
4 |
ASSERT_THROW(f_x.andTerm(zero), CVC5ApiException); |
288 |
4 |
ASSERT_THROW(f_x.andTerm(f_x), CVC5ApiException); |
289 |
4 |
Term sum = d_solver.mkTerm(PLUS, f_x, f_x); |
290 |
4 |
ASSERT_THROW(sum.andTerm(b), CVC5ApiException); |
291 |
4 |
ASSERT_THROW(sum.andTerm(x), CVC5ApiException); |
292 |
4 |
ASSERT_THROW(sum.andTerm(f), CVC5ApiException); |
293 |
4 |
ASSERT_THROW(sum.andTerm(p), CVC5ApiException); |
294 |
4 |
ASSERT_THROW(sum.andTerm(zero), CVC5ApiException); |
295 |
4 |
ASSERT_THROW(sum.andTerm(f_x), CVC5ApiException); |
296 |
4 |
ASSERT_THROW(sum.andTerm(sum), CVC5ApiException); |
297 |
4 |
Term p_0 = d_solver.mkTerm(APPLY_UF, p, zero); |
298 |
2 |
ASSERT_NO_THROW(p_0.andTerm(b)); |
299 |
4 |
ASSERT_THROW(p_0.andTerm(x), CVC5ApiException); |
300 |
4 |
ASSERT_THROW(p_0.andTerm(f), CVC5ApiException); |
301 |
4 |
ASSERT_THROW(p_0.andTerm(p), CVC5ApiException); |
302 |
4 |
ASSERT_THROW(p_0.andTerm(zero), CVC5ApiException); |
303 |
4 |
ASSERT_THROW(p_0.andTerm(f_x), CVC5ApiException); |
304 |
4 |
ASSERT_THROW(p_0.andTerm(sum), CVC5ApiException); |
305 |
2 |
ASSERT_NO_THROW(p_0.andTerm(p_0)); |
306 |
4 |
Term p_f_x = d_solver.mkTerm(APPLY_UF, p, f_x); |
307 |
2 |
ASSERT_NO_THROW(p_f_x.andTerm(b)); |
308 |
4 |
ASSERT_THROW(p_f_x.andTerm(x), CVC5ApiException); |
309 |
4 |
ASSERT_THROW(p_f_x.andTerm(f), CVC5ApiException); |
310 |
4 |
ASSERT_THROW(p_f_x.andTerm(p), CVC5ApiException); |
311 |
4 |
ASSERT_THROW(p_f_x.andTerm(zero), CVC5ApiException); |
312 |
4 |
ASSERT_THROW(p_f_x.andTerm(f_x), CVC5ApiException); |
313 |
4 |
ASSERT_THROW(p_f_x.andTerm(sum), CVC5ApiException); |
314 |
2 |
ASSERT_NO_THROW(p_f_x.andTerm(p_0)); |
315 |
2 |
ASSERT_NO_THROW(p_f_x.andTerm(p_f_x)); |
316 |
|
} |
317 |
|
|
318 |
41 |
TEST_F(TestApiBlackTerm, orTerm) |
319 |
|
{ |
320 |
4 |
Sort bvSort = d_solver.mkBitVectorSort(8); |
321 |
4 |
Sort intSort = d_solver.getIntegerSort(); |
322 |
4 |
Sort boolSort = d_solver.getBooleanSort(); |
323 |
4 |
Sort funSort1 = d_solver.mkFunctionSort(bvSort, intSort); |
324 |
4 |
Sort funSort2 = d_solver.mkFunctionSort(intSort, boolSort); |
325 |
|
|
326 |
4 |
Term b = d_solver.mkTrue(); |
327 |
4 |
ASSERT_THROW(Term().orTerm(b), CVC5ApiException); |
328 |
4 |
ASSERT_THROW(b.orTerm(Term()), CVC5ApiException); |
329 |
2 |
ASSERT_NO_THROW(b.orTerm(b)); |
330 |
4 |
Term x = d_solver.mkVar(d_solver.mkBitVectorSort(8), "x"); |
331 |
4 |
ASSERT_THROW(x.orTerm(b), CVC5ApiException); |
332 |
4 |
ASSERT_THROW(x.orTerm(x), CVC5ApiException); |
333 |
4 |
Term f = d_solver.mkVar(funSort1, "f"); |
334 |
4 |
ASSERT_THROW(f.orTerm(b), CVC5ApiException); |
335 |
4 |
ASSERT_THROW(f.orTerm(x), CVC5ApiException); |
336 |
4 |
ASSERT_THROW(f.orTerm(f), CVC5ApiException); |
337 |
4 |
Term p = d_solver.mkVar(funSort2, "p"); |
338 |
4 |
ASSERT_THROW(p.orTerm(b), CVC5ApiException); |
339 |
4 |
ASSERT_THROW(p.orTerm(x), CVC5ApiException); |
340 |
4 |
ASSERT_THROW(p.orTerm(f), CVC5ApiException); |
341 |
4 |
ASSERT_THROW(p.orTerm(p), CVC5ApiException); |
342 |
4 |
Term zero = d_solver.mkInteger(0); |
343 |
4 |
ASSERT_THROW(zero.orTerm(b), CVC5ApiException); |
344 |
4 |
ASSERT_THROW(zero.orTerm(x), CVC5ApiException); |
345 |
4 |
ASSERT_THROW(zero.orTerm(f), CVC5ApiException); |
346 |
4 |
ASSERT_THROW(zero.orTerm(p), CVC5ApiException); |
347 |
4 |
ASSERT_THROW(zero.orTerm(zero), CVC5ApiException); |
348 |
4 |
Term f_x = d_solver.mkTerm(APPLY_UF, f, x); |
349 |
4 |
ASSERT_THROW(f_x.orTerm(b), CVC5ApiException); |
350 |
4 |
ASSERT_THROW(f_x.orTerm(x), CVC5ApiException); |
351 |
4 |
ASSERT_THROW(f_x.orTerm(f), CVC5ApiException); |
352 |
4 |
ASSERT_THROW(f_x.orTerm(p), CVC5ApiException); |
353 |
4 |
ASSERT_THROW(f_x.orTerm(zero), CVC5ApiException); |
354 |
4 |
ASSERT_THROW(f_x.orTerm(f_x), CVC5ApiException); |
355 |
4 |
Term sum = d_solver.mkTerm(PLUS, f_x, f_x); |
356 |
4 |
ASSERT_THROW(sum.orTerm(b), CVC5ApiException); |
357 |
4 |
ASSERT_THROW(sum.orTerm(x), CVC5ApiException); |
358 |
4 |
ASSERT_THROW(sum.orTerm(f), CVC5ApiException); |
359 |
4 |
ASSERT_THROW(sum.orTerm(p), CVC5ApiException); |
360 |
4 |
ASSERT_THROW(sum.orTerm(zero), CVC5ApiException); |
361 |
4 |
ASSERT_THROW(sum.orTerm(f_x), CVC5ApiException); |
362 |
4 |
ASSERT_THROW(sum.orTerm(sum), CVC5ApiException); |
363 |
4 |
Term p_0 = d_solver.mkTerm(APPLY_UF, p, zero); |
364 |
2 |
ASSERT_NO_THROW(p_0.orTerm(b)); |
365 |
4 |
ASSERT_THROW(p_0.orTerm(x), CVC5ApiException); |
366 |
4 |
ASSERT_THROW(p_0.orTerm(f), CVC5ApiException); |
367 |
4 |
ASSERT_THROW(p_0.orTerm(p), CVC5ApiException); |
368 |
4 |
ASSERT_THROW(p_0.orTerm(zero), CVC5ApiException); |
369 |
4 |
ASSERT_THROW(p_0.orTerm(f_x), CVC5ApiException); |
370 |
4 |
ASSERT_THROW(p_0.orTerm(sum), CVC5ApiException); |
371 |
2 |
ASSERT_NO_THROW(p_0.orTerm(p_0)); |
372 |
4 |
Term p_f_x = d_solver.mkTerm(APPLY_UF, p, f_x); |
373 |
2 |
ASSERT_NO_THROW(p_f_x.orTerm(b)); |
374 |
4 |
ASSERT_THROW(p_f_x.orTerm(x), CVC5ApiException); |
375 |
4 |
ASSERT_THROW(p_f_x.orTerm(f), CVC5ApiException); |
376 |
4 |
ASSERT_THROW(p_f_x.orTerm(p), CVC5ApiException); |
377 |
4 |
ASSERT_THROW(p_f_x.orTerm(zero), CVC5ApiException); |
378 |
4 |
ASSERT_THROW(p_f_x.orTerm(f_x), CVC5ApiException); |
379 |
4 |
ASSERT_THROW(p_f_x.orTerm(sum), CVC5ApiException); |
380 |
2 |
ASSERT_NO_THROW(p_f_x.orTerm(p_0)); |
381 |
2 |
ASSERT_NO_THROW(p_f_x.orTerm(p_f_x)); |
382 |
|
} |
383 |
|
|
384 |
41 |
TEST_F(TestApiBlackTerm, xorTerm) |
385 |
|
{ |
386 |
4 |
Sort bvSort = d_solver.mkBitVectorSort(8); |
387 |
4 |
Sort intSort = d_solver.getIntegerSort(); |
388 |
4 |
Sort boolSort = d_solver.getBooleanSort(); |
389 |
4 |
Sort funSort1 = d_solver.mkFunctionSort(bvSort, intSort); |
390 |
4 |
Sort funSort2 = d_solver.mkFunctionSort(intSort, boolSort); |
391 |
|
|
392 |
4 |
Term b = d_solver.mkTrue(); |
393 |
4 |
ASSERT_THROW(Term().xorTerm(b), CVC5ApiException); |
394 |
4 |
ASSERT_THROW(b.xorTerm(Term()), CVC5ApiException); |
395 |
2 |
ASSERT_NO_THROW(b.xorTerm(b)); |
396 |
4 |
Term x = d_solver.mkVar(d_solver.mkBitVectorSort(8), "x"); |
397 |
4 |
ASSERT_THROW(x.xorTerm(b), CVC5ApiException); |
398 |
4 |
ASSERT_THROW(x.xorTerm(x), CVC5ApiException); |
399 |
4 |
Term f = d_solver.mkVar(funSort1, "f"); |
400 |
4 |
ASSERT_THROW(f.xorTerm(b), CVC5ApiException); |
401 |
4 |
ASSERT_THROW(f.xorTerm(x), CVC5ApiException); |
402 |
4 |
ASSERT_THROW(f.xorTerm(f), CVC5ApiException); |
403 |
4 |
Term p = d_solver.mkVar(funSort2, "p"); |
404 |
4 |
ASSERT_THROW(p.xorTerm(b), CVC5ApiException); |
405 |
4 |
ASSERT_THROW(p.xorTerm(x), CVC5ApiException); |
406 |
4 |
ASSERT_THROW(p.xorTerm(f), CVC5ApiException); |
407 |
4 |
ASSERT_THROW(p.xorTerm(p), CVC5ApiException); |
408 |
4 |
Term zero = d_solver.mkInteger(0); |
409 |
4 |
ASSERT_THROW(zero.xorTerm(b), CVC5ApiException); |
410 |
4 |
ASSERT_THROW(zero.xorTerm(x), CVC5ApiException); |
411 |
4 |
ASSERT_THROW(zero.xorTerm(f), CVC5ApiException); |
412 |
4 |
ASSERT_THROW(zero.xorTerm(p), CVC5ApiException); |
413 |
4 |
ASSERT_THROW(zero.xorTerm(zero), CVC5ApiException); |
414 |
4 |
Term f_x = d_solver.mkTerm(APPLY_UF, f, x); |
415 |
4 |
ASSERT_THROW(f_x.xorTerm(b), CVC5ApiException); |
416 |
4 |
ASSERT_THROW(f_x.xorTerm(x), CVC5ApiException); |
417 |
4 |
ASSERT_THROW(f_x.xorTerm(f), CVC5ApiException); |
418 |
4 |
ASSERT_THROW(f_x.xorTerm(p), CVC5ApiException); |
419 |
4 |
ASSERT_THROW(f_x.xorTerm(zero), CVC5ApiException); |
420 |
4 |
ASSERT_THROW(f_x.xorTerm(f_x), CVC5ApiException); |
421 |
4 |
Term sum = d_solver.mkTerm(PLUS, f_x, f_x); |
422 |
4 |
ASSERT_THROW(sum.xorTerm(b), CVC5ApiException); |
423 |
4 |
ASSERT_THROW(sum.xorTerm(x), CVC5ApiException); |
424 |
4 |
ASSERT_THROW(sum.xorTerm(f), CVC5ApiException); |
425 |
4 |
ASSERT_THROW(sum.xorTerm(p), CVC5ApiException); |
426 |
4 |
ASSERT_THROW(sum.xorTerm(zero), CVC5ApiException); |
427 |
4 |
ASSERT_THROW(sum.xorTerm(f_x), CVC5ApiException); |
428 |
4 |
ASSERT_THROW(sum.xorTerm(sum), CVC5ApiException); |
429 |
4 |
Term p_0 = d_solver.mkTerm(APPLY_UF, p, zero); |
430 |
2 |
ASSERT_NO_THROW(p_0.xorTerm(b)); |
431 |
4 |
ASSERT_THROW(p_0.xorTerm(x), CVC5ApiException); |
432 |
4 |
ASSERT_THROW(p_0.xorTerm(f), CVC5ApiException); |
433 |
4 |
ASSERT_THROW(p_0.xorTerm(p), CVC5ApiException); |
434 |
4 |
ASSERT_THROW(p_0.xorTerm(zero), CVC5ApiException); |
435 |
4 |
ASSERT_THROW(p_0.xorTerm(f_x), CVC5ApiException); |
436 |
4 |
ASSERT_THROW(p_0.xorTerm(sum), CVC5ApiException); |
437 |
2 |
ASSERT_NO_THROW(p_0.xorTerm(p_0)); |
438 |
4 |
Term p_f_x = d_solver.mkTerm(APPLY_UF, p, f_x); |
439 |
2 |
ASSERT_NO_THROW(p_f_x.xorTerm(b)); |
440 |
4 |
ASSERT_THROW(p_f_x.xorTerm(x), CVC5ApiException); |
441 |
4 |
ASSERT_THROW(p_f_x.xorTerm(f), CVC5ApiException); |
442 |
4 |
ASSERT_THROW(p_f_x.xorTerm(p), CVC5ApiException); |
443 |
4 |
ASSERT_THROW(p_f_x.xorTerm(zero), CVC5ApiException); |
444 |
4 |
ASSERT_THROW(p_f_x.xorTerm(f_x), CVC5ApiException); |
445 |
4 |
ASSERT_THROW(p_f_x.xorTerm(sum), CVC5ApiException); |
446 |
2 |
ASSERT_NO_THROW(p_f_x.xorTerm(p_0)); |
447 |
2 |
ASSERT_NO_THROW(p_f_x.xorTerm(p_f_x)); |
448 |
|
} |
449 |
|
|
450 |
41 |
TEST_F(TestApiBlackTerm, eqTerm) |
451 |
|
{ |
452 |
4 |
Sort bvSort = d_solver.mkBitVectorSort(8); |
453 |
4 |
Sort intSort = d_solver.getIntegerSort(); |
454 |
4 |
Sort boolSort = d_solver.getBooleanSort(); |
455 |
4 |
Sort funSort1 = d_solver.mkFunctionSort(bvSort, intSort); |
456 |
4 |
Sort funSort2 = d_solver.mkFunctionSort(intSort, boolSort); |
457 |
|
|
458 |
4 |
Term b = d_solver.mkTrue(); |
459 |
4 |
ASSERT_THROW(Term().eqTerm(b), CVC5ApiException); |
460 |
4 |
ASSERT_THROW(b.eqTerm(Term()), CVC5ApiException); |
461 |
2 |
ASSERT_NO_THROW(b.eqTerm(b)); |
462 |
4 |
Term x = d_solver.mkVar(d_solver.mkBitVectorSort(8), "x"); |
463 |
4 |
ASSERT_THROW(x.eqTerm(b), CVC5ApiException); |
464 |
2 |
ASSERT_NO_THROW(x.eqTerm(x)); |
465 |
4 |
Term f = d_solver.mkVar(funSort1, "f"); |
466 |
4 |
ASSERT_THROW(f.eqTerm(b), CVC5ApiException); |
467 |
4 |
ASSERT_THROW(f.eqTerm(x), CVC5ApiException); |
468 |
2 |
ASSERT_NO_THROW(f.eqTerm(f)); |
469 |
4 |
Term p = d_solver.mkVar(funSort2, "p"); |
470 |
4 |
ASSERT_THROW(p.eqTerm(b), CVC5ApiException); |
471 |
4 |
ASSERT_THROW(p.eqTerm(x), CVC5ApiException); |
472 |
4 |
ASSERT_THROW(p.eqTerm(f), CVC5ApiException); |
473 |
2 |
ASSERT_NO_THROW(p.eqTerm(p)); |
474 |
4 |
Term zero = d_solver.mkInteger(0); |
475 |
4 |
ASSERT_THROW(zero.eqTerm(b), CVC5ApiException); |
476 |
4 |
ASSERT_THROW(zero.eqTerm(x), CVC5ApiException); |
477 |
4 |
ASSERT_THROW(zero.eqTerm(f), CVC5ApiException); |
478 |
4 |
ASSERT_THROW(zero.eqTerm(p), CVC5ApiException); |
479 |
2 |
ASSERT_NO_THROW(zero.eqTerm(zero)); |
480 |
4 |
Term f_x = d_solver.mkTerm(APPLY_UF, f, x); |
481 |
4 |
ASSERT_THROW(f_x.eqTerm(b), CVC5ApiException); |
482 |
4 |
ASSERT_THROW(f_x.eqTerm(x), CVC5ApiException); |
483 |
4 |
ASSERT_THROW(f_x.eqTerm(f), CVC5ApiException); |
484 |
4 |
ASSERT_THROW(f_x.eqTerm(p), CVC5ApiException); |
485 |
2 |
ASSERT_NO_THROW(f_x.eqTerm(zero)); |
486 |
2 |
ASSERT_NO_THROW(f_x.eqTerm(f_x)); |
487 |
4 |
Term sum = d_solver.mkTerm(PLUS, f_x, f_x); |
488 |
4 |
ASSERT_THROW(sum.eqTerm(b), CVC5ApiException); |
489 |
4 |
ASSERT_THROW(sum.eqTerm(x), CVC5ApiException); |
490 |
4 |
ASSERT_THROW(sum.eqTerm(f), CVC5ApiException); |
491 |
4 |
ASSERT_THROW(sum.eqTerm(p), CVC5ApiException); |
492 |
2 |
ASSERT_NO_THROW(sum.eqTerm(zero)); |
493 |
2 |
ASSERT_NO_THROW(sum.eqTerm(f_x)); |
494 |
2 |
ASSERT_NO_THROW(sum.eqTerm(sum)); |
495 |
4 |
Term p_0 = d_solver.mkTerm(APPLY_UF, p, zero); |
496 |
2 |
ASSERT_NO_THROW(p_0.eqTerm(b)); |
497 |
4 |
ASSERT_THROW(p_0.eqTerm(x), CVC5ApiException); |
498 |
4 |
ASSERT_THROW(p_0.eqTerm(f), CVC5ApiException); |
499 |
4 |
ASSERT_THROW(p_0.eqTerm(p), CVC5ApiException); |
500 |
4 |
ASSERT_THROW(p_0.eqTerm(zero), CVC5ApiException); |
501 |
4 |
ASSERT_THROW(p_0.eqTerm(f_x), CVC5ApiException); |
502 |
4 |
ASSERT_THROW(p_0.eqTerm(sum), CVC5ApiException); |
503 |
2 |
ASSERT_NO_THROW(p_0.eqTerm(p_0)); |
504 |
4 |
Term p_f_x = d_solver.mkTerm(APPLY_UF, p, f_x); |
505 |
2 |
ASSERT_NO_THROW(p_f_x.eqTerm(b)); |
506 |
4 |
ASSERT_THROW(p_f_x.eqTerm(x), CVC5ApiException); |
507 |
4 |
ASSERT_THROW(p_f_x.eqTerm(f), CVC5ApiException); |
508 |
4 |
ASSERT_THROW(p_f_x.eqTerm(p), CVC5ApiException); |
509 |
4 |
ASSERT_THROW(p_f_x.eqTerm(zero), CVC5ApiException); |
510 |
4 |
ASSERT_THROW(p_f_x.eqTerm(f_x), CVC5ApiException); |
511 |
4 |
ASSERT_THROW(p_f_x.eqTerm(sum), CVC5ApiException); |
512 |
2 |
ASSERT_NO_THROW(p_f_x.eqTerm(p_0)); |
513 |
2 |
ASSERT_NO_THROW(p_f_x.eqTerm(p_f_x)); |
514 |
|
} |
515 |
|
|
516 |
41 |
TEST_F(TestApiBlackTerm, impTerm) |
517 |
|
{ |
518 |
4 |
Sort bvSort = d_solver.mkBitVectorSort(8); |
519 |
4 |
Sort intSort = d_solver.getIntegerSort(); |
520 |
4 |
Sort boolSort = d_solver.getBooleanSort(); |
521 |
4 |
Sort funSort1 = d_solver.mkFunctionSort(bvSort, intSort); |
522 |
4 |
Sort funSort2 = d_solver.mkFunctionSort(intSort, boolSort); |
523 |
|
|
524 |
4 |
Term b = d_solver.mkTrue(); |
525 |
4 |
ASSERT_THROW(Term().impTerm(b), CVC5ApiException); |
526 |
4 |
ASSERT_THROW(b.impTerm(Term()), CVC5ApiException); |
527 |
2 |
ASSERT_NO_THROW(b.impTerm(b)); |
528 |
4 |
Term x = d_solver.mkVar(d_solver.mkBitVectorSort(8), "x"); |
529 |
4 |
ASSERT_THROW(x.impTerm(b), CVC5ApiException); |
530 |
4 |
ASSERT_THROW(x.impTerm(x), CVC5ApiException); |
531 |
4 |
Term f = d_solver.mkVar(funSort1, "f"); |
532 |
4 |
ASSERT_THROW(f.impTerm(b), CVC5ApiException); |
533 |
4 |
ASSERT_THROW(f.impTerm(x), CVC5ApiException); |
534 |
4 |
ASSERT_THROW(f.impTerm(f), CVC5ApiException); |
535 |
4 |
Term p = d_solver.mkVar(funSort2, "p"); |
536 |
4 |
ASSERT_THROW(p.impTerm(b), CVC5ApiException); |
537 |
4 |
ASSERT_THROW(p.impTerm(x), CVC5ApiException); |
538 |
4 |
ASSERT_THROW(p.impTerm(f), CVC5ApiException); |
539 |
4 |
ASSERT_THROW(p.impTerm(p), CVC5ApiException); |
540 |
4 |
Term zero = d_solver.mkInteger(0); |
541 |
4 |
ASSERT_THROW(zero.impTerm(b), CVC5ApiException); |
542 |
4 |
ASSERT_THROW(zero.impTerm(x), CVC5ApiException); |
543 |
4 |
ASSERT_THROW(zero.impTerm(f), CVC5ApiException); |
544 |
4 |
ASSERT_THROW(zero.impTerm(p), CVC5ApiException); |
545 |
4 |
ASSERT_THROW(zero.impTerm(zero), CVC5ApiException); |
546 |
4 |
Term f_x = d_solver.mkTerm(APPLY_UF, f, x); |
547 |
4 |
ASSERT_THROW(f_x.impTerm(b), CVC5ApiException); |
548 |
4 |
ASSERT_THROW(f_x.impTerm(x), CVC5ApiException); |
549 |
4 |
ASSERT_THROW(f_x.impTerm(f), CVC5ApiException); |
550 |
4 |
ASSERT_THROW(f_x.impTerm(p), CVC5ApiException); |
551 |
4 |
ASSERT_THROW(f_x.impTerm(zero), CVC5ApiException); |
552 |
4 |
ASSERT_THROW(f_x.impTerm(f_x), CVC5ApiException); |
553 |
4 |
Term sum = d_solver.mkTerm(PLUS, f_x, f_x); |
554 |
4 |
ASSERT_THROW(sum.impTerm(b), CVC5ApiException); |
555 |
4 |
ASSERT_THROW(sum.impTerm(x), CVC5ApiException); |
556 |
4 |
ASSERT_THROW(sum.impTerm(f), CVC5ApiException); |
557 |
4 |
ASSERT_THROW(sum.impTerm(p), CVC5ApiException); |
558 |
4 |
ASSERT_THROW(sum.impTerm(zero), CVC5ApiException); |
559 |
4 |
ASSERT_THROW(sum.impTerm(f_x), CVC5ApiException); |
560 |
4 |
ASSERT_THROW(sum.impTerm(sum), CVC5ApiException); |
561 |
4 |
Term p_0 = d_solver.mkTerm(APPLY_UF, p, zero); |
562 |
2 |
ASSERT_NO_THROW(p_0.impTerm(b)); |
563 |
4 |
ASSERT_THROW(p_0.impTerm(x), CVC5ApiException); |
564 |
4 |
ASSERT_THROW(p_0.impTerm(f), CVC5ApiException); |
565 |
4 |
ASSERT_THROW(p_0.impTerm(p), CVC5ApiException); |
566 |
4 |
ASSERT_THROW(p_0.impTerm(zero), CVC5ApiException); |
567 |
4 |
ASSERT_THROW(p_0.impTerm(f_x), CVC5ApiException); |
568 |
4 |
ASSERT_THROW(p_0.impTerm(sum), CVC5ApiException); |
569 |
2 |
ASSERT_NO_THROW(p_0.impTerm(p_0)); |
570 |
4 |
Term p_f_x = d_solver.mkTerm(APPLY_UF, p, f_x); |
571 |
2 |
ASSERT_NO_THROW(p_f_x.impTerm(b)); |
572 |
4 |
ASSERT_THROW(p_f_x.impTerm(x), CVC5ApiException); |
573 |
4 |
ASSERT_THROW(p_f_x.impTerm(f), CVC5ApiException); |
574 |
4 |
ASSERT_THROW(p_f_x.impTerm(p), CVC5ApiException); |
575 |
4 |
ASSERT_THROW(p_f_x.impTerm(zero), CVC5ApiException); |
576 |
4 |
ASSERT_THROW(p_f_x.impTerm(f_x), CVC5ApiException); |
577 |
4 |
ASSERT_THROW(p_f_x.impTerm(sum), CVC5ApiException); |
578 |
2 |
ASSERT_NO_THROW(p_f_x.impTerm(p_0)); |
579 |
2 |
ASSERT_NO_THROW(p_f_x.impTerm(p_f_x)); |
580 |
|
} |
581 |
|
|
582 |
41 |
TEST_F(TestApiBlackTerm, iteTerm) |
583 |
|
{ |
584 |
4 |
Sort bvSort = d_solver.mkBitVectorSort(8); |
585 |
4 |
Sort intSort = d_solver.getIntegerSort(); |
586 |
4 |
Sort boolSort = d_solver.getBooleanSort(); |
587 |
4 |
Sort funSort1 = d_solver.mkFunctionSort(bvSort, intSort); |
588 |
4 |
Sort funSort2 = d_solver.mkFunctionSort(intSort, boolSort); |
589 |
|
|
590 |
4 |
Term b = d_solver.mkTrue(); |
591 |
4 |
ASSERT_THROW(Term().iteTerm(b, b), CVC5ApiException); |
592 |
4 |
ASSERT_THROW(b.iteTerm(Term(), b), CVC5ApiException); |
593 |
4 |
ASSERT_THROW(b.iteTerm(b, Term()), CVC5ApiException); |
594 |
2 |
ASSERT_NO_THROW(b.iteTerm(b, b)); |
595 |
4 |
Term x = d_solver.mkVar(d_solver.mkBitVectorSort(8), "x"); |
596 |
2 |
ASSERT_NO_THROW(b.iteTerm(x, x)); |
597 |
2 |
ASSERT_NO_THROW(b.iteTerm(b, b)); |
598 |
4 |
ASSERT_THROW(b.iteTerm(x, b), CVC5ApiException); |
599 |
4 |
ASSERT_THROW(x.iteTerm(x, x), CVC5ApiException); |
600 |
4 |
ASSERT_THROW(x.iteTerm(x, b), CVC5ApiException); |
601 |
4 |
Term f = d_solver.mkVar(funSort1, "f"); |
602 |
4 |
ASSERT_THROW(f.iteTerm(b, b), CVC5ApiException); |
603 |
4 |
ASSERT_THROW(x.iteTerm(b, x), CVC5ApiException); |
604 |
4 |
Term p = d_solver.mkVar(funSort2, "p"); |
605 |
4 |
ASSERT_THROW(p.iteTerm(b, b), CVC5ApiException); |
606 |
4 |
ASSERT_THROW(p.iteTerm(x, b), CVC5ApiException); |
607 |
4 |
Term zero = d_solver.mkInteger(0); |
608 |
4 |
ASSERT_THROW(zero.iteTerm(x, x), CVC5ApiException); |
609 |
4 |
ASSERT_THROW(zero.iteTerm(x, b), CVC5ApiException); |
610 |
4 |
Term f_x = d_solver.mkTerm(APPLY_UF, f, x); |
611 |
4 |
ASSERT_THROW(f_x.iteTerm(b, b), CVC5ApiException); |
612 |
4 |
ASSERT_THROW(f_x.iteTerm(b, x), CVC5ApiException); |
613 |
4 |
Term sum = d_solver.mkTerm(PLUS, f_x, f_x); |
614 |
4 |
ASSERT_THROW(sum.iteTerm(x, x), CVC5ApiException); |
615 |
4 |
ASSERT_THROW(sum.iteTerm(b, x), CVC5ApiException); |
616 |
4 |
Term p_0 = d_solver.mkTerm(APPLY_UF, p, zero); |
617 |
2 |
ASSERT_NO_THROW(p_0.iteTerm(b, b)); |
618 |
2 |
ASSERT_NO_THROW(p_0.iteTerm(x, x)); |
619 |
4 |
ASSERT_THROW(p_0.iteTerm(x, b), CVC5ApiException); |
620 |
4 |
Term p_f_x = d_solver.mkTerm(APPLY_UF, p, f_x); |
621 |
2 |
ASSERT_NO_THROW(p_f_x.iteTerm(b, b)); |
622 |
2 |
ASSERT_NO_THROW(p_f_x.iteTerm(x, x)); |
623 |
4 |
ASSERT_THROW(p_f_x.iteTerm(x, b), CVC5ApiException); |
624 |
|
} |
625 |
|
|
626 |
41 |
TEST_F(TestApiBlackTerm, termAssignment) |
627 |
|
{ |
628 |
4 |
Term t1 = d_solver.mkInteger(1); |
629 |
4 |
Term t2 = t1; |
630 |
2 |
t2 = d_solver.mkInteger(2); |
631 |
2 |
ASSERT_EQ(t1, d_solver.mkInteger(1)); |
632 |
|
} |
633 |
|
|
634 |
41 |
TEST_F(TestApiBlackTerm, termCompare) |
635 |
|
{ |
636 |
4 |
Term t1 = d_solver.mkInteger(1); |
637 |
4 |
Term t2 = d_solver.mkTerm(PLUS, d_solver.mkInteger(2), d_solver.mkInteger(2)); |
638 |
4 |
Term t3 = d_solver.mkTerm(PLUS, d_solver.mkInteger(2), d_solver.mkInteger(2)); |
639 |
2 |
ASSERT_TRUE(t2 >= t3); |
640 |
2 |
ASSERT_TRUE(t2 <= t3); |
641 |
2 |
ASSERT_TRUE((t1 > t2) != (t1 < t2)); |
642 |
2 |
ASSERT_TRUE((t1 > t2 || t1 == t2) == (t1 >= t2)); |
643 |
|
} |
644 |
|
|
645 |
41 |
TEST_F(TestApiBlackTerm, termChildren) |
646 |
|
{ |
647 |
|
// simple term 2+3 |
648 |
4 |
Term two = d_solver.mkInteger(2); |
649 |
4 |
Term t1 = d_solver.mkTerm(PLUS, two, d_solver.mkInteger(3)); |
650 |
2 |
ASSERT_EQ(t1[0], two); |
651 |
2 |
ASSERT_EQ(t1.getNumChildren(), 2); |
652 |
4 |
Term tnull; |
653 |
4 |
ASSERT_THROW(tnull.getNumChildren(), CVC5ApiException); |
654 |
|
|
655 |
|
// apply term f(2) |
656 |
4 |
Sort intSort = d_solver.getIntegerSort(); |
657 |
4 |
Sort fsort = d_solver.mkFunctionSort(intSort, intSort); |
658 |
4 |
Term f = d_solver.mkConst(fsort, "f"); |
659 |
4 |
Term t2 = d_solver.mkTerm(APPLY_UF, f, two); |
660 |
|
// due to our higher-order view of terms, we treat f as a child of APPLY_UF |
661 |
2 |
ASSERT_EQ(t2.getNumChildren(), 2); |
662 |
2 |
ASSERT_EQ(t2[0], f); |
663 |
2 |
ASSERT_EQ(t2[1], two); |
664 |
4 |
ASSERT_THROW(tnull[0], CVC5ApiException); |
665 |
|
} |
666 |
|
|
667 |
41 |
TEST_F(TestApiBlackTerm, getInteger) |
668 |
|
{ |
669 |
4 |
Term int1 = d_solver.mkInteger("-18446744073709551616"); |
670 |
4 |
Term int2 = d_solver.mkInteger("-18446744073709551615"); |
671 |
4 |
Term int3 = d_solver.mkInteger("-4294967296"); |
672 |
4 |
Term int4 = d_solver.mkInteger("-4294967295"); |
673 |
4 |
Term int5 = d_solver.mkInteger("-10"); |
674 |
4 |
Term int6 = d_solver.mkInteger("0"); |
675 |
4 |
Term int7 = d_solver.mkInteger("10"); |
676 |
4 |
Term int8 = d_solver.mkInteger("4294967295"); |
677 |
4 |
Term int9 = d_solver.mkInteger("4294967296"); |
678 |
4 |
Term int10 = d_solver.mkInteger("18446744073709551615"); |
679 |
4 |
Term int11 = d_solver.mkInteger("18446744073709551616"); |
680 |
4 |
Term int12 = d_solver.mkInteger("-0"); |
681 |
|
|
682 |
4 |
ASSERT_THROW(d_solver.mkInteger(""), CVC5ApiException); |
683 |
4 |
ASSERT_THROW(d_solver.mkInteger("-"), CVC5ApiException); |
684 |
4 |
ASSERT_THROW(d_solver.mkInteger("-1-"), CVC5ApiException); |
685 |
4 |
ASSERT_THROW(d_solver.mkInteger("0.0"), CVC5ApiException); |
686 |
4 |
ASSERT_THROW(d_solver.mkInteger("-0.1"), CVC5ApiException); |
687 |
4 |
ASSERT_THROW(d_solver.mkInteger("012"), CVC5ApiException); |
688 |
4 |
ASSERT_THROW(d_solver.mkInteger("0000"), CVC5ApiException); |
689 |
4 |
ASSERT_THROW(d_solver.mkInteger("-01"), CVC5ApiException); |
690 |
4 |
ASSERT_THROW(d_solver.mkInteger("-00"), CVC5ApiException); |
691 |
|
|
692 |
2 |
ASSERT_TRUE(!int1.isInt32Value() && !int1.isUInt32Value() |
693 |
|
&& !int1.isInt64Value() && !int1.isUInt64Value() |
694 |
2 |
&& int1.isIntegerValue()); |
695 |
2 |
ASSERT_EQ(int1.getIntegerValue(), "-18446744073709551616"); |
696 |
2 |
ASSERT_TRUE(!int2.isInt32Value() && !int2.isUInt32Value() |
697 |
|
&& !int2.isInt64Value() && !int2.isUInt64Value() |
698 |
2 |
&& int2.isIntegerValue()); |
699 |
2 |
ASSERT_EQ(int2.getIntegerValue(), "-18446744073709551615"); |
700 |
2 |
ASSERT_TRUE(!int3.isInt32Value() && !int3.isUInt32Value() |
701 |
|
&& int3.isInt64Value() && !int3.isUInt64Value() |
702 |
2 |
&& int3.isIntegerValue()); |
703 |
2 |
ASSERT_EQ(int3.getInt64Value(), -4294967296); |
704 |
2 |
ASSERT_EQ(int3.getIntegerValue(), "-4294967296"); |
705 |
2 |
ASSERT_TRUE(!int4.isInt32Value() && !int4.isUInt32Value() |
706 |
|
&& int4.isInt64Value() && !int4.isUInt64Value() |
707 |
2 |
&& int4.isIntegerValue()); |
708 |
2 |
ASSERT_EQ(int4.getInt64Value(), -4294967295); |
709 |
2 |
ASSERT_EQ(int4.getIntegerValue(), "-4294967295"); |
710 |
2 |
ASSERT_TRUE(int5.isInt32Value() && !int5.isUInt32Value() |
711 |
|
&& int5.isInt64Value() && !int5.isUInt64Value() |
712 |
2 |
&& int5.isIntegerValue()); |
713 |
2 |
ASSERT_EQ(int5.getInt32Value(), -10); |
714 |
2 |
ASSERT_EQ(int5.getInt64Value(), -10); |
715 |
2 |
ASSERT_EQ(int5.getIntegerValue(), "-10"); |
716 |
2 |
ASSERT_TRUE(int6.isInt32Value() && int6.isUInt32Value() && int6.isInt64Value() |
717 |
2 |
&& int6.isUInt64Value() && int6.isIntegerValue()); |
718 |
2 |
ASSERT_EQ(int6.getInt32Value(), 0); |
719 |
2 |
ASSERT_EQ(int6.getUInt32Value(), 0); |
720 |
2 |
ASSERT_EQ(int6.getInt64Value(), 0); |
721 |
2 |
ASSERT_EQ(int6.getUInt64Value(), 0); |
722 |
2 |
ASSERT_EQ(int6.getIntegerValue(), "0"); |
723 |
2 |
ASSERT_TRUE(int7.isInt32Value() && int7.isUInt32Value() && int7.isInt64Value() |
724 |
2 |
&& int7.isUInt64Value() && int7.isIntegerValue()); |
725 |
2 |
ASSERT_EQ(int7.getInt32Value(), 10); |
726 |
2 |
ASSERT_EQ(int7.getUInt32Value(), 10); |
727 |
2 |
ASSERT_EQ(int7.getInt64Value(), 10); |
728 |
2 |
ASSERT_EQ(int7.getUInt64Value(), 10); |
729 |
2 |
ASSERT_EQ(int7.getIntegerValue(), "10"); |
730 |
2 |
ASSERT_TRUE(!int8.isInt32Value() && int8.isUInt32Value() |
731 |
|
&& int8.isInt64Value() && int8.isUInt64Value() |
732 |
2 |
&& int8.isIntegerValue()); |
733 |
2 |
ASSERT_EQ(int8.getUInt32Value(), 4294967295); |
734 |
2 |
ASSERT_EQ(int8.getInt64Value(), 4294967295); |
735 |
2 |
ASSERT_EQ(int8.getUInt64Value(), 4294967295); |
736 |
2 |
ASSERT_EQ(int8.getIntegerValue(), "4294967295"); |
737 |
2 |
ASSERT_TRUE(!int9.isInt32Value() && !int9.isUInt32Value() |
738 |
|
&& int9.isInt64Value() && int9.isUInt64Value() |
739 |
2 |
&& int9.isIntegerValue()); |
740 |
2 |
ASSERT_EQ(int9.getInt64Value(), 4294967296); |
741 |
2 |
ASSERT_EQ(int9.getUInt64Value(), 4294967296); |
742 |
2 |
ASSERT_EQ(int9.getIntegerValue(), "4294967296"); |
743 |
2 |
ASSERT_TRUE(!int10.isInt32Value() && !int10.isUInt32Value() |
744 |
|
&& !int10.isInt64Value() && int10.isUInt64Value() |
745 |
2 |
&& int10.isIntegerValue()); |
746 |
2 |
ASSERT_EQ(int10.getUInt64Value(), 18446744073709551615ull); |
747 |
2 |
ASSERT_EQ(int10.getIntegerValue(), "18446744073709551615"); |
748 |
2 |
ASSERT_TRUE(!int11.isInt32Value() && !int11.isUInt32Value() |
749 |
|
&& !int11.isInt64Value() && !int11.isUInt64Value() |
750 |
2 |
&& int11.isIntegerValue()); |
751 |
2 |
ASSERT_EQ(int11.getIntegerValue(), "18446744073709551616"); |
752 |
|
} |
753 |
|
|
754 |
41 |
TEST_F(TestApiBlackTerm, getString) |
755 |
|
{ |
756 |
4 |
Term s1 = d_solver.mkString("abcde"); |
757 |
2 |
ASSERT_TRUE(s1.isStringValue()); |
758 |
2 |
ASSERT_EQ(s1.getStringValue(), L"abcde"); |
759 |
|
} |
760 |
|
|
761 |
41 |
TEST_F(TestApiBlackTerm, getReal) |
762 |
|
{ |
763 |
4 |
Term real1 = d_solver.mkReal("0"); |
764 |
4 |
Term real2 = d_solver.mkReal(".0"); |
765 |
4 |
Term real3 = d_solver.mkReal("-17"); |
766 |
4 |
Term real4 = d_solver.mkReal("-3/5"); |
767 |
4 |
Term real5 = d_solver.mkReal("12.7"); |
768 |
4 |
Term real6 = d_solver.mkReal("1/4294967297"); |
769 |
4 |
Term real7 = d_solver.mkReal("4294967297"); |
770 |
4 |
Term real8 = d_solver.mkReal("1/18446744073709551617"); |
771 |
4 |
Term real9 = d_solver.mkReal("18446744073709551617"); |
772 |
|
|
773 |
2 |
ASSERT_TRUE(real1.isRealValue() && real1.isReal64Value() |
774 |
2 |
&& real1.isReal32Value()); |
775 |
2 |
ASSERT_TRUE(real2.isRealValue() && real2.isReal64Value() |
776 |
2 |
&& real2.isReal32Value()); |
777 |
2 |
ASSERT_TRUE(real3.isRealValue() && real3.isReal64Value() |
778 |
2 |
&& real3.isReal32Value()); |
779 |
2 |
ASSERT_TRUE(real4.isRealValue() && real4.isReal64Value() |
780 |
2 |
&& real4.isReal32Value()); |
781 |
2 |
ASSERT_TRUE(real5.isRealValue() && real5.isReal64Value() |
782 |
2 |
&& real5.isReal32Value()); |
783 |
2 |
ASSERT_TRUE(real6.isRealValue() && real6.isReal64Value()); |
784 |
2 |
ASSERT_TRUE(real7.isRealValue() && real7.isReal64Value()); |
785 |
2 |
ASSERT_TRUE(real8.isRealValue()); |
786 |
2 |
ASSERT_TRUE(real9.isRealValue()); |
787 |
|
|
788 |
22 |
ASSERT_EQ(std::make_pair(0, 1u), real1.getReal32Value()); |
789 |
30 |
ASSERT_EQ(std::make_pair(0l, 1ul), real1.getReal64Value()); |
790 |
2 |
ASSERT_EQ("0", real1.getRealValue()); |
791 |
|
|
792 |
2 |
ASSERT_EQ(std::make_pair(0, 1u), real2.getReal32Value()); |
793 |
2 |
ASSERT_EQ(std::make_pair(0l, 1ul), real2.getReal64Value()); |
794 |
2 |
ASSERT_EQ("0", real2.getRealValue()); |
795 |
|
|
796 |
2 |
ASSERT_EQ(std::make_pair(-17, 1u), real3.getReal32Value()); |
797 |
2 |
ASSERT_EQ(std::make_pair(-17l, 1ul), real3.getReal64Value()); |
798 |
2 |
ASSERT_EQ("-17", real3.getRealValue()); |
799 |
|
|
800 |
2 |
ASSERT_EQ(std::make_pair(-3, 5u), real4.getReal32Value()); |
801 |
2 |
ASSERT_EQ(std::make_pair(-3l, 5ul), real4.getReal64Value()); |
802 |
2 |
ASSERT_EQ("-3/5", real4.getRealValue()); |
803 |
|
|
804 |
2 |
ASSERT_EQ(std::make_pair(127, 10u), real5.getReal32Value()); |
805 |
2 |
ASSERT_EQ(std::make_pair(127l, 10ul), real5.getReal64Value()); |
806 |
2 |
ASSERT_EQ("127/10", real5.getRealValue()); |
807 |
|
|
808 |
2 |
ASSERT_EQ(std::make_pair(1l, 4294967297ul), real6.getReal64Value()); |
809 |
2 |
ASSERT_EQ("1/4294967297", real6.getRealValue()); |
810 |
|
|
811 |
2 |
ASSERT_EQ(std::make_pair(4294967297l, 1ul), real7.getReal64Value()); |
812 |
2 |
ASSERT_EQ("4294967297", real7.getRealValue()); |
813 |
|
|
814 |
2 |
ASSERT_EQ("1/18446744073709551617", real8.getRealValue()); |
815 |
|
|
816 |
2 |
ASSERT_EQ("18446744073709551617", real9.getRealValue()); |
817 |
|
} |
818 |
|
|
819 |
41 |
TEST_F(TestApiBlackTerm, getConstArrayBase) |
820 |
|
{ |
821 |
4 |
Sort intsort = d_solver.getIntegerSort(); |
822 |
4 |
Sort arrsort = d_solver.mkArraySort(intsort, intsort); |
823 |
4 |
Term one = d_solver.mkInteger(1); |
824 |
4 |
Term constarr = d_solver.mkConstArray(arrsort, one); |
825 |
|
|
826 |
2 |
ASSERT_TRUE(constarr.isConstArray()); |
827 |
2 |
ASSERT_EQ(one, constarr.getConstArrayBase()); |
828 |
|
} |
829 |
|
|
830 |
41 |
TEST_F(TestApiBlackTerm, getBoolean) |
831 |
|
{ |
832 |
4 |
Term b1 = d_solver.mkBoolean(true); |
833 |
4 |
Term b2 = d_solver.mkBoolean(false); |
834 |
|
|
835 |
2 |
ASSERT_TRUE(b1.isBooleanValue()); |
836 |
2 |
ASSERT_TRUE(b2.isBooleanValue()); |
837 |
2 |
ASSERT_TRUE(b1.getBooleanValue()); |
838 |
2 |
ASSERT_FALSE(b2.getBooleanValue()); |
839 |
|
} |
840 |
|
|
841 |
41 |
TEST_F(TestApiBlackTerm, getBitVector) |
842 |
|
{ |
843 |
4 |
Term b1 = d_solver.mkBitVector(8, 15); |
844 |
4 |
Term b2 = d_solver.mkBitVector("00001111", 2); |
845 |
4 |
Term b3 = d_solver.mkBitVector("15", 10); |
846 |
4 |
Term b4 = d_solver.mkBitVector("0f", 16); |
847 |
4 |
Term b5 = d_solver.mkBitVector(8, "00001111", 2); |
848 |
4 |
Term b6 = d_solver.mkBitVector(8, "15", 10); |
849 |
4 |
Term b7 = d_solver.mkBitVector(8, "0f", 16); |
850 |
|
|
851 |
2 |
ASSERT_TRUE(b1.isBitVectorValue()); |
852 |
2 |
ASSERT_TRUE(b2.isBitVectorValue()); |
853 |
2 |
ASSERT_TRUE(b3.isBitVectorValue()); |
854 |
2 |
ASSERT_TRUE(b4.isBitVectorValue()); |
855 |
2 |
ASSERT_TRUE(b5.isBitVectorValue()); |
856 |
2 |
ASSERT_TRUE(b6.isBitVectorValue()); |
857 |
2 |
ASSERT_TRUE(b7.isBitVectorValue()); |
858 |
|
|
859 |
2 |
ASSERT_EQ("00001111", b1.getBitVectorValue(2)); |
860 |
2 |
ASSERT_EQ("15", b1.getBitVectorValue(10)); |
861 |
2 |
ASSERT_EQ("f", b1.getBitVectorValue(16)); |
862 |
2 |
ASSERT_EQ("00001111", b2.getBitVectorValue(2)); |
863 |
2 |
ASSERT_EQ("15", b2.getBitVectorValue(10)); |
864 |
2 |
ASSERT_EQ("f", b2.getBitVectorValue(16)); |
865 |
2 |
ASSERT_EQ("1111", b3.getBitVectorValue(2)); |
866 |
2 |
ASSERT_EQ("15", b3.getBitVectorValue(10)); |
867 |
2 |
ASSERT_EQ("f", b3.getBitVectorValue(16)); |
868 |
2 |
ASSERT_EQ("00001111", b4.getBitVectorValue(2)); |
869 |
2 |
ASSERT_EQ("15", b4.getBitVectorValue(10)); |
870 |
2 |
ASSERT_EQ("f", b4.getBitVectorValue(16)); |
871 |
2 |
ASSERT_EQ("00001111", b5.getBitVectorValue(2)); |
872 |
2 |
ASSERT_EQ("15", b5.getBitVectorValue(10)); |
873 |
2 |
ASSERT_EQ("f", b5.getBitVectorValue(16)); |
874 |
2 |
ASSERT_EQ("00001111", b6.getBitVectorValue(2)); |
875 |
2 |
ASSERT_EQ("15", b6.getBitVectorValue(10)); |
876 |
2 |
ASSERT_EQ("f", b6.getBitVectorValue(16)); |
877 |
2 |
ASSERT_EQ("00001111", b7.getBitVectorValue(2)); |
878 |
2 |
ASSERT_EQ("15", b7.getBitVectorValue(10)); |
879 |
2 |
ASSERT_EQ("f", b7.getBitVectorValue(16)); |
880 |
|
} |
881 |
|
|
882 |
41 |
TEST_F(TestApiBlackTerm, getAbstractValue) |
883 |
|
{ |
884 |
4 |
Term v1 = d_solver.mkAbstractValue(1); |
885 |
4 |
Term v2 = d_solver.mkAbstractValue("15"); |
886 |
4 |
Term v3 = d_solver.mkAbstractValue("18446744073709551617"); |
887 |
|
|
888 |
2 |
ASSERT_TRUE(v1.isAbstractValue()); |
889 |
2 |
ASSERT_TRUE(v2.isAbstractValue()); |
890 |
2 |
ASSERT_TRUE(v3.isAbstractValue()); |
891 |
2 |
ASSERT_EQ("1", v1.getAbstractValue()); |
892 |
2 |
ASSERT_EQ("15", v2.getAbstractValue()); |
893 |
2 |
ASSERT_EQ("18446744073709551617", v3.getAbstractValue()); |
894 |
|
} |
895 |
|
|
896 |
41 |
TEST_F(TestApiBlackTerm, getTuple) |
897 |
|
{ |
898 |
4 |
Sort s1 = d_solver.getIntegerSort(); |
899 |
4 |
Sort s2 = d_solver.getRealSort(); |
900 |
4 |
Sort s3 = d_solver.getStringSort(); |
901 |
|
|
902 |
4 |
Term t1 = d_solver.mkInteger(15); |
903 |
4 |
Term t2 = d_solver.mkReal(17, 25); |
904 |
4 |
Term t3 = d_solver.mkString("abc"); |
905 |
|
|
906 |
4 |
Term tup = d_solver.mkTuple({s1, s2, s3}, {t1, t2, t3}); |
907 |
|
|
908 |
2 |
ASSERT_TRUE(tup.isTupleValue()); |
909 |
2 |
ASSERT_EQ(std::vector<Term>({t1, t2, t3}), tup.getTupleValue()); |
910 |
|
} |
911 |
|
|
912 |
41 |
TEST_F(TestApiBlackTerm, getFloatingPoint) |
913 |
|
{ |
914 |
4 |
Term bvval = d_solver.mkBitVector("0000110000000011"); |
915 |
4 |
Term fp = d_solver.mkFloatingPoint(5, 11, bvval); |
916 |
|
|
917 |
2 |
ASSERT_TRUE(fp.isFloatingPointValue()); |
918 |
2 |
ASSERT_FALSE(fp.isFloatingPointPosZero()); |
919 |
2 |
ASSERT_FALSE(fp.isFloatingPointNegZero()); |
920 |
2 |
ASSERT_FALSE(fp.isFloatingPointPosInf()); |
921 |
2 |
ASSERT_FALSE(fp.isFloatingPointNegInf()); |
922 |
2 |
ASSERT_FALSE(fp.isFloatingPointNaN()); |
923 |
2 |
ASSERT_EQ(std::make_tuple(5u, 11u, bvval), fp.getFloatingPointValue()); |
924 |
|
|
925 |
2 |
ASSERT_TRUE(d_solver.mkPosZero(5, 11).isFloatingPointPosZero()); |
926 |
2 |
ASSERT_TRUE(d_solver.mkNegZero(5, 11).isFloatingPointNegZero()); |
927 |
2 |
ASSERT_TRUE(d_solver.mkPosInf(5, 11).isFloatingPointPosInf()); |
928 |
2 |
ASSERT_TRUE(d_solver.mkNegInf(5, 11).isFloatingPointNegInf()); |
929 |
2 |
ASSERT_TRUE(d_solver.mkNaN(5, 11).isFloatingPointNaN()); |
930 |
|
} |
931 |
|
|
932 |
41 |
TEST_F(TestApiBlackTerm, getSet) |
933 |
|
{ |
934 |
4 |
Sort s = d_solver.mkSetSort(d_solver.getIntegerSort()); |
935 |
|
|
936 |
4 |
Term i1 = d_solver.mkInteger(5); |
937 |
4 |
Term i2 = d_solver.mkInteger(7); |
938 |
|
|
939 |
4 |
Term s1 = d_solver.mkEmptySet(s); |
940 |
4 |
Term s2 = d_solver.mkTerm(Kind::SINGLETON, i1); |
941 |
4 |
Term s3 = d_solver.mkTerm(Kind::SINGLETON, i1); |
942 |
4 |
Term s4 = d_solver.mkTerm(Kind::SINGLETON, i2); |
943 |
|
Term s5 = |
944 |
4 |
d_solver.mkTerm(Kind::UNION, s2, d_solver.mkTerm(Kind::UNION, s3, s4)); |
945 |
|
|
946 |
2 |
ASSERT_TRUE(s1.isSetValue()); |
947 |
2 |
ASSERT_TRUE(s2.isSetValue()); |
948 |
2 |
ASSERT_TRUE(s3.isSetValue()); |
949 |
2 |
ASSERT_TRUE(s4.isSetValue()); |
950 |
2 |
ASSERT_FALSE(s5.isSetValue()); |
951 |
2 |
s5 = d_solver.simplify(s5); |
952 |
2 |
ASSERT_TRUE(s5.isSetValue()); |
953 |
|
|
954 |
2 |
ASSERT_EQ(std::set<Term>({}), s1.getSetValue()); |
955 |
2 |
ASSERT_EQ(std::set<Term>({i1}), s2.getSetValue()); |
956 |
2 |
ASSERT_EQ(std::set<Term>({i1}), s3.getSetValue()); |
957 |
2 |
ASSERT_EQ(std::set<Term>({i2}), s4.getSetValue()); |
958 |
2 |
ASSERT_EQ(std::set<Term>({i1, i2}), s5.getSetValue()); |
959 |
|
} |
960 |
|
|
961 |
41 |
TEST_F(TestApiBlackTerm, getSequence) |
962 |
|
{ |
963 |
4 |
Sort s = d_solver.mkSequenceSort(d_solver.getIntegerSort()); |
964 |
|
|
965 |
4 |
Term i1 = d_solver.mkInteger(5); |
966 |
4 |
Term i2 = d_solver.mkInteger(7); |
967 |
|
|
968 |
4 |
Term s1 = d_solver.mkEmptySequence(s); |
969 |
4 |
Term s2 = d_solver.mkTerm(Kind::SEQ_UNIT, i1); |
970 |
4 |
Term s3 = d_solver.mkTerm(Kind::SEQ_UNIT, i1); |
971 |
4 |
Term s4 = d_solver.mkTerm(Kind::SEQ_UNIT, i2); |
972 |
|
Term s5 = d_solver.mkTerm( |
973 |
4 |
Kind::SEQ_CONCAT, s2, d_solver.mkTerm(Kind::SEQ_CONCAT, s3, s4)); |
974 |
|
|
975 |
2 |
ASSERT_TRUE(s1.isSequenceValue()); |
976 |
2 |
ASSERT_TRUE(!s2.isSequenceValue()); |
977 |
2 |
ASSERT_TRUE(!s3.isSequenceValue()); |
978 |
2 |
ASSERT_TRUE(!s4.isSequenceValue()); |
979 |
2 |
ASSERT_TRUE(!s5.isSequenceValue()); |
980 |
|
|
981 |
2 |
s2 = d_solver.simplify(s2); |
982 |
2 |
s3 = d_solver.simplify(s3); |
983 |
2 |
s4 = d_solver.simplify(s4); |
984 |
2 |
s5 = d_solver.simplify(s5); |
985 |
|
|
986 |
2 |
ASSERT_EQ(std::vector<Term>({}), s1.getSequenceValue()); |
987 |
2 |
ASSERT_EQ(std::vector<Term>({i1}), s2.getSequenceValue()); |
988 |
2 |
ASSERT_EQ(std::vector<Term>({i1}), s3.getSequenceValue()); |
989 |
2 |
ASSERT_EQ(std::vector<Term>({i2}), s4.getSequenceValue()); |
990 |
2 |
ASSERT_EQ(std::vector<Term>({i1, i1, i2}), s5.getSequenceValue()); |
991 |
|
} |
992 |
|
|
993 |
41 |
TEST_F(TestApiBlackTerm, getUninterpretedConst) |
994 |
|
{ |
995 |
4 |
Sort s = d_solver.mkUninterpretedSort("test"); |
996 |
4 |
Term t1 = d_solver.mkUninterpretedConst(s, 3); |
997 |
4 |
Term t2 = d_solver.mkUninterpretedConst(s, 5); |
998 |
|
|
999 |
2 |
ASSERT_TRUE(t1.isUninterpretedValue()); |
1000 |
2 |
ASSERT_TRUE(t2.isUninterpretedValue()); |
1001 |
|
|
1002 |
2 |
ASSERT_EQ(std::make_pair(s, 3), t1.getUninterpretedValue()); |
1003 |
2 |
ASSERT_EQ(std::make_pair(s, 5), t2.getUninterpretedValue()); |
1004 |
|
} |
1005 |
|
|
1006 |
41 |
TEST_F(TestApiBlackTerm, substitute) |
1007 |
|
{ |
1008 |
4 |
Term x = d_solver.mkConst(d_solver.getIntegerSort(), "x"); |
1009 |
4 |
Term one = d_solver.mkInteger(1); |
1010 |
4 |
Term ttrue = d_solver.mkTrue(); |
1011 |
4 |
Term xpx = d_solver.mkTerm(PLUS, x, x); |
1012 |
4 |
Term onepone = d_solver.mkTerm(PLUS, one, one); |
1013 |
|
|
1014 |
2 |
ASSERT_EQ(xpx.substitute(x, one), onepone); |
1015 |
2 |
ASSERT_EQ(onepone.substitute(one, x), xpx); |
1016 |
|
// incorrect due to type |
1017 |
4 |
ASSERT_THROW(xpx.substitute(one, ttrue), CVC5ApiException); |
1018 |
|
|
1019 |
|
// simultaneous substitution |
1020 |
4 |
Term y = d_solver.mkConst(d_solver.getIntegerSort(), "y"); |
1021 |
4 |
Term xpy = d_solver.mkTerm(PLUS, x, y); |
1022 |
4 |
Term xpone = d_solver.mkTerm(PLUS, y, one); |
1023 |
4 |
std::vector<Term> es; |
1024 |
4 |
std::vector<Term> rs; |
1025 |
2 |
es.push_back(x); |
1026 |
2 |
rs.push_back(y); |
1027 |
2 |
es.push_back(y); |
1028 |
2 |
rs.push_back(one); |
1029 |
2 |
ASSERT_EQ(xpy.substitute(es, rs), xpone); |
1030 |
|
|
1031 |
|
// incorrect substitution due to arity |
1032 |
2 |
rs.pop_back(); |
1033 |
4 |
ASSERT_THROW(xpy.substitute(es, rs), CVC5ApiException); |
1034 |
|
|
1035 |
|
// incorrect substitution due to types |
1036 |
2 |
rs.push_back(ttrue); |
1037 |
4 |
ASSERT_THROW(xpy.substitute(es, rs), CVC5ApiException); |
1038 |
|
|
1039 |
|
// null cannot substitute |
1040 |
4 |
Term tnull; |
1041 |
4 |
ASSERT_THROW(tnull.substitute(one, x), CVC5ApiException); |
1042 |
4 |
ASSERT_THROW(xpx.substitute(tnull, x), CVC5ApiException); |
1043 |
4 |
ASSERT_THROW(xpx.substitute(x, tnull), CVC5ApiException); |
1044 |
2 |
rs.pop_back(); |
1045 |
2 |
rs.push_back(tnull); |
1046 |
4 |
ASSERT_THROW(xpy.substitute(es, rs), CVC5ApiException); |
1047 |
2 |
es.clear(); |
1048 |
2 |
rs.clear(); |
1049 |
2 |
es.push_back(x); |
1050 |
2 |
rs.push_back(y); |
1051 |
4 |
ASSERT_THROW(tnull.substitute(es, rs), CVC5ApiException); |
1052 |
2 |
es.push_back(tnull); |
1053 |
2 |
rs.push_back(one); |
1054 |
4 |
ASSERT_THROW(xpx.substitute(es, rs), CVC5ApiException); |
1055 |
|
} |
1056 |
|
|
1057 |
41 |
TEST_F(TestApiBlackTerm, constArray) |
1058 |
|
{ |
1059 |
4 |
Sort intsort = d_solver.getIntegerSort(); |
1060 |
4 |
Sort arrsort = d_solver.mkArraySort(intsort, intsort); |
1061 |
4 |
Term a = d_solver.mkConst(arrsort, "a"); |
1062 |
4 |
Term one = d_solver.mkInteger(1); |
1063 |
4 |
Term constarr = d_solver.mkConstArray(arrsort, one); |
1064 |
|
|
1065 |
2 |
ASSERT_EQ(constarr.getKind(), CONST_ARRAY); |
1066 |
2 |
ASSERT_EQ(constarr.getConstArrayBase(), one); |
1067 |
4 |
ASSERT_THROW(a.getConstArrayBase(), CVC5ApiException); |
1068 |
|
|
1069 |
2 |
arrsort = |
1070 |
4 |
d_solver.mkArraySort(d_solver.getRealSort(), d_solver.getRealSort()); |
1071 |
4 |
Term zero_array = d_solver.mkConstArray(arrsort, d_solver.mkReal(0)); |
1072 |
|
Term stores = d_solver.mkTerm( |
1073 |
4 |
STORE, zero_array, d_solver.mkReal(1), d_solver.mkReal(2)); |
1074 |
2 |
stores = |
1075 |
4 |
d_solver.mkTerm(STORE, stores, d_solver.mkReal(2), d_solver.mkReal(3)); |
1076 |
2 |
stores = |
1077 |
4 |
d_solver.mkTerm(STORE, stores, d_solver.mkReal(4), d_solver.mkReal(5)); |
1078 |
|
} |
1079 |
|
|
1080 |
41 |
TEST_F(TestApiBlackTerm, getSequenceValue) |
1081 |
|
{ |
1082 |
4 |
Sort realsort = d_solver.getRealSort(); |
1083 |
4 |
Sort seqsort = d_solver.mkSequenceSort(realsort); |
1084 |
4 |
Term s = d_solver.mkEmptySequence(seqsort); |
1085 |
|
|
1086 |
2 |
ASSERT_EQ(s.getKind(), CONST_SEQUENCE); |
1087 |
|
// empty sequence has zero elements |
1088 |
4 |
std::vector<Term> cs = s.getSequenceValue(); |
1089 |
2 |
ASSERT_TRUE(cs.empty()); |
1090 |
|
|
1091 |
|
// A seq.unit app is not a constant sequence (regardless of whether it is |
1092 |
|
// applied to a constant). |
1093 |
4 |
Term su = d_solver.mkTerm(SEQ_UNIT, d_solver.mkReal(1)); |
1094 |
4 |
ASSERT_THROW(su.getSequenceValue(), CVC5ApiException); |
1095 |
|
} |
1096 |
|
|
1097 |
41 |
TEST_F(TestApiBlackTerm, termScopedToString) |
1098 |
|
{ |
1099 |
4 |
Sort intsort = d_solver.getIntegerSort(); |
1100 |
4 |
Term x = d_solver.mkConst(intsort, "x"); |
1101 |
2 |
ASSERT_EQ(x.toString(), "x"); |
1102 |
4 |
Solver solver2; |
1103 |
2 |
ASSERT_EQ(x.toString(), "x"); |
1104 |
|
} |
1105 |
|
} // namespace test |
1106 |
99 |
} // namespace cvc5 |