GCC Code Coverage Report
Directory: . Exec Total Coverage
File: test/unit/api/solver_black.cpp Lines: 1591 1591 100.0 %
Date: 2021-08-01 Branches: 6184 16980 36.4 %

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