1 /******************************************************************************
2 * Top contributors (to current version):
3 * Aina Niemetz, Andrew Reynolds, Mathias Preiner
5 * This file is part of the cvc5 project.
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 * ****************************************************************************
13 * Black box testing of the guards of the C++ API functions.
18 namespace cvc5::internal
{
22 class TestApiBlackSort
: public TestApi
25 Sort
create_datatype_sort()
27 DatatypeDecl dtypeSpec
= d_solver
.mkDatatypeDecl("list");
28 DatatypeConstructorDecl cons
= d_solver
.mkDatatypeConstructorDecl("cons");
29 cons
.addSelector("head", d_solver
.getIntegerSort());
30 cons
.addSelectorSelf("tail");
31 dtypeSpec
.addConstructor(cons
);
32 DatatypeConstructorDecl nil
= d_solver
.mkDatatypeConstructorDecl("nil");
33 dtypeSpec
.addConstructor(nil
);
34 return d_solver
.mkDatatypeSort(dtypeSpec
);
37 Sort
create_param_datatype_sort()
39 Sort sort
= d_solver
.mkParamSort("T");
40 DatatypeDecl paramDtypeSpec
= d_solver
.mkDatatypeDecl("paramlist", sort
);
41 DatatypeConstructorDecl paramCons
=
42 d_solver
.mkDatatypeConstructorDecl("cons");
43 DatatypeConstructorDecl paramNil
=
44 d_solver
.mkDatatypeConstructorDecl("nil");
45 paramCons
.addSelector("head", sort
);
46 paramDtypeSpec
.addConstructor(paramCons
);
47 paramDtypeSpec
.addConstructor(paramNil
);
48 return d_solver
.mkDatatypeSort(paramDtypeSpec
);
52 TEST_F(TestApiBlackSort
, operators_comparison
)
54 ASSERT_NO_THROW(d_solver
.getIntegerSort() == Sort());
55 ASSERT_NO_THROW(d_solver
.getIntegerSort() != Sort());
56 ASSERT_NO_THROW(d_solver
.getIntegerSort() < Sort());
57 ASSERT_NO_THROW(d_solver
.getIntegerSort() <= Sort());
58 ASSERT_NO_THROW(d_solver
.getIntegerSort() > Sort());
59 ASSERT_NO_THROW(d_solver
.getIntegerSort() >= Sort());
62 TEST_F(TestApiBlackSort
, hasGetSymbol
)
65 Sort b
= d_solver
.getBooleanSort();
66 Sort s0
= d_solver
.mkParamSort("s0");
67 Sort s1
= d_solver
.mkParamSort("|s1\\|");
69 ASSERT_THROW(n
.hasSymbol(), CVC5ApiException
);
70 ASSERT_FALSE(b
.hasSymbol());
71 ASSERT_TRUE(s0
.hasSymbol());
72 ASSERT_TRUE(s1
.hasSymbol());
74 ASSERT_THROW(n
.getSymbol(), CVC5ApiException
);
75 ASSERT_THROW(b
.getSymbol(), CVC5ApiException
);
76 ASSERT_EQ(s0
.getSymbol(), "s0");
77 ASSERT_EQ(s1
.getSymbol(), "|s1\\|");
80 TEST_F(TestApiBlackSort
, isNull
)
83 ASSERT_TRUE(x
.isNull());
84 x
= d_solver
.getBooleanSort();
85 ASSERT_FALSE(x
.isNull());
88 TEST_F(TestApiBlackSort
, isBoolean
)
90 ASSERT_TRUE(d_solver
.getBooleanSort().isBoolean());
91 ASSERT_NO_THROW(Sort().isBoolean());
94 TEST_F(TestApiBlackSort
, isInteger
)
96 ASSERT_TRUE(d_solver
.getIntegerSort().isInteger());
97 ASSERT_TRUE(!d_solver
.getRealSort().isInteger());
98 ASSERT_NO_THROW(Sort().isInteger());
101 TEST_F(TestApiBlackSort
, isReal
)
103 ASSERT_TRUE(d_solver
.getRealSort().isReal());
104 ASSERT_TRUE(!d_solver
.getIntegerSort().isReal());
105 ASSERT_NO_THROW(Sort().isReal());
108 TEST_F(TestApiBlackSort
, isString
)
110 ASSERT_TRUE(d_solver
.getStringSort().isString());
111 ASSERT_NO_THROW(Sort().isString());
114 TEST_F(TestApiBlackSort
, isRegExp
)
116 ASSERT_TRUE(d_solver
.getRegExpSort().isRegExp());
117 ASSERT_NO_THROW(Sort().isRegExp());
120 TEST_F(TestApiBlackSort
, isRoundingMode
)
122 ASSERT_TRUE(d_solver
.getRoundingModeSort().isRoundingMode());
123 ASSERT_NO_THROW(Sort().isRoundingMode());
126 TEST_F(TestApiBlackSort
, isBitVector
)
128 ASSERT_TRUE(d_solver
.mkBitVectorSort(8).isBitVector());
129 ASSERT_NO_THROW(Sort().isBitVector());
132 TEST_F(TestApiBlackSort
, isFloatingPoint
)
134 ASSERT_TRUE(d_solver
.mkFloatingPointSort(8, 24).isFloatingPoint());
135 ASSERT_NO_THROW(Sort().isFloatingPoint());
138 TEST_F(TestApiBlackSort
, isDatatype
)
140 Sort dt_sort
= create_datatype_sort();
141 ASSERT_TRUE(dt_sort
.isDatatype());
142 ASSERT_NO_THROW(Sort().isDatatype());
145 TEST_F(TestApiBlackSort
, isConstructor
)
147 Sort dt_sort
= create_datatype_sort();
148 Datatype dt
= dt_sort
.getDatatype();
149 Sort cons_sort
= dt
[0].getTerm().getSort();
150 ASSERT_TRUE(cons_sort
.isDatatypeConstructor());
151 ASSERT_NO_THROW(Sort().isDatatypeConstructor());
154 TEST_F(TestApiBlackSort
, isSelector
)
156 Sort dt_sort
= create_datatype_sort();
157 Datatype dt
= dt_sort
.getDatatype();
158 Sort cons_sort
= dt
[0][1].getTerm().getSort();
159 ASSERT_TRUE(cons_sort
.isDatatypeSelector());
160 ASSERT_NO_THROW(Sort().isDatatypeSelector());
163 TEST_F(TestApiBlackSort
, isTester
)
165 Sort dt_sort
= create_datatype_sort();
166 Datatype dt
= dt_sort
.getDatatype();
167 Sort testerSort
= dt
[0].getTesterTerm().getSort();
168 ASSERT_TRUE(testerSort
.isDatatypeTester());
169 ASSERT_NO_THROW(Sort().isDatatypeTester());
172 TEST_F(TestApiBlackSort
, isUpdater
)
174 Sort dt_sort
= create_datatype_sort();
175 Datatype dt
= dt_sort
.getDatatype();
176 Sort updaterSort
= dt
[0][0].getUpdaterTerm().getSort();
177 ASSERT_TRUE(updaterSort
.isDatatypeUpdater());
178 ASSERT_NO_THROW(Sort().isDatatypeUpdater());
181 TEST_F(TestApiBlackSort
, isFunction
)
183 Sort fun_sort
= d_solver
.mkFunctionSort({d_solver
.getRealSort()},
184 d_solver
.getIntegerSort());
185 ASSERT_TRUE(fun_sort
.isFunction());
186 ASSERT_NO_THROW(Sort().isFunction());
189 TEST_F(TestApiBlackSort
, isPredicate
)
191 Sort pred_sort
= d_solver
.mkPredicateSort({d_solver
.getRealSort()});
192 ASSERT_TRUE(pred_sort
.isPredicate());
193 ASSERT_NO_THROW(Sort().isPredicate());
196 TEST_F(TestApiBlackSort
, isTuple
)
198 Sort tup_sort
= d_solver
.mkTupleSort({d_solver
.getRealSort()});
199 ASSERT_TRUE(tup_sort
.isTuple());
200 ASSERT_NO_THROW(Sort().isTuple());
203 TEST_F(TestApiBlackSort
, isRecord
)
206 d_solver
.mkRecordSort({std::make_pair("asdf", d_solver
.getRealSort())});
207 ASSERT_TRUE(rec_sort
.isRecord());
208 ASSERT_NO_THROW(Sort().isRecord());
211 TEST_F(TestApiBlackSort
, isArray
)
214 d_solver
.mkArraySort(d_solver
.getRealSort(), d_solver
.getIntegerSort());
215 ASSERT_TRUE(arr_sort
.isArray());
216 ASSERT_NO_THROW(Sort().isArray());
219 TEST_F(TestApiBlackSort
, isSet
)
221 Sort set_sort
= d_solver
.mkSetSort(d_solver
.getRealSort());
222 ASSERT_TRUE(set_sort
.isSet());
223 ASSERT_NO_THROW(Sort().isSet());
226 TEST_F(TestApiBlackSort
, isBag
)
228 Sort bag_sort
= d_solver
.mkBagSort(d_solver
.getRealSort());
229 ASSERT_TRUE(bag_sort
.isBag());
230 ASSERT_NO_THROW(Sort().isBag());
233 TEST_F(TestApiBlackSort
, isSequence
)
235 Sort seq_sort
= d_solver
.mkSequenceSort(d_solver
.getRealSort());
236 ASSERT_TRUE(seq_sort
.isSequence());
237 ASSERT_NO_THROW(Sort().isSequence());
240 TEST_F(TestApiBlackSort
, isUninterpreted
)
242 Sort un_sort
= d_solver
.mkUninterpretedSort("asdf");
243 ASSERT_TRUE(un_sort
.isUninterpretedSort());
244 ASSERT_NO_THROW(Sort().isUninterpretedSort());
245 Sort un_sort2
= d_solver
.mkUninterpretedSort();
246 ASSERT_TRUE(un_sort2
.isUninterpretedSort());
249 TEST_F(TestApiBlackSort
, isUninterpretedSortConstructor
)
251 Sort sc_sort
= d_solver
.mkUninterpretedSortConstructorSort(1, "asdf");
252 ASSERT_TRUE(sc_sort
.isUninterpretedSortConstructor());
253 ASSERT_NO_THROW(Sort().isUninterpretedSortConstructor());
254 Sort sc_sort2
= d_solver
.mkUninterpretedSortConstructorSort(2);
255 ASSERT_TRUE(sc_sort2
.isUninterpretedSortConstructor());
258 TEST_F(TestApiBlackSort
, getDatatype
)
260 Sort dtypeSort
= create_datatype_sort();
261 ASSERT_NO_THROW(dtypeSort
.getDatatype());
262 // create bv sort, check should fail
263 Sort bvSort
= d_solver
.mkBitVectorSort(32);
264 ASSERT_THROW(bvSort
.getDatatype(), CVC5ApiException
);
267 TEST_F(TestApiBlackSort
, datatypeSorts
)
269 Sort intSort
= d_solver
.getIntegerSort();
270 Sort dtypeSort
= create_datatype_sort();
271 Datatype dt
= dtypeSort
.getDatatype();
272 ASSERT_FALSE(dtypeSort
.isDatatypeConstructor());
273 ASSERT_THROW(dtypeSort
.getDatatypeConstructorCodomainSort(),
275 ASSERT_THROW(dtypeSort
.getDatatypeConstructorDomainSorts(), CVC5ApiException
);
276 ASSERT_THROW(dtypeSort
.getDatatypeConstructorArity(), CVC5ApiException
);
279 DatatypeConstructor dcons
= dt
[0];
280 Term consTerm
= dcons
.getTerm();
281 Sort consSort
= consTerm
.getSort();
282 ASSERT_TRUE(consSort
.isDatatypeConstructor());
283 ASSERT_FALSE(consSort
.isDatatypeTester());
284 ASSERT_FALSE(consSort
.isDatatypeSelector());
285 ASSERT_EQ(consSort
.getDatatypeConstructorArity(), 2);
286 std::vector
<Sort
> consDomSorts
= consSort
.getDatatypeConstructorDomainSorts();
287 ASSERT_EQ(consDomSorts
[0], intSort
);
288 ASSERT_EQ(consDomSorts
[1], dtypeSort
);
289 ASSERT_EQ(consSort
.getDatatypeConstructorCodomainSort(), dtypeSort
);
292 Term isConsTerm
= dcons
.getTesterTerm();
293 ASSERT_TRUE(isConsTerm
.getSort().isDatatypeTester());
294 ASSERT_EQ(isConsTerm
.getSort().getDatatypeTesterDomainSort(), dtypeSort
);
295 Sort booleanSort
= d_solver
.getBooleanSort();
296 ASSERT_EQ(isConsTerm
.getSort().getDatatypeTesterCodomainSort(), booleanSort
);
297 ASSERT_THROW(booleanSort
.getDatatypeTesterDomainSort(), CVC5ApiException
);
298 ASSERT_THROW(booleanSort
.getDatatypeTesterCodomainSort(), CVC5ApiException
);
301 DatatypeSelector dselTail
= dcons
[1];
302 Term tailTerm
= dselTail
.getTerm();
303 ASSERT_TRUE(tailTerm
.getSort().isDatatypeSelector());
304 ASSERT_EQ(tailTerm
.getSort().getDatatypeSelectorDomainSort(), dtypeSort
);
305 ASSERT_EQ(tailTerm
.getSort().getDatatypeSelectorCodomainSort(), dtypeSort
);
306 ASSERT_THROW(booleanSort
.getDatatypeSelectorDomainSort(), CVC5ApiException
);
307 ASSERT_THROW(booleanSort
.getDatatypeSelectorCodomainSort(), CVC5ApiException
);
310 TEST_F(TestApiBlackSort
, instantiate
)
312 // instantiate parametric datatype, check should not fail
313 Sort paramDtypeSort
= create_param_datatype_sort();
314 ASSERT_NO_THROW(paramDtypeSort
.instantiate({d_solver
.getIntegerSort()}));
315 // instantiate non-parametric datatype sort, check should fail
316 DatatypeDecl dtypeSpec
= d_solver
.mkDatatypeDecl("list");
317 DatatypeConstructorDecl cons
= d_solver
.mkDatatypeConstructorDecl("cons");
318 cons
.addSelector("head", d_solver
.getIntegerSort());
319 dtypeSpec
.addConstructor(cons
);
320 DatatypeConstructorDecl nil
= d_solver
.mkDatatypeConstructorDecl("nil");
321 dtypeSpec
.addConstructor(nil
);
322 Sort dtypeSort
= d_solver
.mkDatatypeSort(dtypeSpec
);
323 ASSERT_THROW(dtypeSort
.instantiate({d_solver
.getIntegerSort()}),
325 // instantiate uninterpreted sort constructor
326 Sort sortConsSort
= d_solver
.mkUninterpretedSortConstructorSort(1, "s");
327 ASSERT_NO_THROW(sortConsSort
.instantiate({d_solver
.getIntegerSort()}));
330 TEST_F(TestApiBlackSort
, isInstantiated
)
332 Sort paramDtypeSort
= create_param_datatype_sort();
333 ASSERT_FALSE(paramDtypeSort
.isInstantiated());
334 Sort instParamDtypeSort
=
335 paramDtypeSort
.instantiate({d_solver
.getIntegerSort()});
336 ASSERT_TRUE(instParamDtypeSort
.isInstantiated());
338 Sort sortConsSort
= d_solver
.mkUninterpretedSortConstructorSort(1, "s");
339 ASSERT_FALSE(sortConsSort
.isInstantiated());
340 Sort instSortConsSort
= sortConsSort
.instantiate({d_solver
.getIntegerSort()});
341 ASSERT_TRUE(instSortConsSort
.isInstantiated());
343 ASSERT_FALSE(d_solver
.getIntegerSort().isInstantiated());
344 ASSERT_FALSE(d_solver
.mkBitVectorSort(32).isInstantiated());
347 TEST_F(TestApiBlackSort
, getInstantiatedParameters
)
349 Sort intSort
= d_solver
.getIntegerSort();
350 Sort realSort
= d_solver
.getRealSort();
351 Sort boolSort
= d_solver
.getBooleanSort();
352 Sort bvSort
= d_solver
.mkBitVectorSort(8);
353 std::vector
<Sort
> instSorts
;
355 // parametric datatype instantiation
356 Sort p1
= d_solver
.mkParamSort("p1");
357 Sort p2
= d_solver
.mkParamSort("p2");
358 DatatypeDecl pspec
= d_solver
.mkDatatypeDecl("pdtype", {p1
, p2
});
359 DatatypeConstructorDecl pcons1
= d_solver
.mkDatatypeConstructorDecl("cons1");
360 DatatypeConstructorDecl pcons2
= d_solver
.mkDatatypeConstructorDecl("cons2");
361 DatatypeConstructorDecl pnil
= d_solver
.mkDatatypeConstructorDecl("nil");
362 pcons1
.addSelector("sel", p1
);
363 pcons2
.addSelector("sel", p2
);
364 pspec
.addConstructor(pcons1
);
365 pspec
.addConstructor(pcons2
);
366 pspec
.addConstructor(pnil
);
367 Sort paramDtypeSort
= d_solver
.mkDatatypeSort(pspec
);
369 ASSERT_THROW(paramDtypeSort
.getInstantiatedParameters(), CVC5ApiException
);
371 Sort instParamDtypeSort
= paramDtypeSort
.instantiate({realSort
, boolSort
});
373 instSorts
= instParamDtypeSort
.getInstantiatedParameters();
374 ASSERT_EQ(instSorts
[0], realSort
);
375 ASSERT_EQ(instSorts
[1], boolSort
);
377 // uninterpreted sort constructor sort instantiation
378 Sort sortConsSort
= d_solver
.mkUninterpretedSortConstructorSort(4, "s");
379 ASSERT_THROW(sortConsSort
.getInstantiatedParameters(), CVC5ApiException
);
381 Sort instSortConsSort
=
382 sortConsSort
.instantiate({boolSort
, intSort
, bvSort
, realSort
});
384 instSorts
= instSortConsSort
.getInstantiatedParameters();
385 ASSERT_EQ(instSorts
[0], boolSort
);
386 ASSERT_EQ(instSorts
[1], intSort
);
387 ASSERT_EQ(instSorts
[2], bvSort
);
388 ASSERT_EQ(instSorts
[3], realSort
);
390 ASSERT_THROW(intSort
.getInstantiatedParameters(), CVC5ApiException
);
391 ASSERT_THROW(bvSort
.getInstantiatedParameters(), CVC5ApiException
);
394 TEST_F(TestApiBlackSort
, getUninterpretedSortConstructor
)
396 Sort intSort
= d_solver
.getIntegerSort();
397 Sort realSort
= d_solver
.getRealSort();
398 Sort boolSort
= d_solver
.getBooleanSort();
399 Sort bvSort
= d_solver
.mkBitVectorSort(8);
400 Sort sortConsSort
= d_solver
.mkUninterpretedSortConstructorSort(4, "s");
401 ASSERT_THROW(sortConsSort
.getUninterpretedSortConstructor(),
403 Sort instSortConsSort
=
404 sortConsSort
.instantiate({boolSort
, intSort
, bvSort
, realSort
});
405 ASSERT_EQ(sortConsSort
, instSortConsSort
.getUninterpretedSortConstructor());
408 TEST_F(TestApiBlackSort
, getFunctionArity
)
410 Sort funSort
= d_solver
.mkFunctionSort({d_solver
.mkUninterpretedSort("u")},
411 d_solver
.getIntegerSort());
412 ASSERT_NO_THROW(funSort
.getFunctionArity());
413 Sort bvSort
= d_solver
.mkBitVectorSort(32);
414 ASSERT_THROW(bvSort
.getFunctionArity(), CVC5ApiException
);
417 TEST_F(TestApiBlackSort
, getFunctionDomainSorts
)
419 Sort funSort
= d_solver
.mkFunctionSort({d_solver
.mkUninterpretedSort("u")},
420 d_solver
.getIntegerSort());
421 ASSERT_NO_THROW(funSort
.getFunctionDomainSorts());
422 Sort bvSort
= d_solver
.mkBitVectorSort(32);
423 ASSERT_THROW(bvSort
.getFunctionDomainSorts(), CVC5ApiException
);
426 TEST_F(TestApiBlackSort
, getFunctionCodomainSort
)
428 Sort funSort
= d_solver
.mkFunctionSort({d_solver
.mkUninterpretedSort("u")},
429 d_solver
.getIntegerSort());
430 ASSERT_NO_THROW(funSort
.getFunctionCodomainSort());
431 Sort bvSort
= d_solver
.mkBitVectorSort(32);
432 ASSERT_THROW(bvSort
.getFunctionCodomainSort(), CVC5ApiException
);
435 TEST_F(TestApiBlackSort
, getArrayIndexSort
)
437 Sort elementSort
= d_solver
.mkBitVectorSort(32);
438 Sort indexSort
= d_solver
.mkBitVectorSort(32);
439 Sort arraySort
= d_solver
.mkArraySort(indexSort
, elementSort
);
440 ASSERT_NO_THROW(arraySort
.getArrayIndexSort());
441 ASSERT_THROW(indexSort
.getArrayIndexSort(), CVC5ApiException
);
444 TEST_F(TestApiBlackSort
, getArrayElementSort
)
446 Sort elementSort
= d_solver
.mkBitVectorSort(32);
447 Sort indexSort
= d_solver
.mkBitVectorSort(32);
448 Sort arraySort
= d_solver
.mkArraySort(indexSort
, elementSort
);
449 ASSERT_NO_THROW(arraySort
.getArrayElementSort());
450 ASSERT_THROW(indexSort
.getArrayElementSort(), CVC5ApiException
);
453 TEST_F(TestApiBlackSort
, getSetElementSort
)
455 Sort setSort
= d_solver
.mkSetSort(d_solver
.getIntegerSort());
456 ASSERT_NO_THROW(setSort
.getSetElementSort());
457 Sort elementSort
= setSort
.getSetElementSort();
458 ASSERT_EQ(elementSort
, d_solver
.getIntegerSort());
459 Sort bvSort
= d_solver
.mkBitVectorSort(32);
460 ASSERT_THROW(bvSort
.getSetElementSort(), CVC5ApiException
);
463 TEST_F(TestApiBlackSort
, getBagElementSort
)
465 Sort bagSort
= d_solver
.mkBagSort(d_solver
.getIntegerSort());
466 ASSERT_NO_THROW(bagSort
.getBagElementSort());
467 Sort elementSort
= bagSort
.getBagElementSort();
468 ASSERT_EQ(elementSort
, d_solver
.getIntegerSort());
469 Sort bvSort
= d_solver
.mkBitVectorSort(32);
470 ASSERT_THROW(bvSort
.getBagElementSort(), CVC5ApiException
);
473 TEST_F(TestApiBlackSort
, getSequenceElementSort
)
475 Sort seqSort
= d_solver
.mkSequenceSort(d_solver
.getIntegerSort());
476 ASSERT_TRUE(seqSort
.isSequence());
477 ASSERT_NO_THROW(seqSort
.getSequenceElementSort());
478 Sort bvSort
= d_solver
.mkBitVectorSort(32);
479 ASSERT_FALSE(bvSort
.isSequence());
480 ASSERT_THROW(bvSort
.getSequenceElementSort(), CVC5ApiException
);
483 TEST_F(TestApiBlackSort
, getSymbol
)
485 Sort uSort
= d_solver
.mkUninterpretedSort("u");
486 ASSERT_NO_THROW(uSort
.getSymbol());
487 Sort bvSort
= d_solver
.mkBitVectorSort(32);
488 ASSERT_THROW(bvSort
.getSymbol(), CVC5ApiException
);
491 TEST_F(TestApiBlackSort
, getUninterpretedSortConstructorName
)
493 Sort sSort
= d_solver
.mkUninterpretedSortConstructorSort(2, "s");
494 ASSERT_NO_THROW(sSort
.getSymbol());
495 Sort bvSort
= d_solver
.mkBitVectorSort(32);
496 ASSERT_THROW(bvSort
.getSymbol(), CVC5ApiException
);
499 TEST_F(TestApiBlackSort
, getUninterpretedSortConstructorArity
)
501 Sort sSort
= d_solver
.mkUninterpretedSortConstructorSort(2, "s");
502 ASSERT_NO_THROW(sSort
.getUninterpretedSortConstructorArity());
503 Sort bvSort
= d_solver
.mkBitVectorSort(32);
504 ASSERT_THROW(bvSort
.getUninterpretedSortConstructorArity(), CVC5ApiException
);
507 TEST_F(TestApiBlackSort
, getBitVectorSize
)
509 Sort bvSort
= d_solver
.mkBitVectorSort(32);
510 ASSERT_NO_THROW(bvSort
.getBitVectorSize());
511 Sort setSort
= d_solver
.mkSetSort(d_solver
.getIntegerSort());
512 ASSERT_THROW(setSort
.getBitVectorSize(), CVC5ApiException
);
515 TEST_F(TestApiBlackSort
, getFloatingPointExponentSize
)
517 Sort fpSort
= d_solver
.mkFloatingPointSort(4, 8);
518 ASSERT_NO_THROW(fpSort
.getFloatingPointExponentSize());
519 Sort setSort
= d_solver
.mkSetSort(d_solver
.getIntegerSort());
520 ASSERT_THROW(setSort
.getFloatingPointExponentSize(), CVC5ApiException
);
523 TEST_F(TestApiBlackSort
, getFloatingPointSignificandSize
)
525 Sort fpSort
= d_solver
.mkFloatingPointSort(4, 8);
526 ASSERT_NO_THROW(fpSort
.getFloatingPointSignificandSize());
527 Sort setSort
= d_solver
.mkSetSort(d_solver
.getIntegerSort());
528 ASSERT_THROW(setSort
.getFloatingPointSignificandSize(), CVC5ApiException
);
531 TEST_F(TestApiBlackSort
, getDatatypeArity
)
533 // create datatype sort, check should not fail
534 DatatypeDecl dtypeSpec
= d_solver
.mkDatatypeDecl("list");
535 DatatypeConstructorDecl cons
= d_solver
.mkDatatypeConstructorDecl("cons");
536 cons
.addSelector("head", d_solver
.getIntegerSort());
537 dtypeSpec
.addConstructor(cons
);
538 DatatypeConstructorDecl nil
= d_solver
.mkDatatypeConstructorDecl("nil");
539 dtypeSpec
.addConstructor(nil
);
540 Sort dtypeSort
= d_solver
.mkDatatypeSort(dtypeSpec
);
541 ASSERT_NO_THROW(dtypeSort
.getDatatypeArity());
542 // create bv sort, check should fail
543 Sort bvSort
= d_solver
.mkBitVectorSort(32);
544 ASSERT_THROW(bvSort
.getDatatypeArity(), CVC5ApiException
);
547 TEST_F(TestApiBlackSort
, getTupleLength
)
549 Sort tupleSort
= d_solver
.mkTupleSort(
550 {d_solver
.getIntegerSort(), d_solver
.getIntegerSort()});
551 ASSERT_NO_THROW(tupleSort
.getTupleLength());
552 Sort bvSort
= d_solver
.mkBitVectorSort(32);
553 ASSERT_THROW(bvSort
.getTupleLength(), CVC5ApiException
);
556 TEST_F(TestApiBlackSort
, getTupleSorts
)
558 Sort tupleSort
= d_solver
.mkTupleSort(
559 {d_solver
.getIntegerSort(), d_solver
.getIntegerSort()});
560 ASSERT_NO_THROW(tupleSort
.getTupleSorts());
561 Sort bvSort
= d_solver
.mkBitVectorSort(32);
562 ASSERT_THROW(bvSort
.getTupleSorts(), CVC5ApiException
);
565 TEST_F(TestApiBlackSort
, sortCompare
)
567 Sort boolSort
= d_solver
.getBooleanSort();
568 Sort intSort
= d_solver
.getIntegerSort();
569 Sort bvSort
= d_solver
.mkBitVectorSort(32);
570 Sort bvSort2
= d_solver
.mkBitVectorSort(32);
571 ASSERT_TRUE(bvSort
>= bvSort2
);
572 ASSERT_TRUE(bvSort
<= bvSort2
);
573 ASSERT_TRUE((intSort
> boolSort
) != (intSort
< boolSort
));
574 ASSERT_TRUE((intSort
> bvSort
|| intSort
== bvSort
) == (intSort
>= bvSort
));
577 TEST_F(TestApiBlackSort
, sortScopedToString
)
579 std::string name
= "uninterp-sort";
580 Sort bvsort8
= d_solver
.mkBitVectorSort(8);
581 Sort uninterp_sort
= d_solver
.mkUninterpretedSort(name
);
582 ASSERT_EQ(bvsort8
.toString(), "(_ BitVec 8)");
583 ASSERT_EQ(uninterp_sort
.toString(), name
);
585 ASSERT_EQ(bvsort8
.toString(), "(_ BitVec 8)");
586 ASSERT_EQ(uninterp_sort
.toString(), name
);
589 TEST_F(TestApiBlackSort
, toString
)
591 ASSERT_NO_THROW(Sort().toString());
595 } // namespace cvc5::internal