GCC Code Coverage Report
Directory: . Exec Total Coverage
File: test/unit/api/solver_black.cpp Lines: 1719 1719 100.0 %
Date: 2021-09-07 Branches: 6580 18232 36.1 %

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