GCC Code Coverage Report
Directory: . Exec Total Coverage
File: test/unit/api/solver_black.cpp Lines: 1604 1616 99.3 %
Date: 2021-05-22 Branches: 6199 17210 36.0 %

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