GCC Code Coverage Report
Directory: . Exec Total Coverage
File: test/unit/api/solver_black.cpp Lines: 1606 1606 100.0 %
Date: 2021-08-14 Branches: 6259 17226 36.3 %

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