GCC Code Coverage Report
Directory: . Exec Total Coverage
File: test/unit/api/solver_black.cpp Lines: 1756 1758 99.9 %
Date: 2021-09-15 Branches: 6689 18598 36.0 %

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