GCC Code Coverage Report
Directory: . Exec Total Coverage
File: test/unit/api/solver_black.cpp Lines: 1775 1777 99.9 %
Date: 2021-11-07 Branches: 6700 18596 36.0 %

Line Exec Source
1
/******************************************************************************
2
 * Top contributors (to current version):
3
 *   Aina Niemetz, Mudathir Mohamed, 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 Solver class of the  C++ API.
14
 */
15
16
#include <algorithm>
17
18
#include "test_api.h"
19
#include "base/output.h"
20
21
namespace cvc5 {
22
23
using namespace api;
24
25
namespace test {
26
27
596
class TestApiBlackSolver : public TestApi
28
{
29
};
30
31
158
TEST_F(TestApiBlackSolver, recoverableException)
32
{
33
2
  d_solver.setOption("produce-models", "true");
34
4
  Term x = d_solver.mkConst(d_solver.getBooleanSort(), "x");
35
2
  d_solver.assertFormula(x.eqTerm(x).notTerm());
36
4
  ASSERT_THROW(d_solver.getValue(x), CVC5ApiRecoverableException);
37
}
38
39
158
TEST_F(TestApiBlackSolver, supportsFloatingPoint)
40
{
41
2
  ASSERT_NO_THROW(d_solver.mkRoundingMode(ROUND_NEAREST_TIES_TO_EVEN));
42
}
43
44
158
TEST_F(TestApiBlackSolver, getBooleanSort)
45
{
46
2
  ASSERT_NO_THROW(d_solver.getBooleanSort());
47
}
48
49
158
TEST_F(TestApiBlackSolver, getIntegerSort)
50
{
51
2
  ASSERT_NO_THROW(d_solver.getIntegerSort());
52
}
53
54
158
TEST_F(TestApiBlackSolver, getNullSort)
55
{
56
2
  ASSERT_NO_THROW(d_solver.getNullSort());
57
}
58
59
158
TEST_F(TestApiBlackSolver, getRealSort)
60
{
61
2
  ASSERT_NO_THROW(d_solver.getRealSort());
62
}
63
64
158
TEST_F(TestApiBlackSolver, getRegExpSort)
65
{
66
2
  ASSERT_NO_THROW(d_solver.getRegExpSort());
67
}
68
69
158
TEST_F(TestApiBlackSolver, getStringSort)
70
{
71
2
  ASSERT_NO_THROW(d_solver.getStringSort());
72
}
73
74
158
TEST_F(TestApiBlackSolver, getRoundingModeSort)
75
{
76
2
  ASSERT_NO_THROW(d_solver.getRoundingModeSort());
77
}
78
79
158
TEST_F(TestApiBlackSolver, mkArraySort)
80
{
81
4
  Sort boolSort = d_solver.getBooleanSort();
82
4
  Sort intSort = d_solver.getIntegerSort();
83
4
  Sort realSort = d_solver.getRealSort();
84
4
  Sort bvSort = d_solver.mkBitVectorSort(32);
85
2
  ASSERT_NO_THROW(d_solver.mkArraySort(boolSort, boolSort));
86
2
  ASSERT_NO_THROW(d_solver.mkArraySort(intSort, intSort));
87
2
  ASSERT_NO_THROW(d_solver.mkArraySort(realSort, realSort));
88
2
  ASSERT_NO_THROW(d_solver.mkArraySort(bvSort, bvSort));
89
2
  ASSERT_NO_THROW(d_solver.mkArraySort(boolSort, intSort));
90
2
  ASSERT_NO_THROW(d_solver.mkArraySort(realSort, bvSort));
91
92
4
  Sort fpSort = d_solver.mkFloatingPointSort(3, 5);
93
2
  ASSERT_NO_THROW(d_solver.mkArraySort(fpSort, fpSort));
94
2
  ASSERT_NO_THROW(d_solver.mkArraySort(bvSort, fpSort));
95
96
4
  Solver slv;
97
4
  ASSERT_THROW(slv.mkArraySort(boolSort, boolSort), CVC5ApiException);
98
}
99
100
158
TEST_F(TestApiBlackSolver, mkBitVectorSort)
101
{
102
2
  ASSERT_NO_THROW(d_solver.mkBitVectorSort(32));
103
4
  ASSERT_THROW(d_solver.mkBitVectorSort(0), CVC5ApiException);
104
}
105
106
158
TEST_F(TestApiBlackSolver, mkFloatingPointSort)
107
{
108
2
  ASSERT_NO_THROW(d_solver.mkFloatingPointSort(4, 8));
109
4
  ASSERT_THROW(d_solver.mkFloatingPointSort(0, 8), CVC5ApiException);
110
4
  ASSERT_THROW(d_solver.mkFloatingPointSort(4, 0), CVC5ApiException);
111
}
112
113
158
TEST_F(TestApiBlackSolver, mkDatatypeSort)
114
{
115
4
  DatatypeDecl dtypeSpec = d_solver.mkDatatypeDecl("list");
116
4
  DatatypeConstructorDecl cons = d_solver.mkDatatypeConstructorDecl("cons");
117
2
  cons.addSelector("head", d_solver.getIntegerSort());
118
2
  dtypeSpec.addConstructor(cons);
119
4
  DatatypeConstructorDecl nil = d_solver.mkDatatypeConstructorDecl("nil");
120
2
  dtypeSpec.addConstructor(nil);
121
2
  ASSERT_NO_THROW(d_solver.mkDatatypeSort(dtypeSpec));
122
123
4
  Solver slv;
124
4
  ASSERT_THROW(slv.mkDatatypeSort(dtypeSpec), CVC5ApiException);
125
126
4
  DatatypeDecl throwsDtypeSpec = d_solver.mkDatatypeDecl("list");
127
4
  ASSERT_THROW(d_solver.mkDatatypeSort(throwsDtypeSpec), CVC5ApiException);
128
}
129
130
158
TEST_F(TestApiBlackSolver, mkDatatypeSorts)
131
{
132
4
  Solver slv;
133
134
4
  DatatypeDecl dtypeSpec1 = d_solver.mkDatatypeDecl("list1");
135
4
  DatatypeConstructorDecl cons1 = d_solver.mkDatatypeConstructorDecl("cons1");
136
2
  cons1.addSelector("head1", d_solver.getIntegerSort());
137
2
  dtypeSpec1.addConstructor(cons1);
138
4
  DatatypeConstructorDecl nil1 = d_solver.mkDatatypeConstructorDecl("nil1");
139
2
  dtypeSpec1.addConstructor(nil1);
140
4
  DatatypeDecl dtypeSpec2 = d_solver.mkDatatypeDecl("list2");
141
4
  DatatypeConstructorDecl cons2 = d_solver.mkDatatypeConstructorDecl("cons2");
142
2
  cons2.addSelector("head2", d_solver.getIntegerSort());
143
2
  dtypeSpec2.addConstructor(cons2);
144
4
  DatatypeConstructorDecl nil2 = d_solver.mkDatatypeConstructorDecl("nil2");
145
2
  dtypeSpec2.addConstructor(nil2);
146
4
  std::vector<DatatypeDecl> decls = {dtypeSpec1, dtypeSpec2};
147
2
  ASSERT_NO_THROW(d_solver.mkDatatypeSorts(decls));
148
149
4
  ASSERT_THROW(slv.mkDatatypeSorts(decls), CVC5ApiException);
150
151
4
  DatatypeDecl throwsDtypeSpec = d_solver.mkDatatypeDecl("list");
152
4
  std::vector<DatatypeDecl> throwsDecls = {throwsDtypeSpec};
153
4
  ASSERT_THROW(d_solver.mkDatatypeSorts(throwsDecls), CVC5ApiException);
154
155
  /* with unresolved sorts */
156
4
  Sort unresList = d_solver.mkUninterpretedSort("ulist");
157
4
  std::set<Sort> unresSorts = {unresList};
158
4
  DatatypeDecl ulist = d_solver.mkDatatypeDecl("ulist");
159
4
  DatatypeConstructorDecl ucons = d_solver.mkDatatypeConstructorDecl("ucons");
160
2
  ucons.addSelector("car", unresList);
161
2
  ucons.addSelector("cdr", unresList);
162
2
  ulist.addConstructor(ucons);
163
4
  DatatypeConstructorDecl unil = d_solver.mkDatatypeConstructorDecl("unil");
164
2
  ulist.addConstructor(unil);
165
4
  std::vector<DatatypeDecl> udecls = {ulist};
166
2
  ASSERT_NO_THROW(d_solver.mkDatatypeSorts(udecls, unresSorts));
167
168
4
  ASSERT_THROW(slv.mkDatatypeSorts(udecls, unresSorts), CVC5ApiException);
169
170
  /* Note: More tests are in datatype_api_black. */
171
}
172
173
158
TEST_F(TestApiBlackSolver, mkFunctionSort)
174
{
175
2
  ASSERT_NO_THROW(d_solver.mkFunctionSort(d_solver.mkUninterpretedSort("u"),
176
                                          d_solver.getIntegerSort()));
177
4
  Sort funSort = d_solver.mkFunctionSort(d_solver.mkUninterpretedSort("u"),
178
8
                                         d_solver.getIntegerSort());
179
  // function arguments are allowed
180
2
  ASSERT_NO_THROW(d_solver.mkFunctionSort(funSort, d_solver.getIntegerSort()));
181
  // non-first-class arguments are not allowed
182
4
  Sort reSort = d_solver.getRegExpSort();
183
4
  ASSERT_THROW(d_solver.mkFunctionSort(reSort, d_solver.getIntegerSort()),
184
2
               CVC5ApiException);
185
4
  ASSERT_THROW(d_solver.mkFunctionSort(d_solver.getIntegerSort(), funSort),
186
2
               CVC5ApiException);
187
2
  ASSERT_NO_THROW(d_solver.mkFunctionSort(
188
      {d_solver.mkUninterpretedSort("u"), d_solver.getIntegerSort()},
189
      d_solver.getIntegerSort()));
190
4
  Sort funSort2 = d_solver.mkFunctionSort(d_solver.mkUninterpretedSort("u"),
191
8
                                          d_solver.getIntegerSort());
192
  // function arguments are allowed
193
2
  ASSERT_NO_THROW(
194
      d_solver.mkFunctionSort({funSort2, d_solver.mkUninterpretedSort("u")},
195
                              d_solver.getIntegerSort()));
196
4
  ASSERT_THROW(d_solver.mkFunctionSort({d_solver.getIntegerSort(),
197
                                        d_solver.mkUninterpretedSort("u")},
198
                                       funSort2),
199
2
               CVC5ApiException);
200
201
4
  Solver slv;
202
4
  ASSERT_THROW(slv.mkFunctionSort(d_solver.mkUninterpretedSort("u"),
203
                                  d_solver.getIntegerSort()),
204
2
               CVC5ApiException);
205
4
  ASSERT_THROW(slv.mkFunctionSort(slv.mkUninterpretedSort("u"),
206
                                  d_solver.getIntegerSort()),
207
2
               CVC5ApiException);
208
  std::vector<Sort> sorts1 = {d_solver.getBooleanSort(),
209
                              slv.getIntegerSort(),
210
4
                              d_solver.getIntegerSort()};
211
4
  std::vector<Sort> sorts2 = {slv.getBooleanSort(), slv.getIntegerSort()};
212
2
  ASSERT_NO_THROW(slv.mkFunctionSort(sorts2, slv.getIntegerSort()));
213
4
  ASSERT_THROW(slv.mkFunctionSort(sorts1, slv.getIntegerSort()),
214
2
               CVC5ApiException);
215
4
  ASSERT_THROW(slv.mkFunctionSort(sorts2, d_solver.getIntegerSort()),
216
2
               CVC5ApiException);
217
}
218
219
158
TEST_F(TestApiBlackSolver, mkParamSort)
220
{
221
2
  ASSERT_NO_THROW(d_solver.mkParamSort("T"));
222
2
  ASSERT_NO_THROW(d_solver.mkParamSort(""));
223
}
224
225
158
TEST_F(TestApiBlackSolver, mkPredicateSort)
226
{
227
2
  ASSERT_NO_THROW(d_solver.mkPredicateSort({d_solver.getIntegerSort()}));
228
4
  ASSERT_THROW(d_solver.mkPredicateSort({}), CVC5ApiException);
229
4
  Sort funSort = d_solver.mkFunctionSort(d_solver.mkUninterpretedSort("u"),
230
8
                                         d_solver.getIntegerSort());
231
  // functions as arguments are allowed
232
2
  ASSERT_NO_THROW(
233
      d_solver.mkPredicateSort({d_solver.getIntegerSort(), funSort}));
234
235
4
  Solver slv;
236
4
  ASSERT_THROW(slv.mkPredicateSort({d_solver.getIntegerSort()}),
237
2
               CVC5ApiException);
238
}
239
240
158
TEST_F(TestApiBlackSolver, mkRecordSort)
241
{
242
  std::vector<std::pair<std::string, Sort>> fields = {
243
4
      std::make_pair("b", d_solver.getBooleanSort()),
244
4
      std::make_pair("bv", d_solver.mkBitVectorSort(8)),
245
6
      std::make_pair("i", d_solver.getIntegerSort())};
246
4
  std::vector<std::pair<std::string, Sort>> empty;
247
2
  ASSERT_NO_THROW(d_solver.mkRecordSort(fields));
248
2
  ASSERT_NO_THROW(d_solver.mkRecordSort(empty));
249
4
  Sort recSort = d_solver.mkRecordSort(fields);
250
2
  ASSERT_NO_THROW(recSort.getDatatype());
251
252
4
  Solver slv;
253
4
  ASSERT_THROW(slv.mkRecordSort(fields), CVC5ApiException);
254
}
255
256
158
TEST_F(TestApiBlackSolver, mkSetSort)
257
{
258
2
  ASSERT_NO_THROW(d_solver.mkSetSort(d_solver.getBooleanSort()));
259
2
  ASSERT_NO_THROW(d_solver.mkSetSort(d_solver.getIntegerSort()));
260
2
  ASSERT_NO_THROW(d_solver.mkSetSort(d_solver.mkBitVectorSort(4)));
261
4
  Solver slv;
262
4
  ASSERT_THROW(slv.mkSetSort(d_solver.mkBitVectorSort(4)), CVC5ApiException);
263
}
264
265
158
TEST_F(TestApiBlackSolver, mkBagSort)
266
{
267
2
  ASSERT_NO_THROW(d_solver.mkBagSort(d_solver.getBooleanSort()));
268
2
  ASSERT_NO_THROW(d_solver.mkBagSort(d_solver.getIntegerSort()));
269
2
  ASSERT_NO_THROW(d_solver.mkBagSort(d_solver.mkBitVectorSort(4)));
270
4
  Solver slv;
271
4
  ASSERT_THROW(slv.mkBagSort(d_solver.mkBitVectorSort(4)), CVC5ApiException);
272
}
273
274
158
TEST_F(TestApiBlackSolver, mkSequenceSort)
275
{
276
2
  ASSERT_NO_THROW(d_solver.mkSequenceSort(d_solver.getBooleanSort()));
277
2
  ASSERT_NO_THROW(d_solver.mkSequenceSort(
278
      d_solver.mkSequenceSort(d_solver.getIntegerSort())));
279
4
  Solver slv;
280
4
  ASSERT_THROW(slv.mkSequenceSort(d_solver.getIntegerSort()), CVC5ApiException);
281
}
282
283
158
TEST_F(TestApiBlackSolver, mkUninterpretedSort)
284
{
285
2
  ASSERT_NO_THROW(d_solver.mkUninterpretedSort("u"));
286
2
  ASSERT_NO_THROW(d_solver.mkUninterpretedSort(""));
287
}
288
289
158
TEST_F(TestApiBlackSolver, mkSortConstructorSort)
290
{
291
2
  ASSERT_NO_THROW(d_solver.mkSortConstructorSort("s", 2));
292
2
  ASSERT_NO_THROW(d_solver.mkSortConstructorSort("", 2));
293
4
  ASSERT_THROW(d_solver.mkSortConstructorSort("", 0), CVC5ApiException);
294
}
295
296
158
TEST_F(TestApiBlackSolver, mkTupleSort)
297
{
298
2
  ASSERT_NO_THROW(d_solver.mkTupleSort({d_solver.getIntegerSort()}));
299
4
  Sort funSort = d_solver.mkFunctionSort(d_solver.mkUninterpretedSort("u"),
300
8
                                         d_solver.getIntegerSort());
301
4
  ASSERT_THROW(d_solver.mkTupleSort({d_solver.getIntegerSort(), funSort}),
302
2
               CVC5ApiException);
303
304
4
  Solver slv;
305
4
  ASSERT_THROW(slv.mkTupleSort({d_solver.getIntegerSort()}), CVC5ApiException);
306
}
307
308
158
TEST_F(TestApiBlackSolver, mkBitVector)
309
{
310
2
  ASSERT_NO_THROW(d_solver.mkBitVector(8, 2));
311
2
  ASSERT_NO_THROW(d_solver.mkBitVector(32, 2));
312
2
  ASSERT_NO_THROW(d_solver.mkBitVector(8, "-1111111", 2));
313
2
  ASSERT_NO_THROW(d_solver.mkBitVector(8, "0101", 2));
314
2
  ASSERT_NO_THROW(d_solver.mkBitVector(8, "00000101", 2));
315
2
  ASSERT_NO_THROW(d_solver.mkBitVector(8, "-127", 10));
316
2
  ASSERT_NO_THROW(d_solver.mkBitVector(8, "255", 10));
317
2
  ASSERT_NO_THROW(d_solver.mkBitVector(8, "-7f", 16));
318
2
  ASSERT_NO_THROW(d_solver.mkBitVector(8, "a0", 16));
319
320
4
  ASSERT_THROW(d_solver.mkBitVector(0, 2), CVC5ApiException);
321
4
  ASSERT_THROW(d_solver.mkBitVector(0, "-127", 10), CVC5ApiException);
322
4
  ASSERT_THROW(d_solver.mkBitVector(0, "a0", 16), CVC5ApiException);
323
324
4
  ASSERT_THROW(d_solver.mkBitVector(8, "", 2), CVC5ApiException);
325
326
4
  ASSERT_THROW(d_solver.mkBitVector(8, "101", 5), CVC5ApiException);
327
4
  ASSERT_THROW(d_solver.mkBitVector(8, "128", 11), CVC5ApiException);
328
4
  ASSERT_THROW(d_solver.mkBitVector(8, "a0", 21), CVC5ApiException);
329
330
4
  ASSERT_THROW(d_solver.mkBitVector(8, "-11111111", 2), CVC5ApiException);
331
4
  ASSERT_THROW(d_solver.mkBitVector(8, "101010101", 2), CVC5ApiException);
332
4
  ASSERT_THROW(d_solver.mkBitVector(8, "-256", 10), CVC5ApiException);
333
4
  ASSERT_THROW(d_solver.mkBitVector(8, "257", 10), CVC5ApiException);
334
4
  ASSERT_THROW(d_solver.mkBitVector(8, "-a0", 16), CVC5ApiException);
335
4
  ASSERT_THROW(d_solver.mkBitVector(8, "fffff", 16), CVC5ApiException);
336
337
4
  ASSERT_THROW(d_solver.mkBitVector(8, "10201010", 2), CVC5ApiException);
338
4
  ASSERT_THROW(d_solver.mkBitVector(8, "-25x", 10), CVC5ApiException);
339
4
  ASSERT_THROW(d_solver.mkBitVector(8, "2x7", 10), CVC5ApiException);
340
4
  ASSERT_THROW(d_solver.mkBitVector(8, "fzff", 16), CVC5ApiException);
341
342
2
  ASSERT_EQ(d_solver.mkBitVector(8, "0101", 2),
343
2
            d_solver.mkBitVector(8, "00000101", 2));
344
2
  ASSERT_EQ(d_solver.mkBitVector(4, "-1", 2), d_solver.mkBitVector(4, "1111", 2));
345
2
  ASSERT_EQ(d_solver.mkBitVector(4, "-1", 16), d_solver.mkBitVector(4, "1111", 2));
346
2
  ASSERT_EQ(d_solver.mkBitVector(4, "-1", 10), d_solver.mkBitVector(4, "1111", 2));
347
2
  ASSERT_EQ(d_solver.mkBitVector(8, "01010101", 2).toString(), "#b01010101");
348
2
  ASSERT_EQ(d_solver.mkBitVector(8, "F", 16).toString(), "#b00001111");
349
2
  ASSERT_EQ(d_solver.mkBitVector(8, "-1", 10),
350
2
            d_solver.mkBitVector(8, "FF", 16));
351
}
352
353
158
TEST_F(TestApiBlackSolver, mkVar)
354
{
355
4
  Sort boolSort = d_solver.getBooleanSort();
356
4
  Sort intSort = d_solver.getIntegerSort();
357
4
  Sort funSort = d_solver.mkFunctionSort(intSort, boolSort);
358
2
  ASSERT_NO_THROW(d_solver.mkVar(boolSort));
359
2
  ASSERT_NO_THROW(d_solver.mkVar(funSort));
360
2
  ASSERT_NO_THROW(d_solver.mkVar(boolSort, std::string("b")));
361
2
  ASSERT_NO_THROW(d_solver.mkVar(funSort, ""));
362
4
  ASSERT_THROW(d_solver.mkVar(Sort()), CVC5ApiException);
363
4
  ASSERT_THROW(d_solver.mkVar(Sort(), "a"), CVC5ApiException);
364
4
  Solver slv;
365
4
  ASSERT_THROW(slv.mkVar(boolSort, "x"), CVC5ApiException);
366
}
367
368
158
TEST_F(TestApiBlackSolver, mkBoolean)
369
{
370
2
  ASSERT_NO_THROW(d_solver.mkBoolean(true));
371
2
  ASSERT_NO_THROW(d_solver.mkBoolean(false));
372
}
373
374
158
TEST_F(TestApiBlackSolver, mkRoundingMode)
375
{
376
2
  ASSERT_NO_THROW(d_solver.mkRoundingMode(RoundingMode::ROUND_TOWARD_ZERO));
377
}
378
379
158
TEST_F(TestApiBlackSolver, mkAbstractValue)
380
{
381
2
  ASSERT_NO_THROW(d_solver.mkAbstractValue(std::string("1")));
382
4
  ASSERT_THROW(d_solver.mkAbstractValue(std::string("0")), CVC5ApiException);
383
4
  ASSERT_THROW(d_solver.mkAbstractValue(std::string("-1")), CVC5ApiException);
384
4
  ASSERT_THROW(d_solver.mkAbstractValue(std::string("1.2")), CVC5ApiException);
385
4
  ASSERT_THROW(d_solver.mkAbstractValue("1/2"), CVC5ApiException);
386
4
  ASSERT_THROW(d_solver.mkAbstractValue("asdf"), CVC5ApiException);
387
388
2
  ASSERT_NO_THROW(d_solver.mkAbstractValue((uint32_t)1));
389
2
  ASSERT_NO_THROW(d_solver.mkAbstractValue((int32_t)1));
390
2
  ASSERT_NO_THROW(d_solver.mkAbstractValue((uint64_t)1));
391
2
  ASSERT_NO_THROW(d_solver.mkAbstractValue((int64_t)1));
392
2
  ASSERT_NO_THROW(d_solver.mkAbstractValue((int32_t)-1));
393
2
  ASSERT_NO_THROW(d_solver.mkAbstractValue((int64_t)-1));
394
4
  ASSERT_THROW(d_solver.mkAbstractValue(0), CVC5ApiException);
395
}
396
397
158
TEST_F(TestApiBlackSolver, mkFloatingPoint)
398
{
399
4
  Term t1 = d_solver.mkBitVector(8);
400
4
  Term t2 = d_solver.mkBitVector(4);
401
4
  Term t3 = d_solver.mkInteger(2);
402
2
  ASSERT_NO_THROW(d_solver.mkFloatingPoint(3, 5, t1));
403
4
  ASSERT_THROW(d_solver.mkFloatingPoint(0, 5, Term()), CVC5ApiException);
404
4
  ASSERT_THROW(d_solver.mkFloatingPoint(0, 5, t1), CVC5ApiException);
405
4
  ASSERT_THROW(d_solver.mkFloatingPoint(3, 0, t1), CVC5ApiException);
406
4
  ASSERT_THROW(d_solver.mkFloatingPoint(3, 5, t2), CVC5ApiException);
407
4
  ASSERT_THROW(d_solver.mkFloatingPoint(3, 5, t2), CVC5ApiException);
408
409
4
  Solver slv;
410
4
  ASSERT_THROW(slv.mkFloatingPoint(3, 5, t1), CVC5ApiException);
411
}
412
413
158
TEST_F(TestApiBlackSolver, mkCardinalityConstraint)
414
{
415
4
  Sort su = d_solver.mkUninterpretedSort("u");
416
4
  Sort si = d_solver.getIntegerSort();
417
2
  ASSERT_NO_THROW(d_solver.mkCardinalityConstraint(su, 3));
418
4
  ASSERT_THROW(d_solver.mkCardinalityConstraint(si, 3), CVC5ApiException);
419
4
  ASSERT_THROW(d_solver.mkCardinalityConstraint(su, 0), CVC5ApiException);
420
4
  Solver slv;
421
4
  ASSERT_THROW(slv.mkCardinalityConstraint(su, 3), CVC5ApiException);
422
}
423
424
158
TEST_F(TestApiBlackSolver, mkEmptySet)
425
{
426
4
  Solver slv;
427
4
  Sort s = d_solver.mkSetSort(d_solver.getBooleanSort());
428
2
  ASSERT_NO_THROW(d_solver.mkEmptySet(Sort()));
429
2
  ASSERT_NO_THROW(d_solver.mkEmptySet(s));
430
4
  ASSERT_THROW(d_solver.mkEmptySet(d_solver.getBooleanSort()),
431
2
               CVC5ApiException);
432
4
  ASSERT_THROW(slv.mkEmptySet(s), CVC5ApiException);
433
}
434
435
158
TEST_F(TestApiBlackSolver, mkEmptyBag)
436
{
437
4
  Solver slv;
438
4
  Sort s = d_solver.mkBagSort(d_solver.getBooleanSort());
439
2
  ASSERT_NO_THROW(d_solver.mkEmptyBag(Sort()));
440
2
  ASSERT_NO_THROW(d_solver.mkEmptyBag(s));
441
4
  ASSERT_THROW(d_solver.mkEmptyBag(d_solver.getBooleanSort()),
442
2
               CVC5ApiException);
443
4
  ASSERT_THROW(slv.mkEmptyBag(s), CVC5ApiException);
444
}
445
446
158
TEST_F(TestApiBlackSolver, mkEmptySequence)
447
{
448
4
  Solver slv;
449
4
  Sort s = d_solver.mkSequenceSort(d_solver.getBooleanSort());
450
2
  ASSERT_NO_THROW(d_solver.mkEmptySequence(s));
451
2
  ASSERT_NO_THROW(d_solver.mkEmptySequence(d_solver.getBooleanSort()));
452
4
  ASSERT_THROW(slv.mkEmptySequence(s), CVC5ApiException);
453
}
454
455
158
TEST_F(TestApiBlackSolver, mkFalse)
456
{
457
2
  ASSERT_NO_THROW(d_solver.mkFalse());
458
2
  ASSERT_NO_THROW(d_solver.mkFalse());
459
}
460
461
158
TEST_F(TestApiBlackSolver, mkNaN) { ASSERT_NO_THROW(d_solver.mkNaN(3, 5)); }
462
463
158
TEST_F(TestApiBlackSolver, mkNegZero)
464
{
465
2
  ASSERT_NO_THROW(d_solver.mkNegZero(3, 5));
466
}
467
468
158
TEST_F(TestApiBlackSolver, mkNegInf)
469
{
470
2
  ASSERT_NO_THROW(d_solver.mkNegInf(3, 5));
471
}
472
473
158
TEST_F(TestApiBlackSolver, mkPosInf)
474
{
475
2
  ASSERT_NO_THROW(d_solver.mkPosInf(3, 5));
476
}
477
478
158
TEST_F(TestApiBlackSolver, mkPosZero)
479
{
480
2
  ASSERT_NO_THROW(d_solver.mkPosZero(3, 5));
481
}
482
483
158
TEST_F(TestApiBlackSolver, mkOp)
484
{
485
  // mkOp(Kind kind, Kind k)
486
4
  ASSERT_THROW(d_solver.mkOp(BITVECTOR_EXTRACT, EQUAL), CVC5ApiException);
487
488
  // mkOp(Kind kind, const std::string& arg)
489
2
  ASSERT_NO_THROW(d_solver.mkOp(DIVISIBLE, "2147483648"));
490
4
  ASSERT_THROW(d_solver.mkOp(BITVECTOR_EXTRACT, "asdf"), CVC5ApiException);
491
492
  // mkOp(Kind kind, uint32_t arg)
493
2
  ASSERT_NO_THROW(d_solver.mkOp(DIVISIBLE, 1));
494
2
  ASSERT_NO_THROW(d_solver.mkOp(BITVECTOR_ROTATE_LEFT, 1));
495
2
  ASSERT_NO_THROW(d_solver.mkOp(BITVECTOR_ROTATE_RIGHT, 1));
496
4
  ASSERT_THROW(d_solver.mkOp(BITVECTOR_EXTRACT, 1), CVC5ApiException);
497
498
  // mkOp(Kind kind, uint32_t arg1, uint32_t arg2)
499
2
  ASSERT_NO_THROW(d_solver.mkOp(BITVECTOR_EXTRACT, 1, 1));
500
4
  ASSERT_THROW(d_solver.mkOp(DIVISIBLE, 1, 2), CVC5ApiException);
501
502
  // mkOp(Kind kind, std::vector<uint32_t> args)
503
4
  std::vector<uint32_t> args = {1, 2, 2};
504
2
  ASSERT_NO_THROW(d_solver.mkOp(TUPLE_PROJECT, args));
505
}
506
507
158
TEST_F(TestApiBlackSolver, mkPi) { ASSERT_NO_THROW(d_solver.mkPi()); }
508
509
158
TEST_F(TestApiBlackSolver, mkInteger)
510
{
511
2
  ASSERT_NO_THROW(d_solver.mkInteger("123"));
512
4
  ASSERT_THROW(d_solver.mkInteger("1.23"), CVC5ApiException);
513
4
  ASSERT_THROW(d_solver.mkInteger("1/23"), CVC5ApiException);
514
4
  ASSERT_THROW(d_solver.mkInteger("12/3"), CVC5ApiException);
515
4
  ASSERT_THROW(d_solver.mkInteger(".2"), CVC5ApiException);
516
4
  ASSERT_THROW(d_solver.mkInteger("2."), CVC5ApiException);
517
4
  ASSERT_THROW(d_solver.mkInteger(""), CVC5ApiException);
518
4
  ASSERT_THROW(d_solver.mkInteger("asdf"), CVC5ApiException);
519
4
  ASSERT_THROW(d_solver.mkInteger("1.2/3"), CVC5ApiException);
520
4
  ASSERT_THROW(d_solver.mkInteger("."), CVC5ApiException);
521
4
  ASSERT_THROW(d_solver.mkInteger("/"), CVC5ApiException);
522
4
  ASSERT_THROW(d_solver.mkInteger("2/"), CVC5ApiException);
523
4
  ASSERT_THROW(d_solver.mkInteger("/2"), CVC5ApiException);
524
525
2
  ASSERT_NO_THROW(d_solver.mkReal(std::string("123")));
526
4
  ASSERT_THROW(d_solver.mkInteger(std::string("1.23")), CVC5ApiException);
527
4
  ASSERT_THROW(d_solver.mkInteger(std::string("1/23")), CVC5ApiException);
528
4
  ASSERT_THROW(d_solver.mkInteger(std::string("12/3")), CVC5ApiException);
529
4
  ASSERT_THROW(d_solver.mkInteger(std::string(".2")), CVC5ApiException);
530
4
  ASSERT_THROW(d_solver.mkInteger(std::string("2.")), CVC5ApiException);
531
4
  ASSERT_THROW(d_solver.mkInteger(std::string("")), CVC5ApiException);
532
4
  ASSERT_THROW(d_solver.mkInteger(std::string("asdf")), CVC5ApiException);
533
4
  ASSERT_THROW(d_solver.mkInteger(std::string("1.2/3")), CVC5ApiException);
534
4
  ASSERT_THROW(d_solver.mkInteger(std::string(".")), CVC5ApiException);
535
4
  ASSERT_THROW(d_solver.mkInteger(std::string("/")), CVC5ApiException);
536
4
  ASSERT_THROW(d_solver.mkInteger(std::string("2/")), CVC5ApiException);
537
4
  ASSERT_THROW(d_solver.mkInteger(std::string("/2")), CVC5ApiException);
538
539
2
  int32_t val1 = 1;
540
2
  int64_t val2 = -1;
541
2
  uint32_t val3 = 1;
542
2
  uint64_t val4 = -1;
543
2
  ASSERT_NO_THROW(d_solver.mkInteger(val1));
544
2
  ASSERT_NO_THROW(d_solver.mkInteger(val2));
545
2
  ASSERT_NO_THROW(d_solver.mkInteger(val3));
546
2
  ASSERT_NO_THROW(d_solver.mkInteger(val4));
547
2
  ASSERT_NO_THROW(d_solver.mkInteger(val4));
548
}
549
550
158
TEST_F(TestApiBlackSolver, mkReal)
551
{
552
2
  ASSERT_NO_THROW(d_solver.mkReal("123"));
553
2
  ASSERT_NO_THROW(d_solver.mkReal("1.23"));
554
2
  ASSERT_NO_THROW(d_solver.mkReal("1/23"));
555
2
  ASSERT_NO_THROW(d_solver.mkReal("12/3"));
556
2
  ASSERT_NO_THROW(d_solver.mkReal(".2"));
557
2
  ASSERT_NO_THROW(d_solver.mkReal("2."));
558
4
  ASSERT_THROW(d_solver.mkReal(""), CVC5ApiException);
559
4
  ASSERT_THROW(d_solver.mkReal("asdf"), CVC5ApiException);
560
4
  ASSERT_THROW(d_solver.mkReal("1.2/3"), CVC5ApiException);
561
4
  ASSERT_THROW(d_solver.mkReal("."), CVC5ApiException);
562
4
  ASSERT_THROW(d_solver.mkReal("/"), CVC5ApiException);
563
4
  ASSERT_THROW(d_solver.mkReal("2/"), CVC5ApiException);
564
4
  ASSERT_THROW(d_solver.mkReal("/2"), CVC5ApiException);
565
566
2
  ASSERT_NO_THROW(d_solver.mkReal(std::string("123")));
567
2
  ASSERT_NO_THROW(d_solver.mkReal(std::string("1.23")));
568
2
  ASSERT_NO_THROW(d_solver.mkReal(std::string("1/23")));
569
2
  ASSERT_NO_THROW(d_solver.mkReal(std::string("12/3")));
570
2
  ASSERT_NO_THROW(d_solver.mkReal(std::string(".2")));
571
2
  ASSERT_NO_THROW(d_solver.mkReal(std::string("2.")));
572
4
  ASSERT_THROW(d_solver.mkReal(std::string("")), CVC5ApiException);
573
4
  ASSERT_THROW(d_solver.mkReal(std::string("asdf")), CVC5ApiException);
574
4
  ASSERT_THROW(d_solver.mkReal(std::string("1.2/3")), CVC5ApiException);
575
4
  ASSERT_THROW(d_solver.mkReal(std::string(".")), CVC5ApiException);
576
4
  ASSERT_THROW(d_solver.mkReal(std::string("/")), CVC5ApiException);
577
4
  ASSERT_THROW(d_solver.mkReal(std::string("2/")), CVC5ApiException);
578
4
  ASSERT_THROW(d_solver.mkReal(std::string("/2")), CVC5ApiException);
579
580
2
  int32_t val1 = 1;
581
2
  int64_t val2 = -1;
582
2
  uint32_t val3 = 1;
583
2
  uint64_t val4 = -1;
584
2
  ASSERT_NO_THROW(d_solver.mkReal(val1));
585
2
  ASSERT_NO_THROW(d_solver.mkReal(val2));
586
2
  ASSERT_NO_THROW(d_solver.mkReal(val3));
587
2
  ASSERT_NO_THROW(d_solver.mkReal(val4));
588
2
  ASSERT_NO_THROW(d_solver.mkReal(val4));
589
2
  ASSERT_NO_THROW(d_solver.mkReal(val1, val1));
590
2
  ASSERT_NO_THROW(d_solver.mkReal(val2, val2));
591
2
  ASSERT_NO_THROW(d_solver.mkReal(val3, val3));
592
2
  ASSERT_NO_THROW(d_solver.mkReal(val4, val4));
593
}
594
595
158
TEST_F(TestApiBlackSolver, mkRegexpEmpty)
596
{
597
4
  Sort strSort = d_solver.getStringSort();
598
4
  Term s = d_solver.mkConst(strSort, "s");
599
2
  ASSERT_NO_THROW(
600
      d_solver.mkTerm(STRING_IN_REGEXP, s, d_solver.mkRegexpEmpty()));
601
}
602
603
158
TEST_F(TestApiBlackSolver, mkRegexpSigma)
604
{
605
4
  Sort strSort = d_solver.getStringSort();
606
4
  Term s = d_solver.mkConst(strSort, "s");
607
2
  ASSERT_NO_THROW(
608
      d_solver.mkTerm(STRING_IN_REGEXP, s, d_solver.mkRegexpSigma()));
609
}
610
611
158
TEST_F(TestApiBlackSolver, mkSepEmp) { ASSERT_NO_THROW(d_solver.mkSepEmp()); }
612
613
158
TEST_F(TestApiBlackSolver, mkSepNil)
614
{
615
2
  ASSERT_NO_THROW(d_solver.mkSepNil(d_solver.getBooleanSort()));
616
4
  ASSERT_THROW(d_solver.mkSepNil(Sort()), CVC5ApiException);
617
4
  Solver slv;
618
4
  ASSERT_THROW(slv.mkSepNil(d_solver.getIntegerSort()), CVC5ApiException);
619
}
620
621
158
TEST_F(TestApiBlackSolver, mkString)
622
{
623
2
  ASSERT_NO_THROW(d_solver.mkString(""));
624
2
  ASSERT_NO_THROW(d_solver.mkString("asdfasdf"));
625
2
  ASSERT_EQ(d_solver.mkString("asdf\\nasdf").toString(),
626
2
            "\"asdf\\u{5c}nasdf\"");
627
2
  ASSERT_EQ(d_solver.mkString("asdf\\u{005c}nasdf", true).toString(),
628
2
            "\"asdf\\u{5c}nasdf\"");
629
}
630
631
158
TEST_F(TestApiBlackSolver, mkTerm)
632
{
633
4
  Sort bv32 = d_solver.mkBitVectorSort(32);
634
4
  Term a = d_solver.mkConst(bv32, "a");
635
4
  Term b = d_solver.mkConst(bv32, "b");
636
4
  std::vector<Term> v1 = {a, b};
637
4
  std::vector<Term> v2 = {a, Term()};
638
4
  std::vector<Term> v3 = {a, d_solver.mkTrue()};
639
4
  std::vector<Term> v4 = {d_solver.mkInteger(1), d_solver.mkInteger(2)};
640
4
  std::vector<Term> v5 = {d_solver.mkInteger(1), Term()};
641
4
  std::vector<Term> v6 = {};
642
4
  Solver slv;
643
644
  // mkTerm(Kind kind) const
645
2
  ASSERT_NO_THROW(d_solver.mkTerm(PI));
646
2
  ASSERT_NO_THROW(d_solver.mkTerm(REGEXP_EMPTY));
647
2
  ASSERT_NO_THROW(d_solver.mkTerm(REGEXP_SIGMA));
648
4
  ASSERT_THROW(d_solver.mkTerm(CONST_BITVECTOR), CVC5ApiException);
649
650
  // mkTerm(Kind kind, Term child) const
651
2
  ASSERT_NO_THROW(d_solver.mkTerm(NOT, d_solver.mkTrue()));
652
4
  ASSERT_THROW(d_solver.mkTerm(NOT, Term()), CVC5ApiException);
653
4
  ASSERT_THROW(d_solver.mkTerm(NOT, a), CVC5ApiException);
654
4
  ASSERT_THROW(slv.mkTerm(NOT, d_solver.mkTrue()), CVC5ApiException);
655
656
  // mkTerm(Kind kind, Term child1, Term child2) const
657
2
  ASSERT_NO_THROW(d_solver.mkTerm(EQUAL, a, b));
658
4
  ASSERT_THROW(d_solver.mkTerm(EQUAL, Term(), b), CVC5ApiException);
659
4
  ASSERT_THROW(d_solver.mkTerm(EQUAL, a, Term()), CVC5ApiException);
660
4
  ASSERT_THROW(d_solver.mkTerm(EQUAL, a, d_solver.mkTrue()), CVC5ApiException);
661
4
  ASSERT_THROW(slv.mkTerm(EQUAL, a, b), CVC5ApiException);
662
663
  // mkTerm(Kind kind, Term child1, Term child2, Term child3) const
664
2
  ASSERT_NO_THROW(d_solver.mkTerm(
665
      ITE, d_solver.mkTrue(), d_solver.mkTrue(), d_solver.mkTrue()));
666
4
  ASSERT_THROW(
667
      d_solver.mkTerm(ITE, Term(), d_solver.mkTrue(), d_solver.mkTrue()),
668
2
      CVC5ApiException);
669
4
  ASSERT_THROW(
670
      d_solver.mkTerm(ITE, d_solver.mkTrue(), Term(), d_solver.mkTrue()),
671
2
      CVC5ApiException);
672
4
  ASSERT_THROW(
673
      d_solver.mkTerm(ITE, d_solver.mkTrue(), d_solver.mkTrue(), Term()),
674
2
      CVC5ApiException);
675
4
  ASSERT_THROW(d_solver.mkTerm(ITE, d_solver.mkTrue(), d_solver.mkTrue(), b),
676
2
               CVC5ApiException);
677
4
  ASSERT_THROW(
678
      slv.mkTerm(ITE, d_solver.mkTrue(), d_solver.mkTrue(), d_solver.mkTrue()),
679
2
      CVC5ApiException);
680
681
  // mkTerm(Kind kind, const std::vector<Term>& children) const
682
2
  ASSERT_NO_THROW(d_solver.mkTerm(EQUAL, v1));
683
4
  ASSERT_THROW(d_solver.mkTerm(EQUAL, v2), CVC5ApiException);
684
4
  ASSERT_THROW(d_solver.mkTerm(EQUAL, v3), CVC5ApiException);
685
4
  ASSERT_THROW(d_solver.mkTerm(DISTINCT, v6), CVC5ApiException);
686
}
687
688
158
TEST_F(TestApiBlackSolver, mkTermFromOp)
689
{
690
4
  Sort bv32 = d_solver.mkBitVectorSort(32);
691
4
  Term a = d_solver.mkConst(bv32, "a");
692
4
  Term b = d_solver.mkConst(bv32, "b");
693
4
  std::vector<Term> v1 = {d_solver.mkInteger(1), d_solver.mkInteger(2)};
694
4
  std::vector<Term> v2 = {d_solver.mkInteger(1), Term()};
695
4
  std::vector<Term> v3 = {};
696
4
  std::vector<Term> v4 = {d_solver.mkInteger(5)};
697
4
  Solver slv;
698
699
  // simple operator terms
700
4
  Op opterm1 = d_solver.mkOp(BITVECTOR_EXTRACT, 2, 1);
701
4
  Op opterm2 = d_solver.mkOp(DIVISIBLE, 1);
702
703
  // list datatype
704
4
  Sort sort = d_solver.mkParamSort("T");
705
4
  DatatypeDecl listDecl = d_solver.mkDatatypeDecl("paramlist", sort);
706
4
  DatatypeConstructorDecl cons = d_solver.mkDatatypeConstructorDecl("cons");
707
4
  DatatypeConstructorDecl nil = d_solver.mkDatatypeConstructorDecl("nil");
708
2
  cons.addSelector("head", sort);
709
2
  cons.addSelectorSelf("tail");
710
2
  listDecl.addConstructor(cons);
711
2
  listDecl.addConstructor(nil);
712
4
  Sort listSort = d_solver.mkDatatypeSort(listDecl);
713
  Sort intListSort =
714
4
      listSort.instantiate(std::vector<Sort>{d_solver.getIntegerSort()});
715
4
  Term c = d_solver.mkConst(intListSort, "c");
716
4
  Datatype list = listSort.getDatatype();
717
718
  // list datatype constructor and selector operator terms
719
4
  Term consTerm1 = list.getConstructorTerm("cons");
720
4
  Term consTerm2 = list.getConstructor("cons").getConstructorTerm();
721
4
  Term nilTerm1 = list.getConstructorTerm("nil");
722
4
  Term nilTerm2 = list.getConstructor("nil").getConstructorTerm();
723
4
  Term headTerm1 = list["cons"].getSelectorTerm("head");
724
4
  Term headTerm2 = list["cons"].getSelector("head").getSelectorTerm();
725
4
  Term tailTerm1 = list["cons"].getSelectorTerm("tail");
726
4
  Term tailTerm2 = list["cons"]["tail"].getSelectorTerm();
727
728
  // mkTerm(Op op, Term term) const
729
2
  ASSERT_NO_THROW(d_solver.mkTerm(APPLY_CONSTRUCTOR, nilTerm1));
730
2
  ASSERT_NO_THROW(d_solver.mkTerm(APPLY_CONSTRUCTOR, nilTerm2));
731
4
  ASSERT_THROW(d_solver.mkTerm(APPLY_SELECTOR, nilTerm1), CVC5ApiException);
732
4
  ASSERT_THROW(d_solver.mkTerm(APPLY_SELECTOR, consTerm1), CVC5ApiException);
733
4
  ASSERT_THROW(d_solver.mkTerm(APPLY_CONSTRUCTOR, consTerm2), CVC5ApiException);
734
4
  ASSERT_THROW(d_solver.mkTerm(opterm1), CVC5ApiException);
735
4
  ASSERT_THROW(d_solver.mkTerm(APPLY_SELECTOR, headTerm1), CVC5ApiException);
736
4
  ASSERT_THROW(d_solver.mkTerm(opterm1), CVC5ApiException);
737
4
  ASSERT_THROW(slv.mkTerm(APPLY_CONSTRUCTOR, nilTerm1), CVC5ApiException);
738
739
  // mkTerm(Op op, Term child) const
740
2
  ASSERT_NO_THROW(d_solver.mkTerm(opterm1, a));
741
2
  ASSERT_NO_THROW(d_solver.mkTerm(opterm2, d_solver.mkInteger(1)));
742
2
  ASSERT_NO_THROW(d_solver.mkTerm(APPLY_SELECTOR, headTerm1, c));
743
2
  ASSERT_NO_THROW(d_solver.mkTerm(APPLY_SELECTOR, tailTerm2, c));
744
4
  ASSERT_THROW(d_solver.mkTerm(opterm2, a), CVC5ApiException);
745
4
  ASSERT_THROW(d_solver.mkTerm(opterm1, Term()), CVC5ApiException);
746
4
  ASSERT_THROW(
747
      d_solver.mkTerm(APPLY_CONSTRUCTOR, consTerm1, d_solver.mkInteger(0)),
748
2
      CVC5ApiException);
749
4
  ASSERT_THROW(slv.mkTerm(opterm1, a), CVC5ApiException);
750
751
  // mkTerm(Op op, Term child1, Term child2) const
752
2
  ASSERT_NO_THROW(
753
      d_solver.mkTerm(APPLY_CONSTRUCTOR,
754
                      consTerm1,
755
                      d_solver.mkInteger(0),
756
                      d_solver.mkTerm(APPLY_CONSTRUCTOR, nilTerm1)));
757
4
  ASSERT_THROW(
758
      d_solver.mkTerm(opterm2, d_solver.mkInteger(1), d_solver.mkInteger(2)),
759
2
      CVC5ApiException);
760
4
  ASSERT_THROW(d_solver.mkTerm(opterm1, a, b), CVC5ApiException);
761
4
  ASSERT_THROW(d_solver.mkTerm(opterm2, d_solver.mkInteger(1), Term()),
762
2
               CVC5ApiException);
763
4
  ASSERT_THROW(d_solver.mkTerm(opterm2, Term(), d_solver.mkInteger(1)),
764
2
               CVC5ApiException);
765
4
  ASSERT_THROW(slv.mkTerm(APPLY_CONSTRUCTOR,
766
                          consTerm1,
767
                          d_solver.mkInteger(0),
768
                          d_solver.mkTerm(APPLY_CONSTRUCTOR, nilTerm1)),
769
2
               CVC5ApiException);
770
771
  // mkTerm(Op op, Term child1, Term child2, Term child3) const
772
4
  ASSERT_THROW(d_solver.mkTerm(opterm1, a, b, a), CVC5ApiException);
773
4
  ASSERT_THROW(
774
      d_solver.mkTerm(
775
          opterm2, d_solver.mkInteger(1), d_solver.mkInteger(1), Term()),
776
2
      CVC5ApiException);
777
778
  // mkTerm(Op op, const std::vector<Term>& children) const
779
2
  ASSERT_NO_THROW(d_solver.mkTerm(opterm2, v4));
780
4
  ASSERT_THROW(d_solver.mkTerm(opterm2, v1), CVC5ApiException);
781
4
  ASSERT_THROW(d_solver.mkTerm(opterm2, v2), CVC5ApiException);
782
4
  ASSERT_THROW(d_solver.mkTerm(opterm2, v3), CVC5ApiException);
783
4
  ASSERT_THROW(slv.mkTerm(opterm2, v4), CVC5ApiException);
784
}
785
786
158
TEST_F(TestApiBlackSolver, mkTrue)
787
{
788
2
  ASSERT_NO_THROW(d_solver.mkTrue());
789
2
  ASSERT_NO_THROW(d_solver.mkTrue());
790
}
791
792
158
TEST_F(TestApiBlackSolver, mkTuple)
793
{
794
2
  ASSERT_NO_THROW(d_solver.mkTuple({d_solver.mkBitVectorSort(3)},
795
                                   {d_solver.mkBitVector(3, "101", 2)}));
796
2
  ASSERT_NO_THROW(
797
      d_solver.mkTuple({d_solver.getRealSort()}, {d_solver.mkInteger("5")}));
798
799
4
  ASSERT_THROW(d_solver.mkTuple({}, {d_solver.mkBitVector(3, "101", 2)}),
800
2
               CVC5ApiException);
801
4
  ASSERT_THROW(d_solver.mkTuple({d_solver.mkBitVectorSort(4)},
802
                                {d_solver.mkBitVector(3, "101", 2)}),
803
2
               CVC5ApiException);
804
4
  ASSERT_THROW(
805
      d_solver.mkTuple({d_solver.getIntegerSort()}, {d_solver.mkReal("5.3")}),
806
2
      CVC5ApiException);
807
4
  Solver slv;
808
4
  ASSERT_THROW(slv.mkTuple({d_solver.mkBitVectorSort(3)},
809
                           {slv.mkBitVector(3, "101", 2)}),
810
2
               CVC5ApiException);
811
4
  ASSERT_THROW(slv.mkTuple({slv.mkBitVectorSort(3)},
812
                           {d_solver.mkBitVector(3, "101", 2)}),
813
2
               CVC5ApiException);
814
}
815
816
158
TEST_F(TestApiBlackSolver, mkUniverseSet)
817
{
818
2
  ASSERT_NO_THROW(d_solver.mkUniverseSet(d_solver.getBooleanSort()));
819
4
  ASSERT_THROW(d_solver.mkUniverseSet(Sort()), CVC5ApiException);
820
4
  Solver slv;
821
4
  ASSERT_THROW(slv.mkUniverseSet(d_solver.getBooleanSort()), CVC5ApiException);
822
}
823
824
158
TEST_F(TestApiBlackSolver, mkConst)
825
{
826
4
  Sort boolSort = d_solver.getBooleanSort();
827
4
  Sort intSort = d_solver.getIntegerSort();
828
4
  Sort funSort = d_solver.mkFunctionSort(intSort, boolSort);
829
2
  ASSERT_NO_THROW(d_solver.mkConst(boolSort));
830
2
  ASSERT_NO_THROW(d_solver.mkConst(funSort));
831
2
  ASSERT_NO_THROW(d_solver.mkConst(boolSort, std::string("b")));
832
2
  ASSERT_NO_THROW(d_solver.mkConst(intSort, std::string("i")));
833
2
  ASSERT_NO_THROW(d_solver.mkConst(funSort, "f"));
834
2
  ASSERT_NO_THROW(d_solver.mkConst(funSort, ""));
835
4
  ASSERT_THROW(d_solver.mkConst(Sort()), CVC5ApiException);
836
4
  ASSERT_THROW(d_solver.mkConst(Sort(), "a"), CVC5ApiException);
837
838
4
  Solver slv;
839
4
  ASSERT_THROW(slv.mkConst(boolSort), CVC5ApiException);
840
}
841
842
158
TEST_F(TestApiBlackSolver, mkConstArray)
843
{
844
4
  Sort intSort = d_solver.getIntegerSort();
845
4
  Sort arrSort = d_solver.mkArraySort(intSort, intSort);
846
4
  Term zero = d_solver.mkInteger(0);
847
4
  Term constArr = d_solver.mkConstArray(arrSort, zero);
848
849
2
  ASSERT_NO_THROW(d_solver.mkConstArray(arrSort, zero));
850
4
  ASSERT_THROW(d_solver.mkConstArray(Sort(), zero), CVC5ApiException);
851
4
  ASSERT_THROW(d_solver.mkConstArray(arrSort, Term()), CVC5ApiException);
852
4
  ASSERT_THROW(d_solver.mkConstArray(arrSort, d_solver.mkBitVector(1, 1)),
853
2
               CVC5ApiException);
854
4
  ASSERT_THROW(d_solver.mkConstArray(intSort, zero), CVC5ApiException);
855
4
  Solver slv;
856
4
  Term zero2 = slv.mkInteger(0);
857
4
  Sort arrSort2 = slv.mkArraySort(slv.getIntegerSort(), slv.getIntegerSort());
858
4
  ASSERT_THROW(slv.mkConstArray(arrSort2, zero), CVC5ApiException);
859
4
  ASSERT_THROW(slv.mkConstArray(arrSort, zero2), CVC5ApiException);
860
}
861
862
158
TEST_F(TestApiBlackSolver, declareDatatype)
863
{
864
4
  DatatypeConstructorDecl nil = d_solver.mkDatatypeConstructorDecl("nil");
865
4
  std::vector<DatatypeConstructorDecl> ctors1 = {nil};
866
2
  ASSERT_NO_THROW(d_solver.declareDatatype(std::string("a"), ctors1));
867
4
  DatatypeConstructorDecl cons = d_solver.mkDatatypeConstructorDecl("cons");
868
4
  DatatypeConstructorDecl nil2 = d_solver.mkDatatypeConstructorDecl("nil");
869
4
  std::vector<DatatypeConstructorDecl> ctors2 = {cons, nil2};
870
2
  ASSERT_NO_THROW(d_solver.declareDatatype(std::string("b"), ctors2));
871
4
  DatatypeConstructorDecl cons2 = d_solver.mkDatatypeConstructorDecl("cons");
872
4
  DatatypeConstructorDecl nil3 = d_solver.mkDatatypeConstructorDecl("nil");
873
4
  std::vector<DatatypeConstructorDecl> ctors3 = {cons2, nil3};
874
2
  ASSERT_NO_THROW(d_solver.declareDatatype(std::string(""), ctors3));
875
4
  std::vector<DatatypeConstructorDecl> ctors4;
876
4
  ASSERT_THROW(d_solver.declareDatatype(std::string("c"), ctors4),
877
2
               CVC5ApiException);
878
4
  ASSERT_THROW(d_solver.declareDatatype(std::string(""), ctors4),
879
2
               CVC5ApiException);
880
4
  Solver slv;
881
4
  ASSERT_THROW(slv.declareDatatype(std::string("a"), ctors1), CVC5ApiException);
882
}
883
884
158
TEST_F(TestApiBlackSolver, declareFun)
885
{
886
4
  Sort bvSort = d_solver.mkBitVectorSort(32);
887
4
  Sort funSort = d_solver.mkFunctionSort(d_solver.mkUninterpretedSort("u"),
888
8
                                         d_solver.getIntegerSort());
889
2
  ASSERT_NO_THROW(d_solver.declareFun("f1", {}, bvSort));
890
2
  ASSERT_NO_THROW(
891
      d_solver.declareFun("f3", {bvSort, d_solver.getIntegerSort()}, bvSort));
892
4
  ASSERT_THROW(d_solver.declareFun("f2", {}, funSort), CVC5ApiException);
893
  // functions as arguments is allowed
894
2
  ASSERT_NO_THROW(d_solver.declareFun("f4", {bvSort, funSort}, bvSort));
895
4
  ASSERT_THROW(d_solver.declareFun("f5", {bvSort, bvSort}, funSort),
896
2
               CVC5ApiException);
897
4
  Solver slv;
898
4
  ASSERT_THROW(slv.declareFun("f1", {}, bvSort), CVC5ApiException);
899
}
900
901
158
TEST_F(TestApiBlackSolver, declareSort)
902
{
903
2
  ASSERT_NO_THROW(d_solver.declareSort("s", 0));
904
2
  ASSERT_NO_THROW(d_solver.declareSort("s", 2));
905
2
  ASSERT_NO_THROW(d_solver.declareSort("", 2));
906
}
907
908
158
TEST_F(TestApiBlackSolver, defineSort)
909
{
910
4
  Sort sortVar0 = d_solver.mkParamSort("T0");
911
4
  Sort sortVar1 = d_solver.mkParamSort("T1");
912
4
  Sort intSort = d_solver.getIntegerSort();
913
4
  Sort realSort = d_solver.getRealSort();
914
4
  Sort arraySort0 = d_solver.mkArraySort(sortVar0, sortVar0);
915
4
  Sort arraySort1 = d_solver.mkArraySort(sortVar0, sortVar1);
916
  // Now create instantiations of the defined sorts
917
2
  ASSERT_NO_THROW(arraySort0.substitute(sortVar0, intSort));
918
2
  ASSERT_NO_THROW(
919
      arraySort1.substitute({sortVar0, sortVar1}, {intSort, realSort}));
920
}
921
922
158
TEST_F(TestApiBlackSolver, defineFun)
923
{
924
4
  Sort bvSort = d_solver.mkBitVectorSort(32);
925
4
  Sort funSort = d_solver.mkFunctionSort(d_solver.mkUninterpretedSort("u"),
926
8
                                         d_solver.getIntegerSort());
927
4
  Term b1 = d_solver.mkVar(bvSort, "b1");
928
4
  Term b2 = d_solver.mkVar(d_solver.getIntegerSort(), "b2");
929
4
  Term b3 = d_solver.mkVar(funSort, "b3");
930
4
  Term v1 = d_solver.mkConst(bvSort, "v1");
931
4
  Term v2 = d_solver.mkConst(funSort, "v2");
932
2
  ASSERT_NO_THROW(d_solver.defineFun("f", {}, bvSort, v1));
933
2
  ASSERT_NO_THROW(d_solver.defineFun("ff", {b1, b2}, bvSort, v1));
934
4
  ASSERT_THROW(d_solver.defineFun("ff", {v1, b2}, bvSort, v1),
935
2
               CVC5ApiException);
936
4
  ASSERT_THROW(d_solver.defineFun("fff", {b1}, bvSort, v2), CVC5ApiException);
937
4
  ASSERT_THROW(d_solver.defineFun("ffff", {b1}, funSort, v2), CVC5ApiException);
938
  // b3 has function sort, which is allowed as an argument
939
2
  ASSERT_NO_THROW(d_solver.defineFun("fffff", {b1, b3}, bvSort, v1));
940
941
4
  Solver slv;
942
4
  Sort bvSort2 = slv.mkBitVectorSort(32);
943
4
  Term v12 = slv.mkConst(bvSort2, "v1");
944
4
  Term b12 = slv.mkVar(bvSort2, "b1");
945
4
  Term b22 = slv.mkVar(slv.getIntegerSort(), "b2");
946
4
  ASSERT_THROW(slv.defineFun("f", {}, bvSort, v12), CVC5ApiException);
947
4
  ASSERT_THROW(slv.defineFun("f", {}, bvSort2, v1), CVC5ApiException);
948
4
  ASSERT_THROW(slv.defineFun("ff", {b1, b22}, bvSort2, v12), CVC5ApiException);
949
4
  ASSERT_THROW(slv.defineFun("ff", {b12, b2}, bvSort2, v12), CVC5ApiException);
950
4
  ASSERT_THROW(slv.defineFun("ff", {b12, b22}, bvSort, v12), CVC5ApiException);
951
4
  ASSERT_THROW(slv.defineFun("ff", {b12, b22}, bvSort2, v1), CVC5ApiException);
952
}
953
954
158
TEST_F(TestApiBlackSolver, defineFunGlobal)
955
{
956
4
  Sort bSort = d_solver.getBooleanSort();
957
958
4
  Term bTrue = d_solver.mkBoolean(true);
959
  // (define-fun f () Bool true)
960
4
  Term f = d_solver.defineFun("f", {}, bSort, bTrue, true);
961
4
  Term b = d_solver.mkVar(bSort, "b");
962
  // (define-fun g (b Bool) Bool b)
963
4
  Term g = d_solver.defineFun("g", {b}, bSort, b, true);
964
965
  // (assert (or (not f) (not (g true))))
966
4
  d_solver.assertFormula(d_solver.mkTerm(
967
4
      OR, f.notTerm(), d_solver.mkTerm(APPLY_UF, g, bTrue).notTerm()));
968
2
  ASSERT_TRUE(d_solver.checkSat().isUnsat());
969
2
  d_solver.resetAssertions();
970
  // (assert (or (not f) (not (g true))))
971
4
  d_solver.assertFormula(d_solver.mkTerm(
972
4
      OR, f.notTerm(), d_solver.mkTerm(APPLY_UF, g, bTrue).notTerm()));
973
2
  ASSERT_TRUE(d_solver.checkSat().isUnsat());
974
}
975
976
158
TEST_F(TestApiBlackSolver, defineFunRec)
977
{
978
4
  Sort bvSort = d_solver.mkBitVectorSort(32);
979
4
  Sort funSort1 = d_solver.mkFunctionSort({bvSort, bvSort}, bvSort);
980
4
  Sort funSort2 = d_solver.mkFunctionSort(d_solver.mkUninterpretedSort("u"),
981
8
                                          d_solver.getIntegerSort());
982
4
  Term b1 = d_solver.mkVar(bvSort, "b1");
983
4
  Term b11 = d_solver.mkVar(bvSort, "b1");
984
4
  Term b2 = d_solver.mkVar(d_solver.getIntegerSort(), "b2");
985
4
  Term b3 = d_solver.mkVar(funSort2, "b3");
986
4
  Term v1 = d_solver.mkConst(bvSort, "v1");
987
4
  Term v2 = d_solver.mkConst(d_solver.getIntegerSort(), "v2");
988
4
  Term v3 = d_solver.mkConst(funSort2, "v3");
989
4
  Term f1 = d_solver.mkConst(funSort1, "f1");
990
4
  Term f2 = d_solver.mkConst(funSort2, "f2");
991
4
  Term f3 = d_solver.mkConst(bvSort, "f3");
992
2
  ASSERT_NO_THROW(d_solver.defineFunRec("f", {}, bvSort, v1));
993
2
  ASSERT_NO_THROW(d_solver.defineFunRec("ff", {b1, b2}, bvSort, v1));
994
2
  ASSERT_NO_THROW(d_solver.defineFunRec(f1, {b1, b11}, v1));
995
4
  ASSERT_THROW(d_solver.defineFunRec("fff", {b1}, bvSort, v3),
996
2
               CVC5ApiException);
997
4
  ASSERT_THROW(d_solver.defineFunRec("ff", {b1, v2}, bvSort, v1),
998
2
               CVC5ApiException);
999
4
  ASSERT_THROW(d_solver.defineFunRec("ffff", {b1}, funSort2, v3),
1000
2
               CVC5ApiException);
1001
  // b3 has function sort, which is allowed as an argument
1002
2
  ASSERT_NO_THROW(d_solver.defineFunRec("fffff", {b1, b3}, bvSort, v1));
1003
4
  ASSERT_THROW(d_solver.defineFunRec(f1, {b1}, v1), CVC5ApiException);
1004
4
  ASSERT_THROW(d_solver.defineFunRec(f1, {b1, b11}, v2), CVC5ApiException);
1005
4
  ASSERT_THROW(d_solver.defineFunRec(f1, {b1, b11}, v3), CVC5ApiException);
1006
4
  ASSERT_THROW(d_solver.defineFunRec(f2, {b1}, v2), CVC5ApiException);
1007
4
  ASSERT_THROW(d_solver.defineFunRec(f3, {b1}, v1), CVC5ApiException);
1008
1009
4
  Solver slv;
1010
4
  Sort bvSort2 = slv.mkBitVectorSort(32);
1011
4
  Term v12 = slv.mkConst(bvSort2, "v1");
1012
4
  Term b12 = slv.mkVar(bvSort2, "b1");
1013
4
  Term b22 = slv.mkVar(slv.getIntegerSort(), "b2");
1014
2
  ASSERT_NO_THROW(slv.defineFunRec("f", {}, bvSort2, v12));
1015
2
  ASSERT_NO_THROW(slv.defineFunRec("ff", {b12, b22}, bvSort2, v12));
1016
4
  ASSERT_THROW(slv.defineFunRec("f", {}, bvSort, v12), CVC5ApiException);
1017
4
  ASSERT_THROW(slv.defineFunRec("f", {}, bvSort2, v1), CVC5ApiException);
1018
4
  ASSERT_THROW(slv.defineFunRec("ff", {b1, b22}, bvSort2, v12),
1019
2
               CVC5ApiException);
1020
4
  ASSERT_THROW(slv.defineFunRec("ff", {b12, b2}, bvSort2, v12),
1021
2
               CVC5ApiException);
1022
4
  ASSERT_THROW(slv.defineFunRec("ff", {b12, b22}, bvSort, v12),
1023
2
               CVC5ApiException);
1024
4
  ASSERT_THROW(slv.defineFunRec("ff", {b12, b22}, bvSort2, v1),
1025
2
               CVC5ApiException);
1026
}
1027
1028
158
TEST_F(TestApiBlackSolver, defineFunRecWrongLogic)
1029
{
1030
2
  d_solver.setLogic("QF_BV");
1031
4
  Sort bvSort = d_solver.mkBitVectorSort(32);
1032
4
  Sort funSort = d_solver.mkFunctionSort({bvSort, bvSort}, bvSort);
1033
4
  Term b = d_solver.mkVar(bvSort, "b");
1034
4
  Term v = d_solver.mkConst(bvSort, "v");
1035
4
  Term f = d_solver.mkConst(funSort, "f");
1036
4
  ASSERT_THROW(d_solver.defineFunRec("f", {}, bvSort, v), CVC5ApiException);
1037
4
  ASSERT_THROW(d_solver.defineFunRec(f, {b, b}, v), CVC5ApiException);
1038
}
1039
1040
158
TEST_F(TestApiBlackSolver, defineFunRecGlobal)
1041
{
1042
4
  Sort bSort = d_solver.getBooleanSort();
1043
4
  Sort fSort = d_solver.mkFunctionSort(bSort, bSort);
1044
1045
2
  d_solver.push();
1046
4
  Term bTrue = d_solver.mkBoolean(true);
1047
  // (define-fun f () Bool true)
1048
4
  Term f = d_solver.defineFunRec("f", {}, bSort, bTrue, true);
1049
4
  Term b = d_solver.mkVar(bSort, "b");
1050
4
  Term gSym = d_solver.mkConst(fSort, "g");
1051
  // (define-fun g (b Bool) Bool b)
1052
4
  Term g = d_solver.defineFunRec(gSym, {b}, b, true);
1053
1054
  // (assert (or (not f) (not (g true))))
1055
4
  d_solver.assertFormula(d_solver.mkTerm(
1056
4
      OR, f.notTerm(), d_solver.mkTerm(APPLY_UF, g, bTrue).notTerm()));
1057
2
  ASSERT_TRUE(d_solver.checkSat().isUnsat());
1058
2
  d_solver.pop();
1059
  // (assert (or (not f) (not (g true))))
1060
4
  d_solver.assertFormula(d_solver.mkTerm(
1061
4
      OR, f.notTerm(), d_solver.mkTerm(APPLY_UF, g, bTrue).notTerm()));
1062
2
  ASSERT_TRUE(d_solver.checkSat().isUnsat());
1063
}
1064
1065
158
TEST_F(TestApiBlackSolver, defineFunsRec)
1066
{
1067
4
  Sort uSort = d_solver.mkUninterpretedSort("u");
1068
4
  Sort bvSort = d_solver.mkBitVectorSort(32);
1069
4
  Sort funSort1 = d_solver.mkFunctionSort({bvSort, bvSort}, bvSort);
1070
4
  Sort funSort2 = d_solver.mkFunctionSort(uSort, d_solver.getIntegerSort());
1071
4
  Term b1 = d_solver.mkVar(bvSort, "b1");
1072
4
  Term b11 = d_solver.mkVar(bvSort, "b1");
1073
4
  Term b2 = d_solver.mkVar(d_solver.getIntegerSort(), "b2");
1074
4
  Term b3 = d_solver.mkVar(funSort2, "b3");
1075
4
  Term b4 = d_solver.mkVar(uSort, "b4");
1076
4
  Term v1 = d_solver.mkConst(bvSort, "v1");
1077
4
  Term v2 = d_solver.mkConst(d_solver.getIntegerSort(), "v2");
1078
4
  Term v3 = d_solver.mkConst(funSort2, "v3");
1079
4
  Term v4 = d_solver.mkConst(uSort, "v4");
1080
4
  Term f1 = d_solver.mkConst(funSort1, "f1");
1081
4
  Term f2 = d_solver.mkConst(funSort2, "f2");
1082
4
  Term f3 = d_solver.mkConst(bvSort, "f3");
1083
2
  ASSERT_NO_THROW(
1084
      d_solver.defineFunsRec({f1, f2}, {{b1, b11}, {b4}}, {v1, v2}));
1085
4
  ASSERT_THROW(d_solver.defineFunsRec({f1, f2}, {{v1, b11}, {b4}}, {v1, v2}),
1086
2
               CVC5ApiException);
1087
4
  ASSERT_THROW(d_solver.defineFunsRec({f1, f3}, {{b1, b11}, {b4}}, {v1, v2}),
1088
2
               CVC5ApiException);
1089
4
  ASSERT_THROW(d_solver.defineFunsRec({f1, f2}, {{b1}, {b4}}, {v1, v2}),
1090
2
               CVC5ApiException);
1091
4
  ASSERT_THROW(d_solver.defineFunsRec({f1, f2}, {{b1, b2}, {b4}}, {v1, v2}),
1092
2
               CVC5ApiException);
1093
4
  ASSERT_THROW(d_solver.defineFunsRec({f1, f2}, {{b1, b11}, {b4}}, {v1, v4}),
1094
2
               CVC5ApiException);
1095
1096
4
  Solver slv;
1097
4
  Sort uSort2 = slv.mkUninterpretedSort("u");
1098
4
  Sort bvSort2 = slv.mkBitVectorSort(32);
1099
4
  Sort funSort12 = slv.mkFunctionSort({bvSort2, bvSort2}, bvSort2);
1100
4
  Sort funSort22 = slv.mkFunctionSort(uSort2, slv.getIntegerSort());
1101
4
  Term b12 = slv.mkVar(bvSort2, "b1");
1102
4
  Term b112 = slv.mkVar(bvSort2, "b1");
1103
4
  Term b42 = slv.mkVar(uSort2, "b4");
1104
4
  Term v12 = slv.mkConst(bvSort2, "v1");
1105
4
  Term v22 = slv.mkConst(slv.getIntegerSort(), "v2");
1106
4
  Term f12 = slv.mkConst(funSort12, "f1");
1107
4
  Term f22 = slv.mkConst(funSort22, "f2");
1108
2
  ASSERT_NO_THROW(
1109
      slv.defineFunsRec({f12, f22}, {{b12, b112}, {b42}}, {v12, v22}));
1110
4
  ASSERT_THROW(slv.defineFunsRec({f1, f22}, {{b12, b112}, {b42}}, {v12, v22}),
1111
2
               CVC5ApiException);
1112
4
  ASSERT_THROW(slv.defineFunsRec({f12, f2}, {{b12, b112}, {b42}}, {v12, v22}),
1113
2
               CVC5ApiException);
1114
4
  ASSERT_THROW(slv.defineFunsRec({f12, f22}, {{b1, b112}, {b42}}, {v12, v22}),
1115
2
               CVC5ApiException);
1116
4
  ASSERT_THROW(slv.defineFunsRec({f12, f22}, {{b12, b11}, {b42}}, {v12, v22}),
1117
2
               CVC5ApiException);
1118
4
  ASSERT_THROW(slv.defineFunsRec({f12, f22}, {{b12, b112}, {b4}}, {v12, v22}),
1119
2
               CVC5ApiException);
1120
4
  ASSERT_THROW(slv.defineFunsRec({f12, f22}, {{b12, b112}, {b42}}, {v1, v22}),
1121
2
               CVC5ApiException);
1122
4
  ASSERT_THROW(slv.defineFunsRec({f12, f22}, {{b12, b112}, {b42}}, {v12, v2}),
1123
2
               CVC5ApiException);
1124
}
1125
1126
158
TEST_F(TestApiBlackSolver, defineFunsRecWrongLogic)
1127
{
1128
2
  d_solver.setLogic("QF_BV");
1129
4
  Sort uSort = d_solver.mkUninterpretedSort("u");
1130
4
  Sort bvSort = d_solver.mkBitVectorSort(32);
1131
4
  Sort funSort1 = d_solver.mkFunctionSort({bvSort, bvSort}, bvSort);
1132
4
  Sort funSort2 = d_solver.mkFunctionSort(uSort, d_solver.getIntegerSort());
1133
4
  Term b = d_solver.mkVar(bvSort, "b");
1134
4
  Term u = d_solver.mkVar(uSort, "u");
1135
4
  Term v1 = d_solver.mkConst(bvSort, "v1");
1136
4
  Term v2 = d_solver.mkConst(d_solver.getIntegerSort(), "v2");
1137
4
  Term f1 = d_solver.mkConst(funSort1, "f1");
1138
4
  Term f2 = d_solver.mkConst(funSort2, "f2");
1139
4
  ASSERT_THROW(d_solver.defineFunsRec({f1, f2}, {{b, b}, {u}}, {v1, v2}),
1140
2
               CVC5ApiException);
1141
}
1142
1143
158
TEST_F(TestApiBlackSolver, defineFunsRecGlobal)
1144
{
1145
4
  Sort bSort = d_solver.getBooleanSort();
1146
4
  Sort fSort = d_solver.mkFunctionSort(bSort, bSort);
1147
1148
2
  d_solver.push();
1149
4
  Term bTrue = d_solver.mkBoolean(true);
1150
4
  Term b = d_solver.mkVar(bSort, "b");
1151
4
  Term gSym = d_solver.mkConst(fSort, "g");
1152
  // (define-funs-rec ((g ((b Bool)) Bool)) (b))
1153
2
  d_solver.defineFunsRec({gSym}, {{b}}, {b}, true);
1154
1155
  // (assert (not (g true)))
1156
2
  d_solver.assertFormula(d_solver.mkTerm(APPLY_UF, gSym, bTrue).notTerm());
1157
2
  ASSERT_TRUE(d_solver.checkSat().isUnsat());
1158
2
  d_solver.pop();
1159
  // (assert (not (g true)))
1160
2
  d_solver.assertFormula(d_solver.mkTerm(APPLY_UF, gSym, bTrue).notTerm());
1161
2
  ASSERT_TRUE(d_solver.checkSat().isUnsat());
1162
}
1163
1164
158
TEST_F(TestApiBlackSolver, uFIteration)
1165
{
1166
4
  Sort intSort = d_solver.getIntegerSort();
1167
4
  Sort funSort = d_solver.mkFunctionSort({intSort, intSort}, intSort);
1168
4
  Term x = d_solver.mkConst(intSort, "x");
1169
4
  Term y = d_solver.mkConst(intSort, "y");
1170
4
  Term f = d_solver.mkConst(funSort, "f");
1171
4
  Term fxy = d_solver.mkTerm(APPLY_UF, f, x, y);
1172
1173
  // Expecting the uninterpreted function to be one of the children
1174
8
  Term expected_children[3] = {f, x, y};
1175
2
  uint32_t idx = 0;
1176
8
  for (auto c : fxy)
1177
  {
1178
6
    ASSERT_LT(idx, 3);
1179
6
    ASSERT_EQ(c, expected_children[idx]);
1180
6
    idx++;
1181
  }
1182
}
1183
1184
158
TEST_F(TestApiBlackSolver, getInfo)
1185
{
1186
2
  ASSERT_NO_THROW(d_solver.getInfo("name"));
1187
4
  ASSERT_THROW(d_solver.getInfo("asdf"), CVC5ApiException);
1188
}
1189
1190
158
TEST_F(TestApiBlackSolver, getAbduct)
1191
{
1192
2
  d_solver.setLogic("QF_LIA");
1193
2
  d_solver.setOption("produce-abducts", "true");
1194
2
  d_solver.setOption("incremental", "false");
1195
1196
4
  Sort intSort = d_solver.getIntegerSort();
1197
4
  Term zero = d_solver.mkInteger(0);
1198
4
  Term x = d_solver.mkConst(intSort, "x");
1199
4
  Term y = d_solver.mkConst(intSort, "y");
1200
1201
  // Assumptions for abduction: x > 0
1202
2
  d_solver.assertFormula(d_solver.mkTerm(GT, x, zero));
1203
  // Conjecture for abduction: y > 0
1204
4
  Term conj = d_solver.mkTerm(GT, y, zero);
1205
4
  Term output;
1206
  // Call the abduction api, while the resulting abduct is the output
1207
2
  ASSERT_TRUE(d_solver.getAbduct(conj, output));
1208
  // We expect the resulting output to be a boolean formula
1209
2
  ASSERT_TRUE(!output.isNull() && output.getSort().isBoolean());
1210
1211
  // try with a grammar, a simple grammar admitting true
1212
4
  Sort boolean = d_solver.getBooleanSort();
1213
4
  Term truen = d_solver.mkBoolean(true);
1214
4
  Term start = d_solver.mkVar(boolean);
1215
4
  Term output2;
1216
4
  Grammar g = d_solver.mkSygusGrammar({}, {start});
1217
4
  Term conj2 = d_solver.mkTerm(GT, x, zero);
1218
2
  ASSERT_NO_THROW(g.addRule(start, truen));
1219
  // Call the abduction api, while the resulting abduct is the output
1220
2
  ASSERT_TRUE(d_solver.getAbduct(conj2, g, output2));
1221
  // abduct must be true
1222
2
  ASSERT_EQ(output2, truen);
1223
}
1224
1225
158
TEST_F(TestApiBlackSolver, getAbduct2)
1226
{
1227
2
  d_solver.setLogic("QF_LIA");
1228
2
  d_solver.setOption("incremental", "false");
1229
4
  Sort intSort = d_solver.getIntegerSort();
1230
4
  Term zero = d_solver.mkInteger(0);
1231
4
  Term x = d_solver.mkConst(intSort, "x");
1232
4
  Term y = d_solver.mkConst(intSort, "y");
1233
  // Assumptions for abduction: x > 0
1234
2
  d_solver.assertFormula(d_solver.mkTerm(GT, x, zero));
1235
  // Conjecture for abduction: y > 0
1236
4
  Term conj = d_solver.mkTerm(GT, y, zero);
1237
4
  Term output;
1238
  // Fails due to option not set
1239
4
  ASSERT_THROW(d_solver.getAbduct(conj, output), CVC5ApiException);
1240
}
1241
1242
158
TEST_F(TestApiBlackSolver, getInterpolant)
1243
{
1244
2
  d_solver.setLogic("QF_LIA");
1245
2
  d_solver.setOption("produce-interpols", "default");
1246
2
  d_solver.setOption("incremental", "false");
1247
1248
4
  Sort intSort = d_solver.getIntegerSort();
1249
4
  Term zero = d_solver.mkInteger(0);
1250
4
  Term x = d_solver.mkConst(intSort, "x");
1251
4
  Term y = d_solver.mkConst(intSort, "y");
1252
4
  Term z = d_solver.mkConst(intSort, "z");
1253
1254
  // Assumptions for interpolation: x + y > 0 /\ x < 0
1255
4
  d_solver.assertFormula(
1256
4
      d_solver.mkTerm(GT, d_solver.mkTerm(PLUS, x, y), zero));
1257
2
  d_solver.assertFormula(d_solver.mkTerm(LT, x, zero));
1258
  // Conjecture for interpolation: y + z > 0 \/ z < 0
1259
  Term conj =
1260
      d_solver.mkTerm(OR,
1261
4
                      d_solver.mkTerm(GT, d_solver.mkTerm(PLUS, y, z), zero),
1262
8
                      d_solver.mkTerm(LT, z, zero));
1263
4
  Term output;
1264
  // Call the interpolation api, while the resulting interpolant is the output
1265
2
  d_solver.getInterpolant(conj, output);
1266
1267
  // We expect the resulting output to be a boolean formula
1268
2
  ASSERT_TRUE(output.getSort().isBoolean());
1269
}
1270
1271
158
TEST_F(TestApiBlackSolver, declarePool)
1272
{
1273
4
  Sort intSort = d_solver.getIntegerSort();
1274
4
  Sort setSort = d_solver.mkSetSort(intSort);
1275
4
  Term zero = d_solver.mkInteger(0);
1276
4
  Term x = d_solver.mkConst(intSort, "x");
1277
4
  Term y = d_solver.mkConst(intSort, "y");
1278
  // declare a pool with initial value { 0, x, y }
1279
4
  Term p = d_solver.declarePool("p", intSort, {zero, x, y});
1280
  // pool should have the same sort
1281
2
  ASSERT_TRUE(p.getSort() == setSort);
1282
  // cannot pass null sort
1283
4
  Sort nullSort;
1284
4
  ASSERT_THROW(d_solver.declarePool("i", nullSort, {}), CVC5ApiException);
1285
}
1286
1287
158
TEST_F(TestApiBlackSolver, getOp)
1288
{
1289
4
  Sort bv32 = d_solver.mkBitVectorSort(32);
1290
4
  Term a = d_solver.mkConst(bv32, "a");
1291
4
  Op ext = d_solver.mkOp(BITVECTOR_EXTRACT, 2, 1);
1292
4
  Term exta = d_solver.mkTerm(ext, a);
1293
1294
2
  ASSERT_FALSE(a.hasOp());
1295
4
  ASSERT_THROW(a.getOp(), CVC5ApiException);
1296
2
  ASSERT_TRUE(exta.hasOp());
1297
2
  ASSERT_EQ(exta.getOp(), ext);
1298
1299
  // Test Datatypes -- more complicated
1300
4
  DatatypeDecl consListSpec = d_solver.mkDatatypeDecl("list");
1301
4
  DatatypeConstructorDecl cons = d_solver.mkDatatypeConstructorDecl("cons");
1302
2
  cons.addSelector("head", d_solver.getIntegerSort());
1303
2
  cons.addSelectorSelf("tail");
1304
2
  consListSpec.addConstructor(cons);
1305
4
  DatatypeConstructorDecl nil = d_solver.mkDatatypeConstructorDecl("nil");
1306
2
  consListSpec.addConstructor(nil);
1307
4
  Sort consListSort = d_solver.mkDatatypeSort(consListSpec);
1308
4
  Datatype consList = consListSort.getDatatype();
1309
1310
4
  Term consTerm = consList.getConstructorTerm("cons");
1311
4
  Term nilTerm = consList.getConstructorTerm("nil");
1312
4
  Term headTerm = consList["cons"].getSelectorTerm("head");
1313
1314
4
  Term listnil = d_solver.mkTerm(APPLY_CONSTRUCTOR, nilTerm);
1315
  Term listcons1 = d_solver.mkTerm(
1316
4
      APPLY_CONSTRUCTOR, consTerm, d_solver.mkInteger(1), listnil);
1317
4
  Term listhead = d_solver.mkTerm(APPLY_SELECTOR, headTerm, listcons1);
1318
1319
2
  ASSERT_TRUE(listnil.hasOp());
1320
2
  ASSERT_TRUE(listcons1.hasOp());
1321
2
  ASSERT_TRUE(listhead.hasOp());
1322
}
1323
1324
158
TEST_F(TestApiBlackSolver, getOption)
1325
{
1326
2
  ASSERT_NO_THROW(d_solver.getOption("incremental"));
1327
4
  ASSERT_THROW(d_solver.getOption("asdf"), CVC5ApiException);
1328
}
1329
1330
158
TEST_F(TestApiBlackSolver, getOptionNames)
1331
{
1332
4
  std::vector<std::string> names = d_solver.getOptionNames();
1333
2
  ASSERT_TRUE(names.size() > 100);
1334
2
  ASSERT_NE(std::find(names.begin(), names.end(), "verbose"), names.end());
1335
2
  ASSERT_EQ(std::find(names.begin(), names.end(), "foobar"), names.end());
1336
}
1337
1338
158
TEST_F(TestApiBlackSolver, getOptionInfo)
1339
{
1340
  {
1341
4
    EXPECT_THROW(d_solver.getOptionInfo("asdf-invalid"), CVC5ApiException);
1342
  }
1343
  {
1344
4
    api::OptionInfo info = d_solver.getOptionInfo("verbose");
1345
2
    EXPECT_EQ("verbose", info.name);
1346
2
    EXPECT_EQ(std::vector<std::string>{}, info.aliases);
1347
2
    EXPECT_TRUE(std::holds_alternative<OptionInfo::VoidInfo>(info.valueInfo));
1348
  }
1349
  {
1350
    // int64 type with default
1351
4
    api::OptionInfo info = d_solver.getOptionInfo("verbosity");
1352
2
    EXPECT_EQ("verbosity", info.name);
1353
2
    EXPECT_EQ(std::vector<std::string>{}, info.aliases);
1354
2
    EXPECT_TRUE(std::holds_alternative<OptionInfo::NumberInfo<int64_t>>(info.valueInfo));
1355
2
    auto numInfo = std::get<OptionInfo::NumberInfo<int64_t>>(info.valueInfo);
1356
2
    EXPECT_EQ(0, numInfo.defaultValue);
1357
2
    EXPECT_EQ(0, numInfo.currentValue);
1358
2
    EXPECT_FALSE(numInfo.minimum || numInfo.maximum);
1359
2
    ASSERT_EQ(info.intValue(), 0);
1360
  }
1361
  {
1362
4
    auto info = d_solver.getOptionInfo("random-freq");
1363
2
    ASSERT_EQ(info.name, "random-freq");
1364
2
    ASSERT_EQ(info.aliases, std::vector<std::string>{"random-frequency"});
1365
2
    ASSERT_TRUE(std::holds_alternative<api::OptionInfo::NumberInfo<double>>(info.valueInfo));
1366
2
    auto ni = std::get<api::OptionInfo::NumberInfo<double>>(info.valueInfo);
1367
2
    ASSERT_EQ(ni.currentValue, 0.0);
1368
2
    ASSERT_EQ(ni.defaultValue, 0.0);
1369
2
    ASSERT_TRUE(ni.minimum && ni.maximum);
1370
2
    ASSERT_EQ(*ni.minimum, 0.0);
1371
2
    ASSERT_EQ(*ni.maximum, 1.0);
1372
2
    ASSERT_EQ(info.doubleValue(), 0.0);
1373
  }
1374
  {
1375
    // mode option
1376
4
    api::OptionInfo info = d_solver.getOptionInfo("output");
1377
2
    EXPECT_EQ("output", info.name);
1378
2
    EXPECT_EQ(std::vector<std::string>{}, info.aliases);
1379
2
    EXPECT_TRUE(std::holds_alternative<OptionInfo::ModeInfo>(info.valueInfo));
1380
4
    auto modeInfo = std::get<OptionInfo::ModeInfo>(info.valueInfo);
1381
2
    EXPECT_EQ("NONE", modeInfo.defaultValue);
1382
2
    EXPECT_EQ("none", modeInfo.currentValue);
1383
2
    EXPECT_TRUE(std::find(modeInfo.modes.begin(), modeInfo.modes.end(), "NONE")
1384
2
                != modeInfo.modes.end());
1385
  }
1386
}
1387
1388
158
TEST_F(TestApiBlackSolver, getUnsatAssumptions1)
1389
{
1390
2
  d_solver.setOption("incremental", "false");
1391
2
  d_solver.checkSatAssuming(d_solver.mkFalse());
1392
4
  ASSERT_THROW(d_solver.getUnsatAssumptions(), CVC5ApiException);
1393
}
1394
1395
158
TEST_F(TestApiBlackSolver, getUnsatAssumptions2)
1396
{
1397
2
  d_solver.setOption("incremental", "true");
1398
2
  d_solver.setOption("produce-unsat-assumptions", "false");
1399
2
  d_solver.checkSatAssuming(d_solver.mkFalse());
1400
4
  ASSERT_THROW(d_solver.getUnsatAssumptions(), CVC5ApiException);
1401
}
1402
1403
158
TEST_F(TestApiBlackSolver, getUnsatAssumptions3)
1404
{
1405
2
  d_solver.setOption("incremental", "true");
1406
2
  d_solver.setOption("produce-unsat-assumptions", "true");
1407
2
  d_solver.checkSatAssuming(d_solver.mkFalse());
1408
2
  ASSERT_NO_THROW(d_solver.getUnsatAssumptions());
1409
2
  d_solver.checkSatAssuming(d_solver.mkTrue());
1410
4
  ASSERT_THROW(d_solver.getUnsatAssumptions(), CVC5ApiException);
1411
}
1412
1413
158
TEST_F(TestApiBlackSolver, getUnsatCore1)
1414
{
1415
2
  d_solver.setOption("incremental", "false");
1416
2
  d_solver.assertFormula(d_solver.mkFalse());
1417
2
  d_solver.checkSat();
1418
4
  ASSERT_THROW(d_solver.getUnsatCore(), CVC5ApiException);
1419
}
1420
1421
158
TEST_F(TestApiBlackSolver, getUnsatCore2)
1422
{
1423
2
  d_solver.setOption("incremental", "false");
1424
2
  d_solver.setOption("produce-unsat-cores", "false");
1425
2
  d_solver.assertFormula(d_solver.mkFalse());
1426
2
  d_solver.checkSat();
1427
4
  ASSERT_THROW(d_solver.getUnsatCore(), CVC5ApiException);
1428
}
1429
1430
158
TEST_F(TestApiBlackSolver, getUnsatCoreAndProof)
1431
{
1432
2
  d_solver.setOption("incremental", "true");
1433
2
  d_solver.setOption("produce-unsat-cores", "true");
1434
2
  d_solver.setOption("produce-proofs", "true");
1435
1436
4
  Sort uSort = d_solver.mkUninterpretedSort("u");
1437
4
  Sort intSort = d_solver.getIntegerSort();
1438
4
  Sort boolSort = d_solver.getBooleanSort();
1439
4
  Sort uToIntSort = d_solver.mkFunctionSort(uSort, intSort);
1440
4
  Sort intPredSort = d_solver.mkFunctionSort(intSort, boolSort);
1441
4
  std::vector<Term> unsat_core;
1442
1443
4
  Term x = d_solver.mkConst(uSort, "x");
1444
4
  Term y = d_solver.mkConst(uSort, "y");
1445
4
  Term f = d_solver.mkConst(uToIntSort, "f");
1446
4
  Term p = d_solver.mkConst(intPredSort, "p");
1447
4
  Term zero = d_solver.mkInteger(0);
1448
4
  Term one = d_solver.mkInteger(1);
1449
4
  Term f_x = d_solver.mkTerm(APPLY_UF, f, x);
1450
4
  Term f_y = d_solver.mkTerm(APPLY_UF, f, y);
1451
4
  Term sum = d_solver.mkTerm(PLUS, f_x, f_y);
1452
4
  Term p_0 = d_solver.mkTerm(APPLY_UF, p, zero);
1453
4
  Term p_f_y = d_solver.mkTerm(APPLY_UF, p, f_y);
1454
2
  d_solver.assertFormula(d_solver.mkTerm(GT, zero, f_x));
1455
2
  d_solver.assertFormula(d_solver.mkTerm(GT, zero, f_y));
1456
2
  d_solver.assertFormula(d_solver.mkTerm(GT, sum, one));
1457
2
  d_solver.assertFormula(p_0);
1458
2
  d_solver.assertFormula(p_f_y.notTerm());
1459
2
  ASSERT_TRUE(d_solver.checkSat().isUnsat());
1460
1461
2
  ASSERT_NO_THROW(unsat_core = d_solver.getUnsatCore());
1462
1463
2
  ASSERT_NO_THROW(d_solver.getProof());
1464
1465
2
  d_solver.resetAssertions();
1466
8
  for (const auto& t : unsat_core)
1467
  {
1468
6
    d_solver.assertFormula(t);
1469
  }
1470
4
  cvc5::api::Result res = d_solver.checkSat();
1471
2
  ASSERT_TRUE(res.isUnsat());
1472
2
  ASSERT_NO_THROW(d_solver.getProof());
1473
}
1474
1475
158
TEST_F(TestApiBlackSolver, getDifficulty)
1476
{
1477
2
  d_solver.setOption("produce-difficulty", "true");
1478
  // cannot ask before a check sat
1479
4
  ASSERT_THROW(d_solver.getDifficulty(), CVC5ApiException);
1480
2
  d_solver.checkSat();
1481
2
  ASSERT_NO_THROW(d_solver.getDifficulty());
1482
}
1483
1484
158
TEST_F(TestApiBlackSolver, getDifficulty2)
1485
{
1486
2
  d_solver.checkSat();
1487
  // option is not set
1488
2
  ASSERT_THROW(d_solver.getDifficulty(), CVC5ApiException);
1489
}
1490
1491
158
TEST_F(TestApiBlackSolver, getDifficulty3)
1492
{
1493
2
  d_solver.setOption("produce-difficulty", "true");
1494
4
  Sort intSort = d_solver.getIntegerSort();
1495
4
  Term x = d_solver.mkConst(intSort, "x");
1496
4
  Term zero = d_solver.mkInteger(0);
1497
4
  Term ten = d_solver.mkInteger(10);
1498
4
  Term f0 = d_solver.mkTerm(GEQ, x, ten);
1499
4
  Term f1 = d_solver.mkTerm(GEQ, zero, x);
1500
2
  d_solver.checkSat();
1501
4
  std::map<Term, Term> dmap;
1502
2
  ASSERT_NO_THROW(dmap = d_solver.getDifficulty());
1503
  // difficulty should map assertions to integer values
1504
2
  for (const std::pair<const Term, Term>& t : dmap)
1505
  {
1506
    ASSERT_TRUE(t.first == f0 || t.first == f1);
1507
    ASSERT_TRUE(t.second.getKind() == CONST_RATIONAL);
1508
  }
1509
}
1510
1511
158
TEST_F(TestApiBlackSolver, getValue1)
1512
{
1513
2
  d_solver.setOption("produce-models", "false");
1514
4
  Term t = d_solver.mkTrue();
1515
2
  d_solver.assertFormula(t);
1516
2
  d_solver.checkSat();
1517
4
  ASSERT_THROW(d_solver.getValue(t), CVC5ApiException);
1518
}
1519
1520
158
TEST_F(TestApiBlackSolver, getValue2)
1521
{
1522
2
  d_solver.setOption("produce-models", "true");
1523
4
  Term t = d_solver.mkFalse();
1524
2
  d_solver.assertFormula(t);
1525
2
  d_solver.checkSat();
1526
4
  ASSERT_THROW(d_solver.getValue(t), CVC5ApiException);
1527
}
1528
1529
158
TEST_F(TestApiBlackSolver, getValue3)
1530
{
1531
2
  d_solver.setOption("produce-models", "true");
1532
4
  Sort uSort = d_solver.mkUninterpretedSort("u");
1533
4
  Sort intSort = d_solver.getIntegerSort();
1534
4
  Sort boolSort = d_solver.getBooleanSort();
1535
4
  Sort uToIntSort = d_solver.mkFunctionSort(uSort, intSort);
1536
4
  Sort intPredSort = d_solver.mkFunctionSort(intSort, boolSort);
1537
4
  std::vector<Term> unsat_core;
1538
1539
4
  Term x = d_solver.mkConst(uSort, "x");
1540
4
  Term y = d_solver.mkConst(uSort, "y");
1541
4
  Term z = d_solver.mkConst(uSort, "z");
1542
4
  Term f = d_solver.mkConst(uToIntSort, "f");
1543
4
  Term p = d_solver.mkConst(intPredSort, "p");
1544
4
  Term zero = d_solver.mkInteger(0);
1545
4
  Term one = d_solver.mkInteger(1);
1546
4
  Term f_x = d_solver.mkTerm(APPLY_UF, f, x);
1547
4
  Term f_y = d_solver.mkTerm(APPLY_UF, f, y);
1548
4
  Term sum = d_solver.mkTerm(PLUS, f_x, f_y);
1549
4
  Term p_0 = d_solver.mkTerm(APPLY_UF, p, zero);
1550
4
  Term p_f_y = d_solver.mkTerm(APPLY_UF, p, f_y);
1551
1552
2
  d_solver.assertFormula(d_solver.mkTerm(LEQ, zero, f_x));
1553
2
  d_solver.assertFormula(d_solver.mkTerm(LEQ, zero, f_y));
1554
2
  d_solver.assertFormula(d_solver.mkTerm(LEQ, sum, one));
1555
2
  d_solver.assertFormula(p_0.notTerm());
1556
2
  d_solver.assertFormula(p_f_y);
1557
2
  ASSERT_TRUE(d_solver.checkSat().isSat());
1558
2
  ASSERT_NO_THROW(d_solver.getValue(x));
1559
2
  ASSERT_NO_THROW(d_solver.getValue(y));
1560
2
  ASSERT_NO_THROW(d_solver.getValue(z));
1561
2
  ASSERT_NO_THROW(d_solver.getValue(sum));
1562
2
  ASSERT_NO_THROW(d_solver.getValue(p_f_y));
1563
1564
4
  Solver slv;
1565
4
  ASSERT_THROW(slv.getValue(x), CVC5ApiException);
1566
}
1567
1568
158
TEST_F(TestApiBlackSolver, getModelDomainElements)
1569
{
1570
2
  d_solver.setOption("produce-models", "true");
1571
4
  Sort uSort = d_solver.mkUninterpretedSort("u");
1572
4
  Sort intSort = d_solver.getIntegerSort();
1573
4
  Term x = d_solver.mkConst(uSort, "x");
1574
4
  Term y = d_solver.mkConst(uSort, "y");
1575
4
  Term z = d_solver.mkConst(uSort, "z");
1576
4
  Term f = d_solver.mkTerm(DISTINCT, x, y, z);
1577
2
  d_solver.assertFormula(f);
1578
2
  d_solver.checkSat();
1579
2
  ASSERT_NO_THROW(d_solver.getModelDomainElements(uSort));
1580
2
  ASSERT_TRUE(d_solver.getModelDomainElements(uSort).size() >= 3);
1581
4
  ASSERT_THROW(d_solver.getModelDomainElements(intSort), CVC5ApiException);
1582
}
1583
1584
158
TEST_F(TestApiBlackSolver, getModelDomainElements2)
1585
{
1586
2
  d_solver.setOption("produce-models", "true");
1587
2
  d_solver.setOption("finite-model-find", "true");
1588
4
  Sort uSort = d_solver.mkUninterpretedSort("u");
1589
4
  Term x = d_solver.mkVar(uSort, "x");
1590
4
  Term y = d_solver.mkVar(uSort, "y");
1591
4
  Term eq = d_solver.mkTerm(EQUAL, x, y);
1592
4
  Term bvl = d_solver.mkTerm(BOUND_VAR_LIST, x, y);
1593
4
  Term f = d_solver.mkTerm(FORALL, bvl, eq);
1594
2
  d_solver.assertFormula(f);
1595
2
  d_solver.checkSat();
1596
2
  ASSERT_NO_THROW(d_solver.getModelDomainElements(uSort));
1597
  // a model for the above must interpret u as size 1
1598
2
  ASSERT_TRUE(d_solver.getModelDomainElements(uSort).size() == 1);
1599
}
1600
1601
158
TEST_F(TestApiBlackSolver, isModelCoreSymbol)
1602
{
1603
2
  d_solver.setOption("produce-models", "true");
1604
2
  d_solver.setOption("model-cores", "simple");
1605
4
  Sort uSort = d_solver.mkUninterpretedSort("u");
1606
4
  Term x = d_solver.mkConst(uSort, "x");
1607
4
  Term y = d_solver.mkConst(uSort, "y");
1608
4
  Term z = d_solver.mkConst(uSort, "z");
1609
4
  Term zero = d_solver.mkInteger(0);
1610
4
  Term f = d_solver.mkTerm(NOT, d_solver.mkTerm(EQUAL, x, y));
1611
2
  d_solver.assertFormula(f);
1612
2
  d_solver.checkSat();
1613
2
  ASSERT_TRUE(d_solver.isModelCoreSymbol(x));
1614
2
  ASSERT_TRUE(d_solver.isModelCoreSymbol(y));
1615
2
  ASSERT_FALSE(d_solver.isModelCoreSymbol(z));
1616
4
  ASSERT_THROW(d_solver.isModelCoreSymbol(zero), CVC5ApiException);
1617
}
1618
1619
158
TEST_F(TestApiBlackSolver, getModel)
1620
{
1621
2
  d_solver.setOption("produce-models", "true");
1622
4
  Sort uSort = d_solver.mkUninterpretedSort("u");
1623
4
  Term x = d_solver.mkConst(uSort, "x");
1624
4
  Term y = d_solver.mkConst(uSort, "y");
1625
4
  Term z = d_solver.mkConst(uSort, "z");
1626
4
  Term f = d_solver.mkTerm(NOT, d_solver.mkTerm(EQUAL, x, y));
1627
2
  d_solver.assertFormula(f);
1628
2
  d_solver.checkSat();
1629
4
  std::vector<Sort> sorts;
1630
2
  sorts.push_back(uSort);
1631
4
  std::vector<Term> terms;
1632
2
  terms.push_back(x);
1633
2
  terms.push_back(y);
1634
2
  ASSERT_NO_THROW(d_solver.getModel(sorts, terms));
1635
4
  Term null;
1636
2
  terms.push_back(null);
1637
4
  ASSERT_THROW(d_solver.getModel(sorts, terms), CVC5ApiException);
1638
}
1639
1640
158
TEST_F(TestApiBlackSolver, getModel2)
1641
{
1642
2
  d_solver.setOption("produce-models", "true");
1643
4
  std::vector<Sort> sorts;
1644
4
  std::vector<Term> terms;
1645
4
  ASSERT_THROW(d_solver.getModel(sorts, terms), CVC5ApiException);
1646
}
1647
1648
158
TEST_F(TestApiBlackSolver, getModel3)
1649
{
1650
2
  d_solver.setOption("produce-models", "true");
1651
4
  std::vector<Sort> sorts;
1652
4
  std::vector<Term> terms;
1653
2
  d_solver.checkSat();
1654
2
  ASSERT_NO_THROW(d_solver.getModel(sorts, terms));
1655
4
  Sort integer = d_solver.getIntegerSort();
1656
2
  sorts.push_back(integer);
1657
4
  ASSERT_THROW(d_solver.getModel(sorts, terms), CVC5ApiException);
1658
}
1659
1660
158
TEST_F(TestApiBlackSolver, getQuantifierElimination)
1661
{
1662
4
  Term x = d_solver.mkVar(d_solver.getBooleanSort(), "x");
1663
  Term forall =
1664
      d_solver.mkTerm(FORALL,
1665
4
                      d_solver.mkTerm(BOUND_VAR_LIST, x),
1666
8
                      d_solver.mkTerm(OR, x, d_solver.mkTerm(NOT, x)));
1667
4
  ASSERT_THROW(d_solver.getQuantifierElimination(Term()), CVC5ApiException);
1668
4
  ASSERT_THROW(d_solver.getQuantifierElimination(Solver().mkBoolean(false)),
1669
2
               CVC5ApiException);
1670
2
  ASSERT_NO_THROW(d_solver.getQuantifierElimination(forall));
1671
}
1672
1673
158
TEST_F(TestApiBlackSolver, getQuantifierEliminationDisjunct)
1674
{
1675
4
  Term x = d_solver.mkVar(d_solver.getBooleanSort(), "x");
1676
  Term forall =
1677
      d_solver.mkTerm(FORALL,
1678
4
                      d_solver.mkTerm(BOUND_VAR_LIST, x),
1679
8
                      d_solver.mkTerm(OR, x, d_solver.mkTerm(NOT, x)));
1680
4
  ASSERT_THROW(d_solver.getQuantifierEliminationDisjunct(Term()),
1681
2
               CVC5ApiException);
1682
4
  ASSERT_THROW(
1683
      d_solver.getQuantifierEliminationDisjunct(Solver().mkBoolean(false)),
1684
2
      CVC5ApiException);
1685
2
  ASSERT_NO_THROW(d_solver.getQuantifierEliminationDisjunct(forall));
1686
}
1687
1688
158
TEST_F(TestApiBlackSolver, declareSepHeap)
1689
{
1690
2
  d_solver.setLogic("ALL");
1691
4
  Sort integer = d_solver.getIntegerSort();
1692
2
  ASSERT_NO_THROW(d_solver.declareSepHeap(integer, integer));
1693
  // cannot declare separation logic heap more than once
1694
4
  ASSERT_THROW(d_solver.declareSepHeap(integer, integer), CVC5ApiException);
1695
}
1696
1697
namespace {
1698
/**
1699
 * Helper function for testGetSeparation{Heap,Nil}TermX. Asserts and checks
1700
 * some simple separation logic constraints.
1701
 */
1702
8
void checkSimpleSeparationConstraints(Solver* solver)
1703
{
1704
16
  Sort integer = solver->getIntegerSort();
1705
  // declare the separation heap
1706
8
  solver->declareSepHeap(integer, integer);
1707
16
  Term x = solver->mkConst(integer, "x");
1708
16
  Term p = solver->mkConst(integer, "p");
1709
16
  Term heap = solver->mkTerm(cvc5::api::Kind::SEP_PTO, p, x);
1710
8
  solver->assertFormula(heap);
1711
16
  Term nil = solver->mkSepNil(integer);
1712
8
  solver->assertFormula(nil.eqTerm(solver->mkReal(5)));
1713
8
  solver->checkSat();
1714
8
}
1715
}  // namespace
1716
1717
158
TEST_F(TestApiBlackSolver, getValueSepHeap1)
1718
{
1719
2
  d_solver.setLogic("QF_BV");
1720
2
  d_solver.setOption("incremental", "false");
1721
2
  d_solver.setOption("produce-models", "true");
1722
4
  Term t = d_solver.mkTrue();
1723
2
  d_solver.assertFormula(t);
1724
4
  ASSERT_THROW(d_solver.getValueSepHeap(), CVC5ApiException);
1725
}
1726
1727
158
TEST_F(TestApiBlackSolver, getValueSepHeap2)
1728
{
1729
2
  d_solver.setLogic("ALL");
1730
2
  d_solver.setOption("incremental", "false");
1731
2
  d_solver.setOption("produce-models", "false");
1732
2
  checkSimpleSeparationConstraints(&d_solver);
1733
4
  ASSERT_THROW(d_solver.getValueSepHeap(), CVC5ApiException);
1734
}
1735
1736
158
TEST_F(TestApiBlackSolver, getValueSepHeap3)
1737
{
1738
2
  d_solver.setLogic("ALL");
1739
2
  d_solver.setOption("incremental", "false");
1740
2
  d_solver.setOption("produce-models", "true");
1741
4
  Term t = d_solver.mkFalse();
1742
2
  d_solver.assertFormula(t);
1743
2
  d_solver.checkSat();
1744
4
  ASSERT_THROW(d_solver.getValueSepHeap(), CVC5ApiException);
1745
}
1746
1747
158
TEST_F(TestApiBlackSolver, getValueSepHeap4)
1748
{
1749
2
  d_solver.setLogic("ALL");
1750
2
  d_solver.setOption("incremental", "false");
1751
2
  d_solver.setOption("produce-models", "true");
1752
4
  Term t = d_solver.mkTrue();
1753
2
  d_solver.assertFormula(t);
1754
2
  d_solver.checkSat();
1755
4
  ASSERT_THROW(d_solver.getValueSepHeap(), CVC5ApiException);
1756
}
1757
1758
158
TEST_F(TestApiBlackSolver, getValueSepHeap5)
1759
{
1760
2
  d_solver.setLogic("ALL");
1761
2
  d_solver.setOption("incremental", "false");
1762
2
  d_solver.setOption("produce-models", "true");
1763
2
  checkSimpleSeparationConstraints(&d_solver);
1764
2
  ASSERT_NO_THROW(d_solver.getValueSepHeap());
1765
}
1766
1767
158
TEST_F(TestApiBlackSolver, getValueSepNil1)
1768
{
1769
2
  d_solver.setLogic("QF_BV");
1770
2
  d_solver.setOption("incremental", "false");
1771
2
  d_solver.setOption("produce-models", "true");
1772
4
  Term t = d_solver.mkTrue();
1773
2
  d_solver.assertFormula(t);
1774
4
  ASSERT_THROW(d_solver.getValueSepNil(), CVC5ApiException);
1775
}
1776
1777
158
TEST_F(TestApiBlackSolver, getValueSepNil2)
1778
{
1779
2
  d_solver.setLogic("ALL");
1780
2
  d_solver.setOption("incremental", "false");
1781
2
  d_solver.setOption("produce-models", "false");
1782
2
  checkSimpleSeparationConstraints(&d_solver);
1783
4
  ASSERT_THROW(d_solver.getValueSepNil(), CVC5ApiException);
1784
}
1785
1786
158
TEST_F(TestApiBlackSolver, getValueSepNil3)
1787
{
1788
2
  d_solver.setLogic("ALL");
1789
2
  d_solver.setOption("incremental", "false");
1790
2
  d_solver.setOption("produce-models", "true");
1791
4
  Term t = d_solver.mkFalse();
1792
2
  d_solver.assertFormula(t);
1793
2
  d_solver.checkSat();
1794
4
  ASSERT_THROW(d_solver.getValueSepNil(), CVC5ApiException);
1795
}
1796
1797
158
TEST_F(TestApiBlackSolver, getValueSepNil4)
1798
{
1799
2
  d_solver.setLogic("ALL");
1800
2
  d_solver.setOption("incremental", "false");
1801
2
  d_solver.setOption("produce-models", "true");
1802
4
  Term t = d_solver.mkTrue();
1803
2
  d_solver.assertFormula(t);
1804
2
  d_solver.checkSat();
1805
4
  ASSERT_THROW(d_solver.getValueSepNil(), CVC5ApiException);
1806
}
1807
1808
158
TEST_F(TestApiBlackSolver, getValueSepNil5)
1809
{
1810
2
  d_solver.setLogic("ALL");
1811
2
  d_solver.setOption("incremental", "false");
1812
2
  d_solver.setOption("produce-models", "true");
1813
2
  checkSimpleSeparationConstraints(&d_solver);
1814
2
  ASSERT_NO_THROW(d_solver.getValueSepNil());
1815
}
1816
1817
158
TEST_F(TestApiBlackSolver, push1)
1818
{
1819
2
  d_solver.setOption("incremental", "true");
1820
2
  ASSERT_NO_THROW(d_solver.push(1));
1821
4
  ASSERT_THROW(d_solver.setOption("incremental", "false"), CVC5ApiException);
1822
4
  ASSERT_THROW(d_solver.setOption("incremental", "true"), CVC5ApiException);
1823
}
1824
1825
158
TEST_F(TestApiBlackSolver, push2)
1826
{
1827
2
  d_solver.setOption("incremental", "false");
1828
4
  ASSERT_THROW(d_solver.push(1), CVC5ApiException);
1829
}
1830
1831
158
TEST_F(TestApiBlackSolver, pop1)
1832
{
1833
2
  d_solver.setOption("incremental", "false");
1834
4
  ASSERT_THROW(d_solver.pop(1), CVC5ApiException);
1835
}
1836
1837
158
TEST_F(TestApiBlackSolver, pop2)
1838
{
1839
2
  d_solver.setOption("incremental", "true");
1840
4
  ASSERT_THROW(d_solver.pop(1), CVC5ApiException);
1841
}
1842
1843
158
TEST_F(TestApiBlackSolver, pop3)
1844
{
1845
2
  d_solver.setOption("incremental", "true");
1846
2
  ASSERT_NO_THROW(d_solver.push(1));
1847
2
  ASSERT_NO_THROW(d_solver.pop(1));
1848
4
  ASSERT_THROW(d_solver.pop(1), CVC5ApiException);
1849
}
1850
1851
158
TEST_F(TestApiBlackSolver, blockModel1)
1852
{
1853
2
  d_solver.setOption("produce-models", "true");
1854
4
  Term x = d_solver.mkConst(d_solver.getBooleanSort(), "x");
1855
2
  d_solver.assertFormula(x.eqTerm(x));
1856
2
  d_solver.checkSat();
1857
4
  ASSERT_THROW(d_solver.blockModel(), CVC5ApiException);
1858
}
1859
1860
158
TEST_F(TestApiBlackSolver, blockModel2)
1861
{
1862
2
  d_solver.setOption("block-models", "literals");
1863
4
  Term x = d_solver.mkConst(d_solver.getBooleanSort(), "x");
1864
2
  d_solver.assertFormula(x.eqTerm(x));
1865
2
  d_solver.checkSat();
1866
4
  ASSERT_THROW(d_solver.blockModel(), CVC5ApiException);
1867
}
1868
1869
158
TEST_F(TestApiBlackSolver, blockModel3)
1870
{
1871
2
  d_solver.setOption("produce-models", "true");
1872
2
  d_solver.setOption("block-models", "literals");
1873
4
  Term x = d_solver.mkConst(d_solver.getBooleanSort(), "x");
1874
2
  d_solver.assertFormula(x.eqTerm(x));
1875
4
  ASSERT_THROW(d_solver.blockModel(), CVC5ApiException);
1876
}
1877
1878
158
TEST_F(TestApiBlackSolver, blockModel4)
1879
{
1880
2
  d_solver.setOption("produce-models", "true");
1881
2
  d_solver.setOption("block-models", "literals");
1882
4
  Term x = d_solver.mkConst(d_solver.getBooleanSort(), "x");
1883
2
  d_solver.assertFormula(x.eqTerm(x));
1884
2
  d_solver.checkSat();
1885
2
  ASSERT_NO_THROW(d_solver.blockModel());
1886
}
1887
1888
158
TEST_F(TestApiBlackSolver, blockModelValues1)
1889
{
1890
2
  d_solver.setOption("produce-models", "true");
1891
2
  d_solver.setOption("block-models", "literals");
1892
4
  Term x = d_solver.mkConst(d_solver.getBooleanSort(), "x");
1893
2
  d_solver.assertFormula(x.eqTerm(x));
1894
2
  d_solver.checkSat();
1895
4
  ASSERT_THROW(d_solver.blockModelValues({}), CVC5ApiException);
1896
4
  ASSERT_THROW(d_solver.blockModelValues({Term()}), CVC5ApiException);
1897
4
  ASSERT_THROW(d_solver.blockModelValues({Solver().mkBoolean(false)}),
1898
2
               CVC5ApiException);
1899
}
1900
1901
158
TEST_F(TestApiBlackSolver, blockModelValues2)
1902
{
1903
2
  d_solver.setOption("produce-models", "true");
1904
4
  Term x = d_solver.mkConst(d_solver.getBooleanSort(), "x");
1905
2
  d_solver.assertFormula(x.eqTerm(x));
1906
2
  d_solver.checkSat();
1907
4
  ASSERT_THROW(d_solver.blockModelValues({x}), CVC5ApiException);
1908
}
1909
1910
158
TEST_F(TestApiBlackSolver, blockModelValues3)
1911
{
1912
2
  d_solver.setOption("block-models", "literals");
1913
4
  Term x = d_solver.mkConst(d_solver.getBooleanSort(), "x");
1914
2
  d_solver.assertFormula(x.eqTerm(x));
1915
2
  d_solver.checkSat();
1916
4
  ASSERT_THROW(d_solver.blockModelValues({x}), CVC5ApiException);
1917
}
1918
1919
158
TEST_F(TestApiBlackSolver, blockModelValues4)
1920
{
1921
2
  d_solver.setOption("produce-models", "true");
1922
2
  d_solver.setOption("block-models", "literals");
1923
4
  Term x = d_solver.mkConst(d_solver.getBooleanSort(), "x");
1924
2
  d_solver.assertFormula(x.eqTerm(x));
1925
4
  ASSERT_THROW(d_solver.blockModelValues({x}), CVC5ApiException);
1926
}
1927
1928
158
TEST_F(TestApiBlackSolver, blockModelValues5)
1929
{
1930
2
  d_solver.setOption("produce-models", "true");
1931
2
  d_solver.setOption("block-models", "literals");
1932
4
  Term x = d_solver.mkConst(d_solver.getBooleanSort(), "x");
1933
2
  d_solver.assertFormula(x.eqTerm(x));
1934
2
  d_solver.checkSat();
1935
2
  ASSERT_NO_THROW(d_solver.blockModelValues({x}));
1936
}
1937
1938
158
TEST_F(TestApiBlackSolver, setInfo)
1939
{
1940
4
  ASSERT_THROW(d_solver.setInfo("cvc5-lagic", "QF_BV"), CVC5ApiException);
1941
4
  ASSERT_THROW(d_solver.setInfo("cvc2-logic", "QF_BV"), CVC5ApiException);
1942
4
  ASSERT_THROW(d_solver.setInfo("cvc5-logic", "asdf"), CVC5ApiException);
1943
1944
2
  ASSERT_NO_THROW(d_solver.setInfo("source", "asdf"));
1945
2
  ASSERT_NO_THROW(d_solver.setInfo("category", "asdf"));
1946
2
  ASSERT_NO_THROW(d_solver.setInfo("difficulty", "asdf"));
1947
2
  ASSERT_NO_THROW(d_solver.setInfo("filename", "asdf"));
1948
2
  ASSERT_NO_THROW(d_solver.setInfo("license", "asdf"));
1949
2
  ASSERT_NO_THROW(d_solver.setInfo("name", "asdf"));
1950
2
  ASSERT_NO_THROW(d_solver.setInfo("notes", "asdf"));
1951
1952
2
  ASSERT_NO_THROW(d_solver.setInfo("smt-lib-version", "2"));
1953
2
  ASSERT_NO_THROW(d_solver.setInfo("smt-lib-version", "2.0"));
1954
2
  ASSERT_NO_THROW(d_solver.setInfo("smt-lib-version", "2.5"));
1955
2
  ASSERT_NO_THROW(d_solver.setInfo("smt-lib-version", "2.6"));
1956
4
  ASSERT_THROW(d_solver.setInfo("smt-lib-version", ".0"), CVC5ApiException);
1957
1958
2
  ASSERT_NO_THROW(d_solver.setInfo("status", "sat"));
1959
2
  ASSERT_NO_THROW(d_solver.setInfo("status", "unsat"));
1960
2
  ASSERT_NO_THROW(d_solver.setInfo("status", "unknown"));
1961
4
  ASSERT_THROW(d_solver.setInfo("status", "asdf"), CVC5ApiException);
1962
}
1963
1964
158
TEST_F(TestApiBlackSolver, simplify)
1965
{
1966
4
  ASSERT_THROW(d_solver.simplify(Term()), CVC5ApiException);
1967
1968
4
  Sort bvSort = d_solver.mkBitVectorSort(32);
1969
4
  Sort uSort = d_solver.mkUninterpretedSort("u");
1970
4
  Sort funSort1 = d_solver.mkFunctionSort({bvSort, bvSort}, bvSort);
1971
4
  Sort funSort2 = d_solver.mkFunctionSort(uSort, d_solver.getIntegerSort());
1972
4
  DatatypeDecl consListSpec = d_solver.mkDatatypeDecl("list");
1973
4
  DatatypeConstructorDecl cons = d_solver.mkDatatypeConstructorDecl("cons");
1974
2
  cons.addSelector("head", d_solver.getIntegerSort());
1975
2
  cons.addSelectorSelf("tail");
1976
2
  consListSpec.addConstructor(cons);
1977
4
  DatatypeConstructorDecl nil = d_solver.mkDatatypeConstructorDecl("nil");
1978
2
  consListSpec.addConstructor(nil);
1979
4
  Sort consListSort = d_solver.mkDatatypeSort(consListSpec);
1980
1981
4
  Term x = d_solver.mkConst(bvSort, "x");
1982
2
  ASSERT_NO_THROW(d_solver.simplify(x));
1983
4
  Term a = d_solver.mkConst(bvSort, "a");
1984
2
  ASSERT_NO_THROW(d_solver.simplify(a));
1985
4
  Term b = d_solver.mkConst(bvSort, "b");
1986
2
  ASSERT_NO_THROW(d_solver.simplify(b));
1987
4
  Term x_eq_x = d_solver.mkTerm(EQUAL, x, x);
1988
2
  ASSERT_NO_THROW(d_solver.simplify(x_eq_x));
1989
2
  ASSERT_NE(d_solver.mkTrue(), x_eq_x);
1990
2
  ASSERT_EQ(d_solver.mkTrue(), d_solver.simplify(x_eq_x));
1991
4
  Term x_eq_b = d_solver.mkTerm(EQUAL, x, b);
1992
2
  ASSERT_NO_THROW(d_solver.simplify(x_eq_b));
1993
2
  ASSERT_NE(d_solver.mkTrue(), x_eq_b);
1994
2
  ASSERT_NE(d_solver.mkTrue(), d_solver.simplify(x_eq_b));
1995
4
  Solver slv;
1996
4
  ASSERT_THROW(slv.simplify(x), CVC5ApiException);
1997
1998
4
  Term i1 = d_solver.mkConst(d_solver.getIntegerSort(), "i1");
1999
2
  ASSERT_NO_THROW(d_solver.simplify(i1));
2000
4
  Term i2 = d_solver.mkTerm(MULT, i1, d_solver.mkInteger("23"));
2001
2
  ASSERT_NO_THROW(d_solver.simplify(i2));
2002
2
  ASSERT_NE(i1, i2);
2003
2
  ASSERT_NE(i1, d_solver.simplify(i2));
2004
4
  Term i3 = d_solver.mkTerm(PLUS, i1, d_solver.mkInteger(0));
2005
2
  ASSERT_NO_THROW(d_solver.simplify(i3));
2006
2
  ASSERT_NE(i1, i3);
2007
2
  ASSERT_EQ(i1, d_solver.simplify(i3));
2008
2009
4
  Datatype consList = consListSort.getDatatype();
2010
  Term dt1 = d_solver.mkTerm(
2011
      APPLY_CONSTRUCTOR,
2012
4
      consList.getConstructorTerm("cons"),
2013
4
      d_solver.mkInteger(0),
2014
8
      d_solver.mkTerm(APPLY_CONSTRUCTOR, consList.getConstructorTerm("nil")));
2015
2
  ASSERT_NO_THROW(d_solver.simplify(dt1));
2016
  Term dt2 = d_solver.mkTerm(
2017
4
      APPLY_SELECTOR, consList["cons"].getSelectorTerm("head"), dt1);
2018
2
  ASSERT_NO_THROW(d_solver.simplify(dt2));
2019
2020
4
  Term b1 = d_solver.mkVar(bvSort, "b1");
2021
2
  ASSERT_NO_THROW(d_solver.simplify(b1));
2022
4
  Term b2 = d_solver.mkVar(bvSort, "b1");
2023
2
  ASSERT_NO_THROW(d_solver.simplify(b2));
2024
4
  Term b3 = d_solver.mkVar(uSort, "b3");
2025
2
  ASSERT_NO_THROW(d_solver.simplify(b3));
2026
4
  Term v1 = d_solver.mkConst(bvSort, "v1");
2027
2
  ASSERT_NO_THROW(d_solver.simplify(v1));
2028
4
  Term v2 = d_solver.mkConst(d_solver.getIntegerSort(), "v2");
2029
2
  ASSERT_NO_THROW(d_solver.simplify(v2));
2030
4
  Term f1 = d_solver.mkConst(funSort1, "f1");
2031
2
  ASSERT_NO_THROW(d_solver.simplify(f1));
2032
4
  Term f2 = d_solver.mkConst(funSort2, "f2");
2033
2
  ASSERT_NO_THROW(d_solver.simplify(f2));
2034
2
  d_solver.defineFunsRec({f1, f2}, {{b1, b2}, {b3}}, {v1, v2});
2035
2
  ASSERT_NO_THROW(d_solver.simplify(f1));
2036
2
  ASSERT_NO_THROW(d_solver.simplify(f2));
2037
}
2038
2039
158
TEST_F(TestApiBlackSolver, assertFormula)
2040
{
2041
2
  ASSERT_NO_THROW(d_solver.assertFormula(d_solver.mkTrue()));
2042
4
  ASSERT_THROW(d_solver.assertFormula(Term()), CVC5ApiException);
2043
4
  Solver slv;
2044
4
  ASSERT_THROW(slv.assertFormula(d_solver.mkTrue()), CVC5ApiException);
2045
}
2046
2047
158
TEST_F(TestApiBlackSolver, checkEntailed)
2048
{
2049
2
  d_solver.setOption("incremental", "false");
2050
2
  ASSERT_NO_THROW(d_solver.checkEntailed(d_solver.mkTrue()));
2051
4
  ASSERT_THROW(d_solver.checkEntailed(d_solver.mkTrue()), CVC5ApiException);
2052
4
  Solver slv;
2053
4
  ASSERT_THROW(slv.checkEntailed(d_solver.mkTrue()), CVC5ApiException);
2054
}
2055
2056
158
TEST_F(TestApiBlackSolver, checkEntailed1)
2057
{
2058
4
  Sort boolSort = d_solver.getBooleanSort();
2059
4
  Term x = d_solver.mkConst(boolSort, "x");
2060
4
  Term y = d_solver.mkConst(boolSort, "y");
2061
4
  Term z = d_solver.mkTerm(AND, x, y);
2062
2
  d_solver.setOption("incremental", "true");
2063
2
  ASSERT_NO_THROW(d_solver.checkEntailed(d_solver.mkTrue()));
2064
4
  ASSERT_THROW(d_solver.checkEntailed(Term()), CVC5ApiException);
2065
2
  ASSERT_NO_THROW(d_solver.checkEntailed(d_solver.mkTrue()));
2066
2
  ASSERT_NO_THROW(d_solver.checkEntailed(z));
2067
4
  Solver slv;
2068
4
  ASSERT_THROW(slv.checkEntailed(d_solver.mkTrue()), CVC5ApiException);
2069
}
2070
2071
158
TEST_F(TestApiBlackSolver, checkEntailed2)
2072
{
2073
2
  d_solver.setOption("incremental", "true");
2074
2075
4
  Sort uSort = d_solver.mkUninterpretedSort("u");
2076
4
  Sort intSort = d_solver.getIntegerSort();
2077
4
  Sort boolSort = d_solver.getBooleanSort();
2078
4
  Sort uToIntSort = d_solver.mkFunctionSort(uSort, intSort);
2079
4
  Sort intPredSort = d_solver.mkFunctionSort(intSort, boolSort);
2080
2081
4
  Term n = Term();
2082
  // Constants
2083
4
  Term x = d_solver.mkConst(uSort, "x");
2084
4
  Term y = d_solver.mkConst(uSort, "y");
2085
  // Functions
2086
4
  Term f = d_solver.mkConst(uToIntSort, "f");
2087
4
  Term p = d_solver.mkConst(intPredSort, "p");
2088
  // Values
2089
4
  Term zero = d_solver.mkInteger(0);
2090
4
  Term one = d_solver.mkInteger(1);
2091
  // Terms
2092
4
  Term f_x = d_solver.mkTerm(APPLY_UF, f, x);
2093
4
  Term f_y = d_solver.mkTerm(APPLY_UF, f, y);
2094
4
  Term sum = d_solver.mkTerm(PLUS, f_x, f_y);
2095
4
  Term p_0 = d_solver.mkTerm(APPLY_UF, p, zero);
2096
4
  Term p_f_y = d_solver.mkTerm(APPLY_UF, p, f_y);
2097
  // Assertions
2098
  Term assertions =
2099
      d_solver.mkTerm(AND,
2100
6
                      std::vector<Term>{
2101
                          d_solver.mkTerm(LEQ, zero, f_x),  // 0 <= f(x)
2102
                          d_solver.mkTerm(LEQ, zero, f_y),  // 0 <= f(y)
2103
                          d_solver.mkTerm(LEQ, sum, one),   // f(x) + f(y) <= 1
2104
                          p_0.notTerm(),                    // not p(0)
2105
                          p_f_y                             // p(f(y))
2106
16
                      });
2107
2108
2
  ASSERT_NO_THROW(d_solver.checkEntailed(d_solver.mkTrue()));
2109
2
  d_solver.assertFormula(assertions);
2110
2
  ASSERT_NO_THROW(d_solver.checkEntailed(d_solver.mkTerm(DISTINCT, x, y)));
2111
2
  ASSERT_NO_THROW(d_solver.checkEntailed(
2112
      {d_solver.mkFalse(), d_solver.mkTerm(DISTINCT, x, y)}));
2113
4
  ASSERT_THROW(d_solver.checkEntailed(n), CVC5ApiException);
2114
4
  ASSERT_THROW(d_solver.checkEntailed({n, d_solver.mkTerm(DISTINCT, x, y)}),
2115
2
               CVC5ApiException);
2116
4
  Solver slv;
2117
4
  ASSERT_THROW(slv.checkEntailed(d_solver.mkTrue()), CVC5ApiException);
2118
}
2119
2120
158
TEST_F(TestApiBlackSolver, checkSat)
2121
{
2122
2
  d_solver.setOption("incremental", "false");
2123
2
  ASSERT_NO_THROW(d_solver.checkSat());
2124
4
  ASSERT_THROW(d_solver.checkSat(), CVC5ApiException);
2125
}
2126
2127
158
TEST_F(TestApiBlackSolver, checkSatAssuming)
2128
{
2129
2
  d_solver.setOption("incremental", "false");
2130
2
  ASSERT_NO_THROW(d_solver.checkSatAssuming(d_solver.mkTrue()));
2131
4
  ASSERT_THROW(d_solver.checkSatAssuming(d_solver.mkTrue()), CVC5ApiException);
2132
4
  Solver slv;
2133
4
  ASSERT_THROW(slv.checkSatAssuming(d_solver.mkTrue()), CVC5ApiException);
2134
}
2135
2136
158
TEST_F(TestApiBlackSolver, checkSatAssuming1)
2137
{
2138
4
  Sort boolSort = d_solver.getBooleanSort();
2139
4
  Term x = d_solver.mkConst(boolSort, "x");
2140
4
  Term y = d_solver.mkConst(boolSort, "y");
2141
4
  Term z = d_solver.mkTerm(AND, x, y);
2142
2
  d_solver.setOption("incremental", "true");
2143
2
  ASSERT_NO_THROW(d_solver.checkSatAssuming(d_solver.mkTrue()));
2144
4
  ASSERT_THROW(d_solver.checkSatAssuming(Term()), CVC5ApiException);
2145
2
  ASSERT_NO_THROW(d_solver.checkSatAssuming(d_solver.mkTrue()));
2146
2
  ASSERT_NO_THROW(d_solver.checkSatAssuming(z));
2147
4
  Solver slv;
2148
4
  ASSERT_THROW(slv.checkSatAssuming(d_solver.mkTrue()), CVC5ApiException);
2149
}
2150
2151
158
TEST_F(TestApiBlackSolver, checkSatAssuming2)
2152
{
2153
2
  d_solver.setOption("incremental", "true");
2154
2155
4
  Sort uSort = d_solver.mkUninterpretedSort("u");
2156
4
  Sort intSort = d_solver.getIntegerSort();
2157
4
  Sort boolSort = d_solver.getBooleanSort();
2158
4
  Sort uToIntSort = d_solver.mkFunctionSort(uSort, intSort);
2159
4
  Sort intPredSort = d_solver.mkFunctionSort(intSort, boolSort);
2160
2161
4
  Term n = Term();
2162
  // Constants
2163
4
  Term x = d_solver.mkConst(uSort, "x");
2164
4
  Term y = d_solver.mkConst(uSort, "y");
2165
  // Functions
2166
4
  Term f = d_solver.mkConst(uToIntSort, "f");
2167
4
  Term p = d_solver.mkConst(intPredSort, "p");
2168
  // Values
2169
4
  Term zero = d_solver.mkInteger(0);
2170
4
  Term one = d_solver.mkInteger(1);
2171
  // Terms
2172
4
  Term f_x = d_solver.mkTerm(APPLY_UF, f, x);
2173
4
  Term f_y = d_solver.mkTerm(APPLY_UF, f, y);
2174
4
  Term sum = d_solver.mkTerm(PLUS, f_x, f_y);
2175
4
  Term p_0 = d_solver.mkTerm(APPLY_UF, p, zero);
2176
4
  Term p_f_y = d_solver.mkTerm(APPLY_UF, p, f_y);
2177
  // Assertions
2178
  Term assertions =
2179
      d_solver.mkTerm(AND,
2180
6
                      std::vector<Term>{
2181
                          d_solver.mkTerm(LEQ, zero, f_x),  // 0 <= f(x)
2182
                          d_solver.mkTerm(LEQ, zero, f_y),  // 0 <= f(y)
2183
                          d_solver.mkTerm(LEQ, sum, one),   // f(x) + f(y) <= 1
2184
                          p_0.notTerm(),                    // not p(0)
2185
                          p_f_y                             // p(f(y))
2186
16
                      });
2187
2188
2
  ASSERT_NO_THROW(d_solver.checkSatAssuming(d_solver.mkTrue()));
2189
2
  d_solver.assertFormula(assertions);
2190
2
  ASSERT_NO_THROW(d_solver.checkSatAssuming(d_solver.mkTerm(DISTINCT, x, y)));
2191
2
  ASSERT_NO_THROW(d_solver.checkSatAssuming(
2192
      {d_solver.mkFalse(), d_solver.mkTerm(DISTINCT, x, y)}));
2193
4
  ASSERT_THROW(d_solver.checkSatAssuming(n), CVC5ApiException);
2194
4
  ASSERT_THROW(d_solver.checkSatAssuming({n, d_solver.mkTerm(DISTINCT, x, y)}),
2195
2
               CVC5ApiException);
2196
4
  Solver slv;
2197
4
  ASSERT_THROW(slv.checkSatAssuming(d_solver.mkTrue()), CVC5ApiException);
2198
}
2199
2200
158
TEST_F(TestApiBlackSolver, setLogic)
2201
{
2202
2
  ASSERT_NO_THROW(d_solver.setLogic("AUFLIRA"));
2203
4
  ASSERT_THROW(d_solver.setLogic("AF_BV"), CVC5ApiException);
2204
2
  d_solver.assertFormula(d_solver.mkTrue());
2205
4
  ASSERT_THROW(d_solver.setLogic("AUFLIRA"), CVC5ApiException);
2206
}
2207
2208
158
TEST_F(TestApiBlackSolver, setOption)
2209
{
2210
2
  ASSERT_NO_THROW(d_solver.setOption("bv-sat-solver", "minisat"));
2211
4
  ASSERT_THROW(d_solver.setOption("bv-sat-solver", "1"), CVC5ApiException);
2212
2
  d_solver.assertFormula(d_solver.mkTrue());
2213
4
  ASSERT_THROW(d_solver.setOption("bv-sat-solver", "minisat"),
2214
2
               CVC5ApiException);
2215
}
2216
2217
158
TEST_F(TestApiBlackSolver, resetAssertions)
2218
{
2219
2
  d_solver.setOption("incremental", "true");
2220
2221
4
  Sort bvSort = d_solver.mkBitVectorSort(4);
2222
4
  Term one = d_solver.mkBitVector(4, 1);
2223
4
  Term x = d_solver.mkConst(bvSort, "x");
2224
4
  Term ule = d_solver.mkTerm(BITVECTOR_ULE, x, one);
2225
4
  Term srem = d_solver.mkTerm(BITVECTOR_SREM, one, x);
2226
2
  d_solver.push(4);
2227
4
  Term slt = d_solver.mkTerm(BITVECTOR_SLT, srem, one);
2228
2
  d_solver.resetAssertions();
2229
2
  d_solver.checkSatAssuming({slt, ule});
2230
2
}
2231
2232
158
TEST_F(TestApiBlackSolver, mkSygusVar)
2233
{
2234
4
  Sort boolSort = d_solver.getBooleanSort();
2235
4
  Sort intSort = d_solver.getIntegerSort();
2236
4
  Sort funSort = d_solver.mkFunctionSort(intSort, boolSort);
2237
2238
2
  ASSERT_NO_THROW(d_solver.mkSygusVar(boolSort));
2239
2
  ASSERT_NO_THROW(d_solver.mkSygusVar(funSort));
2240
2
  ASSERT_NO_THROW(d_solver.mkSygusVar(boolSort, std::string("b")));
2241
2
  ASSERT_NO_THROW(d_solver.mkSygusVar(funSort, ""));
2242
4
  ASSERT_THROW(d_solver.mkSygusVar(Sort()), CVC5ApiException);
2243
4
  ASSERT_THROW(d_solver.mkSygusVar(d_solver.getNullSort(), "a"),
2244
2
               CVC5ApiException);
2245
4
  Solver slv;
2246
4
  ASSERT_THROW(slv.mkSygusVar(boolSort), CVC5ApiException);
2247
}
2248
2249
158
TEST_F(TestApiBlackSolver, mkSygusGrammar)
2250
{
2251
4
  Term nullTerm;
2252
4
  Term boolTerm = d_solver.mkBoolean(true);
2253
4
  Term boolVar = d_solver.mkVar(d_solver.getBooleanSort());
2254
4
  Term intVar = d_solver.mkVar(d_solver.getIntegerSort());
2255
2256
2
  ASSERT_NO_THROW(d_solver.mkSygusGrammar({}, {intVar}));
2257
2
  ASSERT_NO_THROW(d_solver.mkSygusGrammar({boolVar}, {intVar}));
2258
4
  ASSERT_THROW(d_solver.mkSygusGrammar({}, {}), CVC5ApiException);
2259
4
  ASSERT_THROW(d_solver.mkSygusGrammar({}, {nullTerm}), CVC5ApiException);
2260
4
  ASSERT_THROW(d_solver.mkSygusGrammar({}, {boolTerm}), CVC5ApiException);
2261
4
  ASSERT_THROW(d_solver.mkSygusGrammar({boolTerm}, {intVar}), CVC5ApiException);
2262
4
  Solver slv;
2263
4
  Term boolVar2 = slv.mkVar(slv.getBooleanSort());
2264
4
  Term intVar2 = slv.mkVar(slv.getIntegerSort());
2265
2
  ASSERT_NO_THROW(slv.mkSygusGrammar({boolVar2}, {intVar2}));
2266
4
  ASSERT_THROW(slv.mkSygusGrammar({boolVar}, {intVar2}), CVC5ApiException);
2267
4
  ASSERT_THROW(slv.mkSygusGrammar({boolVar2}, {intVar}), CVC5ApiException);
2268
}
2269
2270
158
TEST_F(TestApiBlackSolver, synthFun)
2271
{
2272
4
  Sort null = d_solver.getNullSort();
2273
4
  Sort boolean = d_solver.getBooleanSort();
2274
4
  Sort integer = d_solver.getIntegerSort();
2275
2276
4
  Term nullTerm;
2277
4
  Term x = d_solver.mkVar(boolean);
2278
2279
4
  Term start1 = d_solver.mkVar(boolean);
2280
4
  Term start2 = d_solver.mkVar(integer);
2281
2282
4
  Grammar g1 = d_solver.mkSygusGrammar({x}, {start1});
2283
2
  g1.addRule(start1, d_solver.mkBoolean(false));
2284
2285
4
  Grammar g2 = d_solver.mkSygusGrammar({x}, {start2});
2286
2
  g2.addRule(start2, d_solver.mkInteger(0));
2287
2288
2
  ASSERT_NO_THROW(d_solver.synthFun("", {}, boolean));
2289
2
  ASSERT_NO_THROW(d_solver.synthFun("f1", {x}, boolean));
2290
2
  ASSERT_NO_THROW(d_solver.synthFun("f2", {x}, boolean, g1));
2291
2292
4
  ASSERT_THROW(d_solver.synthFun("f3", {nullTerm}, boolean), CVC5ApiException);
2293
4
  ASSERT_THROW(d_solver.synthFun("f4", {}, null), CVC5ApiException);
2294
4
  ASSERT_THROW(d_solver.synthFun("f6", {x}, boolean, g2), CVC5ApiException);
2295
4
  Solver slv;
2296
4
  Term x2 = slv.mkVar(slv.getBooleanSort());
2297
2
  ASSERT_NO_THROW(slv.synthFun("f1", {x2}, slv.getBooleanSort()));
2298
4
  ASSERT_THROW(slv.synthFun("", {}, d_solver.getBooleanSort()),
2299
2
               CVC5ApiException);
2300
4
  ASSERT_THROW(slv.synthFun("f1", {x}, d_solver.getBooleanSort()),
2301
2
               CVC5ApiException);
2302
}
2303
2304
158
TEST_F(TestApiBlackSolver, synthInv)
2305
{
2306
4
  Sort boolean = d_solver.getBooleanSort();
2307
4
  Sort integer = d_solver.getIntegerSort();
2308
2309
4
  Term nullTerm;
2310
4
  Term x = d_solver.mkVar(boolean);
2311
2312
4
  Term start1 = d_solver.mkVar(boolean);
2313
4
  Term start2 = d_solver.mkVar(integer);
2314
2315
4
  Grammar g1 = d_solver.mkSygusGrammar({x}, {start1});
2316
2
  g1.addRule(start1, d_solver.mkBoolean(false));
2317
2318
4
  Grammar g2 = d_solver.mkSygusGrammar({x}, {start2});
2319
2
  g2.addRule(start2, d_solver.mkInteger(0));
2320
2321
2
  ASSERT_NO_THROW(d_solver.synthInv("", {}));
2322
2
  ASSERT_NO_THROW(d_solver.synthInv("i1", {x}));
2323
2
  ASSERT_NO_THROW(d_solver.synthInv("i2", {x}, g1));
2324
2325
4
  ASSERT_THROW(d_solver.synthInv("i3", {nullTerm}), CVC5ApiException);
2326
4
  ASSERT_THROW(d_solver.synthInv("i4", {x}, g2), CVC5ApiException);
2327
}
2328
2329
158
TEST_F(TestApiBlackSolver, addSygusConstraint)
2330
{
2331
4
  Term nullTerm;
2332
4
  Term boolTerm = d_solver.mkBoolean(true);
2333
4
  Term intTerm = d_solver.mkInteger(1);
2334
2335
2
  ASSERT_NO_THROW(d_solver.addSygusConstraint(boolTerm));
2336
4
  ASSERT_THROW(d_solver.addSygusConstraint(nullTerm), CVC5ApiException);
2337
4
  ASSERT_THROW(d_solver.addSygusConstraint(intTerm), CVC5ApiException);
2338
2339
4
  Solver slv;
2340
4
  ASSERT_THROW(slv.addSygusConstraint(boolTerm), CVC5ApiException);
2341
}
2342
2343
158
TEST_F(TestApiBlackSolver, addSygusAssume)
2344
{
2345
4
  Term nullTerm;
2346
4
  Term boolTerm = d_solver.mkBoolean(false);
2347
4
  Term intTerm = d_solver.mkInteger(1);
2348
2349
2
  ASSERT_NO_THROW(d_solver.addSygusAssume(boolTerm));
2350
4
  ASSERT_THROW(d_solver.addSygusAssume(nullTerm), CVC5ApiException);
2351
4
  ASSERT_THROW(d_solver.addSygusAssume(intTerm), CVC5ApiException);
2352
2353
4
  Solver slv;
2354
4
  ASSERT_THROW(slv.addSygusAssume(boolTerm), CVC5ApiException);
2355
}
2356
2357
158
TEST_F(TestApiBlackSolver, addSygusInvConstraint)
2358
{
2359
4
  Sort boolean = d_solver.getBooleanSort();
2360
4
  Sort real = d_solver.getRealSort();
2361
2362
4
  Term nullTerm;
2363
4
  Term intTerm = d_solver.mkInteger(1);
2364
2365
4
  Term inv = d_solver.declareFun("inv", {real}, boolean);
2366
4
  Term pre = d_solver.declareFun("pre", {real}, boolean);
2367
4
  Term trans = d_solver.declareFun("trans", {real, real}, boolean);
2368
4
  Term post = d_solver.declareFun("post", {real}, boolean);
2369
2370
4
  Term inv1 = d_solver.declareFun("inv1", {real}, real);
2371
2372
4
  Term trans1 = d_solver.declareFun("trans1", {boolean, real}, boolean);
2373
4
  Term trans2 = d_solver.declareFun("trans2", {real, boolean}, boolean);
2374
4
  Term trans3 = d_solver.declareFun("trans3", {real, real}, real);
2375
2376
2
  ASSERT_NO_THROW(d_solver.addSygusInvConstraint(inv, pre, trans, post));
2377
2378
4
  ASSERT_THROW(d_solver.addSygusInvConstraint(nullTerm, pre, trans, post),
2379
2
               CVC5ApiException);
2380
4
  ASSERT_THROW(d_solver.addSygusInvConstraint(inv, nullTerm, trans, post),
2381
2
               CVC5ApiException);
2382
4
  ASSERT_THROW(d_solver.addSygusInvConstraint(inv, pre, nullTerm, post),
2383
2
               CVC5ApiException);
2384
4
  ASSERT_THROW(d_solver.addSygusInvConstraint(inv, pre, trans, nullTerm),
2385
2
               CVC5ApiException);
2386
2387
4
  ASSERT_THROW(d_solver.addSygusInvConstraint(intTerm, pre, trans, post),
2388
2
               CVC5ApiException);
2389
2390
4
  ASSERT_THROW(d_solver.addSygusInvConstraint(inv1, pre, trans, post),
2391
2
               CVC5ApiException);
2392
2393
4
  ASSERT_THROW(d_solver.addSygusInvConstraint(inv, trans, trans, post),
2394
2
               CVC5ApiException);
2395
2396
4
  ASSERT_THROW(d_solver.addSygusInvConstraint(inv, pre, intTerm, post),
2397
2
               CVC5ApiException);
2398
4
  ASSERT_THROW(d_solver.addSygusInvConstraint(inv, pre, pre, post),
2399
2
               CVC5ApiException);
2400
4
  ASSERT_THROW(d_solver.addSygusInvConstraint(inv, pre, trans1, post),
2401
2
               CVC5ApiException);
2402
4
  ASSERT_THROW(d_solver.addSygusInvConstraint(inv, pre, trans2, post),
2403
2
               CVC5ApiException);
2404
4
  ASSERT_THROW(d_solver.addSygusInvConstraint(inv, pre, trans3, post),
2405
2
               CVC5ApiException);
2406
2407
4
  ASSERT_THROW(d_solver.addSygusInvConstraint(inv, pre, trans, trans),
2408
2
               CVC5ApiException);
2409
4
  Solver slv;
2410
4
  Sort boolean2 = slv.getBooleanSort();
2411
4
  Sort real2 = slv.getRealSort();
2412
4
  Term inv22 = slv.declareFun("inv", {real2}, boolean2);
2413
4
  Term pre22 = slv.declareFun("pre", {real2}, boolean2);
2414
4
  Term trans22 = slv.declareFun("trans", {real2, real2}, boolean2);
2415
4
  Term post22 = slv.declareFun("post", {real2}, boolean2);
2416
2
  ASSERT_NO_THROW(slv.addSygusInvConstraint(inv22, pre22, trans22, post22));
2417
4
  ASSERT_THROW(slv.addSygusInvConstraint(inv, pre22, trans22, post22),
2418
2
               CVC5ApiException);
2419
4
  ASSERT_THROW(slv.addSygusInvConstraint(inv22, pre, trans22, post22),
2420
2
               CVC5ApiException);
2421
4
  ASSERT_THROW(slv.addSygusInvConstraint(inv22, pre22, trans, post22),
2422
2
               CVC5ApiException);
2423
4
  ASSERT_THROW(slv.addSygusInvConstraint(inv22, pre22, trans22, post),
2424
2
               CVC5ApiException);
2425
}
2426
2427
158
TEST_F(TestApiBlackSolver, getSynthSolution)
2428
{
2429
2
  d_solver.setOption("lang", "sygus2");
2430
2
  d_solver.setOption("incremental", "false");
2431
2432
4
  Term nullTerm;
2433
4
  Term x = d_solver.mkBoolean(false);
2434
4
  Term f = d_solver.synthFun("f", {}, d_solver.getBooleanSort());
2435
2436
4
  ASSERT_THROW(d_solver.getSynthSolution(f), CVC5ApiException);
2437
2438
2
  d_solver.checkSynth();
2439
2440
2
  ASSERT_NO_THROW(d_solver.getSynthSolution(f));
2441
2
  ASSERT_NO_THROW(d_solver.getSynthSolution(f));
2442
2443
4
  ASSERT_THROW(d_solver.getSynthSolution(nullTerm), CVC5ApiException);
2444
4
  ASSERT_THROW(d_solver.getSynthSolution(x), CVC5ApiException);
2445
2446
4
  Solver slv;
2447
4
  ASSERT_THROW(slv.getSynthSolution(f), CVC5ApiException);
2448
}
2449
2450
158
TEST_F(TestApiBlackSolver, getSynthSolutions)
2451
{
2452
2
  d_solver.setOption("lang", "sygus2");
2453
2
  d_solver.setOption("incremental", "false");
2454
2455
4
  Term nullTerm;
2456
4
  Term x = d_solver.mkBoolean(false);
2457
4
  Term f = d_solver.synthFun("f", {}, d_solver.getBooleanSort());
2458
2459
4
  ASSERT_THROW(d_solver.getSynthSolutions({}), CVC5ApiException);
2460
4
  ASSERT_THROW(d_solver.getSynthSolutions({f}), CVC5ApiException);
2461
2462
2
  d_solver.checkSynth();
2463
2464
2
  ASSERT_NO_THROW(d_solver.getSynthSolutions({f}));
2465
2
  ASSERT_NO_THROW(d_solver.getSynthSolutions({f, f}));
2466
2467
4
  ASSERT_THROW(d_solver.getSynthSolutions({}), CVC5ApiException);
2468
4
  ASSERT_THROW(d_solver.getSynthSolutions({nullTerm}), CVC5ApiException);
2469
4
  ASSERT_THROW(d_solver.getSynthSolutions({x}), CVC5ApiException);
2470
2471
4
  Solver slv;
2472
4
  ASSERT_THROW(slv.getSynthSolutions({x}), CVC5ApiException);
2473
}
2474
2475
158
TEST_F(TestApiBlackSolver, tupleProject)
2476
{
2477
  std::vector<Sort> sorts = {d_solver.getBooleanSort(),
2478
                             d_solver.getIntegerSort(),
2479
                             d_solver.getStringSort(),
2480
4
                             d_solver.mkSetSort(d_solver.getStringSort())};
2481
  std::vector<Term> elements = {
2482
      d_solver.mkBoolean(true),
2483
      d_solver.mkInteger(3),
2484
      d_solver.mkString("C"),
2485
4
      d_solver.mkTerm(SINGLETON, d_solver.mkString("Z"))};
2486
2487
4
  Term tuple = d_solver.mkTuple(sorts, elements);
2488
2489
4
  std::vector<uint32_t> indices1 = {};
2490
4
  std::vector<uint32_t> indices2 = {0};
2491
4
  std::vector<uint32_t> indices3 = {0, 1};
2492
4
  std::vector<uint32_t> indices4 = {0, 0, 2, 2, 3, 3, 0};
2493
4
  std::vector<uint32_t> indices5 = {4};
2494
4
  std::vector<uint32_t> indices6 = {0, 4};
2495
2496
2
  ASSERT_NO_THROW(
2497
      d_solver.mkTerm(d_solver.mkOp(TUPLE_PROJECT, indices1), tuple));
2498
2
  ASSERT_NO_THROW(
2499
      d_solver.mkTerm(d_solver.mkOp(TUPLE_PROJECT, indices2), tuple));
2500
2
  ASSERT_NO_THROW(
2501
      d_solver.mkTerm(d_solver.mkOp(TUPLE_PROJECT, indices3), tuple));
2502
2
  ASSERT_NO_THROW(
2503
      d_solver.mkTerm(d_solver.mkOp(TUPLE_PROJECT, indices4), tuple));
2504
2505
4
  ASSERT_THROW(d_solver.mkTerm(d_solver.mkOp(TUPLE_PROJECT, indices5), tuple),
2506
2
               CVC5ApiException);
2507
4
  ASSERT_THROW(d_solver.mkTerm(d_solver.mkOp(TUPLE_PROJECT, indices6), tuple),
2508
2
               CVC5ApiException);
2509
2510
4
  std::vector<uint32_t> indices = {0, 3, 2, 0, 1, 2};
2511
2512
4
  Op op = d_solver.mkOp(TUPLE_PROJECT, indices);
2513
4
  Term projection = d_solver.mkTerm(op, tuple);
2514
2515
4
  Datatype datatype = tuple.getSort().getDatatype();
2516
4
  DatatypeConstructor constructor = datatype[0];
2517
2518
14
  for (size_t i = 0; i < indices.size(); i++)
2519
  {
2520
24
    Term selectorTerm = constructor[indices[i]].getSelectorTerm();
2521
24
    Term selectedTerm = d_solver.mkTerm(APPLY_SELECTOR, selectorTerm, tuple);
2522
24
    Term simplifiedTerm = d_solver.simplify(selectedTerm);
2523
12
    ASSERT_EQ(elements[indices[i]], simplifiedTerm);
2524
  }
2525
2526
2
  ASSERT_EQ(
2527
      "((_ tuple_project 0 3 2 0 1 2) (tuple true 3 \"C\" (singleton "
2528
      "\"Z\")))",
2529
2
      projection.toString());
2530
}
2531
2532
158
TEST_F(TestApiBlackSolver, Output)
2533
{
2534
4
  ASSERT_THROW(d_solver.isOutputOn("foo-invalid"), CVC5ApiException);
2535
4
  ASSERT_THROW(d_solver.getOutput("foo-invalid"), CVC5ApiException);
2536
2
  ASSERT_FALSE(d_solver.isOutputOn("inst"));
2537
2
  ASSERT_EQ(cvc5::null_os.rdbuf(), d_solver.getOutput("inst").rdbuf());
2538
2
  d_solver.setOption("output", "inst");
2539
2
  ASSERT_TRUE(d_solver.isOutputOn("inst"));
2540
2
  ASSERT_NE(cvc5::null_os.rdbuf(), d_solver.getOutput("inst").rdbuf());
2541
}
2542
2543
2544
158
TEST_F(TestApiBlackSolver, issue7000)
2545
{
2546
4
  Sort s1 = d_solver.getIntegerSort();
2547
4
  Sort s2 = d_solver.mkFunctionSort(s1, s1);
2548
4
  Sort s3 = d_solver.getRealSort();
2549
4
  Term t4 = d_solver.mkPi();
2550
4
  Term t7 = d_solver.mkConst(s3, "_x5");
2551
4
  Term t37 = d_solver.mkConst(s2, "_x32");
2552
4
  Term t59 = d_solver.mkConst(s2, "_x51");
2553
4
  Term t72 = d_solver.mkTerm(EQUAL, t37, t59);
2554
4
  Term t74 = d_solver.mkTerm(GT, t4, t7);
2555
  // throws logic exception since logic is not higher order by default
2556
4
  ASSERT_THROW(d_solver.checkEntailed({t72, t74, t72, t72}), CVC5ApiException);
2557
}
2558
2559
158
TEST_F(TestApiBlackSolver, issue5893)
2560
{
2561
4
  Solver slv;
2562
4
  Sort bvsort4 = d_solver.mkBitVectorSort(4);
2563
4
  Sort bvsort8 = d_solver.mkBitVectorSort(8);
2564
4
  Sort arrsort = d_solver.mkArraySort(bvsort4, bvsort8);
2565
4
  Term arr = d_solver.mkConst(arrsort, "arr");
2566
4
  Term idx = d_solver.mkConst(bvsort4, "idx");
2567
4
  Term ten = d_solver.mkBitVector(8, "10", 10);
2568
4
  Term sel = d_solver.mkTerm(SELECT, arr, idx);
2569
4
  Term distinct = d_solver.mkTerm(DISTINCT, sel, ten);
2570
2
  ASSERT_NO_FATAL_FAILURE(distinct.getOp());
2571
}
2572
2573
}  // namespace test
2574
450
}  // namespace cvc5