LCOV - code coverage report
Current view: top level - buildbot/coverage/build/test/unit/api/c - capi_solver_black.cpp (source / functions) Hit Total Coverage
Test: coverage.info Lines: 2625 2638 99.5 %
Date: 2026-10-03 10:36:04 Functions: 564 572 98.6 %
Branches: 2592 5170 50.1 %

           Branch data     Line data    Source code
       1                 :            : /******************************************************************************
       2                 :            :  * This file is part of the cvc5 project.
       3                 :            :  *
       4                 :            :  * Copyright (c) 2009-2026 by the authors listed in the file AUTHORS
       5                 :            :  * in the top-level source directory and their institutional affiliations.
       6                 :            :  * All rights reserved.  See the file COPYING in the top-level source
       7                 :            :  * directory for licensing information.
       8                 :            :  * ****************************************************************************
       9                 :            :  *
      10                 :            :  * Black box testing of solver functions of the C API.
      11                 :            :  */
      12                 :            : 
      13                 :            : extern "C" {
      14                 :            : #include <cvc5/c/cvc5.h>
      15                 :            : }
      16                 :            : 
      17                 :            : #include <cvc5/c/cvc5.h>
      18                 :            : 
      19                 :            : #include <cmath>
      20                 :            : #include <cstring>
      21                 :            : #include <fstream>
      22                 :            : 
      23                 :            : #include "base/check.h"
      24                 :            : #include "base/output.h"
      25                 :            : #include "gtest/gtest.h"
      26                 :            : #include "test_capi.h"
      27                 :            : 
      28                 :            : namespace cvc5::internal::test {
      29                 :            : 
      30                 :            : class TestCApiBlackSolver : public ::testing::Test
      31                 :            : {
      32                 :            :  protected:
      33                 :        137 :   void SetUp() override
      34                 :            :   {
      35                 :        137 :     d_tm = cvc5_term_manager_new();
      36                 :        137 :     d_solver = cvc5_new(d_tm);
      37                 :        137 :     d_bool = cvc5_get_boolean_sort(d_tm);
      38                 :        137 :     d_int = cvc5_get_integer_sort(d_tm);
      39                 :        137 :     d_real = cvc5_get_real_sort(d_tm);
      40                 :        137 :     d_str = cvc5_get_string_sort(d_tm);
      41                 :        137 :     d_uninterpreted = cvc5_mk_uninterpreted_sort(d_tm, "u");
      42                 :        137 :   }
      43                 :        137 :   void TearDown() override
      44                 :            :   {
      45                 :        137 :     cvc5_delete(d_solver);
      46                 :        137 :     cvc5_term_manager_release(d_tm);
      47                 :        137 :     cvc5_term_manager_delete(d_tm);
      48                 :        137 :   }
      49                 :            : 
      50                 :            :   /**
      51                 :            :    * Helper function for testGetSeparation{Heap,Nil}TermX. Asserts and checks
      52                 :            :    * some simple separation logic constraints.
      53                 :            :    */
      54                 :          4 :   void check_simple_separation_constraints()
      55                 :            :   {
      56                 :            :     // declare the separation heap
      57                 :          4 :     cvc5_declare_sep_heap(d_solver, d_int, d_int);
      58                 :          4 :     Cvc5Term x = cvc5_mk_const(d_tm, d_int, "x");
      59                 :          4 :     Cvc5Term p = cvc5_mk_const(d_tm, d_int, "p");
      60                 :          4 :     std::vector<Cvc5Term> args = {p, x};
      61                 :            :     Cvc5Term heap =
      62                 :          4 :         cvc5_mk_term(d_tm, CVC5_KIND_SEP_PTO, args.size(), args.data());
      63                 :          4 :     cvc5_assert_formula(d_solver, heap);
      64                 :          4 :     Cvc5Term nil = cvc5_mk_sep_nil(d_tm, d_int);
      65                 :          4 :     args = {nil, cvc5_mk_integer_int64(d_tm, 5)};
      66                 :          4 :     cvc5_assert_formula(
      67                 :            :         d_solver,
      68                 :          4 :         cvc5_mk_term(d_tm, CVC5_KIND_EQUAL, args.size(), args.data()));
      69                 :          4 :     cvc5_check_sat(d_solver);
      70                 :          4 :   }
      71                 :            : 
      72                 :            :   Cvc5TermManager* d_tm;
      73                 :            :   Cvc5* d_solver;
      74                 :            :   Cvc5Sort d_bool;
      75                 :            :   Cvc5Sort d_int;
      76                 :            :   Cvc5Sort d_real;
      77                 :            :   Cvc5Sort d_str;
      78                 :            :   Cvc5Sort d_uninterpreted;
      79                 :            : };
      80                 :            : 
      81                 :          4 : TEST_F(TestCApiBlackSolver, new)
      82                 :            : {
      83 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_new(nullptr), "unexpected NULL argument");
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
      84                 :            : }
      85                 :            : 
      86                 :          4 : TEST_F(TestCApiBlackSolver, pow2_large1)
      87                 :            : {
      88                 :            :   // Based on https://github.com/cvc5/cvc5-projects/issues/371
      89                 :          1 :   Cvc5Sort s4 = cvc5_mk_array_sort(d_tm, d_str, d_int);
      90                 :          1 :   Cvc5Sort s7 = cvc5_mk_array_sort(d_tm, d_int, d_str);
      91                 :          1 :   Cvc5Term t10 = cvc5_mk_integer(d_tm, "68038927088685865242724985643");
      92                 :          1 :   Cvc5Term t74 = cvc5_mk_integer(d_tm, "8416288636405");
      93                 :          1 :   Cvc5DatatypeConstructorDecl cons1 = cvc5_mk_dt_cons_decl(d_tm, "_x109");
      94                 :          1 :   cvc5_dt_cons_decl_add_selector(cons1, "_x108", s7);
      95                 :          1 :   Cvc5DatatypeConstructorDecl cons2 = cvc5_mk_dt_cons_decl(d_tm, "_x113");
      96                 :          1 :   cvc5_dt_cons_decl_add_selector(cons2, "_x110", s4);
      97                 :          1 :   cvc5_dt_cons_decl_add_selector(cons2, "_x111", d_int);
      98                 :          1 :   cvc5_dt_cons_decl_add_selector(cons2, "_x112", s7);
      99                 :          1 :   std::vector<Cvc5DatatypeConstructorDecl> ctors = {cons1, cons2};
     100                 :          1 :   Cvc5Sort s11 = cvc5_declare_dt(d_solver, "_x107", ctors.size(), ctors.data());
     101                 :          1 :   Cvc5Term t82 = cvc5_mk_const(d_tm, s11, "_x114");
     102                 :          1 :   std::vector<Cvc5Term> args = {t10};
     103                 :          1 :   Cvc5Term t180 = cvc5_mk_term(d_tm, CVC5_KIND_POW2, args.size(), args.data());
     104                 :          1 :   args = {t74, t180};
     105                 :          1 :   Cvc5Term t258 = cvc5_mk_term(d_tm, CVC5_KIND_GEQ, args.size(), args.data());
     106                 :          1 :   cvc5_assert_formula(d_solver, t258);
     107 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_simplify(d_solver, t82, true),
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
     108                 :            :                     "can only be a positive integral constant below");
     109 [ +  - ][ +  - ]:          1 : }
     110                 :            : 
     111                 :          4 : TEST_F(TestCApiBlackSolver, pow2_large2)
     112                 :            : {
     113                 :            :   // Based on https://github.com/cvc5/cvc5-projects/issues/333
     114                 :          1 :   Cvc5Term t1 = cvc5_mk_bv_uint64(d_tm, 63, ~(((uint64_t)1) << 62));
     115                 :          1 :   std::vector<Cvc5Term> args = {t1};
     116                 :          1 :   Cvc5Term t2 = cvc5_mk_term(
     117                 :          1 :       d_tm, CVC5_KIND_BITVECTOR_UBV_TO_INT, args.size(), args.data());
     118                 :          1 :   args = {t2};
     119                 :          1 :   Cvc5Term t3 = cvc5_mk_term(d_tm, CVC5_KIND_POW2, args.size(), args.data());
     120                 :          1 :   args = {t3, t2};
     121                 :            :   Cvc5Term t4 =
     122                 :          1 :       cvc5_mk_term(d_tm, CVC5_KIND_DISTINCT, args.size(), args.data());
     123                 :          1 :   std::vector<Cvc5Term> assumptions = {t4};
     124 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
     125                 :            :       cvc5_check_sat_assuming(d_solver, assumptions.size(), assumptions.data()),
     126                 :            :       "can only be a positive integral constant below");
     127 [ +  - ][ +  - ]:          1 : }
     128                 :            : 
     129                 :          4 : TEST_F(TestCApiBlackSolver, pow2_large3)
     130                 :            : {
     131                 :            :   // Based on https://github.com/cvc5/cvc5-projects/issues/339
     132                 :          1 :   Cvc5Term t203 = cvc5_mk_integer(d_tm, "6135470354240554220207");
     133                 :          1 :   std::vector<Cvc5Term> args = {t203};
     134                 :          1 :   Cvc5Term t262 = cvc5_mk_term(d_tm, CVC5_KIND_POW2, args.size(), args.data());
     135                 :          1 :   args = {t262};
     136                 :          1 :   std::vector<uint32_t> idxs = {49};
     137                 :          2 :   Cvc5Term t536 = cvc5_mk_term_from_op(
     138                 :            :       d_tm,
     139                 :          1 :       cvc5_mk_op(d_tm, CVC5_KIND_INT_TO_BITVECTOR, idxs.size(), idxs.data()),
     140                 :            :       args.size(),
     141                 :          1 :       args.data());
     142                 :            :   // should not throw an exception, will not simplify.
     143                 :          1 :   cvc5_simplify(d_solver, t536, false);
     144                 :          1 : }
     145                 :            : 
     146                 :          4 : TEST_F(TestCApiBlackSolver, simplify)
     147                 :            : {
     148                 :          1 :   Cvc5Sort bv_sort = cvc5_mk_bv_sort(d_tm, 32);
     149                 :          1 :   std::vector<Cvc5Sort> domain = {bv_sort, bv_sort};
     150                 :            :   Cvc5Sort fun_sort1 =
     151                 :          1 :       cvc5_mk_fun_sort(d_tm, domain.size(), domain.data(), bv_sort);
     152                 :          1 :   domain = {d_uninterpreted};
     153                 :            :   Cvc5Sort fun_sort2 =
     154                 :          1 :       cvc5_mk_fun_sort(d_tm, domain.size(), domain.data(), d_int);
     155                 :            : 
     156                 :          1 :   Cvc5DatatypeDecl decl = cvc5_mk_dt_decl(d_tm, "list", false);
     157                 :          1 :   Cvc5DatatypeConstructorDecl cons = cvc5_mk_dt_cons_decl(d_tm, "cons");
     158                 :          1 :   cvc5_dt_cons_decl_add_selector(cons, "head", d_int);
     159                 :          1 :   cvc5_dt_cons_decl_add_selector_self(cons, "tail");
     160                 :          1 :   cvc5_dt_decl_add_constructor(decl, cons);
     161                 :          1 :   Cvc5DatatypeConstructorDecl nil = cvc5_mk_dt_cons_decl(d_tm, "nil");
     162                 :          1 :   cvc5_dt_decl_add_constructor(decl, nil);
     163                 :          1 :   Cvc5Sort list = cvc5_mk_dt_sort(d_tm, decl);
     164                 :            : 
     165                 :          1 :   Cvc5Term x = cvc5_mk_const(d_tm, bv_sort, "x");
     166                 :          1 :   (void)cvc5_simplify(d_solver, x, false);
     167                 :            : 
     168 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_simplify(nullptr, x, false),
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
     169                 :            :                     "unexpected NULL argument");
     170 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_simplify(d_solver, nullptr, false), "invalid term");
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
     171                 :            : 
     172                 :          1 :   Cvc5Term a = cvc5_mk_const(d_tm, bv_sort, "a");
     173                 :          1 :   (void)cvc5_simplify(d_solver, a, false);
     174                 :          1 :   Cvc5Term b = cvc5_mk_const(d_tm, bv_sort, "b");
     175                 :          1 :   (void)cvc5_simplify(d_solver, b, false);
     176                 :          1 :   std::vector<Cvc5Term> args = {x, x};
     177                 :            :   Cvc5Term x_eq_x =
     178                 :          1 :       cvc5_mk_term(d_tm, CVC5_KIND_EQUAL, args.size(), args.data());
     179                 :          1 :   (void)cvc5_simplify(d_solver, x_eq_x, false);
     180 [ -  + ][ +  - ]:          1 :   ASSERT_TRUE(cvc5_term_is_disequal(cvc5_mk_true(d_tm), x_eq_x));
     181         [ -  + ]:          1 :   ASSERT_TRUE(cvc5_term_is_equal(cvc5_mk_true(d_tm),
     182         [ +  - ]:          1 :                                  cvc5_simplify(d_solver, x_eq_x, false)));
     183                 :          1 :   args = {x, b};
     184                 :            :   Cvc5Term x_eq_b =
     185                 :          1 :       cvc5_mk_term(d_tm, CVC5_KIND_EQUAL, args.size(), args.data());
     186                 :          1 :   (void)cvc5_simplify(d_solver, x_eq_b, false);
     187 [ -  + ][ +  - ]:          1 :   ASSERT_TRUE(cvc5_term_is_disequal(cvc5_mk_true(d_tm), x_eq_b));
     188         [ -  + ]:          1 :   ASSERT_TRUE(cvc5_term_is_disequal(cvc5_mk_true(d_tm),
     189         [ +  - ]:          1 :                                     cvc5_simplify(d_solver, x_eq_b, false)));
     190                 :            : 
     191                 :          1 :   Cvc5Term i1 = cvc5_mk_const(d_tm, d_int, "i1");
     192                 :          1 :   (void)cvc5_simplify(d_solver, i1, false);
     193                 :          1 :   args = {i1, cvc5_mk_integer(d_tm, "23")};
     194                 :          1 :   Cvc5Term i2 = cvc5_mk_term(d_tm, CVC5_KIND_MULT, args.size(), args.data());
     195                 :          1 :   (void)cvc5_simplify(d_solver, i2, false);
     196 [ -  + ][ +  - ]:          1 :   ASSERT_TRUE(cvc5_term_is_disequal(i1, i2));
     197 [ -  + ][ +  - ]:          1 :   ASSERT_TRUE(cvc5_term_is_disequal(i1, cvc5_simplify(d_solver, i2, false)));
     198                 :            : 
     199                 :          1 :   args = {i1, cvc5_mk_integer(d_tm, "0")};
     200                 :          1 :   Cvc5Term i3 = cvc5_mk_term(d_tm, CVC5_KIND_ADD, args.size(), args.data());
     201                 :          1 :   (void)cvc5_simplify(d_solver, i3, false);
     202 [ -  + ][ +  - ]:          1 :   ASSERT_TRUE(cvc5_term_is_disequal(i1, i3));
     203 [ -  + ][ +  - ]:          1 :   ASSERT_TRUE(cvc5_term_is_equal(i1, cvc5_simplify(d_solver, i3, false)));
     204                 :            : 
     205                 :          1 :   Cvc5Datatype list_dt = cvc5_sort_get_datatype(list);
     206                 :          0 :   args = {
     207                 :          1 :       cvc5_dt_cons_get_term(cvc5_dt_get_constructor_by_name(list_dt, "nil"))};
     208                 :          0 :   args = {
     209                 :          1 :       cvc5_dt_cons_get_term(cvc5_dt_get_constructor_by_name(list_dt, "cons")),
     210                 :          1 :       cvc5_mk_integer(d_tm, "0"),
     211                 :          1 :       cvc5_mk_term(
     212                 :          2 :           d_tm, CVC5_KIND_APPLY_CONSTRUCTOR, args.size(), args.data())};
     213                 :            :   Cvc5Term dt1 =
     214                 :          1 :       cvc5_mk_term(d_tm, CVC5_KIND_APPLY_CONSTRUCTOR, args.size(), args.data());
     215                 :          1 :   (void)cvc5_simplify(d_solver, dt1, false);
     216                 :            : 
     217                 :          1 :   args = {cvc5_dt_sel_get_term(cvc5_dt_cons_get_selector_by_name(
     218                 :            :               cvc5_dt_get_constructor_by_name(list_dt, "cons"), "head")),
     219                 :          1 :           dt1};
     220                 :            :   Cvc5Term dt2 =
     221                 :          1 :       cvc5_mk_term(d_tm, CVC5_KIND_APPLY_SELECTOR, args.size(), args.data());
     222                 :          1 :   (void)cvc5_simplify(d_solver, dt2, false);
     223                 :            : 
     224                 :          1 :   Cvc5Term b1 = cvc5_mk_var(d_tm, bv_sort, "b1");
     225                 :          1 :   (void)cvc5_simplify(d_solver, b1, false);
     226                 :          1 :   Cvc5Term b2 = cvc5_mk_var(d_tm, bv_sort, "b1");
     227                 :          1 :   (void)cvc5_simplify(d_solver, b2, false);
     228                 :          1 :   Cvc5Term b3 = cvc5_mk_var(d_tm, d_uninterpreted, "b3");
     229                 :          1 :   (void)cvc5_simplify(d_solver, b3, false);
     230                 :          1 :   Cvc5Term v1 = cvc5_mk_const(d_tm, bv_sort, "v1");
     231                 :          1 :   (void)cvc5_simplify(d_solver, v1, false);
     232                 :          1 :   Cvc5Term v2 = cvc5_mk_const(d_tm, d_int, "v2");
     233                 :          1 :   (void)cvc5_simplify(d_solver, v2, false);
     234                 :          1 :   Cvc5Term f1 = cvc5_mk_const(d_tm, fun_sort1, "f1");
     235                 :          1 :   (void)cvc5_simplify(d_solver, f1, false);
     236                 :          1 :   Cvc5Term f2 = cvc5_mk_const(d_tm, fun_sort2, "f1");
     237                 :          1 :   (void)cvc5_simplify(d_solver, f2, false);
     238                 :            : 
     239                 :          1 :   std::vector<Cvc5Term> funs = {f1, f2};
     240                 :          1 :   std::vector<size_t> nvars = {2, 1};
     241                 :          1 :   std::vector<Cvc5Term> vars1 = {b1, b2};
     242                 :          1 :   std::vector<Cvc5Term> vars2 = {b3};
     243                 :          1 :   std::vector<const Cvc5Term*> vars = {vars1.data(), vars2.data()};
     244                 :          1 :   std::vector<Cvc5Term> terms = {v1, v2};
     245                 :          2 :   cvc5_define_funs_rec(d_solver,
     246                 :            :                        funs.size(),
     247                 :          1 :                        funs.data(),
     248                 :            :                        nvars.data(),
     249                 :            :                        vars.data(),
     250                 :          1 :                        terms.data(),
     251                 :            :                        false);
     252                 :          1 :   (void)cvc5_simplify(d_solver, f1, false);
     253                 :          1 :   (void)cvc5_simplify(d_solver, f2, false);
     254                 :            : 
     255                 :          1 :   Cvc5TermManager* tm = cvc5_term_manager_new();
     256                 :          1 :   Cvc5* slv = cvc5_new(tm);
     257 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
     258                 :            :       cvc5_simplify(slv, x, false),
     259                 :            :       "term is not associated with the term manager of this solver");
     260                 :          1 :   cvc5_delete(slv);
     261                 :          1 :   cvc5_term_manager_release(tm);
     262                 :          1 :   cvc5_term_manager_delete(tm);
     263         [ +  - ]:          1 : }
     264                 :            : 
     265                 :          4 : TEST_F(TestCApiBlackSolver, simplify_apply_subs)
     266                 :            : {
     267                 :          1 :   cvc5_set_option(d_solver, "incremental", "true");
     268                 :          1 :   Cvc5Term x = cvc5_mk_const(d_tm, d_int, "x");
     269                 :          1 :   Cvc5Term zero = cvc5_mk_integer_int64(d_tm, 0);
     270                 :          1 :   std::vector<Cvc5Term> args = {x, zero};
     271                 :          1 :   Cvc5Term eq = cvc5_mk_term(d_tm, CVC5_KIND_EQUAL, args.size(), args.data());
     272                 :          1 :   cvc5_assert_formula(d_solver, eq);
     273                 :          1 :   cvc5_check_sat(d_solver);
     274                 :            : 
     275 [ -  + ][ +  - ]:          1 :   ASSERT_TRUE(cvc5_term_is_equal(cvc5_simplify(d_solver, x, false), x));
     276 [ -  + ][ +  - ]:          1 :   ASSERT_TRUE(cvc5_term_is_equal(cvc5_simplify(d_solver, x, true), zero));
     277         [ +  - ]:          1 : }
     278                 :            : 
     279                 :          4 : TEST_F(TestCApiBlackSolver, assert_formula)
     280                 :            : {
     281 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_assert_formula(nullptr, cvc5_mk_true(d_tm)),
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
     282                 :            :                     "unexpected NULL argument");
     283 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_assert_formula(d_solver, nullptr), "invalid term");
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
     284                 :            : 
     285                 :          1 :   cvc5_assert_formula(d_solver, cvc5_mk_true(d_tm));
     286                 :            : 
     287                 :          1 :   Cvc5TermManager* tm = cvc5_term_manager_new();
     288                 :          1 :   Cvc5* slv = cvc5_new(tm);
     289 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
     290                 :            :       cvc5_assert_formula(slv, cvc5_mk_true(d_tm)),
     291                 :            :       "term is not associated with the term manager of this solver");
     292                 :          1 :   cvc5_delete(slv);
     293                 :          1 :   cvc5_term_manager_release(tm);
     294                 :          1 :   cvc5_term_manager_delete(tm);
     295                 :            : }
     296                 :            : 
     297                 :          4 : TEST_F(TestCApiBlackSolver, check_sat)
     298                 :            : {
     299 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_check_sat(nullptr), "unexpected NULL argument");
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
     300                 :            : 
     301                 :          1 :   cvc5_set_option(d_solver, "incremental", "false");
     302                 :          1 :   cvc5_check_sat(d_solver);
     303 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_check_sat(d_solver), "cannot make multiple queries");
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
     304                 :            : }
     305                 :            : 
     306                 :          4 : TEST_F(TestCApiBlackSolver, check_sat_assuming)
     307                 :            : {
     308                 :          1 :   std::vector<Cvc5Term> assumptions = {nullptr};
     309 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
     310                 :            :       cvc5_check_sat_assuming(d_solver, assumptions.size(), assumptions.data()),
     311                 :            :       "invalid term at index 0");
     312                 :          1 :   assumptions = {cvc5_mk_true(d_tm)};
     313 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
     314                 :            :       cvc5_check_sat_assuming(nullptr, assumptions.size(), assumptions.data()),
     315                 :            :       "unexpected NULL argument");
     316 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_check_sat_assuming(d_solver, 0, nullptr),
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
     317                 :            :                     "unexpected NULL argument");
     318                 :            : 
     319                 :          1 :   cvc5_set_option(d_solver, "incremental", "false");
     320                 :          1 :   cvc5_check_sat_assuming(d_solver, assumptions.size(), assumptions.data());
     321 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
     322                 :            :       cvc5_check_sat_assuming(d_solver, assumptions.size(), assumptions.data()),
     323                 :            :       "cannot make multiple queries");
     324                 :            : 
     325                 :          1 :   Cvc5TermManager* tm = cvc5_term_manager_new();
     326                 :          1 :   Cvc5* slv = cvc5_new(tm);
     327 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
     328                 :            :       cvc5_check_sat_assuming(slv, assumptions.size(), assumptions.data()),
     329                 :            :       "expected a term associated with the term manager of this solver");
     330                 :            :   ;
     331                 :          1 :   cvc5_delete(slv);
     332                 :          1 :   cvc5_term_manager_release(tm);
     333                 :          1 :   cvc5_term_manager_delete(tm);
     334         [ +  - ]:          1 : }
     335                 :            : 
     336                 :          4 : TEST_F(TestCApiBlackSolver, check_sat_assuming1)
     337                 :            : {
     338                 :          1 :   Cvc5Term x = cvc5_mk_const(d_tm, d_bool, "x");
     339                 :          1 :   Cvc5Term y = cvc5_mk_const(d_tm, d_bool, "y");
     340                 :          1 :   std::vector<Cvc5Term> args = {x, y};
     341                 :          1 :   Cvc5Term z = cvc5_mk_term(d_tm, CVC5_KIND_AND, args.size(), args.data());
     342                 :          1 :   cvc5_set_option(d_solver, "incremental", "true");
     343                 :          1 :   std::vector<Cvc5Term> assumptions = {cvc5_mk_true(d_tm)};
     344                 :          1 :   cvc5_check_sat_assuming(d_solver, assumptions.size(), assumptions.data());
     345                 :          1 :   cvc5_check_sat_assuming(d_solver, assumptions.size(), assumptions.data());
     346                 :          1 :   assumptions = {z};
     347                 :          1 :   cvc5_check_sat_assuming(d_solver, assumptions.size(), assumptions.data());
     348                 :          1 : }
     349                 :            : 
     350                 :          4 : TEST_F(TestCApiBlackSolver, check_sat_assuming2)
     351                 :            : {
     352                 :          1 :   cvc5_set_option(d_solver, "incremental", "true");
     353                 :            : 
     354                 :          1 :   std::vector<Cvc5Sort> domain = {d_uninterpreted};
     355                 :            :   Cvc5Sort u_to_int_sort =
     356                 :          1 :       cvc5_mk_fun_sort(d_tm, domain.size(), domain.data(), d_int);
     357                 :          1 :   domain = {d_int};
     358                 :            :   Cvc5Sort int_pred_sort =
     359                 :          1 :       cvc5_mk_fun_sort(d_tm, domain.size(), domain.data(), d_bool);
     360                 :            : 
     361                 :            :   // Constants
     362                 :          1 :   Cvc5Term x = cvc5_mk_const(d_tm, d_uninterpreted, "x");
     363                 :          1 :   Cvc5Term y = cvc5_mk_const(d_tm, d_uninterpreted, "y");
     364                 :            :   // Functions
     365                 :          1 :   Cvc5Term f = cvc5_mk_const(d_tm, u_to_int_sort, "f");
     366                 :          1 :   Cvc5Term p = cvc5_mk_const(d_tm, int_pred_sort, "p");
     367                 :            :   // Values
     368                 :          1 :   Cvc5Term zero = cvc5_mk_integer_int64(d_tm, 0);
     369                 :          1 :   Cvc5Term one = cvc5_mk_integer_int64(d_tm, 1);
     370                 :            :   // Terms
     371                 :          1 :   std::vector<Cvc5Term> args = {f, x};
     372                 :            :   Cvc5Term f_x =
     373                 :          1 :       cvc5_mk_term(d_tm, CVC5_KIND_APPLY_UF, args.size(), args.data());
     374                 :          1 :   args = {f, y};
     375                 :            :   Cvc5Term f_y =
     376                 :          1 :       cvc5_mk_term(d_tm, CVC5_KIND_APPLY_UF, args.size(), args.data());
     377                 :          1 :   args = {f_x, f_y};
     378                 :          1 :   Cvc5Term sum = cvc5_mk_term(d_tm, CVC5_KIND_ADD, args.size(), args.data());
     379                 :          1 :   args = {p, zero};
     380                 :            :   Cvc5Term p_0 =
     381                 :          1 :       cvc5_mk_term(d_tm, CVC5_KIND_APPLY_UF, args.size(), args.data());
     382                 :          1 :   args = {p, f_y};
     383                 :            :   Cvc5Term p_f_y =
     384                 :          1 :       cvc5_mk_term(d_tm, CVC5_KIND_APPLY_UF, args.size(), args.data());
     385                 :            :   // Assertions
     386                 :          1 :   args = {zero, f_x};
     387                 :          1 :   Cvc5Term args1 = cvc5_mk_term(d_tm, CVC5_KIND_LEQ, args.size(), args.data());
     388                 :          1 :   args = {zero, f_y};
     389                 :          1 :   Cvc5Term args2 = cvc5_mk_term(d_tm, CVC5_KIND_LEQ, args.size(), args.data());
     390                 :          1 :   args = {sum, one};
     391                 :          1 :   Cvc5Term args3 = cvc5_mk_term(d_tm, CVC5_KIND_LEQ, args.size(), args.data());
     392                 :          1 :   args = {p_0};
     393                 :          0 :   args = {args1,
     394                 :            :           args2,
     395                 :            :           args3,
     396                 :          1 :           cvc5_mk_term(d_tm, CVC5_KIND_NOT, args.size(), args.data()),
     397                 :          1 :           p_f_y};
     398                 :            :   Cvc5Term assertions =
     399                 :          1 :       cvc5_mk_term(d_tm, CVC5_KIND_AND, args.size(), args.data());
     400                 :            : 
     401                 :          1 :   std::vector<Cvc5Term> assumptions = {cvc5_mk_true(d_tm)};
     402                 :          1 :   (void)cvc5_check_sat_assuming(
     403                 :          1 :       d_solver, assumptions.size(), assumptions.data());
     404                 :          1 :   cvc5_assert_formula(d_solver, assertions);
     405                 :          1 :   args = {x, y};
     406                 :            :   Cvc5Term dist =
     407                 :          1 :       cvc5_mk_term(d_tm, CVC5_KIND_DISTINCT, args.size(), args.data());
     408                 :          1 :   assumptions = {dist};
     409                 :          1 :   (void)cvc5_check_sat_assuming(
     410                 :          1 :       d_solver, assumptions.size(), assumptions.data());
     411                 :          1 :   assumptions = {cvc5_mk_false(d_tm), dist};
     412                 :          1 : }
     413                 :            : 
     414                 :          4 : TEST_F(TestCApiBlackSolver, declare_datatype)
     415                 :            : {
     416                 :          1 :   Cvc5DatatypeConstructorDecl nil = cvc5_mk_dt_cons_decl(d_tm, "lin");
     417                 :          1 :   std::vector<Cvc5DatatypeConstructorDecl> ctors = {nil};
     418                 :          1 :   (void)cvc5_declare_dt(d_solver, "", ctors.size(), ctors.data());
     419                 :            : 
     420                 :          1 :   nil = cvc5_mk_dt_cons_decl(d_tm, "nil");
     421                 :          1 :   ctors = {nil};
     422                 :          1 :   (void)cvc5_declare_dt(d_solver, "a", ctors.size(), ctors.data());
     423                 :            : 
     424                 :          1 :   Cvc5DatatypeConstructorDecl cons = cvc5_mk_dt_cons_decl(d_tm, "cons");
     425                 :          1 :   nil = cvc5_mk_dt_cons_decl(d_tm, "nil");
     426                 :          1 :   ctors = {cons, nil};
     427                 :          1 :   (void)cvc5_declare_dt(d_solver, "b", ctors.size(), ctors.data());
     428                 :            : 
     429                 :          1 :   cons = cvc5_mk_dt_cons_decl(d_tm, "cons");
     430                 :          1 :   nil = cvc5_mk_dt_cons_decl(d_tm, "nil");
     431                 :          1 :   ctors = {cons, nil};
     432                 :          1 :   (void)cvc5_declare_dt(d_solver, "", ctors.size(), ctors.data());
     433                 :            : 
     434                 :          1 :   cons = cvc5_mk_dt_cons_decl(d_tm, "cons");
     435                 :          1 :   nil = cvc5_mk_dt_cons_decl(d_tm, "nil");
     436                 :          1 :   ctors = {cons, nil};
     437 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_declare_dt(nullptr, "c", ctors.size(), ctors.data()),
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
     438                 :            :                     "unexpected NULL argument");
     439                 :          1 :   ctors = {nullptr};
     440 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_declare_dt(d_solver, "c", ctors.size(), ctors.data()),
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
     441                 :            :                     "invalid datatype constructor declaration at index 0");
     442                 :            : 
     443                 :            :   // must have at least one constructor
     444                 :          1 :   ctors = {};
     445 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
     446                 :            :       cvc5_declare_dt(d_solver, "c", ctors.size(), ctors.data()),
     447                 :            :       "expected a datatype declaration with at least one constructor");
     448                 :            :   // constructors may not be reused
     449                 :          1 :   Cvc5DatatypeConstructorDecl ctor1 = cvc5_mk_dt_cons_decl(d_tm, "_x21");
     450                 :          1 :   Cvc5DatatypeConstructorDecl ctor2 = cvc5_mk_dt_cons_decl(d_tm, "_x31");
     451                 :          1 :   ctors = {ctor1, ctor2};
     452                 :          1 :   (void)cvc5_declare_dt(d_solver, "_x17", ctors.size(), ctors.data());
     453 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
     454                 :            :       cvc5_declare_dt(d_solver, "_x86", ctors.size(), ctors.data()),
     455                 :            :       "cannot use a constructor for multiple datatypes");
     456                 :            : 
     457                 :          1 :   Cvc5TermManager* tm = cvc5_term_manager_new();
     458                 :          1 :   Cvc5* slv = cvc5_new(tm);
     459                 :          1 :   nil = cvc5_mk_dt_cons_decl(d_tm, "nil");
     460                 :          1 :   ctors = {nil};
     461 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
     462                 :            :       cvc5_declare_dt(slv, "a", ctors.size(), ctors.data()),
     463                 :            :       "expected a datatype constructor declaration associated with "
     464                 :            :       "the term manager of this solver");
     465                 :          1 :   cvc5_delete(slv);
     466                 :          1 :   cvc5_term_manager_release(tm);
     467                 :          1 :   cvc5_term_manager_delete(tm);
     468         [ +  - ]:          1 : }
     469                 :            : 
     470                 :          4 : TEST_F(TestCApiBlackSolver, dt_get_arity)
     471                 :            : {
     472                 :            :   std::vector<Cvc5DatatypeConstructorDecl> ctors = {
     473                 :          1 :       cvc5_mk_dt_cons_decl(d_tm, "_x21"), cvc5_mk_dt_cons_decl(d_tm, "_x31")};
     474                 :          1 :   Cvc5Sort s3 = cvc5_declare_dt(d_solver, "_x17", ctors.size(), ctors.data());
     475 [ -  + ][ +  - ]:          1 :   ASSERT_EQ(cvc5_sort_dt_get_arity(s3), 0);
     476         [ +  - ]:          1 : }
     477                 :            : 
     478                 :          4 : TEST_F(TestCApiBlackSolver, declare_fun)
     479                 :            : {
     480 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_declare_fun(nullptr, "b", 0, nullptr, d_bool, true),
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
     481                 :            :                     "unexpected NULL argument");
     482 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_declare_fun(d_solver, "b", 0, nullptr, nullptr, true),
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
     483                 :            :                     "invalid sort");
     484                 :            : 
     485                 :          1 :   Cvc5Sort bv_sort = cvc5_mk_bv_sort(d_tm, 32);
     486                 :          1 :   std::vector<Cvc5Sort> domain = {d_uninterpreted};
     487                 :            :   Cvc5Sort fun_sort =
     488                 :          1 :       cvc5_mk_fun_sort(d_tm, domain.size(), domain.data(), d_int);
     489                 :          1 :   (void)cvc5_declare_fun(d_solver, "f1", 0, nullptr, bv_sort, true);
     490                 :          1 :   domain = {bv_sort, d_int};
     491                 :          1 :   (void)cvc5_declare_fun(
     492                 :          1 :       d_solver, "f3", domain.size(), domain.data(), bv_sort, true);
     493 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
     494                 :            :       cvc5_declare_fun(d_solver, "f3", 0, nullptr, fun_sort, true),
     495                 :            :       "invalid argument");
     496                 :            :   // functions as arguments is allowed
     497                 :          1 :   domain = {bv_sort, fun_sort};
     498                 :          1 :   (void)cvc5_declare_fun(
     499                 :          1 :       d_solver, "f4", domain.size(), domain.data(), bv_sort, true);
     500                 :          1 :   domain = {bv_sort, bv_sort};
     501 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
     502                 :            :       cvc5_declare_fun(
     503                 :            :           d_solver, "f5", domain.size(), domain.data(), fun_sort, true),
     504                 :            :       "invalid argument");
     505                 :            : 
     506                 :          1 :   Cvc5TermManager* tm = cvc5_term_manager_new();
     507                 :          1 :   Cvc5* slv = cvc5_new(tm);
     508 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
     509                 :            :       cvc5_declare_fun(slv, "f1", 0, nullptr, bv_sort, true),
     510                 :            :       "sort is not associated with the term manager of this solver");
     511                 :          1 :   cvc5_delete(slv);
     512                 :          1 :   cvc5_term_manager_release(tm);
     513                 :          1 :   cvc5_term_manager_delete(tm);
     514                 :            : }
     515                 :            : 
     516                 :          4 : TEST_F(TestCApiBlackSolver, declare_fun_fresh)
     517                 :            : {
     518                 :            :   // std::vector<Cvc5Sort> domain =
     519                 :          1 :   Cvc5Term t1 = cvc5_declare_fun(d_solver, "b", 0, nullptr, d_bool, true);
     520                 :          1 :   Cvc5Term t2 = cvc5_declare_fun(d_solver, "b", 0, nullptr, d_bool, false);
     521                 :          1 :   Cvc5Term t3 = cvc5_declare_fun(d_solver, "b", 0, nullptr, d_bool, false);
     522 [ -  + ][ +  - ]:          1 :   ASSERT_FALSE(cvc5_term_is_equal(t1, t2));
     523 [ -  + ][ +  - ]:          1 :   ASSERT_FALSE(cvc5_term_is_equal(t1, t3));
     524 [ -  + ][ +  - ]:          1 :   ASSERT_TRUE(cvc5_term_is_equal(t2, t3));
     525                 :          1 :   Cvc5Term t4 = cvc5_declare_fun(d_solver, "c", 0, nullptr, d_bool, false);
     526 [ -  + ][ +  - ]:          1 :   ASSERT_FALSE(cvc5_term_is_equal(t2, t4));
     527                 :          1 :   Cvc5Term t5 = cvc5_declare_fun(d_solver, "b", 0, nullptr, d_int, false);
     528 [ -  + ][ +  - ]:          1 :   ASSERT_FALSE(cvc5_term_is_equal(t2, t5));
     529                 :            : 
     530                 :          1 :   Cvc5TermManager* tm = cvc5_term_manager_new();
     531                 :          1 :   Cvc5* slv = cvc5_new(tm);
     532 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
     533                 :            :       cvc5_declare_fun(slv, "b", 0, nullptr, d_int, false),
     534                 :            :       "sort is not associated with the term manager of this solver");
     535                 :            :   ;
     536                 :          1 :   cvc5_delete(slv);
     537                 :          1 :   cvc5_term_manager_release(tm);
     538                 :          1 :   cvc5_term_manager_delete(tm);
     539                 :            : }
     540                 :            : 
     541                 :          4 : TEST_F(TestCApiBlackSolver, declare_sort)
     542                 :            : {
     543 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_declare_sort(nullptr, "s", 0, true),
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
     544                 :            :                     "unexpected NULL argument");
     545 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_declare_sort(d_solver, nullptr, 0, true),
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
     546                 :            :                     "unexpected NULL argument");
     547                 :          1 :   (void)cvc5_declare_sort(d_solver, "s", 0, true);
     548                 :          1 :   (void)cvc5_declare_sort(d_solver, "s", 2, true);
     549                 :          1 :   (void)cvc5_declare_sort(d_solver, "", 2, true);
     550                 :            : }
     551                 :            : 
     552                 :          4 : TEST_F(TestCApiBlackSolver, declare_sort_fresh)
     553                 :            : {
     554 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_declare_sort(nullptr, "b", 0, true),
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
     555                 :            :                     "unexpected NULL argument");
     556 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_declare_sort(d_solver, nullptr, 0, true),
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
     557                 :            :                     "unexpected NULL argument");
     558                 :            : 
     559                 :          1 :   Cvc5Sort s1 = cvc5_declare_sort(d_solver, "b", 0, true);
     560                 :          1 :   Cvc5Sort s2 = cvc5_declare_sort(d_solver, "b", 0, false);
     561                 :          1 :   Cvc5Sort s3 = cvc5_declare_sort(d_solver, "b", 0, false);
     562 [ -  + ][ +  - ]:          1 :   ASSERT_FALSE(cvc5_sort_is_equal(s1, s2));
     563 [ -  + ][ +  - ]:          1 :   ASSERT_FALSE(cvc5_sort_is_equal(s1, s3));
     564 [ -  + ][ +  - ]:          1 :   ASSERT_TRUE(cvc5_sort_is_equal(s2, s3));
     565                 :            : 
     566                 :          1 :   Cvc5Sort s4 = cvc5_declare_sort(d_solver, "c", 0, false);
     567 [ -  + ][ +  - ]:          1 :   ASSERT_FALSE(cvc5_sort_is_equal(s2, s4));
     568                 :            : 
     569                 :          1 :   Cvc5Sort s5 = cvc5_declare_sort(d_solver, "b", 1, false);
     570 [ -  + ][ +  - ]:          1 :   ASSERT_FALSE(cvc5_sort_is_equal(s2, s5));
     571                 :            : }
     572                 :            : 
     573                 :          4 : TEST_F(TestCApiBlackSolver, define_fun)
     574                 :            : {
     575                 :          1 :   Cvc5Sort bv_sort = cvc5_mk_bv_sort(d_tm, 32);
     576                 :          1 :   std::vector<Cvc5Sort> domain = {d_uninterpreted};
     577                 :            :   Cvc5Sort fun_sort =
     578                 :          1 :       cvc5_mk_fun_sort(d_tm, domain.size(), domain.data(), d_int);
     579                 :            : 
     580                 :          1 :   Cvc5Term b1 = cvc5_mk_var(d_tm, bv_sort, "b1");
     581                 :          1 :   Cvc5Term b2 = cvc5_mk_var(d_tm, d_int, "b2");
     582                 :          1 :   Cvc5Term b3 = cvc5_mk_var(d_tm, fun_sort, "b3");
     583                 :          1 :   Cvc5Term v1 = cvc5_mk_const(d_tm, bv_sort, "v1");
     584                 :          1 :   Cvc5Term v2 = cvc5_mk_const(d_tm, fun_sort, "v2");
     585                 :            : 
     586 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
     587                 :            :       cvc5_define_fun(nullptr, "f", 0, nullptr, bv_sort, v1, false),
     588                 :            :       "unexpected NULL argument");
     589 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
     590                 :            :       cvc5_define_fun(d_solver, "f", 0, nullptr, nullptr, v1, false),
     591                 :            :       "invalid sort");
     592 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
     593                 :            :       cvc5_define_fun(d_solver, "f", 0, nullptr, bv_sort, nullptr, false),
     594                 :            :       "invalid term");
     595                 :            : 
     596                 :          1 :   (void)cvc5_define_fun(d_solver, "f", 0, nullptr, bv_sort, v1, false);
     597                 :          1 :   std::vector<Cvc5Term> vars = {b1, b2};
     598                 :          1 :   (void)cvc5_define_fun(
     599                 :          1 :       d_solver, "f", vars.size(), vars.data(), bv_sort, v1, false);
     600                 :          1 :   vars = {v1, b2};
     601 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
     602                 :            :       cvc5_define_fun(
     603                 :            :           d_solver, "f", vars.size(), vars.data(), bv_sort, v1, false),
     604                 :            :       "invalid bound variable");
     605                 :          1 :   vars = {b1};
     606 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
     607                 :            :       cvc5_define_fun(
     608                 :            :           d_solver, "f", vars.size(), vars.data(), bv_sort, v2, false),
     609                 :            :       "invalid sort of function body");
     610 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
     611                 :            :       cvc5_define_fun(
     612                 :            :           d_solver, "f", vars.size(), vars.data(), fun_sort, v2, false),
     613                 :            :       "invalid argument");
     614                 :            :   // b3 has function sort, which is allowed as an argument
     615                 :          1 :   vars = {b1, b3};
     616                 :          1 :   (void)cvc5_define_fun(
     617                 :          1 :       d_solver, "f", vars.size(), vars.data(), bv_sort, v1, false);
     618                 :            : 
     619                 :          1 :   Cvc5TermManager* tm = cvc5_term_manager_new();
     620                 :          1 :   Cvc5* slv = cvc5_new(tm);
     621                 :          1 :   Cvc5Sort bv_sort2 = cvc5_mk_bv_sort(tm, 32);
     622                 :          1 :   Cvc5Term v12 = cvc5_mk_const(tm, bv_sort2, "v1");
     623                 :          1 :   Cvc5Term b12 = cvc5_mk_var(tm, bv_sort2, "b1");
     624                 :          1 :   Cvc5Term b22 = cvc5_mk_var(tm, cvc5_get_integer_sort(tm), "b2");
     625                 :          1 :   vars = {};
     626 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
     627                 :            :       cvc5_define_fun(slv, "f", vars.size(), vars.data(), bv_sort, v12, false),
     628                 :            :       "sort is not associated with the term manager of this solver");
     629 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
     630                 :            :       cvc5_define_fun(slv, "f", vars.size(), vars.data(), bv_sort2, v1, false),
     631                 :            :       "term is not associated with the term manager of this solver");
     632                 :          1 :   vars = {b1, b22};
     633 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
     634                 :            :       cvc5_define_fun(slv, "f", vars.size(), vars.data(), bv_sort2, v12, false),
     635                 :            :       "expected a term associated with the term manager of this solver");
     636                 :          1 :   vars = {b12, b2};
     637 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
     638                 :            :       cvc5_define_fun(slv, "f", vars.size(), vars.data(), bv_sort2, v12, false),
     639                 :            :       "expected a term associated with the term manager of this solver");
     640                 :          1 :   vars = {b12, b22};
     641 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
     642                 :            :       cvc5_define_fun(slv, "f", vars.size(), vars.data(), bv_sort, v12, false),
     643                 :            :       "sort is not associated with the term manager of this solver");
     644 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
     645                 :            :       cvc5_define_fun(slv, "f", vars.size(), vars.data(), bv_sort2, v1, false),
     646                 :            :       "term is not associated with the term manager of this solver");
     647                 :          1 :   cvc5_delete(slv);
     648                 :          1 :   cvc5_term_manager_release(tm);
     649                 :          1 :   cvc5_term_manager_delete(tm);
     650         [ +  - ]:          1 : }
     651                 :            : 
     652                 :          4 : TEST_F(TestCApiBlackSolver, define_fun_global)
     653                 :            : {
     654                 :          1 :   Cvc5Term btrue = cvc5_mk_true(d_tm);
     655                 :            :   // (define-fun f () Bool true)
     656                 :          1 :   Cvc5Term f = cvc5_define_fun(d_solver, "f", 0, nullptr, d_bool, btrue, true);
     657                 :          1 :   Cvc5Term b = cvc5_mk_var(d_tm, d_bool, "b");
     658                 :            :   // (define-fun g (b Bool) Bool b)
     659                 :          1 :   std::vector<Cvc5Term> vars = {b};
     660                 :            :   Cvc5Term g =
     661                 :          1 :       cvc5_define_fun(d_solver, "g", vars.size(), vars.data(), d_bool, b, true);
     662                 :            : 
     663                 :            :   // (assert (or (not f) (not (g true))))
     664                 :          1 :   std::vector<Cvc5Term> args = {f};
     665                 :          1 :   Cvc5Term fnot = cvc5_mk_term(d_tm, CVC5_KIND_NOT, args.size(), args.data());
     666                 :          1 :   args = {g, btrue};
     667                 :            :   Cvc5Term app =
     668                 :          1 :       cvc5_mk_term(d_tm, CVC5_KIND_APPLY_UF, args.size(), args.data());
     669                 :          1 :   args = {app};
     670                 :          1 :   Cvc5Term appnot = cvc5_mk_term(d_tm, CVC5_KIND_NOT, args.size(), args.data());
     671                 :            : 
     672                 :          1 :   args = {fnot, appnot};
     673                 :          1 :   cvc5_assert_formula(
     674                 :          1 :       d_solver, cvc5_mk_term(d_tm, CVC5_KIND_OR, args.size(), args.data()));
     675                 :          1 :   Cvc5Result res = cvc5_check_sat(d_solver);
     676 [ -  + ][ +  - ]:          1 :   ASSERT_TRUE(cvc5_result_is_unsat(res));
     677                 :            : 
     678                 :          1 :   cvc5_reset_assertions(d_solver);
     679                 :          1 :   cvc5_result_release(res);
     680                 :            :   // (assert (or (not f) (not (g true))))
     681                 :          1 :   cvc5_assert_formula(
     682                 :          1 :       d_solver, cvc5_mk_term(d_tm, CVC5_KIND_OR, args.size(), args.data()));
     683                 :          1 :   res = cvc5_check_sat(d_solver);
     684 [ -  + ][ +  - ]:          1 :   ASSERT_TRUE(cvc5_result_is_unsat(res));
     685 [ +  - ][ +  - ]:          1 : }
     686                 :            : 
     687                 :          4 : TEST_F(TestCApiBlackSolver, define_fun_rec)
     688                 :            : {
     689                 :          1 :   Cvc5Sort bv_sort = cvc5_mk_bv_sort(d_tm, 32);
     690                 :          1 :   std::vector<Cvc5Sort> domain = {bv_sort, bv_sort};
     691                 :            :   Cvc5Sort fun_sort1 =
     692                 :          1 :       cvc5_mk_fun_sort(d_tm, domain.size(), domain.data(), bv_sort);
     693                 :          1 :   domain = {d_uninterpreted};
     694                 :            :   Cvc5Sort fun_sort2 =
     695                 :          1 :       cvc5_mk_fun_sort(d_tm, domain.size(), domain.data(), d_int);
     696                 :            : 
     697                 :          1 :   Cvc5Term b1 = cvc5_mk_var(d_tm, bv_sort, "b1");
     698                 :          1 :   Cvc5Term b11 = cvc5_mk_var(d_tm, bv_sort, "b1");
     699                 :          1 :   Cvc5Term b2 = cvc5_mk_var(d_tm, d_int, "b2");
     700                 :          1 :   Cvc5Term b3 = cvc5_mk_var(d_tm, fun_sort2, "b3");
     701                 :          1 :   Cvc5Term v1 = cvc5_mk_const(d_tm, bv_sort, "v1");
     702                 :          1 :   Cvc5Term v2 = cvc5_mk_const(d_tm, d_int, "v1");
     703                 :          1 :   Cvc5Term v3 = cvc5_mk_const(d_tm, fun_sort2, "v3");
     704                 :          1 :   Cvc5Term f1 = cvc5_mk_const(d_tm, fun_sort1, "f1");
     705                 :          1 :   Cvc5Term f2 = cvc5_mk_const(d_tm, fun_sort2, "f2");
     706                 :          1 :   Cvc5Term f3 = cvc5_mk_const(d_tm, bv_sort, "f3");
     707                 :            : 
     708                 :          1 :   (void)cvc5_define_fun_rec(d_solver, "f", 0, nullptr, bv_sort, v1, false);
     709                 :          1 :   std::vector<Cvc5Term> vars = {b1, b2};
     710                 :          1 :   (void)cvc5_define_fun_rec(
     711                 :          1 :       d_solver, "f", vars.size(), vars.data(), bv_sort, v1, false);
     712                 :          1 :   vars = {b1, b11};
     713                 :          1 :   (void)cvc5_define_fun_rec_from_const(
     714                 :          1 :       d_solver, f1, vars.size(), vars.data(), v1, false);
     715                 :            : 
     716                 :            :   // b3 has function sort, which is allowed as an argument
     717                 :          1 :   vars = {b1, b3};
     718                 :          1 :   (void)cvc5_define_fun_rec(
     719                 :          1 :       d_solver, "f", vars.size(), vars.data(), bv_sort, v1, false);
     720                 :            : 
     721 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
     722                 :            :       cvc5_define_fun_rec(nullptr, "f", 0, nullptr, bv_sort, v1, false),
     723                 :            :       "unexpected NULL argument");
     724 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
     725                 :            :       cvc5_define_fun_rec(d_solver, nullptr, 0, nullptr, bv_sort, v1, false),
     726                 :            :       "unexpected NULL argument");
     727 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
     728                 :            :       cvc5_define_fun_rec(d_solver, "f", 0, nullptr, nullptr, v1, false),
     729                 :            :       "invalid sort");
     730 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
     731                 :            :       cvc5_define_fun_rec(d_solver, "f", 0, nullptr, bv_sort, nullptr, false),
     732                 :            :       "invalid term");
     733                 :            : 
     734                 :          1 :   vars = {b1};
     735 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
     736                 :            :       cvc5_define_fun_rec(
     737                 :            :           d_solver, "f", vars.size(), vars.data(), bv_sort, v3, false),
     738                 :            :       "invalid sort");
     739                 :          1 :   vars = {b1, v2};
     740 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
     741                 :            :       cvc5_define_fun_rec(
     742                 :            :           d_solver, "f", vars.size(), vars.data(), bv_sort, v1, false),
     743                 :            :       "invalid bound variable");
     744                 :          1 :   vars = {b1};
     745 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
     746                 :            :       cvc5_define_fun_rec(
     747                 :            :           d_solver, "f", vars.size(), vars.data(), fun_sort2, v3, false),
     748                 :            :       "invalid argument");
     749                 :            : 
     750 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
     751                 :            :       cvc5_define_fun_rec_from_const(nullptr, f1, 0, nullptr, v1, false),
     752                 :            :       "unexpected NULL argument");
     753 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
     754                 :            :       cvc5_define_fun_rec_from_const(d_solver, nullptr, 0, nullptr, v1, false),
     755                 :            :       "invalid term");
     756 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
     757                 :            :       cvc5_define_fun_rec_from_const(d_solver, f1, 0, nullptr, nullptr, false),
     758                 :            :       "invalid term");
     759                 :            : 
     760                 :          1 :   vars = {b1};
     761 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_define_fun_rec_from_const(
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
     762                 :            :                         d_solver, f1, vars.size(), vars.data(), v1, false),
     763                 :            :                     "invalid size of argument 'bound_vars'");
     764 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_define_fun_rec_from_const(
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
     765                 :            :                         d_solver, f2, vars.size(), vars.data(), v2, false),
     766                 :            :                     "invalid sort");
     767 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_define_fun_rec_from_const(
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
     768                 :            :                         d_solver, f3, vars.size(), vars.data(), v1, false),
     769                 :            :                     "invalid argument");
     770                 :          1 :   vars = {b1, b11};
     771 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_define_fun_rec_from_const(
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
     772                 :            :                         d_solver, f1, vars.size(), vars.data(), v2, false),
     773                 :            :                     "invalid sort");
     774 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_define_fun_rec_from_const(
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
     775                 :            :                         d_solver, f1, vars.size(), vars.data(), v3, false),
     776                 :            :                     "invalid sort");
     777                 :            : 
     778                 :          1 :   Cvc5TermManager* tm = cvc5_term_manager_new();
     779                 :          1 :   Cvc5* slv = cvc5_new(tm);
     780                 :          1 :   Cvc5Sort bv_sort2 = cvc5_mk_bv_sort(tm, 32);
     781                 :          1 :   Cvc5Term b12 = cvc5_mk_var(tm, bv_sort2, "b1");
     782                 :          1 :   Cvc5Term b22 = cvc5_mk_var(tm, cvc5_get_integer_sort(tm), "b2");
     783                 :          1 :   Cvc5Term v12 = cvc5_mk_const(tm, bv_sort2, "v1");
     784                 :          1 :   vars = {};
     785 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
     786                 :            :       cvc5_define_fun_rec(
     787                 :            :           d_solver, "f", vars.size(), vars.data(), bv_sort2, v12, false),
     788                 :            :       "term is not associated with the term manager of this solver");
     789 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
     790                 :            :       cvc5_define_fun_rec(
     791                 :            :           slv, "f", vars.size(), vars.data(), bv_sort, v12, false),
     792                 :            :       "sort is not associated with the term manager of this solver");
     793 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
     794                 :            :       cvc5_define_fun_rec(
     795                 :            :           slv, "f", vars.size(), vars.data(), bv_sort2, v1, false),
     796                 :            :       "term is not associated with the term manager of this solver");
     797                 :          1 :   vars = {b12, b22};
     798                 :          1 :   (void)cvc5_define_fun_rec(
     799                 :          1 :       slv, "f", vars.size(), vars.data(), bv_sort2, v12, false);
     800                 :          1 :   vars = {b1, b22};
     801 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
     802                 :            :       cvc5_define_fun_rec(
     803                 :            :           slv, "f", vars.size(), vars.data(), bv_sort2, v12, false),
     804                 :            :       "expected a term associated with the term manager of this solver");
     805                 :          1 :   vars = {b12, b2};
     806 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
     807                 :            :       cvc5_define_fun_rec(
     808                 :            :           slv, "f", vars.size(), vars.data(), bv_sort2, v12, false),
     809                 :            :       "expected a term associated with the term manager of this solver");
     810                 :          1 :   cvc5_delete(slv);
     811                 :          1 :   cvc5_term_manager_release(tm);
     812                 :          1 :   cvc5_term_manager_delete(tm);
     813 [ +  - ][ +  - ]:          1 : }
     814                 :            : 
     815                 :          4 : TEST_F(TestCApiBlackSolver, define_fun_rec_wrong_logic)
     816                 :            : {
     817                 :          1 :   cvc5_set_logic(d_solver, "QF_BV");
     818                 :          1 :   Cvc5Sort bv_sort = cvc5_mk_bv_sort(d_tm, 32);
     819                 :          1 :   std::vector<Cvc5Sort> domain = {bv_sort, bv_sort};
     820                 :            :   Cvc5Sort fun_sort =
     821                 :          1 :       cvc5_mk_fun_sort(d_tm, domain.size(), domain.data(), bv_sort);
     822                 :          1 :   Cvc5Term b = cvc5_mk_var(d_tm, bv_sort, "b");
     823                 :          1 :   Cvc5Term v = cvc5_mk_var(d_tm, bv_sort, "v");
     824                 :          1 :   Cvc5Term f = cvc5_mk_var(d_tm, fun_sort, "f");
     825                 :          1 :   std::vector<Cvc5Term> vars = {};
     826 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
     827                 :            :       cvc5_define_fun_rec(
     828                 :            :           d_solver, "f", vars.size(), vars.data(), bv_sort, v, false),
     829                 :            :       "require a logic with quantifiers");
     830                 :          1 :   vars = {b, b};
     831 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_define_fun_rec_from_const(
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
     832                 :            :                         d_solver, f, vars.size(), vars.data(), v, false),
     833                 :            :                     "require a logic with quantifiers");
     834 [ +  - ][ +  - ]:          1 : }
     835                 :            : 
     836                 :          4 : TEST_F(TestCApiBlackSolver, define_fun_rec_global)
     837                 :            : {
     838                 :          1 :   cvc5_push(d_solver, 1);
     839                 :          1 :   Cvc5Term btrue = cvc5_mk_true(d_tm);
     840                 :            :   // (define-fun f () Bool true)
     841                 :            :   Cvc5Term f =
     842                 :          1 :       cvc5_define_fun_rec(d_solver, "f", 0, nullptr, d_bool, btrue, true);
     843                 :          1 :   Cvc5Term b = cvc5_mk_var(d_tm, d_bool, "b");
     844                 :            :   // (define-fun g (b Bool) Bool b)
     845                 :          1 :   std::vector<Cvc5Sort> domain = {d_bool};
     846                 :          1 :   Cvc5Term ff = cvc5_mk_const(
     847                 :          1 :       d_tm, cvc5_mk_fun_sort(d_tm, domain.size(), domain.data(), d_bool), "g");
     848                 :          1 :   std::vector<Cvc5Term> vars = {b};
     849                 :          1 :   Cvc5Term g = cvc5_define_fun_rec_from_const(
     850                 :          1 :       d_solver, ff, vars.size(), vars.data(), b, true);
     851                 :            : 
     852                 :            :   // (assert (or (not f) (not (g true))))
     853                 :          1 :   std::vector<Cvc5Term> args = {f};
     854                 :          1 :   Cvc5Term fnot = cvc5_mk_term(d_tm, CVC5_KIND_NOT, args.size(), args.data());
     855                 :          1 :   args = {g, btrue};
     856                 :            :   Cvc5Term app =
     857                 :          1 :       cvc5_mk_term(d_tm, CVC5_KIND_APPLY_UF, args.size(), args.data());
     858                 :          1 :   args = {app};
     859                 :          1 :   Cvc5Term appnot = cvc5_mk_term(d_tm, CVC5_KIND_NOT, args.size(), args.data());
     860                 :          1 :   args = {fnot, appnot};
     861                 :          1 :   cvc5_assert_formula(
     862                 :          1 :       d_solver, cvc5_mk_term(d_tm, CVC5_KIND_OR, args.size(), args.data()));
     863                 :          1 :   Cvc5Result res = cvc5_check_sat(d_solver);
     864 [ -  + ][ +  - ]:          1 :   ASSERT_TRUE(cvc5_result_is_unsat(res));
     865                 :          1 :   cvc5_pop(d_solver, 1);
     866                 :            :   // (assert (or (not f) (not (g true))))
     867                 :          1 :   cvc5_assert_formula(
     868                 :          1 :       d_solver, cvc5_mk_term(d_tm, CVC5_KIND_OR, args.size(), args.data()));
     869                 :          1 :   res = cvc5_check_sat(d_solver);
     870 [ -  + ][ +  - ]:          1 :   ASSERT_TRUE(cvc5_result_is_unsat(res));
     871                 :            : 
     872                 :          1 :   Cvc5TermManager* tm = cvc5_term_manager_new();
     873                 :          1 :   Cvc5* slv = cvc5_new(tm);
     874                 :          1 :   Cvc5Term bb = cvc5_mk_var(tm, cvc5_get_boolean_sort(tm), "b");
     875                 :          1 :   domain = {d_bool};
     876                 :          1 :   vars = {bb};
     877 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
     878                 :            :       cvc5_define_fun_rec_from_const(
     879                 :            :           slv,
     880                 :            :           cvc5_mk_const(
     881                 :            :               d_tm,
     882                 :            :               cvc5_mk_fun_sort(d_tm, domain.size(), domain.data(), d_bool),
     883                 :            :               "g"),
     884                 :            :           vars.size(),
     885                 :            :           vars.data(),
     886                 :            :           bb,
     887                 :            :           true),
     888                 :            :       "term is not associated with the term manager of this solver");
     889                 :          1 :   vars = {b};
     890                 :          1 :   domain = {cvc5_get_boolean_sort(tm)};
     891 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
     892                 :            :       cvc5_define_fun_rec_from_const(
     893                 :            :           slv,
     894                 :            :           cvc5_mk_const(
     895                 :            :               tm,
     896                 :            :               cvc5_mk_fun_sort(
     897                 :            :                   tm, domain.size(), domain.data(), cvc5_get_boolean_sort(tm)),
     898                 :            :               "g"),
     899                 :            :           vars.size(),
     900                 :            :           vars.data(),
     901                 :            :           bb,
     902                 :            :           true),
     903                 :            :       "invalid sort of parameter");
     904                 :          1 :   cvc5_delete(slv);
     905                 :          1 :   cvc5_term_manager_release(tm);
     906                 :          1 :   cvc5_term_manager_delete(tm);
     907 [ +  - ][ +  - ]:          1 : }
                 [ +  - ]
     908                 :            : 
     909                 :          4 : TEST_F(TestCApiBlackSolver, define_funs_rec)
     910                 :            : {
     911                 :          1 :   Cvc5Sort bv_sort = cvc5_mk_bv_sort(d_tm, 32);
     912                 :          1 :   std::vector<Cvc5Sort> domain = {bv_sort, bv_sort};
     913                 :            :   Cvc5Sort fun_sort1 =
     914                 :          1 :       cvc5_mk_fun_sort(d_tm, domain.size(), domain.data(), bv_sort);
     915                 :          1 :   domain = {d_uninterpreted};
     916                 :            :   Cvc5Sort fun_sort2 =
     917                 :          1 :       cvc5_mk_fun_sort(d_tm, domain.size(), domain.data(), d_int);
     918                 :          1 :   Cvc5Term b1 = cvc5_mk_var(d_tm, bv_sort, "b1");
     919                 :          1 :   Cvc5Term b11 = cvc5_mk_var(d_tm, bv_sort, "b1");
     920                 :          1 :   Cvc5Term b2 = cvc5_mk_var(d_tm, d_int, "b2");
     921                 :          1 :   Cvc5Term b4 = cvc5_mk_var(d_tm, d_uninterpreted, "b4");
     922                 :          1 :   Cvc5Term v1 = cvc5_mk_const(d_tm, bv_sort, "v1");
     923                 :          1 :   Cvc5Term v2 = cvc5_mk_const(d_tm, d_int, "v2");
     924                 :          1 :   Cvc5Term v4 = cvc5_mk_const(d_tm, d_uninterpreted, "v4");
     925                 :          1 :   Cvc5Term f1 = cvc5_mk_const(d_tm, fun_sort1, "f1");
     926                 :          1 :   Cvc5Term f2 = cvc5_mk_const(d_tm, fun_sort2, "f2");
     927                 :          1 :   Cvc5Term f3 = cvc5_mk_const(d_tm, bv_sort, "f3");
     928                 :            : 
     929                 :          1 :   std::vector<Cvc5Term> funs = {f1, f2};
     930                 :          1 :   std::vector<size_t> nvars = {2, 1};
     931                 :          1 :   std::vector<Cvc5Term> vars1 = {b1, b11};
     932                 :          1 :   std::vector<Cvc5Term> vars2 = {b4};
     933                 :          1 :   std::vector<const Cvc5Term*> vars = {vars1.data(), vars2.data()};
     934                 :          1 :   std::vector<Cvc5Term> terms = {v1, v2};
     935                 :            : 
     936                 :          2 :   cvc5_define_funs_rec(d_solver,
     937                 :            :                        funs.size(),
     938                 :          1 :                        funs.data(),
     939                 :            :                        nvars.data(),
     940                 :            :                        vars.data(),
     941                 :          1 :                        terms.data(),
     942                 :            :                        false);
     943                 :          1 :   vars1 = {v1, b11};
     944                 :          1 :   vars = {vars1.data(), vars2.data()};
     945 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_define_funs_rec(d_solver,
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
     946                 :            :                                          funs.size(),
     947                 :            :                                          funs.data(),
     948                 :            :                                          nvars.data(),
     949                 :            :                                          vars.data(),
     950                 :            :                                          terms.data(),
     951                 :            :                                          false),
     952                 :            :                     "invalid bound variable");
     953                 :          1 :   funs = {f1, f3};
     954                 :          1 :   vars1 = {b1, b11};
     955                 :          1 :   vars = {vars1.data(), vars2.data()};
     956 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_define_funs_rec(d_solver,
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
     957                 :            :                                          funs.size(),
     958                 :            :                                          funs.data(),
     959                 :            :                                          nvars.data(),
     960                 :            :                                          vars.data(),
     961                 :            :                                          terms.data(),
     962                 :            :                                          false),
     963                 :            :                     "invalid argument");
     964                 :          1 :   funs = {f1, f2};
     965                 :          1 :   vars1 = {b1};
     966                 :          1 :   vars = {vars1.data(), vars2.data()};
     967                 :          1 :   nvars = {1, 1};
     968 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_define_funs_rec(d_solver,
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
     969                 :            :                                          funs.size(),
     970                 :            :                                          funs.data(),
     971                 :            :                                          nvars.data(),
     972                 :            :                                          vars.data(),
     973                 :            :                                          terms.data(),
     974                 :            :                                          false),
     975                 :            :                     "invalid size of argument");
     976                 :          1 :   vars1 = {b1, b2};
     977                 :          1 :   vars = {vars1.data(), vars2.data()};
     978                 :          1 :   nvars = {2, 1};
     979 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_define_funs_rec(d_solver,
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
     980                 :            :                                          funs.size(),
     981                 :            :                                          funs.data(),
     982                 :            :                                          nvars.data(),
     983                 :            :                                          vars.data(),
     984                 :            :                                          terms.data(),
     985                 :            :                                          false),
     986                 :            :                     "invalid sort");
     987                 :          1 :   vars1 = {b1, b11};
     988                 :          1 :   vars = {vars1.data(), vars2.data()};
     989                 :          1 :   terms = {v1, v4};
     990 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_define_funs_rec(d_solver,
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
     991                 :            :                                          funs.size(),
     992                 :            :                                          funs.data(),
     993                 :            :                                          nvars.data(),
     994                 :            :                                          vars.data(),
     995                 :            :                                          terms.data(),
     996                 :            :                                          false),
     997                 :            :                     "invalid sort");
     998                 :            : 
     999                 :          1 :   Cvc5TermManager* tm = cvc5_term_manager_new();
    1000                 :          1 :   Cvc5* slv = cvc5_new(tm);
    1001                 :          1 :   Cvc5Sort uninterpreted2 = cvc5_mk_uninterpreted_sort(tm, "u");
    1002                 :          1 :   Cvc5Sort bv_sort2 = cvc5_mk_bv_sort(tm, 32);
    1003                 :            : 
    1004                 :          1 :   domain = {bv_sort2, bv_sort2};
    1005                 :            :   Cvc5Sort fun_sort12 =
    1006                 :          1 :       cvc5_mk_fun_sort(tm, domain.size(), domain.data(), bv_sort2);
    1007                 :          1 :   domain = {uninterpreted2};
    1008                 :          2 :   Cvc5Sort fun_sort22 = cvc5_mk_fun_sort(
    1009                 :          1 :       tm, domain.size(), domain.data(), cvc5_get_integer_sort(tm));
    1010                 :            : 
    1011                 :          1 :   Cvc5Term b12 = cvc5_mk_var(tm, bv_sort2, "b1");
    1012                 :          1 :   Cvc5Term b112 = cvc5_mk_var(tm, bv_sort2, "b1");
    1013                 :          1 :   Cvc5Term b42 = cvc5_mk_var(tm, uninterpreted2, "b4");
    1014                 :          1 :   Cvc5Term v12 = cvc5_mk_const(tm, bv_sort2, "v1");
    1015                 :          1 :   Cvc5Term v22 = cvc5_mk_const(tm, cvc5_get_integer_sort(tm), "v2");
    1016                 :          1 :   Cvc5Term f12 = cvc5_mk_const(tm, fun_sort12, "f1");
    1017                 :          1 :   Cvc5Term f22 = cvc5_mk_const(tm, fun_sort22, "f2");
    1018                 :            : 
    1019                 :          1 :   funs = {f12, f22};
    1020                 :          1 :   nvars = {2, 1};
    1021                 :          1 :   vars1 = {b12, b112};
    1022                 :          1 :   vars2 = {b42};
    1023                 :          1 :   vars = {vars1.data(), vars2.data()};
    1024                 :          1 :   terms = {v12, v22};
    1025                 :          2 :   cvc5_define_funs_rec(slv,
    1026                 :            :                        funs.size(),
    1027                 :          1 :                        funs.data(),
    1028                 :            :                        nvars.data(),
    1029                 :            :                        vars.data(),
    1030                 :          1 :                        terms.data(),
    1031                 :            :                        false);
    1032                 :          1 :   funs = {f1, f22};
    1033 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    1034                 :            :       cvc5_define_funs_rec(slv,
    1035                 :            :                            funs.size(),
    1036                 :            :                            funs.data(),
    1037                 :            :                            nvars.data(),
    1038                 :            :                            vars.data(),
    1039                 :            :                            terms.data(),
    1040                 :            :                            false),
    1041                 :            :       "expected a term associated with the term manager of this solver");
    1042                 :          1 :   funs = {f12, f22};
    1043                 :          1 :   vars1 = {b1, b112};
    1044                 :          1 :   vars = {vars1.data(), vars2.data()};
    1045 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    1046                 :            :       cvc5_define_funs_rec(slv,
    1047                 :            :                            funs.size(),
    1048                 :            :                            funs.data(),
    1049                 :            :                            nvars.data(),
    1050                 :            :                            vars.data(),
    1051                 :            :                            terms.data(),
    1052                 :            :                            false),
    1053                 :            :       "expected a term associated with the term manager of this solver");
    1054                 :          1 :   vars1 = {b12, b11};
    1055                 :          1 :   vars = {vars1.data(), vars2.data()};
    1056 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    1057                 :            :       cvc5_define_funs_rec(slv,
    1058                 :            :                            funs.size(),
    1059                 :            :                            funs.data(),
    1060                 :            :                            nvars.data(),
    1061                 :            :                            vars.data(),
    1062                 :            :                            terms.data(),
    1063                 :            :                            false),
    1064                 :            :       "expected a term associated with the term manager of this solver");
    1065                 :          1 :   vars2 = {b42};
    1066                 :          1 :   vars = {vars1.data(), vars2.data()};
    1067                 :          1 :   terms = {v1, v22};
    1068 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    1069                 :            :       cvc5_define_funs_rec(slv,
    1070                 :            :                            funs.size(),
    1071                 :            :                            funs.data(),
    1072                 :            :                            nvars.data(),
    1073                 :            :                            vars.data(),
    1074                 :            :                            terms.data(),
    1075                 :            :                            false),
    1076                 :            :       "expected a term associated with the term manager of this solver");
    1077                 :          1 :   terms = {v12, v2};
    1078 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    1079                 :            :       cvc5_define_funs_rec(slv,
    1080                 :            :                            funs.size(),
    1081                 :            :                            funs.data(),
    1082                 :            :                            nvars.data(),
    1083                 :            :                            vars.data(),
    1084                 :            :                            terms.data(),
    1085                 :            :                            false),
    1086                 :            :       "expected a term associated with the term manager of this solver");
    1087                 :          1 :   cvc5_delete(slv);
    1088                 :          1 :   cvc5_term_manager_release(tm);
    1089                 :          1 :   cvc5_term_manager_delete(tm);
    1090 [ +  - ][ +  - ]:          1 : }
         [ +  - ][ +  - ]
         [ +  - ][ +  - ]
                 [ +  - ]
    1091                 :            : 
    1092                 :          4 : TEST_F(TestCApiBlackSolver, define_funs_rec_wrong_logic)
    1093                 :            : {
    1094                 :          1 :   cvc5_set_logic(d_solver, "QF_BV");
    1095                 :          1 :   Cvc5Sort bv_sort = cvc5_mk_bv_sort(d_tm, 32);
    1096                 :          1 :   std::vector<Cvc5Sort> domain = {bv_sort, bv_sort};
    1097                 :            :   Cvc5Sort fun_sort1 =
    1098                 :          1 :       cvc5_mk_fun_sort(d_tm, domain.size(), domain.data(), bv_sort);
    1099                 :          1 :   domain = {d_uninterpreted};
    1100                 :            :   Cvc5Sort fun_sort2 =
    1101                 :          1 :       cvc5_mk_fun_sort(d_tm, domain.size(), domain.data(), d_int);
    1102                 :          1 :   Cvc5Term b = cvc5_mk_var(d_tm, bv_sort, "b");
    1103                 :          1 :   Cvc5Term u = cvc5_mk_var(d_tm, d_uninterpreted, "u");
    1104                 :          1 :   Cvc5Term v1 = cvc5_mk_const(d_tm, bv_sort, "v1");
    1105                 :          1 :   Cvc5Term v2 = cvc5_mk_const(d_tm, d_int, "v2");
    1106                 :          1 :   Cvc5Term f1 = cvc5_mk_const(d_tm, fun_sort1, "f1");
    1107                 :          1 :   Cvc5Term f2 = cvc5_mk_const(d_tm, fun_sort2, "f2");
    1108                 :            : 
    1109                 :          1 :   std::vector<Cvc5Term> funs = {f1, f2};
    1110                 :          1 :   std::vector<size_t> nvars = {2, 1};
    1111                 :          1 :   std::vector<Cvc5Term> vars1 = {b, b};
    1112                 :          1 :   std::vector<Cvc5Term> vars2 = {u};
    1113                 :          1 :   std::vector<const Cvc5Term*> vars = {vars1.data(), vars2.data()};
    1114                 :          1 :   std::vector<Cvc5Term> terms = {v1, v2};
    1115                 :            : 
    1116 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_define_funs_rec(d_solver,
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    1117                 :            :                                          funs.size(),
    1118                 :            :                                          funs.data(),
    1119                 :            :                                          nvars.data(),
    1120                 :            :                                          vars.data(),
    1121                 :            :                                          terms.data(),
    1122                 :            :                                          false),
    1123                 :            :                     "require a logic with quantifiers");
    1124 [ +  - ][ +  - ]:          1 : }
         [ +  - ][ +  - ]
         [ +  - ][ +  - ]
                 [ +  - ]
    1125                 :            : 
    1126                 :          4 : TEST_F(TestCApiBlackSolver, define_funs_rec_global)
    1127                 :            : {
    1128                 :          1 :   std::vector<Cvc5Sort> domain = {d_bool};
    1129                 :            :   Cvc5Sort fun_sort =
    1130                 :          1 :       cvc5_mk_fun_sort(d_tm, domain.size(), domain.data(), d_bool);
    1131                 :          1 :   cvc5_push(d_solver, 1);
    1132                 :            : 
    1133                 :          1 :   Cvc5Term btrue = cvc5_mk_true(d_tm);
    1134                 :          1 :   Cvc5Term b = cvc5_mk_var(d_tm, d_bool, "b");
    1135                 :          1 :   Cvc5Term g = cvc5_mk_const(d_tm, fun_sort, "g");
    1136                 :            :   // (define-funs-rec ((g ((b Bool)) Bool)) (b))
    1137                 :          1 :   std::vector<Cvc5Term> funs = {g};
    1138                 :          1 :   std::vector<size_t> nvars = {1};
    1139                 :          1 :   std::vector<Cvc5Term> vars1 = {b};
    1140                 :          1 :   std::vector<const Cvc5Term*> vars = {vars1.data()};
    1141                 :          1 :   std::vector<Cvc5Term> terms = {b};
    1142                 :            : 
    1143                 :          2 :   cvc5_define_funs_rec(d_solver,
    1144                 :            :                        funs.size(),
    1145                 :          1 :                        funs.data(),
    1146                 :            :                        nvars.data(),
    1147                 :            :                        vars.data(),
    1148                 :          1 :                        terms.data(),
    1149                 :            :                        true);
    1150                 :            : 
    1151                 :            :   // (assert (not (g true)))
    1152                 :          1 :   std::vector<Cvc5Term> args = {g, btrue};
    1153                 :          1 :   Cvc5Term t = cvc5_mk_term(d_tm, CVC5_KIND_APPLY_UF, args.size(), args.data());
    1154                 :          1 :   args = {t};
    1155                 :          1 :   cvc5_assert_formula(
    1156                 :          1 :       d_solver, cvc5_mk_term(d_tm, CVC5_KIND_NOT, args.size(), args.data()));
    1157                 :          1 :   Cvc5Result res = cvc5_check_sat(d_solver);
    1158 [ -  + ][ +  - ]:          1 :   ASSERT_TRUE(cvc5_result_is_unsat(res));
    1159                 :          1 :   cvc5_pop(d_solver, 1);
    1160                 :            :   // (assert (not (g true)))
    1161                 :          1 :   cvc5_assert_formula(
    1162                 :          1 :       d_solver, cvc5_mk_term(d_tm, CVC5_KIND_NOT, args.size(), args.data()));
    1163                 :          1 :   res = cvc5_check_sat(d_solver);
    1164 [ -  + ][ +  - ]:          1 :   ASSERT_TRUE(cvc5_result_is_unsat(res));
    1165 [ +  - ][ +  - ]:          1 : }
         [ +  - ][ +  - ]
         [ +  - ][ +  - ]
                 [ +  - ]
    1166                 :            : 
    1167                 :          4 : TEST_F(TestCApiBlackSolver, get_assertions)
    1168                 :            : {
    1169                 :          1 :   Cvc5Term a = cvc5_mk_const(d_tm, d_bool, "a");
    1170                 :          1 :   Cvc5Term b = cvc5_mk_const(d_tm, d_bool, "b");
    1171                 :          1 :   cvc5_assert_formula(d_solver, a);
    1172                 :          1 :   cvc5_assert_formula(d_solver, b);
    1173                 :            :   size_t size;
    1174                 :          1 :   auto res = cvc5_get_assertions(d_solver, &size);
    1175 [ -  + ][ +  - ]:          1 :   ASSERT_EQ(size, 2);
    1176 [ -  + ][ +  - ]:          1 :   ASSERT_TRUE(cvc5_term_is_equal(a, res[0]));
    1177 [ -  + ][ +  - ]:          1 :   ASSERT_TRUE(cvc5_term_is_equal(b, res[1]));
    1178 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_get_assertions(nullptr, &size),
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    1179                 :            :                     "unexpected NULL argument");
    1180 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_get_assertions(d_solver, nullptr),
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    1181                 :            :                     "unexpected NULL argument");
    1182                 :            : }
    1183                 :            : 
    1184                 :          4 : TEST_F(TestCApiBlackSolver, get_info)
    1185                 :            : {
    1186 [ -  + ][ +  - ]:          1 :   ASSERT_EQ(cvc5_get_info(d_solver, "name"), std::string("\"cvc5\""));
    1187 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_get_info(d_solver, "asdf"), "unrecognized flag");
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    1188 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_get_info(nullptr, "name"), "unexpected NULL argument");
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    1189 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_get_info(d_solver, nullptr),
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    1190                 :            :                     "unexpected NULL argument");
    1191                 :            : }
    1192                 :            : 
    1193                 :          4 : TEST_F(TestCApiBlackSolver, get_option)
    1194                 :            : {
    1195 [ -  + ][ +  - ]:          1 :   ASSERT_EQ(cvc5_get_option(d_solver, "incremental"), std::string("true"));
    1196 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_get_option(d_solver, "asdf"), "Unrecognized option");
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    1197 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_get_option(nullptr, "incremental"),
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    1198                 :            :                     "unexpected NULL argument");
    1199 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_get_option(d_solver, nullptr),
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    1200                 :            :                     "unexpected NULL argument");
    1201                 :            : }
    1202                 :            : 
    1203                 :          4 : TEST_F(TestCApiBlackSolver, get_option_names)
    1204                 :            : {
    1205                 :            :   size_t size;
    1206                 :          1 :   auto names = cvc5_get_option_names(d_solver, &size);
    1207 [ -  + ][ +  - ]:          1 :   ASSERT_TRUE(size > 100);
    1208                 :          1 :   bool found_verbose = false;
    1209                 :          1 :   bool found_foobar = false;
    1210         [ +  + ]:        537 :   for (size_t i = 0; i < size; ++i)
    1211                 :            :   {
    1212         [ +  + ]:        536 :     if (names[i] == std::string("verbose"))
    1213                 :            :     {
    1214                 :          1 :       found_verbose = true;
    1215                 :            :     }
    1216         [ -  + ]:        535 :     else if (std::string(names[i]) == "foobar")
    1217                 :            :     {
    1218                 :          0 :       found_foobar = true;
    1219                 :            :     }
    1220                 :            :   }
    1221 [ -  + ][ +  - ]:          1 :   ASSERT_TRUE(found_verbose);
    1222 [ -  + ][ +  - ]:          1 :   ASSERT_FALSE(found_foobar);
    1223 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_get_option_names(nullptr, &size),
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    1224                 :            :                     "unexpected NULL argument");
    1225 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_get_option_names(d_solver, nullptr),
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    1226                 :            :                     "unexpected NULL argument");
    1227                 :            : }
    1228                 :            : 
    1229                 :          4 : TEST_F(TestCApiBlackSolver, get_option_info)
    1230                 :            : {
    1231                 :            :   Cvc5OptionInfo info;
    1232 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_get_option_info(nullptr, "verbose", &info),
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    1233                 :            :                     "unexpected NULL argument");
    1234 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_get_option_info(d_solver, nullptr, &info),
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    1235                 :            :                     "unexpected NULL argument");
    1236 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_get_option_info(d_solver, "verbose", nullptr),
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    1237                 :            :                     "unexpected NULL argument");
    1238                 :            :   // The info struct is zeroed even if the call fails (issue #12991).
    1239                 :          1 :   std::memset(&info, 0xAB, sizeof(info));
    1240 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_get_option_info(d_solver, "asdf-invalid", &info),
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    1241                 :            :                     "Unrecognized option");
    1242                 :            :   Cvc5OptionInfo zero;
    1243                 :          1 :   std::memset(&zero, 0, sizeof(zero));
    1244 [ -  + ][ +  - ]:          1 :   ASSERT_EQ(std::memcmp(&info, &zero, sizeof(info)), 0);
    1245                 :            : 
    1246                 :          1 :   cvc5_set_option(d_solver, "verbosity", "2");
    1247                 :            : 
    1248                 :          1 :   cvc5_get_option_info(d_solver, "verbose", &info);
    1249 [ -  + ][ +  - ]:          2 :   ASSERT_EQ(info.name, std::string("verbose"));
    1250 [ -  + ][ +  - ]:          1 :   ASSERT_EQ(info.num_aliases, 0);
    1251 [ -  + ][ +  - ]:          1 :   ASSERT_EQ(info.category, CVC5_OPTION_CATEGORY_COMMON);
    1252 [ -  + ][ +  - ]:          1 :   ASSERT_FALSE(info.is_set_by_user);
    1253 [ -  + ][ +  - ]:          1 :   ASSERT_EQ(info.kind, CVC5_OPTION_INFO_VOID);
    1254         [ -  + ]:          1 :   ASSERT_EQ(cvc5_option_info_to_string(&info),
    1255         [ +  - ]:          1 :             std::string("OptionInfo{ verbose | void }"));
    1256                 :            : 
    1257                 :            :   // bool kind
    1258                 :          1 :   cvc5_get_option_info(d_solver, "print-success", &info);
    1259 [ -  + ][ +  - ]:          2 :   ASSERT_EQ(info.name, std::string("print-success"));
    1260 [ -  + ][ +  - ]:          1 :   ASSERT_EQ(info.num_aliases, 0);
    1261 [ -  + ][ +  - ]:          1 :   ASSERT_EQ(info.kind, CVC5_OPTION_INFO_BOOL);
    1262 [ -  + ][ +  - ]:          1 :   ASSERT_EQ(info.category, CVC5_OPTION_CATEGORY_COMMON);
    1263 [ -  + ][ +  - ]:          1 :   ASSERT_FALSE(info.is_set_by_user);
    1264 [ -  + ][ +  - ]:          1 :   ASSERT_EQ(info.info_bool.dflt, false);
    1265 [ -  + ][ +  - ]:          1 :   ASSERT_EQ(info.info_bool.cur, false);
    1266         [ -  + ]:          1 :   ASSERT_EQ(cvc5_option_info_to_string(&info),
    1267                 :            :             std::string(
    1268         [ +  - ]:          1 :                 "OptionInfo{ print-success | bool | false | default false }"));
    1269                 :            : 
    1270                 :            :   // int64 kind
    1271                 :          1 :   cvc5_get_option_info(d_solver, "verbosity", &info);
    1272 [ -  + ][ +  - ]:          2 :   ASSERT_EQ(info.name, std::string("verbosity"));
    1273 [ -  + ][ +  - ]:          1 :   ASSERT_EQ(info.num_aliases, 0);
    1274 [ -  + ][ +  - ]:          1 :   ASSERT_EQ(info.category, CVC5_OPTION_CATEGORY_COMMON);
    1275 [ -  + ][ +  - ]:          1 :   ASSERT_TRUE(info.is_set_by_user);
    1276 [ -  + ][ +  - ]:          1 :   ASSERT_EQ(info.kind, CVC5_OPTION_INFO_INT64);
    1277 [ -  + ][ +  - ]:          1 :   ASSERT_EQ(info.info_int.dflt, 0);
    1278 [ -  + ][ +  - ]:          1 :   ASSERT_EQ(info.info_int.cur, 2);
    1279 [ +  - ][ +  - ]:          1 :   ASSERT_FALSE(info.info_int.has_min || info.info_int.has_max);
         [ -  + ][ +  - ]
    1280         [ -  + ]:          1 :   ASSERT_EQ(
    1281                 :            :       cvc5_option_info_to_string(&info),
    1282                 :            :       std::string(
    1283         [ +  - ]:          1 :           "OptionInfo{ verbosity | set by user | int64_t | 2 | default 0 }"));
    1284                 :            : 
    1285                 :            :   // uint64 kind
    1286                 :          1 :   cvc5_get_option_info(d_solver, "rlimit", &info);
    1287 [ -  + ][ +  - ]:          2 :   ASSERT_EQ(info.name, std::string("rlimit"));
    1288 [ -  + ][ +  - ]:          1 :   ASSERT_EQ(info.num_aliases, 0);
    1289 [ -  + ][ +  - ]:          1 :   ASSERT_EQ(info.category, CVC5_OPTION_CATEGORY_COMMON);
    1290 [ -  + ][ +  - ]:          1 :   ASSERT_FALSE(info.is_set_by_user);
    1291 [ -  + ][ +  - ]:          1 :   ASSERT_EQ(info.kind, CVC5_OPTION_INFO_UINT64);
    1292 [ -  + ][ +  - ]:          1 :   ASSERT_EQ(info.info_uint.dflt, 0);
    1293 [ -  + ][ +  - ]:          1 :   ASSERT_EQ(info.info_uint.cur, 0);
    1294 [ +  - ][ +  - ]:          1 :   ASSERT_FALSE(info.info_uint.has_min || info.info_uint.has_max);
         [ -  + ][ +  - ]
    1295         [ -  + ]:          1 :   ASSERT_EQ(cvc5_option_info_to_string(&info),
    1296         [ +  - ]:          1 :             std::string("OptionInfo{ rlimit | uint64_t | 0 | default 0 }"));
    1297                 :            : 
    1298                 :            :   // double kind
    1299                 :          1 :   cvc5_get_option_info(d_solver, "random-freq", &info);
    1300 [ -  + ][ +  - ]:          2 :   ASSERT_EQ(info.name, std::string("random-freq"));
    1301 [ -  + ][ +  - ]:          1 :   ASSERT_EQ(info.num_aliases, 1);
    1302 [ -  + ][ +  - ]:          2 :   ASSERT_EQ(info.aliases[0], std::string("random-frequency"));
    1303 [ -  + ][ +  - ]:          1 :   ASSERT_EQ(info.category, CVC5_OPTION_CATEGORY_EXPERT);
    1304 [ -  + ][ +  - ]:          1 :   ASSERT_FALSE(info.is_set_by_user);
    1305 [ -  + ][ +  - ]:          1 :   ASSERT_EQ(info.kind, CVC5_OPTION_INFO_DOUBLE);
    1306 [ -  + ][ +  - ]:          1 :   ASSERT_EQ(info.info_double.dflt, 0.0);
    1307 [ -  + ][ +  - ]:          1 :   ASSERT_EQ(info.info_double.cur, 0.0);
    1308 [ +  - ][ +  - ]:          1 :   ASSERT_TRUE(info.info_double.has_min && info.info_double.has_max);
         [ -  + ][ +  - ]
    1309 [ -  + ][ +  - ]:          1 :   ASSERT_EQ(info.info_double.min, 0.0);
    1310 [ -  + ][ +  - ]:          1 :   ASSERT_EQ(info.info_double.min, 0.0);
    1311         [ -  + ]:          1 :   ASSERT_EQ(cvc5_option_info_to_string(&info),
    1312                 :            :             std::string("OptionInfo{ random-freq, random-frequency | double | "
    1313         [ +  - ]:          1 :                         "0 | default 0 | 0 <= x <= 1 }"));
    1314                 :            : 
    1315                 :            :   // string kind
    1316                 :          1 :   cvc5_get_option_info(d_solver, "force-logic", &info);
    1317 [ -  + ][ +  - ]:          2 :   ASSERT_EQ(info.name, std::string("force-logic"));
    1318 [ -  + ][ +  - ]:          1 :   ASSERT_EQ(info.num_aliases, 0);
    1319 [ -  + ][ +  - ]:          1 :   ASSERT_EQ(info.category, CVC5_OPTION_CATEGORY_COMMON);
    1320 [ -  + ][ +  - ]:          1 :   ASSERT_FALSE(info.is_set_by_user);
    1321 [ -  + ][ +  - ]:          1 :   ASSERT_EQ(info.kind, CVC5_OPTION_INFO_STR);
    1322 [ -  + ][ +  - ]:          2 :   ASSERT_EQ(info.info_str.dflt, std::string(""));
    1323 [ -  + ][ +  - ]:          2 :   ASSERT_EQ(info.info_str.cur, std::string(""));
    1324         [ -  + ]:          1 :   ASSERT_EQ(
    1325                 :            :       cvc5_option_info_to_string(&info),
    1326         [ +  - ]:          1 :       std::string("OptionInfo{ force-logic | string | \"\" | default \"\" }"));
    1327                 :            : 
    1328                 :            :   // mode option
    1329                 :          1 :   cvc5_get_option_info(d_solver, "simplification", &info);
    1330 [ -  + ][ +  - ]:          2 :   ASSERT_EQ(info.name, std::string("simplification"));
    1331 [ -  + ][ +  - ]:          1 :   ASSERT_EQ(info.num_aliases, 1);
    1332 [ -  + ][ +  - ]:          2 :   ASSERT_EQ(info.aliases[0], std::string("simplification-mode"));
    1333 [ -  + ][ +  - ]:          1 :   ASSERT_EQ(info.category, CVC5_OPTION_CATEGORY_REGULAR);
    1334 [ -  + ][ +  - ]:          1 :   ASSERT_FALSE(info.is_set_by_user);
    1335 [ -  + ][ +  - ]:          1 :   ASSERT_EQ(info.kind, CVC5_OPTION_INFO_MODES);
    1336 [ -  + ][ +  - ]:          2 :   ASSERT_EQ(info.info_mode.dflt, std::string("batch"));
    1337 [ -  + ][ +  - ]:          2 :   ASSERT_EQ(info.info_mode.cur, std::string("batch"));
    1338 [ -  + ][ +  - ]:          1 :   ASSERT_EQ(info.info_mode.num_modes, 2);
    1339                 :          3 :   ASSERT_TRUE((info.info_mode.modes[0] == std::string("batch"))
    1340         [ +  - ]:          1 :               || (info.info_mode.modes[1] == std::string("batch")));
    1341                 :          5 :   ASSERT_TRUE((info.info_mode.modes[0] == std::string("none"))
    1342         [ +  - ]:          1 :               || (info.info_mode.modes[1] == std::string("none")));
    1343         [ -  + ]:          1 :   ASSERT_EQ(cvc5_option_info_to_string(&info),
    1344                 :            :             std::string("OptionInfo{ simplification, simplification-mode | "
    1345         [ +  - ]:          1 :                         "mode | batch | default batch | modes: batch, none }"));
    1346                 :            : }
    1347                 :            : 
    1348                 :          4 : TEST_F(TestCApiBlackSolver, get_unsat_assumptions1)
    1349                 :            : {
    1350                 :          1 :   cvc5_set_option(d_solver, "incremental", "false");
    1351                 :          1 :   std::vector<Cvc5Term> assumptions = {cvc5_mk_false(d_tm)};
    1352                 :          1 :   cvc5_check_sat_assuming(d_solver, assumptions.size(), assumptions.data());
    1353                 :            :   size_t size;
    1354 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_get_unsat_assumptions(nullptr, &size),
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    1355                 :            :                     "unexpected NULL argument");
    1356 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_get_unsat_assumptions(d_solver, nullptr),
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    1357                 :            :                     "unexpected NULL argument");
    1358 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_get_unsat_assumptions(d_solver, &size),
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    1359                 :            :                     "cannot get unsat assumptions");
    1360         [ +  - ]:          1 : }
    1361                 :            : 
    1362                 :          4 : TEST_F(TestCApiBlackSolver, get_unsat_assumptions2)
    1363                 :            : {
    1364                 :          1 :   cvc5_set_option(d_solver, "incremental", "false");
    1365                 :          1 :   cvc5_set_option(d_solver, "produce-unsat-assumptions", "false");
    1366                 :          1 :   std::vector<Cvc5Term> assumptions = {cvc5_mk_false(d_tm)};
    1367                 :          1 :   cvc5_check_sat_assuming(d_solver, assumptions.size(), assumptions.data());
    1368                 :            :   size_t size;
    1369 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_get_unsat_assumptions(d_solver, &size),
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    1370                 :            :                     "cannot get unsat assumptions");
    1371         [ +  - ]:          1 : }
    1372                 :            : 
    1373                 :          4 : TEST_F(TestCApiBlackSolver, get_unsat_assumptions3)
    1374                 :            : {
    1375                 :          1 :   cvc5_set_option(d_solver, "incremental", "true");
    1376                 :          1 :   cvc5_set_option(d_solver, "produce-unsat-assumptions", "true");
    1377                 :          1 :   std::vector<Cvc5Term> assumptions = {cvc5_mk_false(d_tm)};
    1378                 :          1 :   cvc5_check_sat_assuming(d_solver, assumptions.size(), assumptions.data());
    1379                 :            :   size_t size;
    1380                 :          1 :   const Cvc5Term* res = cvc5_get_unsat_assumptions(d_solver, &size);
    1381 [ -  + ][ +  - ]:          1 :   ASSERT_EQ(size, 1);
    1382 [ -  + ][ +  - ]:          1 :   ASSERT_TRUE(cvc5_term_is_equal(res[0], cvc5_mk_false(d_tm)));
    1383                 :          1 :   assumptions = {cvc5_mk_true(d_tm)};
    1384                 :          1 :   cvc5_check_sat_assuming(d_solver, assumptions.size(), assumptions.data());
    1385 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_get_unsat_assumptions(d_solver, &size),
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    1386                 :            :                     "cannot get unsat assumptions");
    1387         [ +  - ]:          1 : }
    1388                 :            : 
    1389                 :          4 : TEST_F(TestCApiBlackSolver, get_unsat_core0)
    1390                 :            : {
    1391                 :          1 :   cvc5_set_option(d_solver, "incremental", "true");
    1392                 :          1 :   cvc5_assert_formula(d_solver, cvc5_mk_false(d_tm));
    1393                 :          1 :   cvc5_check_sat(d_solver);
    1394                 :            :   size_t size;
    1395 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_get_unsat_core(nullptr, &size),
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    1396                 :            :                     "unexpected NULL argument");
    1397 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_get_unsat_core(d_solver, nullptr),
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    1398                 :            :                     "unexpected NULL argument");
    1399                 :            : }
    1400                 :            : 
    1401                 :          4 : TEST_F(TestCApiBlackSolver, get_unsat_core1)
    1402                 :            : {
    1403                 :          1 :   cvc5_set_option(d_solver, "incremental", "false");
    1404                 :          1 :   cvc5_assert_formula(d_solver, cvc5_mk_false(d_tm));
    1405                 :          1 :   cvc5_check_sat(d_solver);
    1406                 :            :   size_t size;
    1407 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_get_unsat_core(d_solver, &size),
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    1408                 :            :                     "cannot get unsat core");
    1409                 :            : }
    1410                 :            : 
    1411                 :          4 : TEST_F(TestCApiBlackSolver, get_unsat_core2)
    1412                 :            : {
    1413                 :          1 :   cvc5_set_option(d_solver, "incremental", "false");
    1414                 :          1 :   cvc5_set_option(d_solver, "produce-unsat-cores", "false");
    1415                 :          1 :   cvc5_assert_formula(d_solver, cvc5_mk_false(d_tm));
    1416                 :          1 :   cvc5_check_sat(d_solver);
    1417                 :            :   size_t size;
    1418 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_get_unsat_core(d_solver, &size),
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    1419                 :            :                     "cannot get unsat core");
    1420                 :            : }
    1421                 :            : 
    1422                 :          4 : TEST_F(TestCApiBlackSolver, get_unsat_core_and_proof)
    1423                 :            : {
    1424                 :          1 :   cvc5_set_option(d_solver, "incremental", "true");
    1425                 :          1 :   cvc5_set_option(d_solver, "produce-unsat-cores", "true");
    1426                 :          1 :   cvc5_set_option(d_solver, "produce-proofs", "true");
    1427                 :            : 
    1428                 :          1 :   std::vector<Cvc5Sort> domain = {d_uninterpreted};
    1429                 :            :   Cvc5Sort u_to_int =
    1430                 :          1 :       cvc5_mk_fun_sort(d_tm, domain.size(), domain.data(), d_int);
    1431                 :          1 :   domain = {d_int};
    1432                 :            :   Cvc5Sort int_pred =
    1433                 :          1 :       cvc5_mk_fun_sort(d_tm, domain.size(), domain.data(), d_bool);
    1434                 :            : 
    1435                 :          1 :   Cvc5Term x = cvc5_mk_const(d_tm, d_uninterpreted, "x");
    1436                 :          1 :   Cvc5Term y = cvc5_mk_const(d_tm, d_uninterpreted, "y");
    1437                 :          1 :   Cvc5Term f = cvc5_mk_const(d_tm, u_to_int, "f");
    1438                 :          1 :   Cvc5Term p = cvc5_mk_const(d_tm, int_pred, "p");
    1439                 :          1 :   Cvc5Term zero = cvc5_mk_integer_int64(d_tm, 0);
    1440                 :          1 :   Cvc5Term one = cvc5_mk_integer_int64(d_tm, 1);
    1441                 :          1 :   std::vector<Cvc5Term> args = {f, x};
    1442                 :            :   Cvc5Term f_x =
    1443                 :          1 :       cvc5_mk_term(d_tm, CVC5_KIND_APPLY_UF, args.size(), args.data());
    1444                 :          1 :   args = {f, y};
    1445                 :            :   Cvc5Term f_y =
    1446                 :          1 :       cvc5_mk_term(d_tm, CVC5_KIND_APPLY_UF, args.size(), args.data());
    1447                 :          1 :   args = {f_x, f_y};
    1448                 :          1 :   Cvc5Term sum = cvc5_mk_term(d_tm, CVC5_KIND_ADD, args.size(), args.data());
    1449                 :          1 :   args = {p, zero};
    1450                 :            :   Cvc5Term p_0 =
    1451                 :          1 :       cvc5_mk_term(d_tm, CVC5_KIND_APPLY_UF, args.size(), args.data());
    1452                 :          1 :   args = {p, f_y};
    1453                 :            :   Cvc5Term p_f_y =
    1454                 :          1 :       cvc5_mk_term(d_tm, CVC5_KIND_APPLY_UF, args.size(), args.data());
    1455                 :            : 
    1456                 :          1 :   args = {zero, f_x};
    1457                 :          1 :   cvc5_assert_formula(
    1458                 :          1 :       d_solver, cvc5_mk_term(d_tm, CVC5_KIND_GT, args.size(), args.data()));
    1459                 :          1 :   args = {zero, f_y};
    1460                 :          1 :   cvc5_assert_formula(
    1461                 :          1 :       d_solver, cvc5_mk_term(d_tm, CVC5_KIND_GT, args.size(), args.data()));
    1462                 :          1 :   args = {sum, one};
    1463                 :          1 :   cvc5_assert_formula(
    1464                 :          1 :       d_solver, cvc5_mk_term(d_tm, CVC5_KIND_GT, args.size(), args.data()));
    1465                 :          1 :   cvc5_assert_formula(d_solver, p_0);
    1466                 :          1 :   args = {p_f_y};
    1467                 :          1 :   cvc5_assert_formula(
    1468                 :          1 :       d_solver, cvc5_mk_term(d_tm, CVC5_KIND_NOT, args.size(), args.data()));
    1469 [ -  + ][ +  - ]:          1 :   ASSERT_TRUE(cvc5_result_is_unsat(cvc5_check_sat(d_solver)));
    1470                 :            : 
    1471                 :            :   size_t uc_size, proof_size;
    1472                 :          1 :   const Cvc5Term* uc = cvc5_get_unsat_core(d_solver, &uc_size);
    1473 [ -  + ][ +  - ]:          1 :   ASSERT_TRUE(uc_size > 0);
    1474                 :            : 
    1475                 :          1 :   (void)cvc5_get_proof(d_solver, CVC5_PROOF_COMPONENT_FULL, &proof_size);
    1476                 :          1 :   (void)cvc5_get_proof(d_solver, CVC5_PROOF_COMPONENT_SAT, &proof_size);
    1477                 :            : 
    1478                 :          1 :   cvc5_reset_assertions(d_solver);
    1479         [ +  + ]:          4 :   for (size_t i = 0; i < uc_size; ++i)
    1480                 :            :   {
    1481                 :          3 :     cvc5_assert_formula(d_solver, uc[i]);
    1482                 :            :   }
    1483                 :          1 :   Cvc5Result res = cvc5_check_sat(d_solver);
    1484 [ -  + ][ +  - ]:          1 :   ASSERT_TRUE(cvc5_result_is_unsat(res));
    1485                 :          1 :   (void)cvc5_get_proof(d_solver, CVC5_PROOF_COMPONENT_FULL, &proof_size);
    1486 [ +  - ][ +  - ]:          1 : }
    1487                 :            : 
    1488                 :          4 : TEST_F(TestCApiBlackSolver, get_unsat_core_lemmas1)
    1489                 :            : {
    1490                 :          1 :   cvc5_set_option(d_solver, "produce-unsat-cores", "true");
    1491                 :          1 :   cvc5_set_option(d_solver, "unsat-cores-mode", "sat-proof");
    1492                 :            : 
    1493                 :            :   size_t size;
    1494                 :            :   // cannot ask before a check sat
    1495 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_get_unsat_core_lemmas(d_solver, &size),
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    1496                 :            :                     "cannot get unsat core");
    1497                 :            : 
    1498                 :          1 :   cvc5_assert_formula(d_solver, cvc5_mk_false(d_tm));
    1499 [ -  + ][ +  - ]:          1 :   ASSERT_TRUE(cvc5_result_is_unsat(cvc5_check_sat(d_solver)));
    1500                 :          1 :   (void)cvc5_get_unsat_core_lemmas(d_solver, &size);
    1501                 :            : 
    1502 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_get_unsat_core_lemmas(nullptr, &size),
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    1503                 :            :                     "unexpected NULL argument");
    1504 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_get_unsat_core_lemmas(d_solver, nullptr),
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    1505                 :            :                     "unexpected NULL argument");
    1506                 :            : }
    1507                 :            : 
    1508                 :          4 : TEST_F(TestCApiBlackSolver, get_unsat_core_lemmas2)
    1509                 :            : {
    1510                 :          1 :   cvc5_set_option(d_solver, "incremental", "true");
    1511                 :          1 :   cvc5_set_option(d_solver, "produce-unsat-cores", "true");
    1512                 :          1 :   cvc5_set_option(d_solver, "produce-proofs", "true");
    1513                 :            : 
    1514                 :          1 :   std::vector<Cvc5Sort> domain = {d_uninterpreted};
    1515                 :            :   Cvc5Sort u_to_int =
    1516                 :          1 :       cvc5_mk_fun_sort(d_tm, domain.size(), domain.data(), d_int);
    1517                 :          1 :   domain = {d_int};
    1518                 :            :   Cvc5Sort int_pred =
    1519                 :          1 :       cvc5_mk_fun_sort(d_tm, domain.size(), domain.data(), d_bool);
    1520                 :            : 
    1521                 :          1 :   Cvc5Term x = cvc5_mk_const(d_tm, d_uninterpreted, "x");
    1522                 :          1 :   Cvc5Term y = cvc5_mk_const(d_tm, d_uninterpreted, "y");
    1523                 :          1 :   Cvc5Term f = cvc5_mk_const(d_tm, u_to_int, "f");
    1524                 :          1 :   Cvc5Term p = cvc5_mk_const(d_tm, int_pred, "p");
    1525                 :          1 :   Cvc5Term zero = cvc5_mk_integer_int64(d_tm, 0);
    1526                 :          1 :   Cvc5Term one = cvc5_mk_integer_int64(d_tm, 1);
    1527                 :          1 :   std::vector<Cvc5Term> args = {f, x};
    1528                 :            :   Cvc5Term f_x =
    1529                 :          1 :       cvc5_mk_term(d_tm, CVC5_KIND_APPLY_UF, args.size(), args.data());
    1530                 :          1 :   args = {f, y};
    1531                 :            :   Cvc5Term f_y =
    1532                 :          1 :       cvc5_mk_term(d_tm, CVC5_KIND_APPLY_UF, args.size(), args.data());
    1533                 :          1 :   args = {f_x, f_y};
    1534                 :          1 :   Cvc5Term sum = cvc5_mk_term(d_tm, CVC5_KIND_ADD, args.size(), args.data());
    1535                 :          1 :   args = {p, zero};
    1536                 :            :   Cvc5Term p_0 =
    1537                 :          1 :       cvc5_mk_term(d_tm, CVC5_KIND_APPLY_UF, args.size(), args.data());
    1538                 :          1 :   args = {p, f_y};
    1539                 :            :   Cvc5Term p_f_y =
    1540                 :          1 :       cvc5_mk_term(d_tm, CVC5_KIND_APPLY_UF, args.size(), args.data());
    1541                 :            : 
    1542                 :          1 :   args = {zero, f_x};
    1543                 :          1 :   cvc5_assert_formula(
    1544                 :          1 :       d_solver, cvc5_mk_term(d_tm, CVC5_KIND_GT, args.size(), args.data()));
    1545                 :          1 :   args = {zero, f_y};
    1546                 :          1 :   cvc5_assert_formula(
    1547                 :          1 :       d_solver, cvc5_mk_term(d_tm, CVC5_KIND_GT, args.size(), args.data()));
    1548                 :          1 :   args = {sum, one};
    1549                 :          1 :   cvc5_assert_formula(
    1550                 :          1 :       d_solver, cvc5_mk_term(d_tm, CVC5_KIND_GT, args.size(), args.data()));
    1551                 :          1 :   cvc5_assert_formula(d_solver, p_0);
    1552                 :          1 :   args = {p_f_y};
    1553                 :          1 :   cvc5_assert_formula(
    1554                 :          1 :       d_solver, cvc5_mk_term(d_tm, CVC5_KIND_NOT, args.size(), args.data()));
    1555 [ -  + ][ +  - ]:          1 :   ASSERT_TRUE(cvc5_result_is_unsat(cvc5_check_sat(d_solver)));
    1556                 :            : 
    1557                 :            :   size_t size;
    1558                 :          1 :   (void)cvc5_get_unsat_core_lemmas(d_solver, &size);
    1559 [ +  - ][ +  - ]:          1 : }
    1560                 :            : 
    1561                 :          4 : TEST_F(TestCApiBlackSolver, get_difficulty)
    1562                 :            : {
    1563                 :          1 :   cvc5_set_option(d_solver, "produce-difficulty", "true");
    1564                 :            :   size_t size;
    1565                 :            :   Cvc5Term *inputs, *values;
    1566 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_get_difficulty(nullptr, &size, &inputs, &values),
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    1567                 :            :                     "unexpected NULL argument");
    1568 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_get_difficulty(d_solver, nullptr, &inputs, &values),
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    1569                 :            :                     "unexpected NULL argument");
    1570 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_get_difficulty(d_solver, &size, nullptr, &values),
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    1571                 :            :                     "unexpected NULL argument");
    1572 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_get_difficulty(d_solver, &size, &inputs, nullptr),
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    1573                 :            :                     "unexpected NULL argument");
    1574                 :            :   // cannot ask before a check sat
    1575 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_get_difficulty(d_solver, &size, &inputs, &values),
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    1576                 :            :                     "cannot get difficulty");
    1577                 :          1 :   cvc5_check_sat(d_solver);
    1578                 :          1 :   cvc5_get_difficulty(d_solver, &size, &inputs, &values);
    1579                 :            : }
    1580                 :            : 
    1581                 :          4 : TEST_F(TestCApiBlackSolver, get_difficulty2)
    1582                 :            : {
    1583                 :          1 :   cvc5_check_sat(d_solver);
    1584                 :            :   size_t size;
    1585                 :            :   Cvc5Term *inputs, *values;
    1586                 :            :   // option is not set
    1587 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_get_difficulty(d_solver, &size, &inputs, &values),
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    1588                 :            :                     "Cannot get difficulty");
    1589                 :            : }
    1590                 :            : 
    1591                 :          4 : TEST_F(TestCApiBlackSolver, get_difficulty3)
    1592                 :            : {
    1593                 :          1 :   cvc5_set_option(d_solver, "produce-difficulty", "true");
    1594                 :            :   size_t size;
    1595                 :            :   Cvc5Term *inputs, *values;
    1596                 :          1 :   Cvc5Term x = cvc5_mk_const(d_tm, d_int, "x");
    1597                 :          1 :   Cvc5Term zero = cvc5_mk_integer_int64(d_tm, 0);
    1598                 :          1 :   Cvc5Term ten = cvc5_mk_integer_int64(d_tm, 10);
    1599                 :          1 :   std::vector<Cvc5Term> args = {x, ten};
    1600                 :          1 :   Cvc5Term f0 = cvc5_mk_term(d_tm, CVC5_KIND_GEQ, args.size(), args.data());
    1601                 :          1 :   args = {zero, x};
    1602                 :          1 :   Cvc5Term f1 = cvc5_mk_term(d_tm, CVC5_KIND_GEQ, args.size(), args.data());
    1603                 :          1 :   cvc5_assert_formula(d_solver, f0);
    1604                 :          1 :   cvc5_assert_formula(d_solver, f1);
    1605                 :          1 :   cvc5_check_sat(d_solver);
    1606                 :          1 :   cvc5_get_difficulty(d_solver, &size, &inputs, &values);
    1607 [ -  + ][ +  - ]:          1 :   ASSERT_EQ(size, 2);
    1608                 :            :   // difficulty should map assertions to integer values
    1609         [ +  + ]:          3 :   for (size_t i = 0; i < size; ++i)
    1610                 :            :   {
    1611 [ +  + ][ +  - ]:          2 :     ASSERT_TRUE(cvc5_term_is_equal(inputs[i], f0)
                 [ -  + ]
    1612         [ +  - ]:          2 :                 || cvc5_term_is_equal(inputs[i], f1));
    1613 [ -  + ][ +  - ]:          2 :     ASSERT_EQ(cvc5_term_get_kind(values[i]), CVC5_KIND_CONST_INTEGER);
    1614                 :            :   }
    1615         [ +  - ]:          1 : }
    1616                 :            : 
    1617                 :          4 : TEST_F(TestCApiBlackSolver, get_timeout_core)
    1618                 :            : {
    1619                 :          1 :   cvc5_set_option(d_solver, "timeout-core-timeout", "100");
    1620                 :          1 :   cvc5_set_option(d_solver, "produce-unsat-cores", "true");
    1621                 :            : 
    1622                 :          1 :   Cvc5Term x = cvc5_mk_const(d_tm, d_int, "x");
    1623                 :          1 :   Cvc5Term tt = cvc5_mk_true(d_tm);
    1624                 :          1 :   std::vector<Cvc5Term> args = {x, x};
    1625                 :          1 :   args = {cvc5_mk_term(d_tm, CVC5_KIND_MULT, args.size(), args.data()),
    1626                 :          1 :           cvc5_mk_integer(d_tm, "501240912901901249014210220059591")};
    1627                 :          1 :   Cvc5Term hard = cvc5_mk_term(d_tm, CVC5_KIND_EQUAL, args.size(), args.data());
    1628                 :          1 :   cvc5_assert_formula(d_solver, tt);
    1629                 :          1 :   cvc5_assert_formula(d_solver, hard);
    1630                 :            : 
    1631                 :            :   Cvc5Result result;
    1632                 :            :   size_t size;
    1633                 :          1 :   const Cvc5Term* core = cvc5_get_timeout_core(d_solver, &result, &size);
    1634 [ -  + ][ +  - ]:          1 :   ASSERT_TRUE(cvc5_result_is_unknown(result));
    1635 [ -  + ][ +  - ]:          1 :   ASSERT_EQ(size, 1);
    1636 [ -  + ][ +  - ]:          1 :   ASSERT_TRUE(cvc5_term_is_equal(core[0], hard));
    1637                 :            : 
    1638 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_get_timeout_core(nullptr, &result, &size),
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    1639                 :            :                     "unexpected NULL argument");
    1640 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_get_timeout_core(d_solver, nullptr, &size),
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    1641                 :            :                     "unexpected NULL argument");
    1642 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_get_timeout_core(d_solver, &result, nullptr),
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    1643                 :            :                     "unexpected NULL argument");
    1644         [ +  - ]:          1 : }
    1645                 :            : 
    1646                 :          4 : TEST_F(TestCApiBlackSolver, get_timeout_core_unsat)
    1647                 :            : {
    1648                 :          1 :   cvc5_set_option(d_solver, "produce-unsat-cores", "true");
    1649                 :          1 :   Cvc5Term ff = cvc5_mk_false(d_tm);
    1650                 :          1 :   Cvc5Term tt = cvc5_mk_true(d_tm);
    1651                 :          1 :   cvc5_assert_formula(d_solver, tt);
    1652                 :          1 :   cvc5_assert_formula(d_solver, ff);
    1653                 :          1 :   cvc5_assert_formula(d_solver, tt);
    1654                 :            : 
    1655                 :            :   Cvc5Result result;
    1656                 :            :   size_t size;
    1657                 :          1 :   const Cvc5Term* core = cvc5_get_timeout_core(d_solver, &result, &size);
    1658 [ -  + ][ +  - ]:          1 :   ASSERT_TRUE(cvc5_result_is_unsat(result));
    1659 [ -  + ][ +  - ]:          1 :   ASSERT_EQ(size, 1);
    1660 [ -  + ][ +  - ]:          1 :   ASSERT_TRUE(cvc5_term_is_equal(core[0], ff));
    1661                 :            : }
    1662                 :            : 
    1663                 :          4 : TEST_F(TestCApiBlackSolver, get_timeout_core_assuming)
    1664                 :            : {
    1665                 :          1 :   cvc5_set_option(d_solver, "produce-unsat-cores", "true");
    1666                 :          1 :   Cvc5Term ff = cvc5_mk_false(d_tm);
    1667                 :          1 :   Cvc5Term tt = cvc5_mk_true(d_tm);
    1668                 :          1 :   cvc5_assert_formula(d_solver, tt);
    1669                 :            : 
    1670                 :          1 :   std::vector<Cvc5Term> assumptions = {ff, tt};
    1671                 :            :   Cvc5Result result;
    1672                 :            :   size_t size;
    1673                 :          1 :   const Cvc5Term* core = cvc5_get_timeout_core_assuming(
    1674                 :          1 :       d_solver, assumptions.size(), assumptions.data(), &result, &size);
    1675 [ -  + ][ +  - ]:          1 :   ASSERT_TRUE(cvc5_result_is_unsat(result));
    1676 [ -  + ][ +  - ]:          1 :   ASSERT_EQ(size, 1);
    1677 [ -  + ][ +  - ]:          1 :   ASSERT_TRUE(cvc5_term_is_equal(core[0], ff));
    1678         [ +  - ]:          1 : }
    1679                 :            : 
    1680                 :          4 : TEST_F(TestCApiBlackSolver, get_timeout_core_assuming_empty)
    1681                 :            : {
    1682                 :          1 :   cvc5_set_option(d_solver, "produce-unsat-cores", "true");
    1683                 :          1 :   std::vector<Cvc5Term> assumptions = {};
    1684                 :            :   Cvc5Result result;
    1685                 :            :   size_t size;
    1686 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    1687                 :            :       cvc5_get_timeout_core_assuming(
    1688                 :            :           d_solver, assumptions.size(), assumptions.data(), &result, &size),
    1689                 :            :       "unexpected NULL argument");
    1690         [ +  - ]:          1 : }
    1691                 :            : 
    1692                 :          4 : TEST_F(TestCApiBlackSolver, get_proof_and_proof_to_string)
    1693                 :            : {
    1694                 :          1 :   cvc5_set_option(d_solver, "produce-proofs", "true");
    1695                 :            : 
    1696                 :          1 :   std::vector<Cvc5Sort> domain = {d_uninterpreted};
    1697                 :            :   Cvc5Sort u_to_int =
    1698                 :          1 :       cvc5_mk_fun_sort(d_tm, domain.size(), domain.data(), d_int);
    1699                 :          1 :   domain = {d_int};
    1700                 :            :   Cvc5Sort int_pred =
    1701                 :          1 :       cvc5_mk_fun_sort(d_tm, domain.size(), domain.data(), d_bool);
    1702                 :            : 
    1703                 :          1 :   Cvc5Term x = cvc5_mk_const(d_tm, d_uninterpreted, "x");
    1704                 :          1 :   Cvc5Term y = cvc5_mk_const(d_tm, d_uninterpreted, "y");
    1705                 :          1 :   Cvc5Term f = cvc5_mk_const(d_tm, u_to_int, "f");
    1706                 :          1 :   Cvc5Term p = cvc5_mk_const(d_tm, int_pred, "p");
    1707                 :          1 :   Cvc5Term zero = cvc5_mk_integer_int64(d_tm, 0);
    1708                 :          1 :   Cvc5Term one = cvc5_mk_integer_int64(d_tm, 1);
    1709                 :          1 :   std::vector<Cvc5Term> args = {f, x};
    1710                 :            :   Cvc5Term f_x =
    1711                 :          1 :       cvc5_mk_term(d_tm, CVC5_KIND_APPLY_UF, args.size(), args.data());
    1712                 :          1 :   args = {f, y};
    1713                 :            :   Cvc5Term f_y =
    1714                 :          1 :       cvc5_mk_term(d_tm, CVC5_KIND_APPLY_UF, args.size(), args.data());
    1715                 :          1 :   args = {f_x, f_y};
    1716                 :          1 :   Cvc5Term sum = cvc5_mk_term(d_tm, CVC5_KIND_ADD, args.size(), args.data());
    1717                 :          1 :   args = {p, zero};
    1718                 :            :   Cvc5Term p_0 =
    1719                 :          1 :       cvc5_mk_term(d_tm, CVC5_KIND_APPLY_UF, args.size(), args.data());
    1720                 :          1 :   args = {p, f_y};
    1721                 :            :   Cvc5Term p_f_y =
    1722                 :          1 :       cvc5_mk_term(d_tm, CVC5_KIND_APPLY_UF, args.size(), args.data());
    1723                 :            : 
    1724                 :          1 :   args = {zero, f_x};
    1725                 :          1 :   cvc5_assert_formula(
    1726                 :          1 :       d_solver, cvc5_mk_term(d_tm, CVC5_KIND_GT, args.size(), args.data()));
    1727                 :          1 :   args = {zero, f_y};
    1728                 :          1 :   cvc5_assert_formula(
    1729                 :          1 :       d_solver, cvc5_mk_term(d_tm, CVC5_KIND_GT, args.size(), args.data()));
    1730                 :          1 :   args = {sum, one};
    1731                 :          1 :   cvc5_assert_formula(
    1732                 :          1 :       d_solver, cvc5_mk_term(d_tm, CVC5_KIND_GT, args.size(), args.data()));
    1733                 :          1 :   cvc5_assert_formula(d_solver, p_0);
    1734                 :          1 :   args = {p_f_y};
    1735                 :          1 :   cvc5_assert_formula(
    1736                 :          1 :       d_solver, cvc5_mk_term(d_tm, CVC5_KIND_NOT, args.size(), args.data()));
    1737 [ -  + ][ +  - ]:          1 :   ASSERT_TRUE(cvc5_result_is_unsat(cvc5_check_sat(d_solver)));
    1738                 :            : 
    1739                 :            :   size_t size;
    1740 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_get_proof(nullptr, CVC5_PROOF_COMPONENT_FULL, &size),
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    1741                 :            :                     "unexpected NULL");
    1742 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    1743                 :            :       cvc5_get_proof(d_solver, CVC5_PROOF_COMPONENT_FULL, nullptr),
    1744                 :            :       "unexpected NULL");
    1745                 :            : 
    1746                 :            :   const Cvc5Proof* proofs =
    1747                 :          1 :       cvc5_get_proof(d_solver, CVC5_PROOF_COMPONENT_FULL, &size);
    1748 [ -  + ][ +  - ]:          1 :   ASSERT_TRUE(size > 0);
    1749                 :            : 
    1750                 :            :   std::string proof_str = cvc5_proof_to_string(
    1751                 :          1 :       d_solver, proofs[0], CVC5_PROOF_FORMAT_DEFAULT, 0, nullptr, nullptr);
    1752 [ -  + ][ +  - ]:          1 :   ASSERT_FALSE(proof_str.empty());
    1753                 :            :   proof_str = cvc5_proof_to_string(
    1754                 :          1 :       d_solver, proofs[0], CVC5_PROOF_FORMAT_ALETHE, 0, nullptr, nullptr);
    1755 [ -  + ][ +  - ]:          1 :   ASSERT_FALSE(proof_str.empty());
    1756                 :          1 :   proofs = cvc5_get_proof(d_solver, CVC5_PROOF_COMPONENT_SAT, &size);
    1757                 :            :   proof_str = cvc5_proof_to_string(
    1758                 :          1 :       d_solver, proofs[0], CVC5_PROOF_FORMAT_NONE, 0, nullptr, nullptr);
    1759 [ -  + ][ +  - ]:          1 :   ASSERT_FALSE(proof_str.empty());
    1760 [ +  - ][ +  - ]:          1 : }
    1761                 :            : 
    1762                 :          4 : TEST_F(TestCApiBlackSolver, proof_to_string_assertion_names)
    1763                 :            : {
    1764                 :          1 :   cvc5_set_option(d_solver, "produce-proofs", "true");
    1765                 :            : 
    1766                 :          1 :   Cvc5Term x = cvc5_mk_const(d_tm, d_uninterpreted, "x");
    1767                 :          1 :   Cvc5Term y = cvc5_mk_const(d_tm, d_uninterpreted, "y");
    1768                 :            : 
    1769                 :          1 :   std::vector<Cvc5Term> args = {x, y};
    1770                 :            :   Cvc5Term x_eq_y =
    1771                 :          1 :       cvc5_mk_term(d_tm, CVC5_KIND_EQUAL, args.size(), args.data());
    1772                 :          1 :   args = {x_eq_y};
    1773                 :            :   Cvc5Term not_x_eq_y =
    1774                 :          1 :       cvc5_mk_term(d_tm, CVC5_KIND_NOT, args.size(), args.data());
    1775                 :            : 
    1776                 :          1 :   cvc5_assert_formula(d_solver, x_eq_y);
    1777                 :          1 :   cvc5_assert_formula(d_solver, not_x_eq_y);
    1778                 :            : 
    1779 [ -  + ][ +  - ]:          1 :   ASSERT_TRUE(cvc5_result_is_unsat(cvc5_check_sat(d_solver)));
    1780                 :            : 
    1781                 :            :   size_t size;
    1782                 :            :   const Cvc5Proof* proofs =
    1783                 :          1 :       cvc5_get_proof(d_solver, CVC5_PROOF_COMPONENT_FULL, &size);
    1784 [ -  + ][ +  - ]:          1 :   ASSERT_TRUE(size > 0);
    1785                 :          1 :   const Cvc5Term assertions[2] = {x_eq_y, not_x_eq_y};
    1786                 :          1 :   const char* names[2] = {"as1", "as2"};
    1787                 :            :   std::string proof_str = cvc5_proof_to_string(
    1788                 :          1 :       d_solver, proofs[0], CVC5_PROOF_FORMAT_ALETHE, 2, assertions, names);
    1789 [ -  + ][ +  - ]:          1 :   ASSERT_FALSE(proof_str.empty());
    1790 [ -  + ][ +  - ]:          1 :   ASSERT_LT(proof_str.find("as1"), std::string::npos);
    1791 [ -  + ][ +  - ]:          1 :   ASSERT_LT(proof_str.find("as2"), std::string::npos);
    1792                 :            : 
    1793 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_proof_to_string(d_solver,
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    1794                 :            :                                          proofs[0],
    1795                 :            :                                          CVC5_PROOF_FORMAT_ALETHE,
    1796                 :            :                                          2,
    1797                 :            :                                          assertions,
    1798                 :            :                                          nullptr),
    1799                 :            :                     "unexpected NULL argument");
    1800                 :          1 :   const Cvc5Term null_assertions[2] = {x_eq_y, nullptr};
    1801 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_proof_to_string(d_solver,
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    1802                 :            :                                          proofs[0],
    1803                 :            :                                          CVC5_PROOF_FORMAT_ALETHE,
    1804                 :            :                                          2,
    1805                 :            :                                          null_assertions,
    1806                 :            :                                          names),
    1807                 :            :                     "invalid term at index 1");
    1808                 :          1 :   const char* null_names[2] = {"as1", nullptr};
    1809 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_proof_to_string(d_solver,
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    1810                 :            :                                          proofs[0],
    1811                 :            :                                          CVC5_PROOF_FORMAT_ALETHE,
    1812                 :            :                                          2,
    1813                 :            :                                          assertions,
    1814                 :            :                                          null_names),
    1815                 :            :                     "unexpected NULL argument at index 1");
    1816         [ +  - ]:          1 : }
    1817                 :            : 
    1818                 :          4 : TEST_F(TestCApiBlackSolver, get_learned_literals)
    1819                 :            : {
    1820                 :          1 :   cvc5_set_option(d_solver, "produce-learned-literals", "true");
    1821                 :            : 
    1822                 :            :   size_t size;
    1823                 :            :   // cannot ask before a check sat
    1824 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    1825                 :            :       cvc5_get_learned_literals(d_solver, CVC5_LEARNED_LIT_TYPE_INPUT, &size),
    1826                 :            :       "cannot get learned literals");
    1827                 :            : 
    1828                 :          1 :   cvc5_check_sat(d_solver);
    1829                 :          1 :   (void)cvc5_get_learned_literals(d_solver, CVC5_LEARNED_LIT_TYPE_INPUT, &size);
    1830                 :          1 :   (void)cvc5_get_learned_literals(
    1831                 :            :       d_solver, CVC5_LEARNED_LIT_TYPE_PREPROCESS, &size);
    1832                 :            : 
    1833 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    1834                 :            :       cvc5_get_learned_literals(nullptr, CVC5_LEARNED_LIT_TYPE_INPUT, &size),
    1835                 :            :       "unexpected NULL argument");
    1836 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    1837                 :            :       cvc5_get_learned_literals(d_solver, CVC5_LEARNED_LIT_TYPE_INPUT, nullptr),
    1838                 :            :       "unexpected NULL argument");
    1839                 :            : }
    1840                 :            : 
    1841                 :          4 : TEST_F(TestCApiBlackSolver, get_learned_literals2)
    1842                 :            : {
    1843                 :          1 :   cvc5_set_option(d_solver, "produce-learned-literals", "true");
    1844                 :          1 :   Cvc5Term x = cvc5_mk_const(d_tm, d_int, "x");
    1845                 :          1 :   Cvc5Term y = cvc5_mk_const(d_tm, d_int, "y");
    1846                 :          1 :   Cvc5Term zero = cvc5_mk_integer_int64(d_tm, 0);
    1847                 :          1 :   Cvc5Term ten = cvc5_mk_integer_int64(d_tm, 10);
    1848                 :          1 :   std::vector<Cvc5Term> args = {x, ten};
    1849                 :          1 :   Cvc5Term f0 = cvc5_mk_term(d_tm, CVC5_KIND_GEQ, args.size(), args.data());
    1850                 :          1 :   args = {zero, x};
    1851                 :          1 :   Cvc5Term args1 = cvc5_mk_term(d_tm, CVC5_KIND_GEQ, args.size(), args.data());
    1852                 :          1 :   args = {y, zero};
    1853                 :          1 :   Cvc5Term args2 = cvc5_mk_term(d_tm, CVC5_KIND_GEQ, args.size(), args.data());
    1854                 :          1 :   args = {args1, args2};
    1855                 :          1 :   Cvc5Term f1 = cvc5_mk_term(d_tm, CVC5_KIND_OR, args.size(), args.data());
    1856                 :          1 :   cvc5_assert_formula(d_solver, f0);
    1857                 :          1 :   cvc5_assert_formula(d_solver, f1);
    1858                 :          1 :   cvc5_check_sat(d_solver);
    1859                 :            :   size_t size;
    1860                 :          1 :   (void)cvc5_get_learned_literals(d_solver, CVC5_LEARNED_LIT_TYPE_INPUT, &size);
    1861                 :          1 : }
    1862                 :            : 
    1863                 :          4 : TEST_F(TestCApiBlackSolver, get_value1)
    1864                 :            : {
    1865                 :          1 :   cvc5_set_option(d_solver, "produce-models", "false");
    1866                 :          1 :   Cvc5Term t = cvc5_mk_true(d_tm);
    1867                 :          1 :   cvc5_assert_formula(d_solver, t);
    1868                 :          1 :   cvc5_check_sat(d_solver);
    1869 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_get_value(d_solver, t), "cannot get value");
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    1870                 :            : }
    1871                 :            : 
    1872                 :          4 : TEST_F(TestCApiBlackSolver, get_value2)
    1873                 :            : {
    1874                 :          1 :   cvc5_set_option(d_solver, "produce-models", "true");
    1875                 :          1 :   Cvc5Term t = cvc5_mk_false(d_tm);
    1876                 :          1 :   cvc5_assert_formula(d_solver, t);
    1877                 :          1 :   cvc5_check_sat(d_solver);
    1878 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_get_value(d_solver, t), "cannot get value");
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    1879                 :            : }
    1880                 :            : 
    1881                 :          4 : TEST_F(TestCApiBlackSolver, get_value3)
    1882                 :            : {
    1883                 :          1 :   cvc5_set_option(d_solver, "produce-models", "true");
    1884                 :            : 
    1885                 :          1 :   std::vector<Cvc5Sort> domain = {d_uninterpreted};
    1886                 :            :   Cvc5Sort u_to_int =
    1887                 :          1 :       cvc5_mk_fun_sort(d_tm, domain.size(), domain.data(), d_int);
    1888                 :          1 :   domain = {d_int};
    1889                 :            :   Cvc5Sort int_pred =
    1890                 :          1 :       cvc5_mk_fun_sort(d_tm, domain.size(), domain.data(), d_bool);
    1891                 :            : 
    1892                 :          1 :   Cvc5Term x = cvc5_mk_const(d_tm, d_uninterpreted, "x");
    1893                 :          1 :   Cvc5Term y = cvc5_mk_const(d_tm, d_uninterpreted, "y");
    1894                 :          1 :   Cvc5Term z = cvc5_mk_const(d_tm, d_uninterpreted, "z");
    1895                 :          1 :   Cvc5Term f = cvc5_mk_const(d_tm, u_to_int, "f");
    1896                 :          1 :   Cvc5Term p = cvc5_mk_const(d_tm, int_pred, "p");
    1897                 :          1 :   Cvc5Term zero = cvc5_mk_integer_int64(d_tm, 0);
    1898                 :          1 :   Cvc5Term one = cvc5_mk_integer_int64(d_tm, 1);
    1899                 :          1 :   std::vector<Cvc5Term> args = {f, x};
    1900                 :            :   Cvc5Term f_x =
    1901                 :          1 :       cvc5_mk_term(d_tm, CVC5_KIND_APPLY_UF, args.size(), args.data());
    1902                 :          1 :   args = {f, y};
    1903                 :            :   Cvc5Term f_y =
    1904                 :          1 :       cvc5_mk_term(d_tm, CVC5_KIND_APPLY_UF, args.size(), args.data());
    1905                 :          1 :   args = {f_x, f_y};
    1906                 :          1 :   Cvc5Term sum = cvc5_mk_term(d_tm, CVC5_KIND_ADD, args.size(), args.data());
    1907                 :          1 :   args = {p, zero};
    1908                 :            :   Cvc5Term p_0 =
    1909                 :          1 :       cvc5_mk_term(d_tm, CVC5_KIND_APPLY_UF, args.size(), args.data());
    1910                 :          1 :   args = {p, f_y};
    1911                 :            :   Cvc5Term p_f_y =
    1912                 :          1 :       cvc5_mk_term(d_tm, CVC5_KIND_APPLY_UF, args.size(), args.data());
    1913                 :            : 
    1914                 :          1 :   args = {zero, f_x};
    1915                 :          1 :   cvc5_assert_formula(
    1916                 :          1 :       d_solver, cvc5_mk_term(d_tm, CVC5_KIND_LEQ, args.size(), args.data()));
    1917                 :          1 :   args = {zero, f_y};
    1918                 :          1 :   cvc5_assert_formula(
    1919                 :          1 :       d_solver, cvc5_mk_term(d_tm, CVC5_KIND_LEQ, args.size(), args.data()));
    1920                 :          1 :   args = {sum, one};
    1921                 :          1 :   cvc5_assert_formula(
    1922                 :          1 :       d_solver, cvc5_mk_term(d_tm, CVC5_KIND_LEQ, args.size(), args.data()));
    1923                 :          1 :   args = {p_0};
    1924                 :          1 :   cvc5_assert_formula(
    1925                 :          1 :       d_solver, cvc5_mk_term(d_tm, CVC5_KIND_NOT, args.size(), args.data()));
    1926                 :          1 :   cvc5_assert_formula(d_solver, p_f_y);
    1927 [ -  + ][ +  - ]:          1 :   ASSERT_TRUE(cvc5_result_is_sat(cvc5_check_sat(d_solver)));
    1928                 :            : 
    1929                 :          1 :   (void)cvc5_get_value(d_solver, x);
    1930                 :          1 :   (void)cvc5_get_value(d_solver, y);
    1931                 :          1 :   (void)cvc5_get_value(d_solver, z);
    1932                 :          1 :   (void)cvc5_get_value(d_solver, sum);
    1933                 :          1 :   (void)cvc5_get_value(d_solver, p_f_y);
    1934                 :            : 
    1935 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_get_value(nullptr, x), "unexpected NULL argument");
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    1936 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_get_value(d_solver, nullptr), "invalid term");
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    1937                 :            : 
    1938                 :          1 :   std::vector<Cvc5Term> a = {cvc5_get_value(d_solver, x),
    1939                 :          2 :                              cvc5_get_value(d_solver, y),
    1940                 :          1 :                              cvc5_get_value(d_solver, z)};
    1941                 :            :   size_t size;
    1942                 :          1 :   std::vector<Cvc5Term> terms = {x, y, z};
    1943                 :            :   const Cvc5Term* b =
    1944                 :          1 :       cvc5_get_values(d_solver, terms.size(), terms.data(), &size);
    1945 [ -  + ][ +  - ]:          1 :   ASSERT_EQ(size, 3);
    1946 [ -  + ][ +  - ]:          1 :   ASSERT_TRUE(cvc5_term_is_equal(a[0], b[0]));
    1947 [ -  + ][ +  - ]:          1 :   ASSERT_TRUE(cvc5_term_is_equal(a[1], b[1]));
    1948 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_get_values(nullptr, terms.size(), terms.data(), &size),
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    1949                 :            :                     "unexpected NULL argument");
    1950 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_get_values(d_solver, terms.size(), nullptr, &size),
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    1951                 :            :                     "unexpected NULL argument");
    1952 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    1953                 :            :       cvc5_get_values(d_solver, terms.size(), terms.data(), nullptr),
    1954                 :            :       "unexpected NULL argument");
    1955                 :          1 :   terms = {x, nullptr};
    1956 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    1957                 :            :       cvc5_get_values(d_solver, terms.size(), terms.data(), &size),
    1958                 :            :       "invalid term at index 1");
    1959                 :            : 
    1960                 :          1 :   Cvc5* slv = cvc5_new(d_tm);
    1961 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_get_value(slv, x), "cannot get value");
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    1962                 :          1 :   cvc5_delete(slv);
    1963                 :            : 
    1964                 :          1 :   slv = cvc5_new(d_tm);
    1965                 :          1 :   cvc5_set_option(slv, "produce-models", "true");
    1966 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_get_value(slv, x), "cannot get value");
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    1967                 :          1 :   cvc5_delete(slv);
    1968                 :            : 
    1969                 :          1 :   slv = cvc5_new(d_tm);
    1970                 :          1 :   cvc5_set_option(slv, "produce-models", "true");
    1971                 :          1 :   cvc5_check_sat(slv);
    1972                 :          1 :   (void)cvc5_get_value(slv, x);
    1973                 :          1 :   cvc5_delete(slv);
    1974                 :            : 
    1975                 :          1 :   Cvc5TermManager* tm = cvc5_term_manager_new();
    1976                 :          1 :   slv = cvc5_new(tm);
    1977                 :          1 :   cvc5_set_option(slv, "produce-models", "true");
    1978                 :          1 :   cvc5_check_sat(slv);
    1979 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    1980                 :            :       cvc5_get_value(slv, x),
    1981                 :            :       "term is not associated with the term manager of this solver");
    1982                 :          1 :   cvc5_delete(slv);
    1983                 :          1 :   cvc5_term_manager_release(tm);
    1984                 :          1 :   cvc5_term_manager_delete(tm);
    1985 [ +  - ][ +  - ]:          1 : }
    1986                 :            : 
    1987                 :          4 : TEST_F(TestCApiBlackSolver, get_modelDomain_elements)
    1988                 :            : {
    1989                 :          1 :   cvc5_set_option(d_solver, "produce-models", "true");
    1990                 :          1 :   Cvc5Term x = cvc5_mk_const(d_tm, d_uninterpreted, "x");
    1991                 :          1 :   Cvc5Term y = cvc5_mk_const(d_tm, d_uninterpreted, "y");
    1992                 :          1 :   Cvc5Term z = cvc5_mk_const(d_tm, d_uninterpreted, "z");
    1993                 :          1 :   std::vector<Cvc5Term> args = {x, y, z};
    1994                 :          1 :   Cvc5Term f = cvc5_mk_term(d_tm, CVC5_KIND_DISTINCT, args.size(), args.data());
    1995                 :          1 :   cvc5_assert_formula(d_solver, f);
    1996                 :          1 :   cvc5_check_sat(d_solver);
    1997                 :            :   size_t size;
    1998                 :          1 :   (void)cvc5_get_model_domain_elements(d_solver, d_uninterpreted, &size);
    1999 [ -  + ][ +  - ]:          1 :   ASSERT_TRUE(size >= 3);
    2000 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    2001                 :            :       cvc5_get_model_domain_elements(nullptr, d_uninterpreted, &size),
    2002                 :            :       "unexpected NULL argument");
    2003 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_get_model_domain_elements(d_solver, nullptr, &size),
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    2004                 :            :                     "invalid sort");
    2005 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    2006                 :            :       cvc5_get_model_domain_elements(d_solver, d_uninterpreted, nullptr),
    2007                 :            :       "unexpected NULL argument");
    2008 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_get_model_domain_elements(d_solver, d_int, &size),
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    2009                 :            :                     "expected an uninterpreted sort");
    2010                 :            : 
    2011                 :          1 :   Cvc5TermManager* tm = cvc5_term_manager_new();
    2012                 :          1 :   Cvc5* slv = cvc5_new(tm);
    2013                 :          1 :   cvc5_set_option(slv, "produce-models", "true");
    2014                 :          1 :   cvc5_check_sat(slv);
    2015 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    2016                 :            :       cvc5_get_model_domain_elements(slv, d_uninterpreted, &size),
    2017                 :            :       "sort is not associated with the term manager of this solver");
    2018                 :          1 :   cvc5_delete(slv);
    2019                 :          1 :   cvc5_term_manager_release(tm);
    2020                 :          1 :   cvc5_term_manager_delete(tm);
    2021         [ +  - ]:          1 : }
    2022                 :            : 
    2023                 :          4 : TEST_F(TestCApiBlackSolver, getModel_domain_elements2)
    2024                 :            : {
    2025                 :          1 :   cvc5_set_option(d_solver, "produce-models", "true");
    2026                 :          1 :   cvc5_set_option(d_solver, "finite-model-find", "true");
    2027                 :          1 :   Cvc5Term x = cvc5_mk_var(d_tm, d_uninterpreted, "x");
    2028                 :          1 :   Cvc5Term y = cvc5_mk_var(d_tm, d_uninterpreted, "y");
    2029                 :          1 :   std::vector<Cvc5Term> args = {x, y};
    2030                 :          1 :   Cvc5Term eq = cvc5_mk_term(d_tm, CVC5_KIND_EQUAL, args.size(), args.data());
    2031                 :            :   Cvc5Term bvl =
    2032                 :          1 :       cvc5_mk_term(d_tm, CVC5_KIND_VARIABLE_LIST, args.size(), args.data());
    2033                 :          1 :   args = {bvl, eq};
    2034                 :          1 :   Cvc5Term f = cvc5_mk_term(d_tm, CVC5_KIND_FORALL, args.size(), args.data());
    2035                 :          1 :   cvc5_assert_formula(d_solver, f);
    2036                 :          1 :   cvc5_check_sat(d_solver);
    2037                 :            :   size_t size;
    2038                 :          1 :   (void)cvc5_get_model_domain_elements(d_solver, d_uninterpreted, &size);
    2039                 :            :   // a model for the above must interpret u as size 1
    2040 [ -  + ][ +  - ]:          1 :   ASSERT_EQ(size, 1);
    2041         [ +  - ]:          1 : }
    2042                 :            : 
    2043                 :          4 : TEST_F(TestCApiBlackSolver, is_model_core_symbol)
    2044                 :            : {
    2045                 :          1 :   cvc5_set_option(d_solver, "produce-models", "true");
    2046                 :          1 :   cvc5_set_option(d_solver, "model-cores", "simple");
    2047                 :          1 :   Cvc5Term x = cvc5_mk_const(d_tm, d_uninterpreted, "x");
    2048                 :          1 :   Cvc5Term y = cvc5_mk_const(d_tm, d_uninterpreted, "y");
    2049                 :          1 :   Cvc5Term z = cvc5_mk_const(d_tm, d_uninterpreted, "z");
    2050                 :          1 :   Cvc5Term zero = cvc5_mk_integer_int64(d_tm, 0);
    2051                 :          1 :   std::vector<Cvc5Term> args = {x, y};
    2052                 :          1 :   args = {cvc5_mk_term(d_tm, CVC5_KIND_EQUAL, args.size(), args.data())};
    2053                 :          1 :   Cvc5Term f = cvc5_mk_term(d_tm, CVC5_KIND_NOT, args.size(), args.data());
    2054                 :          1 :   cvc5_assert_formula(d_solver, f);
    2055                 :          1 :   cvc5_check_sat(d_solver);
    2056 [ -  + ][ +  - ]:          1 :   ASSERT_TRUE(cvc5_is_model_core_symbol(d_solver, x));
    2057 [ -  + ][ +  - ]:          1 :   ASSERT_TRUE(cvc5_is_model_core_symbol(d_solver, y));
    2058 [ -  + ][ +  - ]:          1 :   ASSERT_FALSE(cvc5_is_model_core_symbol(d_solver, z));
    2059                 :            : 
    2060 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_is_model_core_symbol(nullptr, x),
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    2061                 :            :                     "unexpected NULL argument");
    2062 [ -  + ][ +  - ]:          1 :   ASSERT_FALSE(cvc5_is_model_core_symbol(d_solver, nullptr));
    2063 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_is_model_core_symbol(d_solver, zero),
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    2064                 :            :                     "expected a free constant");
    2065                 :            : 
    2066                 :          1 :   Cvc5TermManager* tm = cvc5_term_manager_new();
    2067                 :          1 :   Cvc5* slv = cvc5_new(tm);
    2068                 :          1 :   cvc5_set_option(slv, "produce-models", "true");
    2069                 :          1 :   cvc5_check_sat(slv);
    2070 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    2071                 :            :       cvc5_is_model_core_symbol(slv, x),
    2072                 :            :       "term is not associated with the term manager of this solver");
    2073                 :          1 :   cvc5_delete(slv);
    2074                 :          1 :   cvc5_term_manager_release(tm);
    2075                 :          1 :   cvc5_term_manager_delete(tm);
    2076         [ +  - ]:          1 : }
    2077                 :            : 
    2078                 :          4 : TEST_F(TestCApiBlackSolver, get_model)
    2079                 :            : {
    2080                 :          1 :   cvc5_set_option(d_solver, "produce-models", "true");
    2081                 :          1 :   Cvc5Term x = cvc5_mk_const(d_tm, d_uninterpreted, "x");
    2082                 :          1 :   Cvc5Term y = cvc5_mk_const(d_tm, d_uninterpreted, "y");
    2083                 :          1 :   std::vector<Cvc5Term> args = {x, y};
    2084                 :          1 :   args = {cvc5_mk_term(d_tm, CVC5_KIND_EQUAL, args.size(), args.data())};
    2085                 :          1 :   Cvc5Term f = cvc5_mk_term(d_tm, CVC5_KIND_NOT, args.size(), args.data());
    2086                 :          1 :   cvc5_assert_formula(d_solver, f);
    2087                 :          1 :   cvc5_check_sat(d_solver);
    2088                 :            : 
    2089                 :          1 :   std::vector<Cvc5Sort> sorts = {d_uninterpreted};
    2090                 :          1 :   std::vector<Cvc5Term> terms = {x, y};
    2091                 :          2 :   (void)cvc5_get_model(
    2092                 :          2 :       d_solver, sorts.size(), sorts.data(), terms.size(), terms.data());
    2093                 :            : 
    2094 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    2095                 :            :       cvc5_get_model(
    2096                 :            :           nullptr, sorts.size(), sorts.data(), terms.size(), terms.data()),
    2097                 :            :       "unexpected NULL argument");
    2098 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    2099                 :            :       cvc5_get_model(
    2100                 :            :           d_solver, sorts.size(), nullptr, terms.size(), terms.data()),
    2101                 :            :       "unexpected NULL argument");
    2102 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    2103                 :            :       cvc5_get_model(
    2104                 :            :           d_solver, sorts.size(), sorts.data(), terms.size(), nullptr),
    2105                 :            :       "unexpected NULL argument");
    2106                 :          1 :   terms.push_back(nullptr);
    2107 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    2108                 :            :       cvc5_get_model(
    2109                 :            :           d_solver, sorts.size(), sorts.data(), terms.size(), terms.data()),
    2110                 :            :       "");
    2111 [ +  - ][ +  - ]:          1 : }
                 [ +  - ]
    2112                 :            : 
    2113                 :          4 : TEST_F(TestCApiBlackSolver, get_model2)
    2114                 :            : {
    2115                 :          1 :   cvc5_set_option(d_solver, "produce-models", "true");
    2116                 :          1 :   std::vector<Cvc5Sort> sorts;
    2117                 :          1 :   std::vector<Cvc5Term> terms;
    2118 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    2119                 :            :       cvc5_get_model(
    2120                 :            :           d_solver, sorts.size(), sorts.data(), terms.size(), terms.data()),
    2121                 :            :       "unexpected NULL argument");
    2122 [ +  - ][ +  - ]:          1 : }
    2123                 :            : 
    2124                 :          4 : TEST_F(TestCApiBlackSolver, get_model3)
    2125                 :            : {
    2126                 :          1 :   cvc5_set_option(d_solver, "produce-models", "true");
    2127                 :          1 :   std::vector<Cvc5Sort> sorts;
    2128                 :          1 :   std::vector<Cvc5Term> terms;
    2129                 :          1 :   cvc5_check_sat(d_solver);
    2130 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    2131                 :            :       cvc5_get_model(
    2132                 :            :           d_solver, sorts.size(), sorts.data(), terms.size(), terms.data()),
    2133                 :            :       "unexpected NULL argument");
    2134                 :          1 :   sorts.push_back(d_int);
    2135 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    2136                 :            :       cvc5_get_model(
    2137                 :            :           d_solver, sorts.size(), sorts.data(), terms.size(), terms.data()),
    2138                 :            :       "unexpected NULL argument");
    2139 [ +  - ][ +  - ]:          1 : }
    2140                 :            : 
    2141                 :          4 : TEST_F(TestCApiBlackSolver, get_quantifier_elimination)
    2142                 :            : {
    2143                 :          1 :   Cvc5Term x = cvc5_mk_var(d_tm, d_bool, "x");
    2144                 :          1 :   std::vector<Cvc5Term> args = {x};
    2145                 :            :   Cvc5Term vlist =
    2146                 :          1 :       cvc5_mk_term(d_tm, CVC5_KIND_VARIABLE_LIST, args.size(), args.data());
    2147                 :          1 :   args = {x, cvc5_mk_term(d_tm, CVC5_KIND_NOT, args.size(), args.data())};
    2148                 :          1 :   Cvc5Term b = cvc5_mk_term(d_tm, CVC5_KIND_OR, args.size(), args.data());
    2149                 :          1 :   args = {vlist, b};
    2150                 :            :   Cvc5Term forall =
    2151                 :          1 :       cvc5_mk_term(d_tm, CVC5_KIND_FORALL, args.size(), args.data());
    2152                 :            : 
    2153 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_get_quantifier_elimination(nullptr, forall),
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    2154                 :            :                     "unexpected NULL argument");
    2155 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_get_quantifier_elimination(d_solver, nullptr),
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    2156                 :            :                     "invalid term");
    2157 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    2158                 :            :       cvc5_get_quantifier_elimination(d_solver, cvc5_mk_false(d_tm)),
    2159                 :            :       "Expecting a quantified formula");
    2160                 :          1 :   (void)cvc5_get_quantifier_elimination(d_solver, forall);
    2161                 :            : 
    2162                 :          1 :   Cvc5TermManager* tm = cvc5_term_manager_new();
    2163                 :          1 :   Cvc5* slv = cvc5_new(tm);
    2164                 :          1 :   cvc5_check_sat(slv);
    2165 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    2166                 :            :       cvc5_get_quantifier_elimination(slv, forall),
    2167                 :            :       "term is not associated with the term manager of this solver");
    2168                 :          1 :   cvc5_delete(slv);
    2169                 :          1 :   cvc5_term_manager_release(tm);
    2170                 :          1 :   cvc5_term_manager_delete(tm);
    2171         [ +  - ]:          1 : }
    2172                 :            : 
    2173                 :          4 : TEST_F(TestCApiBlackSolver, get_quantifier_elimination_disjunct)
    2174                 :            : {
    2175                 :          1 :   Cvc5Term x = cvc5_mk_var(d_tm, d_bool, "x");
    2176                 :          1 :   std::vector<Cvc5Term> args = {x};
    2177                 :            :   Cvc5Term vlist =
    2178                 :          1 :       cvc5_mk_term(d_tm, CVC5_KIND_VARIABLE_LIST, args.size(), args.data());
    2179                 :          1 :   args = {x, cvc5_mk_term(d_tm, CVC5_KIND_NOT, args.size(), args.data())};
    2180                 :          1 :   Cvc5Term b = cvc5_mk_term(d_tm, CVC5_KIND_OR, args.size(), args.data());
    2181                 :          1 :   args = {vlist, b};
    2182                 :            :   Cvc5Term forall =
    2183                 :          1 :       cvc5_mk_term(d_tm, CVC5_KIND_FORALL, args.size(), args.data());
    2184                 :            : 
    2185 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_get_quantifier_elimination_disjunct(nullptr, forall),
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    2186                 :            :                     "unexpected NULL argument");
    2187 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_get_quantifier_elimination_disjunct(d_solver, nullptr),
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    2188                 :            :                     "invalid term");
    2189 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    2190                 :            :       cvc5_get_quantifier_elimination_disjunct(d_solver, cvc5_mk_false(d_tm)),
    2191                 :            :       "Expecting a quantified formula");
    2192                 :          1 :   (void)cvc5_get_quantifier_elimination_disjunct(d_solver, forall);
    2193                 :            : 
    2194                 :          1 :   Cvc5TermManager* tm = cvc5_term_manager_new();
    2195                 :          1 :   Cvc5* slv = cvc5_new(tm);
    2196                 :          1 :   cvc5_check_sat(slv);
    2197 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    2198                 :            :       cvc5_get_quantifier_elimination(slv, forall),
    2199                 :            :       "term is not associated with the term manager of this solver");
    2200                 :          1 :   cvc5_delete(slv);
    2201                 :          1 :   cvc5_term_manager_release(tm);
    2202                 :          1 :   cvc5_term_manager_delete(tm);
    2203         [ +  - ]:          1 : }
    2204                 :            : 
    2205                 :          4 : TEST_F(TestCApiBlackSolver, declare_sep_heap)
    2206                 :            : {
    2207                 :          1 :   cvc5_set_logic(d_solver, "ALL");
    2208                 :          1 :   cvc5_set_option(d_solver, "incremental", "false");
    2209                 :          1 :   cvc5_declare_sep_heap(d_solver, d_int, d_int);
    2210                 :            :   // cannot declare separation logic heap more than once
    2211 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_declare_sep_heap(d_solver, d_int, d_int),
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    2212                 :            :                     "cannot declare heap types");
    2213                 :            : 
    2214                 :          1 :   Cvc5TermManager* tm = cvc5_term_manager_new();
    2215                 :            :   // no logic set yet
    2216                 :          1 :   Cvc5* slv = cvc5_new(tm);
    2217 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_declare_sep_heap(d_solver, d_int, d_int),
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    2218                 :            :                     "cannot declare heap types");
    2219                 :          1 :   cvc5_delete(slv);
    2220                 :            : 
    2221                 :          1 :   slv = cvc5_new(tm);
    2222                 :          1 :   cvc5_set_logic(slv, "ALL");
    2223 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    2224                 :            :       cvc5_declare_sep_heap(slv, cvc5_get_integer_sort(tm), d_int),
    2225                 :            :       "sort is not associated with the term manager of this solver");
    2226                 :          1 :   cvc5_delete(slv);
    2227                 :            : 
    2228                 :          1 :   slv = cvc5_new(tm);
    2229                 :          1 :   cvc5_set_logic(slv, "ALL");
    2230 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    2231                 :            :       cvc5_declare_sep_heap(slv, d_int, cvc5_get_integer_sort(tm)),
    2232                 :            :       "sort is not associated with the term manager of this solver");
    2233                 :          1 :   cvc5_delete(slv);
    2234                 :          1 :   cvc5_term_manager_release(tm);
    2235                 :          1 :   cvc5_term_manager_delete(tm);
    2236                 :            : }
    2237                 :            : 
    2238                 :          4 : TEST_F(TestCApiBlackSolver, get_value_sep_heap1)
    2239                 :            : {
    2240                 :          1 :   cvc5_set_logic(d_solver, "QF_BV");
    2241                 :          1 :   cvc5_set_option(d_solver, "incremental", "false");
    2242                 :          1 :   cvc5_set_option(d_solver, "produce-models", "true");
    2243                 :          1 :   Cvc5Term t = cvc5_mk_true(d_tm);
    2244                 :          1 :   cvc5_assert_formula(d_solver, t);
    2245 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_get_value_sep_heap(d_solver),
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    2246                 :            :                     "cannot obtain separation logic expressions");
    2247                 :            : }
    2248                 :            : 
    2249                 :          4 : TEST_F(TestCApiBlackSolver, get_value_sep_heap2)
    2250                 :            : {
    2251                 :          1 :   cvc5_set_logic(d_solver, "ALL");
    2252                 :          1 :   cvc5_set_option(d_solver, "incremental", "false");
    2253                 :          1 :   cvc5_set_option(d_solver, "produce-models", "false");
    2254                 :          1 :   check_simple_separation_constraints();
    2255 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_get_value_sep_heap(d_solver),
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    2256                 :            :                     "cannot get separation heap term");
    2257                 :            : }
    2258                 :            : 
    2259                 :          4 : TEST_F(TestCApiBlackSolver, get_value_sep_heap3)
    2260                 :            : {
    2261                 :          1 :   cvc5_set_logic(d_solver, "ALL");
    2262                 :          1 :   cvc5_set_option(d_solver, "incremental", "false");
    2263                 :          1 :   cvc5_set_option(d_solver, "produce-models", "true");
    2264                 :          1 :   Cvc5Term t = cvc5_mk_false(d_tm);
    2265                 :          1 :   cvc5_assert_formula(d_solver, t);
    2266                 :          1 :   cvc5_check_sat(d_solver);
    2267 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_get_value_sep_heap(d_solver), "after SAT or UNKNOWN");
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    2268                 :            : }
    2269                 :            : 
    2270                 :          4 : TEST_F(TestCApiBlackSolver, get_value_sep_heap4)
    2271                 :            : {
    2272                 :          1 :   cvc5_set_logic(d_solver, "ALL");
    2273                 :          1 :   cvc5_set_option(d_solver, "incremental", "false");
    2274                 :          1 :   cvc5_set_option(d_solver, "produce-models", "true");
    2275                 :          1 :   Cvc5Term t = cvc5_mk_true(d_tm);
    2276                 :          1 :   cvc5_assert_formula(d_solver, t);
    2277                 :          1 :   cvc5_check_sat(d_solver);
    2278 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_get_value_sep_heap(d_solver),
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    2279                 :            :                     "Failed to obtain heap/nil");
    2280                 :            : }
    2281                 :            : 
    2282                 :          4 : TEST_F(TestCApiBlackSolver, get_value_sep_heap5)
    2283                 :            : {
    2284                 :          1 :   cvc5_set_logic(d_solver, "ALL");
    2285                 :          1 :   cvc5_set_option(d_solver, "incremental", "false");
    2286                 :          1 :   cvc5_set_option(d_solver, "produce-models", "true");
    2287                 :          1 :   check_simple_separation_constraints();
    2288                 :          1 :   (void)cvc5_get_value_sep_heap(d_solver);
    2289                 :          1 : }
    2290                 :            : 
    2291                 :          4 : TEST_F(TestCApiBlackSolver, get_value_sep_nil1)
    2292                 :            : {
    2293                 :          1 :   cvc5_set_logic(d_solver, "QF_BV");
    2294                 :          1 :   cvc5_set_option(d_solver, "incremental", "false");
    2295                 :          1 :   cvc5_set_option(d_solver, "produce-models", "true");
    2296                 :          1 :   Cvc5Term t = cvc5_mk_true(d_tm);
    2297                 :          1 :   cvc5_assert_formula(d_solver, t);
    2298 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_get_value_sep_nil(d_solver),
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    2299                 :            :                     "cannot obtain separation logic expressions");
    2300                 :            : }
    2301                 :            : 
    2302                 :          4 : TEST_F(TestCApiBlackSolver, get_value_sep_nil2)
    2303                 :            : {
    2304                 :          1 :   cvc5_set_logic(d_solver, "ALL");
    2305                 :          1 :   cvc5_set_option(d_solver, "incremental", "false");
    2306                 :          1 :   cvc5_set_option(d_solver, "produce-models", "false");
    2307                 :          1 :   check_simple_separation_constraints();
    2308 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_get_value_sep_nil(d_solver),
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    2309                 :            :                     "cannot get separation nil");
    2310                 :            : }
    2311                 :            : 
    2312                 :          4 : TEST_F(TestCApiBlackSolver, get_value_sep_nil3)
    2313                 :            : {
    2314                 :          1 :   cvc5_set_logic(d_solver, "ALL");
    2315                 :          1 :   cvc5_set_option(d_solver, "incremental", "false");
    2316                 :          1 :   cvc5_set_option(d_solver, "produce-models", "true");
    2317                 :          1 :   Cvc5Term t = cvc5_mk_false(d_tm);
    2318                 :          1 :   cvc5_assert_formula(d_solver, t);
    2319                 :          1 :   cvc5_check_sat(d_solver);
    2320 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_get_value_sep_nil(d_solver), "after SAT or UNKNOWN");
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    2321                 :            : }
    2322                 :            : 
    2323                 :          4 : TEST_F(TestCApiBlackSolver, get_value_sep_nil4)
    2324                 :            : {
    2325                 :          1 :   cvc5_set_logic(d_solver, "ALL");
    2326                 :          1 :   cvc5_set_option(d_solver, "incremental", "false");
    2327                 :          1 :   cvc5_set_option(d_solver, "produce-models", "true");
    2328                 :          1 :   Cvc5Term t = cvc5_mk_true(d_tm);
    2329                 :          1 :   cvc5_assert_formula(d_solver, t);
    2330                 :          1 :   cvc5_check_sat(d_solver);
    2331 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_get_value_sep_nil(d_solver),
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    2332                 :            :                     "Failed to obtain heap/nil expressions");
    2333                 :            : }
    2334                 :            : 
    2335                 :          4 : TEST_F(TestCApiBlackSolver, get_value_sep_nil5)
    2336                 :            : {
    2337                 :          1 :   cvc5_set_logic(d_solver, "ALL");
    2338                 :          1 :   cvc5_set_option(d_solver, "incremental", "false");
    2339                 :          1 :   cvc5_set_option(d_solver, "produce-models", "true");
    2340                 :          1 :   check_simple_separation_constraints();
    2341                 :          1 :   cvc5_get_value_sep_nil(d_solver);
    2342                 :          1 : }
    2343                 :            : 
    2344                 :          4 : TEST_F(TestCApiBlackSolver, push1)
    2345                 :            : {
    2346                 :          1 :   cvc5_set_option(d_solver, "incremental", "true");
    2347                 :          1 :   cvc5_push(d_solver, 1);
    2348 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_set_option(d_solver, "incremental", "false"),
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    2349                 :            :                     "is already fully initialized");
    2350 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_set_option(d_solver, "incremental", "true"),
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    2351                 :            :                     "is already fully initialized");
    2352                 :            : }
    2353                 :            : 
    2354                 :          4 : TEST_F(TestCApiBlackSolver, push2)
    2355                 :            : {
    2356                 :          1 :   cvc5_set_option(d_solver, "incremental", "false");
    2357 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_push(d_solver, 1), "cannot push");
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    2358                 :            : }
    2359                 :            : 
    2360                 :          4 : TEST_F(TestCApiBlackSolver, push3)
    2361                 :            : {
    2362                 :          1 :   cvc5_set_option(d_solver, "incremental", "false");
    2363 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_push(nullptr, 1), "unexpected NULL argument");
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    2364                 :            : }
    2365                 :            : 
    2366                 :          4 : TEST_F(TestCApiBlackSolver, pop1)
    2367                 :            : {
    2368                 :          1 :   cvc5_set_option(d_solver, "incremental", "false");
    2369 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_pop(d_solver, 1), "cannot pop");
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    2370                 :            : }
    2371                 :            : 
    2372                 :          4 : TEST_F(TestCApiBlackSolver, pop2)
    2373                 :            : {
    2374                 :          1 :   cvc5_set_option(d_solver, "incremental", "true");
    2375 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_pop(d_solver, 1), "cannot pop");
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    2376                 :            : }
    2377                 :            : 
    2378                 :          4 : TEST_F(TestCApiBlackSolver, pop3)
    2379                 :            : {
    2380                 :          1 :   cvc5_set_option(d_solver, "incremental", "true");
    2381                 :          1 :   cvc5_push(d_solver, 1);
    2382                 :          1 :   cvc5_pop(d_solver, 1);
    2383 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_pop(d_solver, 1), "cannot pop");
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    2384                 :            : }
    2385                 :            : 
    2386                 :          4 : TEST_F(TestCApiBlackSolver, pop4)
    2387                 :            : {
    2388                 :          1 :   cvc5_set_option(d_solver, "incremental", "false");
    2389 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_pop(nullptr, 1), "unexpected NULL argument");
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    2390                 :            : }
    2391                 :            : 
    2392                 :          4 : TEST_F(TestCApiBlackSolver, set_info)
    2393                 :            : {
    2394 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_set_info(d_solver, "cvc5-lagic", "QF_BV"),
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    2395                 :            :                     "unrecognized keyword");
    2396 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_set_info(d_solver, "cvc2-logic", "QF_BV"),
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    2397                 :            :                     "unrecognized keyword");
    2398 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_set_info(d_solver, "cvc5-logic", "asdf"),
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    2399                 :            :                     "unrecognized keyword");
    2400                 :            : 
    2401 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_set_info(nullptr, "source", "asdf"),
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    2402                 :            :                     "unexpected NULL argument");
    2403 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_set_info(d_solver, nullptr, "asdf"),
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    2404                 :            :                     "unexpected NULL argument");
    2405 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_set_info(d_solver, "source", nullptr),
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    2406                 :            :                     "unexpected NULL argument");
    2407                 :            : 
    2408                 :          1 :   cvc5_set_info(d_solver, "source", "asdf");
    2409                 :          1 :   cvc5_set_info(d_solver, "category", "asdf");
    2410                 :          1 :   cvc5_set_info(d_solver, "difficulty", "asdf");
    2411                 :          1 :   cvc5_set_info(d_solver, "filename", "asdf");
    2412                 :          1 :   cvc5_set_info(d_solver, "license", "asdf");
    2413                 :          1 :   cvc5_set_info(d_solver, "name", "asdf");
    2414                 :          1 :   cvc5_set_info(d_solver, "notes", "asdf");
    2415                 :            : 
    2416                 :          1 :   cvc5_set_info(d_solver, "smt-lib-version", "2");
    2417                 :          1 :   cvc5_set_info(d_solver, "smt-lib-version", "2.0");
    2418                 :          1 :   cvc5_set_info(d_solver, "smt-lib-version", "2.5");
    2419                 :          1 :   cvc5_set_info(d_solver, "smt-lib-version", "2.6");
    2420 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_set_info(d_solver, "smt-lib-version", ".0"),
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    2421                 :            :                     "invalid argument");
    2422                 :            : 
    2423                 :          1 :   cvc5_set_info(d_solver, "status", "sat");
    2424                 :          1 :   cvc5_set_info(d_solver, "status", "unsat");
    2425                 :          1 :   cvc5_set_info(d_solver, "status", "unknown");
    2426 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_set_info(d_solver, "status", "asdf"),
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    2427                 :            :                     "invalid argument");
    2428                 :            : }
    2429                 :            : 
    2430                 :          4 : TEST_F(TestCApiBlackSolver, set_logic)
    2431                 :            : {
    2432 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_set_logic(nullptr, "AUFLIRA"),
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    2433                 :            :                     "unexpected NULL argument");
    2434 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_set_logic(d_solver, nullptr),
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    2435                 :            :                     "unexpected NULL argument");
    2436                 :            : 
    2437                 :          1 :   cvc5_set_logic(d_solver, "AUFLIRA");
    2438                 :            : 
    2439 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_set_logic(d_solver, "AF_BV"), "logic is already set");
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    2440                 :          1 :   cvc5_assert_formula(d_solver, cvc5_mk_true(d_tm));
    2441 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_set_logic(d_solver, "AUFLIRA"),
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    2442                 :            :                     "logic is already set");
    2443                 :            : }
    2444                 :            : 
    2445                 :          4 : TEST_F(TestCApiBlackSolver, is_logic_set)
    2446                 :            : {
    2447 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_is_logic_set(nullptr), "unexpected NULL argument");
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    2448 [ -  + ][ +  - ]:          1 :   ASSERT_FALSE(cvc5_is_logic_set(d_solver));
    2449                 :          1 :   cvc5_set_logic(d_solver, "QF_BV");
    2450 [ -  + ][ +  - ]:          1 :   ASSERT_TRUE(cvc5_is_logic_set(d_solver));
    2451                 :            : }
    2452                 :            : 
    2453                 :          4 : TEST_F(TestCApiBlackSolver, get_logic)
    2454                 :            : {
    2455 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_get_logic(nullptr), "unexpected NULL argument");
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    2456 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_get_logic(d_solver), "logic has not yet been set");
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    2457                 :          1 :   cvc5_set_logic(d_solver, "QF_BV");
    2458 [ -  + ][ +  - ]:          1 :   ASSERT_EQ(cvc5_get_logic(d_solver), std::string("QF_BV"));
    2459                 :            : }
    2460                 :            : 
    2461                 :          4 : TEST_F(TestCApiBlackSolver, set_option)
    2462                 :            : {
    2463                 :          1 :   cvc5_set_option(d_solver, "bv-sat-solver", "cadical");
    2464 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_set_option(d_solver, "bv-sat-solver", "1"),
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    2465                 :            :                     "unknown option");
    2466                 :          1 :   cvc5_assert_formula(d_solver, cvc5_mk_true(d_tm));
    2467 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_set_option(d_solver, "bv-sat-solver", "cadical"),
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    2468                 :            :                     "fully initialized");
    2469                 :            : }
    2470                 :            : 
    2471                 :          4 : TEST_F(TestCApiBlackSolver, reset_assertions)
    2472                 :            : {
    2473 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_set_option(nullptr, "incremental", "true"),
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    2474                 :            :                     "unexpected NULL argument");
    2475 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_set_option(d_solver, nullptr, "true"),
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    2476                 :            :                     "unexpected NULL argument");
    2477 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_set_option(d_solver, "incremental", nullptr),
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    2478                 :            :                     "unexpected NULL argument");
    2479                 :            : 
    2480                 :          1 :   cvc5_set_option(d_solver, "incremental", "true");
    2481                 :            : 
    2482                 :          1 :   Cvc5Sort bv_sort = cvc5_mk_bv_sort(d_tm, 4);
    2483                 :          1 :   Cvc5Term one = cvc5_mk_bv_uint64(d_tm, 4, 1);
    2484                 :          1 :   Cvc5Term x = cvc5_mk_const(d_tm, bv_sort, "x");
    2485                 :          2 :   std::vector<Cvc5Term> args = {x, one};
    2486                 :            :   Cvc5Term ule =
    2487                 :          1 :       cvc5_mk_term(d_tm, CVC5_KIND_BITVECTOR_ULE, args.size(), args.data());
    2488                 :          1 :   args = {one, x};
    2489                 :            :   Cvc5Term srem =
    2490                 :          1 :       cvc5_mk_term(d_tm, CVC5_KIND_BITVECTOR_SREM, args.size(), args.data());
    2491                 :          1 :   cvc5_push(d_solver, 4);
    2492                 :          1 :   args = {srem, one};
    2493                 :            :   Cvc5Term slt =
    2494                 :          1 :       cvc5_mk_term(d_tm, CVC5_KIND_BITVECTOR_SLT, args.size(), args.data());
    2495                 :          1 :   cvc5_reset_assertions(d_solver);
    2496                 :          1 :   args = {slt, ule};
    2497                 :          1 :   cvc5_check_sat_assuming(d_solver, args.size(), args.data());
    2498                 :            : }
    2499                 :            : 
    2500                 :          4 : TEST_F(TestCApiBlackSolver, declare_sygus_var)
    2501                 :            : {
    2502                 :          1 :   cvc5_set_option(d_solver, "sygus", "true");
    2503                 :            : 
    2504                 :          1 :   std::vector<Cvc5Sort> domain = {d_int};
    2505                 :            :   Cvc5Sort fun_sort =
    2506                 :          1 :       cvc5_mk_fun_sort(d_tm, domain.size(), domain.data(), d_bool);
    2507                 :            : 
    2508                 :          1 :   (void)cvc5_declare_sygus_var(d_solver, "", d_bool);
    2509                 :          1 :   (void)cvc5_declare_sygus_var(d_solver, "", fun_sort);
    2510                 :          1 :   (void)cvc5_declare_sygus_var(d_solver, "b", d_bool);
    2511                 :            : 
    2512 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_declare_sygus_var(nullptr, "", d_bool),
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    2513                 :            :                     "unexpected NULL argument");
    2514 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_declare_sygus_var(d_solver, nullptr, d_bool),
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    2515                 :            :                     "unexpected NULL argument");
    2516 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_declare_sygus_var(d_solver, "", nullptr),
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    2517                 :            :                     "invalid sort");
    2518                 :            : 
    2519                 :          1 :   Cvc5* slv = cvc5_new(d_tm);
    2520 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_declare_sygus_var(slv, "", d_bool), "cannot call");
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    2521                 :          1 :   cvc5_delete(slv);
    2522                 :            : 
    2523                 :          1 :   Cvc5TermManager* tm = cvc5_term_manager_new();
    2524                 :          1 :   slv = cvc5_new(tm);
    2525                 :          1 :   cvc5_set_option(slv, "sygus", "true");
    2526 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    2527                 :            :       cvc5_declare_sygus_var(slv, "", d_bool),
    2528                 :            :       "sort is not associated with the term manager of this solver");
    2529                 :          1 :   cvc5_delete(slv);
    2530                 :          1 :   cvc5_term_manager_release(tm);
    2531                 :          1 :   cvc5_term_manager_delete(tm);
    2532         [ +  - ]:          1 : }
    2533                 :            : 
    2534                 :          4 : TEST_F(TestCApiBlackSolver, mk_grammar)
    2535                 :            : {
    2536                 :          1 :   Cvc5Term bt = cvc5_mk_true(d_tm);
    2537                 :          1 :   Cvc5Term bv = cvc5_mk_var(d_tm, d_bool, "b");
    2538                 :          1 :   Cvc5Term iv = cvc5_mk_var(d_tm, d_int, "i");
    2539                 :            : 
    2540                 :          1 :   std::vector<Cvc5Term> bvars;
    2541                 :          1 :   std::vector<Cvc5Term> symbols = {iv};
    2542                 :          2 :   (void)cvc5_mk_grammar(
    2543                 :          2 :       d_solver, bvars.size(), bvars.data(), symbols.size(), symbols.data());
    2544                 :          1 :   bvars = {bv};
    2545                 :          2 :   (void)cvc5_mk_grammar(
    2546                 :          2 :       d_solver, bvars.size(), bvars.data(), symbols.size(), symbols.data());
    2547                 :            : 
    2548 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    2549                 :            :       cvc5_mk_grammar(
    2550                 :            :           nullptr, bvars.size(), bvars.data(), symbols.size(), symbols.data()),
    2551                 :            :       "unexpected NULL argument");
    2552 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    2553                 :            :       cvc5_mk_grammar(
    2554                 :            :           d_solver, bvars.size(), bvars.data(), symbols.size(), nullptr),
    2555                 :            :       "unexpected NULL argument");
    2556                 :            : 
    2557 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    2558                 :            :       cvc5_mk_grammar(
    2559                 :            :           d_solver, bvars.size(), nullptr, symbols.size(), symbols.data()),
    2560                 :            :       "unexpected NULL argument");
    2561                 :            : 
    2562                 :          1 :   symbols = {nullptr};
    2563 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    2564                 :            :       cvc5_mk_grammar(
    2565                 :            :           d_solver, bvars.size(), bvars.data(), symbols.size(), symbols.data()),
    2566                 :            :       "invalid term at index 0");
    2567                 :          1 :   bvars = {nullptr};
    2568                 :          1 :   symbols = {iv};
    2569 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    2570                 :            :       cvc5_mk_grammar(
    2571                 :            :           d_solver, bvars.size(), bvars.data(), symbols.size(), symbols.data()),
    2572                 :            :       "invalid term at index 0");
    2573                 :          1 :   bvars = {};
    2574                 :          1 :   symbols = {bt};
    2575 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    2576                 :            :       cvc5_mk_grammar(
    2577                 :            :           d_solver, bvars.size(), bvars.data(), symbols.size(), symbols.data()),
    2578                 :            :       "expected a bound variable");
    2579                 :          1 :   bvars = {bt};
    2580                 :          1 :   symbols = {iv};
    2581 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    2582                 :            :       cvc5_mk_grammar(
    2583                 :            :           d_solver, bvars.size(), bvars.data(), symbols.size(), symbols.data()),
    2584                 :            :       "expected a bound variable");
    2585                 :            : 
    2586                 :          1 :   Cvc5TermManager* tm = cvc5_term_manager_new();
    2587                 :          1 :   Cvc5* slv = cvc5_new(tm);
    2588                 :          1 :   bvars = {};
    2589                 :          1 :   symbols = {iv};
    2590 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    2591                 :            :       cvc5_mk_grammar(
    2592                 :            :           slv, bvars.size(), bvars.data(), symbols.size(), symbols.data()),
    2593                 :            :       "expected a term associated with the term manager of this solver");
    2594                 :          1 :   bvars = {bv};
    2595                 :          1 :   symbols = {cvc5_mk_var(tm, cvc5_get_integer_sort(tm), "")};
    2596 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    2597                 :            :       cvc5_mk_grammar(
    2598                 :            :           d_solver, bvars.size(), bvars.data(), symbols.size(), symbols.data()),
    2599                 :            :       "expected a term associated with the term manager of this solver");
    2600                 :          1 :   cvc5_delete(slv);
    2601                 :          1 :   cvc5_term_manager_release(tm);
    2602                 :          1 :   cvc5_term_manager_delete(tm);
    2603 [ +  - ][ +  - ]:          1 : }
    2604                 :            : 
    2605                 :          4 : TEST_F(TestCApiBlackSolver, synth_fun)
    2606                 :            : {
    2607                 :          1 :   cvc5_set_option(d_solver, "sygus", "true");
    2608                 :            : 
    2609                 :          1 :   Cvc5Term x = cvc5_mk_var(d_tm, d_bool, "");
    2610                 :          1 :   Cvc5Term start1 = cvc5_mk_var(d_tm, d_bool, "");
    2611                 :          1 :   Cvc5Term start2 = cvc5_mk_var(d_tm, d_int, "");
    2612                 :            : 
    2613                 :          1 :   std::vector<Cvc5Term> bvars{x};
    2614                 :          1 :   std::vector<Cvc5Term> symbols{start1};
    2615                 :          2 :   Cvc5Grammar g1 = cvc5_mk_grammar(
    2616                 :          2 :       d_solver, bvars.size(), bvars.data(), symbols.size(), symbols.data());
    2617                 :            : 
    2618                 :          1 :   (void)cvc5_synth_fun(d_solver, "", 0, nullptr, d_bool);
    2619                 :          1 :   (void)cvc5_synth_fun(d_solver, "f1", bvars.size(), bvars.data(), d_bool);
    2620 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    2621                 :            :       cvc5_synth_fun(d_solver, "f3", bvars.size(), nullptr, d_bool),
    2622                 :            :       "unexpected NULL argument");
    2623                 :          1 :   std::vector<Cvc5Term> null_bvars{nullptr};
    2624 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    2625                 :            :       cvc5_synth_fun(
    2626                 :            :           d_solver, "f4", null_bvars.size(), null_bvars.data(), d_bool),
    2627                 :            :       "invalid term at index 0");
    2628 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_synth_fun_with_grammar(
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    2629                 :            :                         d_solver, "f2", bvars.size(), bvars.data(), d_bool, g1),
    2630                 :            :                     "invalid grammar");
    2631                 :            : 
    2632                 :          1 :   cvc5_grammar_add_rule(g1, start1, cvc5_mk_false(d_tm));
    2633                 :            : 
    2634                 :          1 :   symbols = {start2};
    2635                 :          2 :   Cvc5Grammar g2 = cvc5_mk_grammar(
    2636                 :          2 :       d_solver, bvars.size(), bvars.data(), symbols.size(), symbols.data());
    2637                 :          1 :   cvc5_grammar_add_rule(g2, start2, cvc5_mk_integer_int64(d_tm, 0));
    2638                 :            : 
    2639                 :          1 :   cvc5_synth_fun_with_grammar(
    2640                 :          1 :       d_solver, "f2", bvars.size(), bvars.data(), d_bool, g1);
    2641 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_synth_fun_with_grammar(
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    2642                 :            :                         nullptr, "f2", bvars.size(), bvars.data(), d_bool, g1),
    2643                 :            :                     "unexpected NULL argument");
    2644 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    2645                 :            :       cvc5_synth_fun_with_grammar(
    2646                 :            :           d_solver, "f2", bvars.size(), bvars.data(), nullptr, g1),
    2647                 :            :       "invalid sort");
    2648 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    2649                 :            :       cvc5_synth_fun_with_grammar(
    2650                 :            :           d_solver, "f2", bvars.size(), bvars.data(), d_bool, nullptr),
    2651                 :            :       "invalid grammar");
    2652 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_synth_fun_with_grammar(
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    2653                 :            :                         d_solver, "f2", bvars.size(), nullptr, d_bool, g1),
    2654                 :            :                     "unexpected NULL argument");
    2655 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    2656                 :            :       cvc5_synth_fun_with_grammar(
    2657                 :            :           d_solver, "f2", null_bvars.size(), null_bvars.data(), d_bool, g1),
    2658                 :            :       "invalid term at index 0");
    2659                 :            : 
    2660 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_synth_fun_with_grammar(
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    2661                 :            :                         d_solver, "f6", bvars.size(), bvars.data(), d_bool, g2),
    2662                 :            :                     "invalid Start symbol");
    2663                 :            : 
    2664                 :          1 :   Cvc5TermManager* tm = cvc5_term_manager_new();
    2665                 :          1 :   Cvc5* slv = cvc5_new(tm);
    2666 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    2667                 :            :       cvc5_synth_fun_with_grammar(
    2668                 :            :           slv, "f8", bvars.size(), bvars.data(), d_bool, g1),
    2669                 :            :       "expected a term associated with the term manager of this solver");
    2670                 :          1 :   cvc5_delete(slv);
    2671                 :          1 :   cvc5_term_manager_release(tm);
    2672                 :          1 :   cvc5_term_manager_delete(tm);
    2673 [ +  - ][ +  - ]:          1 : }
    2674                 :            : 
    2675                 :          4 : TEST_F(TestCApiBlackSolver, declare_pool)
    2676                 :            : {
    2677                 :          1 :   Cvc5Sort set_sort = cvc5_mk_set_sort(d_tm, d_int);
    2678                 :          1 :   Cvc5Term zero = cvc5_mk_integer_int64(d_tm, 0);
    2679                 :          1 :   Cvc5Term x = cvc5_mk_const(d_tm, d_int, "x");
    2680                 :          1 :   Cvc5Term y = cvc5_mk_const(d_tm, d_int, "y");
    2681                 :            :   // declare a pool with initial value { 0, x, y }
    2682                 :          1 :   std::vector<Cvc5Term> args = {zero, x, y};
    2683                 :            :   Cvc5Term p =
    2684                 :          1 :       cvc5_declare_pool(d_solver, "p", d_int, args.size(), args.data());
    2685                 :            :   // pool should have the same sort
    2686 [ -  + ][ +  - ]:          1 :   ASSERT_TRUE(cvc5_sort_is_equal(cvc5_term_get_sort(p), set_sort));
    2687                 :            : 
    2688 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    2689                 :            :       cvc5_declare_pool(nullptr, "p", d_int, args.size(), args.data()),
    2690                 :            :       "unexpected NULL argument");
    2691 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    2692                 :            :       cvc5_declare_pool(d_solver, nullptr, d_int, args.size(), args.data()),
    2693                 :            :       "unexpected NULL argument");
    2694 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    2695                 :            :       cvc5_declare_pool(d_solver, "p", nullptr, args.size(), args.data()),
    2696                 :            :       "invalid sort");
    2697                 :            : 
    2698                 :            :   // no init values is allowed
    2699                 :          1 :   (void)cvc5_declare_pool(d_solver, "p", d_int, 0, nullptr);
    2700                 :            : 
    2701                 :          1 :   args = {nullptr, x, y};
    2702 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    2703                 :            :       cvc5_declare_pool(d_solver, "p", d_int, args.size(), args.data()),
    2704                 :            :       "invalid term at index 0");
    2705                 :          1 :   args = {zero, nullptr, y};
    2706 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    2707                 :            :       cvc5_declare_pool(d_solver, "p", d_int, args.size(), args.data()),
    2708                 :            :       "invalid term at index 1");
    2709                 :          1 :   args = {zero, x, nullptr};
    2710 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    2711                 :            :       cvc5_declare_pool(d_solver, "p", d_int, args.size(), args.data()),
    2712                 :            :       "invalid term at index 2");
    2713                 :            : 
    2714                 :          1 :   Cvc5TermManager* tm = cvc5_term_manager_new();
    2715                 :          1 :   Cvc5* slv = cvc5_new(tm);
    2716                 :          1 :   args = {zero, x, y};
    2717                 :          1 :   Cvc5Term zero2 = cvc5_mk_integer_int64(tm, 0);
    2718                 :          1 :   Cvc5Term x2 = cvc5_mk_const(tm, cvc5_get_integer_sort(tm), "x");
    2719                 :          1 :   Cvc5Term y2 = cvc5_mk_const(tm, cvc5_get_integer_sort(tm), "y");
    2720                 :          1 :   std::vector<Cvc5Term> args2 = {zero2, x2, y2};
    2721 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    2722                 :            :       cvc5_declare_pool(slv, "p", d_int, args2.size(), args2.data()),
    2723                 :            :       "sort is not associated with the term manager of this solver");
    2724 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    2725                 :            :       cvc5_declare_pool(
    2726                 :            :           slv, "p", cvc5_get_integer_sort(tm), args.size(), args.data()),
    2727                 :            :       "expected a term associated with the term manager of this solver");
    2728                 :          1 :   args2 = {zero2, x, y2};
    2729 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    2730                 :            :       cvc5_declare_pool(
    2731                 :            :           slv, "p", cvc5_get_integer_sort(tm), args2.size(), args2.data()),
    2732                 :            :       "expected a term associated with the term manager of this solver");
    2733                 :          1 :   cvc5_delete(slv);
    2734                 :          1 :   cvc5_term_manager_release(tm);
    2735                 :          1 :   cvc5_term_manager_delete(tm);
    2736         [ +  - ]:          1 : }
    2737                 :            : 
    2738                 :          4 : TEST_F(TestCApiBlackSolver, declare_oracle_fun_unsat)
    2739                 :            : {
    2740                 :          1 :   cvc5_set_option(d_solver, "oracles", "true");
    2741                 :            :   // f is the function implementing (lambda ((x Int)) (+ x 1))
    2742                 :          1 :   std::vector<Cvc5Sort> sorts = {d_int};
    2743                 :          2 :   Cvc5Term f = cvc5_declare_oracle_fun(
    2744                 :            :       d_solver,
    2745                 :            :       "f",
    2746                 :            :       sorts.size(),
    2747                 :          1 :       sorts.data(),
    2748                 :            :       d_int,
    2749                 :          1 :       d_tm,
    2750                 :          1 :       [](size_t, const Cvc5Term* input, void* state) {
    2751                 :          1 :         Cvc5TermManager* ctm = static_cast<Cvc5TermManager*>(state);
    2752         [ +  - ]:          1 :         if (cvc5_term_is_uint32_value(input[0]))
    2753                 :            :         {
    2754                 :          2 :           return cvc5_mk_integer_int64(
    2755                 :          1 :               ctm, cvc5_term_get_uint32_value(input[0]) + 1);
    2756                 :            :         }
    2757                 :          0 :         return cvc5_mk_integer_int64(ctm, 0);
    2758                 :            :       });
    2759                 :            : 
    2760                 :          1 :   Cvc5Term three = cvc5_mk_integer_int64(d_tm, 3);
    2761                 :          1 :   Cvc5Term five = cvc5_mk_integer_int64(d_tm, 5);
    2762                 :          1 :   std::vector<Cvc5Term> args = {f, three};
    2763                 :          1 :   args = {cvc5_mk_term(d_tm, CVC5_KIND_APPLY_UF, args.size(), args.data()),
    2764                 :          1 :           five};
    2765                 :          1 :   cvc5_assert_formula(
    2766                 :          1 :       d_solver, cvc5_mk_term(d_tm, CVC5_KIND_EQUAL, args.size(), args.data()));
    2767                 :            :   // (f 3) = 5
    2768 [ -  + ][ +  - ]:          1 :   ASSERT_TRUE(cvc5_result_is_unsat(cvc5_check_sat(d_solver)));
    2769                 :            : 
    2770                 :          1 :   Cvc5TermManager* tm = cvc5_term_manager_new();
    2771                 :          1 :   Cvc5* slv = cvc5_new(tm);
    2772                 :          1 :   cvc5_set_option(slv, "oracles", "true");
    2773                 :          1 :   Cvc5Sort int_sort = cvc5_get_integer_sort(tm);
    2774                 :          1 :   std::vector<Cvc5Sort> sorts2 = {int_sort};
    2775 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    2776                 :            :       cvc5_declare_oracle_fun(
    2777                 :            :           slv,
    2778                 :            :           "f",
    2779                 :            :           sorts.size(),
    2780                 :            :           sorts.data(),
    2781                 :            :           int_sort,
    2782                 :            :           tm,
    2783                 :            :           [](size_t, const Cvc5Term* input, void* state) {
    2784                 :            :             Cvc5TermManager* ctm = static_cast<Cvc5TermManager*>(state);
    2785                 :            :             if (cvc5_term_is_uint32_value(input[0]))
    2786                 :            :             {
    2787                 :            :               return cvc5_mk_integer_int64(
    2788                 :            :                   ctm, cvc5_term_get_uint32_value(input[0]) + 1);
    2789                 :            :             }
    2790                 :            :             return cvc5_mk_integer_int64(ctm, 0);
    2791                 :            :           }),
    2792                 :            :       "expected a sort associated with the term manager of this solver");
    2793 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    2794                 :            :       cvc5_declare_oracle_fun(
    2795                 :            :           slv,
    2796                 :            :           "f",
    2797                 :            :           sorts2.size(),
    2798                 :            :           sorts2.data(),
    2799                 :            :           d_int,
    2800                 :            :           tm,
    2801                 :            :           [](size_t, const Cvc5Term* input, void* state) {
    2802                 :            :             Cvc5TermManager* ctm = static_cast<Cvc5TermManager*>(state);
    2803                 :            :             if (cvc5_term_is_uint32_value(input[0]))
    2804                 :            :             {
    2805                 :            :               return cvc5_mk_integer_int64(
    2806                 :            :                   ctm, cvc5_term_get_uint32_value(input[0]) + 1);
    2807                 :            :             }
    2808                 :            :             return cvc5_mk_integer_int64(ctm, 0);
    2809                 :            :           }),
    2810                 :            :       "sort is not associated with the term manager of this solver");
    2811                 :            :   // this cannot be caught during declaration, is caught during check-sat
    2812                 :          2 :   Cvc5Term f2 = cvc5_declare_oracle_fun(
    2813                 :            :       slv,
    2814                 :            :       "f",
    2815                 :            :       sorts2.size(),
    2816                 :          1 :       sorts2.data(),
    2817                 :            :       int_sort,
    2818                 :          1 :       d_tm,
    2819                 :          1 :       [](size_t, const Cvc5Term* input, void* state) {
    2820                 :          1 :         Cvc5TermManager* ctm = static_cast<Cvc5TermManager*>(state);
    2821         [ +  - ]:          1 :         if (cvc5_term_is_uint32_value(input[0]))
    2822                 :            :         {
    2823                 :          2 :           return cvc5_mk_integer_int64(
    2824                 :          1 :               ctm, cvc5_term_get_uint32_value(input[0]) + 1);
    2825                 :            :         }
    2826                 :          0 :         return cvc5_mk_integer_int64(ctm, 0);
    2827                 :            :       });
    2828                 :          1 :   Cvc5Term three2 = cvc5_mk_integer_int64(tm, 3);
    2829                 :          1 :   Cvc5Term five2 = cvc5_mk_integer_int64(tm, 5);
    2830                 :          1 :   std::vector<Cvc5Term> args2 = {f2, three2};
    2831                 :          1 :   args2 = {cvc5_mk_term(tm, CVC5_KIND_APPLY_UF, args2.size(), args2.data()),
    2832                 :          1 :            five2};
    2833                 :          1 :   cvc5_assert_formula(
    2834                 :          1 :       slv, cvc5_mk_term(tm, CVC5_KIND_EQUAL, args2.size(), args2.data()));
    2835                 :            :   // (f 3) = 5
    2836 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    2837                 :            :       cvc5_check_sat(slv),
    2838                 :            :       "Evaluated an oracle call that is not associated with the term "
    2839                 :            :       "manager of this solver");
    2840                 :          1 :   cvc5_delete(slv);
    2841                 :          1 :   cvc5_term_manager_release(tm);
    2842                 :          1 :   cvc5_term_manager_delete(tm);
    2843 [ +  - ][ +  - ]:          1 : }
    2844                 :            : 
    2845                 :          4 : TEST_F(TestCApiBlackSolver, declare_oracle_fun_sat)
    2846                 :            : {
    2847                 :          1 :   cvc5_set_option(d_solver, "oracles", "true");
    2848                 :          1 :   cvc5_set_option(d_solver, "produce-models", "true");
    2849                 :            :   // f is the function implementing (lambda ((x Int)) (% x 10))
    2850                 :          1 :   std::vector<Cvc5Sort> sorts = {d_int};
    2851                 :          2 :   Cvc5Term f = cvc5_declare_oracle_fun(
    2852                 :            :       d_solver,
    2853                 :            :       "f",
    2854                 :            :       sorts.size(),
    2855                 :          1 :       sorts.data(),
    2856                 :            :       d_int,
    2857                 :          1 :       d_tm,
    2858                 :          8 :       [](size_t size, const Cvc5Term* input, void* state) {
    2859 [ -  + ][ -  + ]:          8 :         Assert(size == 1);
                 [ -  - ]
    2860                 :          8 :         Cvc5TermManager* ctm = static_cast<Cvc5TermManager*>(state);
    2861         [ +  - ]:          8 :         if (cvc5_term_is_uint32_value(input[0]))
    2862                 :            :         {
    2863                 :         16 :           return cvc5_mk_integer_int64(
    2864                 :          8 :               ctm, cvc5_term_get_uint32_value(input[0]) % 10);
    2865                 :            :         }
    2866                 :          0 :         return cvc5_mk_integer_int64(ctm, 0);
    2867                 :            :       });
    2868                 :          1 :   Cvc5Term seven = cvc5_mk_integer_int64(d_tm, 7);
    2869                 :          1 :   Cvc5Term x = cvc5_mk_const(d_tm, d_int, "x");
    2870                 :          1 :   std::vector<Cvc5Term> args = {x, cvc5_mk_integer_int64(d_tm, 0)};
    2871                 :          1 :   Cvc5Term lb = cvc5_mk_term(d_tm, CVC5_KIND_GEQ, args.size(), args.data());
    2872                 :          1 :   cvc5_assert_formula(d_solver, lb);
    2873                 :          1 :   args = {x, cvc5_mk_integer_int64(d_tm, 100)};
    2874                 :          1 :   Cvc5Term ub = cvc5_mk_term(d_tm, CVC5_KIND_LEQ, args.size(), args.data());
    2875                 :          1 :   cvc5_assert_formula(d_solver, ub);
    2876                 :          1 :   args = {f, x};
    2877                 :          1 :   args = {cvc5_mk_term(d_tm, CVC5_KIND_APPLY_UF, args.size(), args.data()),
    2878                 :          1 :           seven};
    2879                 :          1 :   Cvc5Term eq = cvc5_mk_term(d_tm, CVC5_KIND_EQUAL, args.size(), args.data());
    2880                 :          1 :   cvc5_assert_formula(d_solver, eq);
    2881                 :            :   // x >= 0 ^ x <= 100 ^ (f x) = 7
    2882 [ -  + ][ +  - ]:          1 :   ASSERT_TRUE(cvc5_result_is_sat(cvc5_check_sat(d_solver)));
    2883                 :          1 :   Cvc5Term xval = cvc5_get_value(d_solver, x);
    2884 [ -  + ][ +  - ]:          1 :   ASSERT_TRUE(cvc5_term_is_uint32_value(xval));
    2885 [ -  + ][ +  - ]:          1 :   ASSERT_TRUE(cvc5_term_get_uint32_value(xval) % 10 == 7);
    2886 [ +  - ][ +  - ]:          1 : }
    2887                 :            : 
    2888                 :          4 : TEST_F(TestCApiBlackSolver, declare_oracle_fun_sat2)
    2889                 :            : {
    2890                 :          1 :   cvc5_set_option(d_solver, "oracles", "true");
    2891                 :          1 :   cvc5_set_option(d_solver, "produce-models", "true");
    2892                 :            :   // f is the function implementing (lambda ((x Int) (y Int)) (= x y))
    2893                 :          1 :   std::vector<Cvc5Sort> sorts = {d_int, d_int};
    2894                 :          2 :   Cvc5Term eq = cvc5_declare_oracle_fun(
    2895                 :            :       d_solver,
    2896                 :            :       "eq",
    2897                 :            :       sorts.size(),
    2898                 :          1 :       sorts.data(),
    2899                 :            :       d_bool,
    2900                 :          1 :       d_tm,
    2901                 :          2 :       [](size_t size, const Cvc5Term* input, void* state) {
    2902 [ -  + ][ -  + ]:          2 :         Assert(size == 2);
                 [ -  - ]
    2903                 :          4 :         return cvc5_mk_boolean(static_cast<Cvc5TermManager*>(state),
    2904                 :          2 :                                cvc5_term_is_equal(input[0], input[1]));
    2905                 :            :       });
    2906                 :          1 :   Cvc5Term x = cvc5_mk_const(d_tm, d_int, "x");
    2907                 :          1 :   Cvc5Term y = cvc5_mk_const(d_tm, d_int, "y");
    2908                 :          1 :   std::vector<Cvc5Term> args = {eq, x, y};
    2909                 :          1 :   args = {cvc5_mk_term(d_tm, CVC5_KIND_APPLY_UF, args.size(), args.data())};
    2910                 :          1 :   Cvc5Term neq = cvc5_mk_term(d_tm, CVC5_KIND_NOT, args.size(), args.data());
    2911                 :          1 :   cvc5_assert_formula(d_solver, neq);
    2912                 :            :   // (not (eq x y))
    2913 [ -  + ][ +  - ]:          1 :   ASSERT_TRUE(cvc5_result_is_sat(cvc5_check_sat(d_solver)));
    2914                 :          1 :   Cvc5Term xval = cvc5_get_value(d_solver, x);
    2915                 :          1 :   Cvc5Term yval = cvc5_get_value(d_solver, y);
    2916 [ -  + ][ +  - ]:          1 :   ASSERT_TRUE(cvc5_term_is_disequal(xval, yval));
    2917 [ +  - ][ +  - ]:          1 : }
    2918                 :            : 
    2919                 :          4 : TEST_F(TestCApiBlackSolver, declare_oracle_fun_error1)
    2920                 :            : {
    2921                 :          1 :   cvc5_set_option(d_solver, "oracles", "true");
    2922                 :          1 :   std::vector<Cvc5Sort> sorts = {d_int, d_int};
    2923 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_declare_oracle_fun(
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    2924                 :            :                         nullptr,
    2925                 :            :                         "eq",
    2926                 :            :                         sorts.size(),
    2927                 :            :                         sorts.data(),
    2928                 :            :                         d_bool,
    2929                 :            :                         d_tm,
    2930                 :            :                         [](size_t size, const Cvc5Term* input, void* state) {
    2931                 :            :                           Assert(size == 2);
    2932                 :            :                           return cvc5_mk_boolean(
    2933                 :            :                               static_cast<Cvc5TermManager*>(state),
    2934                 :            :                               cvc5_term_is_equal(input[0], input[1]));
    2935                 :            :                         }),
    2936                 :            :                     "unexpected NULL argument");
    2937 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_declare_oracle_fun(
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    2938                 :            :                         d_solver,
    2939                 :            :                         nullptr,
    2940                 :            :                         sorts.size(),
    2941                 :            :                         sorts.data(),
    2942                 :            :                         d_bool,
    2943                 :            :                         d_tm,
    2944                 :            :                         [](size_t size, const Cvc5Term* input, void* state) {
    2945                 :            :                           Assert(size == 2);
    2946                 :            :                           return cvc5_mk_boolean(
    2947                 :            :                               static_cast<Cvc5TermManager*>(state),
    2948                 :            :                               cvc5_term_is_equal(input[0], input[1]));
    2949                 :            :                         }),
    2950                 :            :                     "unexpected NULL argument");
    2951                 :            :   // Declaring an oracle function with no argument sorts triggers an internal
    2952                 :            :   // (debug-only) cvc5 assertion that aborts the process via FatalStream; this
    2953                 :            :   // is not a recoverable C API error, so it remains a death test.
    2954                 :          1 :   ASSERT_DEATH(cvc5_declare_oracle_fun(
    2955                 :            :                    d_solver,
    2956                 :            :                    "eq",
    2957                 :            :                    0,
    2958                 :            :                    nullptr,
    2959                 :            :                    d_bool,
    2960                 :            :                    d_tm,
    2961                 :            :                    [](size_t size, const Cvc5Term* input, void* state) {
    2962                 :            :                      Assert(size == 2);
    2963                 :            :                      return cvc5_mk_boolean(
    2964                 :            :                          static_cast<Cvc5TermManager*>(state),
    2965                 :            :                          cvc5_term_is_equal(input[0], input[1]));
    2966                 :            :                    }),
    2967                 :            :                "");
    2968 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_declare_oracle_fun(
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    2969                 :            :                         d_solver,
    2970                 :            :                         "eq",
    2971                 :            :                         sorts.size(),
    2972                 :            :                         sorts.data(),
    2973                 :            :                         nullptr,
    2974                 :            :                         d_tm,
    2975                 :            :                         [](size_t size, const Cvc5Term* input, void* state) {
    2976                 :            :                           Assert(size == 2);
    2977                 :            :                           return cvc5_mk_boolean(
    2978                 :            :                               static_cast<Cvc5TermManager*>(state),
    2979                 :            :                               cvc5_term_is_equal(input[0], input[1]));
    2980                 :            :                         }),
    2981                 :            :                     "invalid sort");
    2982                 :            :   // this won't die when declaring the function, only when the actual oracle
    2983                 :            :   // fun is called
    2984                 :          2 :   (void)cvc5_declare_oracle_fun(
    2985                 :            :       d_solver,
    2986                 :            :       "eq",
    2987                 :            :       sorts.size(),
    2988                 :          1 :       sorts.data(),
    2989                 :            :       d_bool,
    2990                 :            :       nullptr,
    2991                 :          0 :       [](size_t size, const Cvc5Term* input, void* state) {
    2992                 :          0 :         Assert(size == 2);
    2993                 :          0 :         return cvc5_mk_boolean(static_cast<Cvc5TermManager*>(state),
    2994                 :          0 :                                cvc5_term_is_equal(input[0], input[1]));
    2995                 :            :       });
    2996 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    2997                 :            :       cvc5_declare_oracle_fun(
    2998                 :            :           d_solver, "eq", sorts.size(), sorts.data(), d_bool, d_tm, nullptr),
    2999                 :            :       "unexpected NULL argument");
    3000         [ +  - ]:          1 : }
    3001                 :            : 
    3002                 :          4 : TEST_F(TestCApiBlackSolver, declare_oracle_fun_error2)
    3003                 :            : {
    3004                 :          1 :   std::vector<Cvc5Sort> sorts = {d_int};
    3005                 :            :   // cannot declare without option
    3006 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    3007                 :            :       cvc5_declare_oracle_fun(d_solver,
    3008                 :            :                               "f",
    3009                 :            :                               sorts.size(),
    3010                 :            :                               sorts.data(),
    3011                 :            :                               d_int,
    3012                 :            :                               d_tm,
    3013                 :            :                               [](size_t size, const Cvc5Term*, void* state) {
    3014                 :            :                                 Assert(size == 2);
    3015                 :            :                                 return cvc5_mk_integer_int64(
    3016                 :            :                                     static_cast<Cvc5TermManager*>(state), 0);
    3017                 :            :                               }),
    3018                 :            :       "unless oracles is enabled");
    3019         [ +  - ]:          1 : }
    3020                 :            : 
    3021                 :          4 : TEST_F(TestCApiBlackSolver, get_interpolant)
    3022                 :            : {
    3023                 :          1 :   cvc5_set_logic(d_solver, "QF_LIA");
    3024                 :          1 :   cvc5_set_option(d_solver, "produce-interpolants", "true");
    3025                 :          1 :   cvc5_set_option(d_solver, "incremental", "false");
    3026                 :            : 
    3027                 :          1 :   Cvc5Term zero = cvc5_mk_integer_int64(d_tm, 0);
    3028                 :          1 :   Cvc5Term x = cvc5_mk_const(d_tm, d_int, "x");
    3029                 :          1 :   Cvc5Term y = cvc5_mk_const(d_tm, d_int, "y");
    3030                 :          1 :   Cvc5Term z = cvc5_mk_const(d_tm, d_int, "z");
    3031                 :            : 
    3032                 :            :   // Assumptions for interpolation: x + y > 0 /\ x < 0
    3033                 :          1 :   std::vector<Cvc5Term> args = {x, y};
    3034                 :          1 :   Cvc5Term add = cvc5_mk_term(d_tm, CVC5_KIND_ADD, args.size(), args.data());
    3035                 :          1 :   args = {add, zero};
    3036                 :          1 :   cvc5_assert_formula(
    3037                 :          1 :       d_solver, cvc5_mk_term(d_tm, CVC5_KIND_GT, args.size(), args.data()));
    3038                 :          1 :   args = {x, zero};
    3039                 :          1 :   cvc5_assert_formula(
    3040                 :          1 :       d_solver, cvc5_mk_term(d_tm, CVC5_KIND_LT, args.size(), args.data()));
    3041                 :            : 
    3042                 :            :   // Conjecture for interpolation: y + z > 0 \/ z < 0
    3043                 :          1 :   args = {y, z};
    3044                 :          1 :   add = cvc5_mk_term(d_tm, CVC5_KIND_ADD, args.size(), args.data());
    3045                 :          1 :   args = {add, zero};
    3046                 :          1 :   Cvc5Term gt = cvc5_mk_term(d_tm, CVC5_KIND_GT, args.size(), args.data());
    3047                 :          1 :   args = {z, zero};
    3048                 :          1 :   Cvc5Term lt = cvc5_mk_term(d_tm, CVC5_KIND_LT, args.size(), args.data());
    3049                 :          1 :   args = {gt, lt};
    3050                 :          1 :   Cvc5Term conj = cvc5_mk_term(d_tm, CVC5_KIND_OR, args.size(), args.data());
    3051                 :            : 
    3052                 :            :   // Call the interpolation api, while the resulting interpolant is the output
    3053                 :          1 :   Cvc5Term output = cvc5_get_interpolant(d_solver, conj);
    3054                 :            :   // We expect the resulting output to be a boolean formula
    3055 [ -  + ][ +  - ]:          1 :   ASSERT_TRUE(cvc5_sort_is_boolean(cvc5_term_get_sort(output)));
    3056                 :            : 
    3057 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_get_interpolant(nullptr, conj),
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    3058                 :            :                     "unexpected NULL argument");
    3059 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_get_interpolant(d_solver, nullptr), "invalid term");
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    3060                 :            : 
    3061                 :            :   // try with a grammar, a simple grammar admitting true
    3062                 :          1 :   Cvc5Term ttrue = cvc5_mk_true(d_tm);
    3063                 :          1 :   Cvc5Term start = cvc5_mk_var(d_tm, d_bool, "start");
    3064                 :          1 :   std::vector<Cvc5Term> symbols = {start};
    3065                 :            :   Cvc5Grammar g =
    3066                 :          1 :       cvc5_mk_grammar(d_solver, 0, nullptr, symbols.size(), symbols.data());
    3067                 :            : 
    3068                 :          1 :   args = {zero, zero};
    3069                 :            :   Cvc5Term conj2 =
    3070                 :          1 :       cvc5_mk_term(d_tm, CVC5_KIND_EQUAL, args.size(), args.data());
    3071 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_get_interpolant_with_grammar(d_solver, conj2, g),
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    3072                 :            :                     "invalid grammar, must have at least one rule");
    3073                 :          1 :   cvc5_grammar_add_rule(g, start, ttrue);
    3074                 :            : 
    3075                 :            :   // Call the interpolation api, while the resulting interpolant is the output
    3076                 :          1 :   Cvc5Term output2 = cvc5_get_interpolant_with_grammar(d_solver, conj2, g);
    3077                 :            :   // interpolant must be true
    3078 [ -  + ][ +  - ]:          1 :   ASSERT_TRUE(cvc5_term_is_equal(output2, ttrue));
    3079                 :            : 
    3080 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_get_interpolant_with_grammar(nullptr, conj2, g),
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    3081                 :            :                     "unexpected NULL argument");
    3082 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_get_interpolant_with_grammar(d_solver, nullptr, g),
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    3083                 :            :                     "invalid term");
    3084 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_get_interpolant_with_grammar(d_solver, conj2, nullptr),
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    3085                 :            :                     "invalid grammar");
    3086                 :            : 
    3087                 :          1 :   Cvc5TermManager* tm = cvc5_term_manager_new();
    3088                 :          1 :   Cvc5* slv = cvc5_new(tm);
    3089                 :          1 :   cvc5_set_option(slv, "produce-interpolants", "true");
    3090                 :          1 :   Cvc5Term zzero = cvc5_mk_integer_int64(tm, 0);
    3091                 :          1 :   Cvc5Term sstart = cvc5_mk_var(tm, cvc5_get_boolean_sort(tm), "start");
    3092                 :          1 :   std::vector<Cvc5Term> ssymbols = {sstart};
    3093                 :            :   Cvc5Grammar gg =
    3094                 :          1 :       cvc5_mk_grammar(slv, 0, nullptr, ssymbols.size(), ssymbols.data());
    3095                 :          1 :   cvc5_grammar_add_rule(gg, sstart, cvc5_mk_true(tm));
    3096                 :          1 :   std::vector<Cvc5Term> aargs = {zzero, zzero};
    3097                 :            :   Cvc5Term cconj2 =
    3098                 :          1 :       cvc5_mk_term(tm, CVC5_KIND_EQUAL, aargs.size(), aargs.data());
    3099                 :          1 :   (void)cvc5_get_interpolant_with_grammar(slv, cconj2, gg);
    3100 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    3101                 :            :       cvc5_get_interpolant(slv, conj2),
    3102                 :            :       "term is not associated with the term manager of this solver");
    3103 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    3104                 :            :       cvc5_get_interpolant_with_grammar(slv, conj2, gg),
    3105                 :            :       "term is not associated with the term manager of this solver");
    3106 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    3107                 :            :       cvc5_get_interpolant_with_grammar(slv, cconj2, g),
    3108                 :            :       "grammar is not associated with the term manager of this solver");
    3109                 :          1 :   cvc5_delete(slv);
    3110                 :          1 :   cvc5_term_manager_release(tm);
    3111                 :          1 :   cvc5_term_manager_delete(tm);
    3112         [ +  - ]:          1 : }
    3113                 :            : 
    3114                 :          4 : TEST_F(TestCApiBlackSolver, get_interpolant_next)
    3115                 :            : {
    3116                 :          1 :   cvc5_set_logic(d_solver, "QF_LIA");
    3117                 :          1 :   cvc5_set_option(d_solver, "produce-interpolants", "true");
    3118                 :          1 :   cvc5_set_option(d_solver, "incremental", "true");
    3119                 :            : 
    3120                 :          1 :   Cvc5Term zero = cvc5_mk_integer_int64(d_tm, 0);
    3121                 :          1 :   Cvc5Term x = cvc5_mk_const(d_tm, d_int, "x");
    3122                 :          1 :   Cvc5Term y = cvc5_mk_const(d_tm, d_int, "y");
    3123                 :          1 :   Cvc5Term z = cvc5_mk_const(d_tm, d_int, "z");
    3124                 :            : 
    3125                 :            :   // Assumptions for interpolation: x + y > 0 /\ x < 0
    3126                 :          1 :   std::vector<Cvc5Term> args = {x, y};
    3127                 :          1 :   Cvc5Term add = cvc5_mk_term(d_tm, CVC5_KIND_ADD, args.size(), args.data());
    3128                 :          1 :   args = {add, zero};
    3129                 :          1 :   cvc5_assert_formula(
    3130                 :          1 :       d_solver, cvc5_mk_term(d_tm, CVC5_KIND_GT, args.size(), args.data()));
    3131                 :          1 :   args = {x, zero};
    3132                 :          1 :   cvc5_assert_formula(
    3133                 :          1 :       d_solver, cvc5_mk_term(d_tm, CVC5_KIND_LT, args.size(), args.data()));
    3134                 :            :   // Conjecture for interpolation: y + z > 0 \/ z < 0
    3135                 :          1 :   args = {y, z};
    3136                 :          1 :   add = cvc5_mk_term(d_tm, CVC5_KIND_ADD, args.size(), args.data());
    3137                 :          1 :   args = {add, zero};
    3138                 :          1 :   Cvc5Term gt = cvc5_mk_term(d_tm, CVC5_KIND_GT, args.size(), args.data());
    3139                 :          1 :   args = {z, zero};
    3140                 :          1 :   Cvc5Term lt = cvc5_mk_term(d_tm, CVC5_KIND_LT, args.size(), args.data());
    3141                 :          1 :   args = {gt, lt};
    3142                 :          1 :   Cvc5Term conj = cvc5_mk_term(d_tm, CVC5_KIND_OR, args.size(), args.data());
    3143                 :            : 
    3144                 :          1 :   Cvc5Term output = cvc5_get_interpolant(d_solver, conj);
    3145                 :          1 :   Cvc5Term output2 = cvc5_get_interpolant_next(d_solver);
    3146                 :            : 
    3147 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_get_interpolant(nullptr, conj),
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    3148                 :            :                     "unexpected NULL argument");
    3149 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_get_interpolant(d_solver, nullptr), "invalid term");
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    3150                 :            : 
    3151 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_get_interpolant_next(nullptr),
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    3152                 :            :                     "unexpected NULL argument");
    3153                 :            : 
    3154                 :            :   // We expect the next output to be distinct
    3155 [ -  + ][ +  - ]:          1 :   ASSERT_TRUE(cvc5_term_is_disequal(output, output2));
    3156         [ +  - ]:          1 : }
    3157                 :            : 
    3158                 :          4 : TEST_F(TestCApiBlackSolver, get_abduct)
    3159                 :            : {
    3160                 :          1 :   cvc5_set_logic(d_solver, "QF_LIA");
    3161                 :          1 :   cvc5_set_option(d_solver, "produce-abducts", "true");
    3162                 :          1 :   cvc5_set_option(d_solver, "incremental", "false");
    3163                 :            : 
    3164                 :          1 :   Cvc5Term zero = cvc5_mk_integer_int64(d_tm, 0);
    3165                 :          1 :   Cvc5Term x = cvc5_mk_const(d_tm, d_int, "x");
    3166                 :          1 :   Cvc5Term y = cvc5_mk_const(d_tm, d_int, "y");
    3167                 :            : 
    3168                 :            :   // Assumptions for abduction: x > 0
    3169                 :          1 :   std::vector<Cvc5Term> args = {x, zero};
    3170                 :          1 :   cvc5_assert_formula(
    3171                 :          1 :       d_solver, cvc5_mk_term(d_tm, CVC5_KIND_GT, args.size(), args.data()));
    3172                 :            :   // Conjecture for abduction: y > 0
    3173                 :          1 :   args = {y, zero};
    3174                 :          1 :   Cvc5Term conj = cvc5_mk_term(d_tm, CVC5_KIND_GT, args.size(), args.data());
    3175                 :            :   // Call the abduction api, while the resulting abduct is the output
    3176                 :          1 :   Cvc5Term output = cvc5_get_abduct(d_solver, conj);
    3177                 :            :   // We expect the resulting output to be a boolean formula
    3178 [ -  + ][ +  - ]:          1 :   ASSERT_TRUE(cvc5_sort_is_boolean(cvc5_term_get_sort(output)));
    3179                 :            : 
    3180 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_get_abduct(nullptr, conj), "unexpected NULL argument");
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    3181 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_get_abduct(d_solver, nullptr), "invalid term");
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    3182                 :            : 
    3183                 :            :   // try with a grammar, a simple grammar admitting true
    3184                 :          1 :   Cvc5Term ttrue = cvc5_mk_true(d_tm);
    3185                 :          1 :   Cvc5Term start = cvc5_mk_var(d_tm, d_bool, "start");
    3186                 :          1 :   std::vector<Cvc5Term> symbols = {start};
    3187                 :            :   Cvc5Grammar g =
    3188                 :          1 :       cvc5_mk_grammar(d_solver, 0, nullptr, symbols.size(), symbols.data());
    3189                 :          1 :   args = {x, zero};
    3190                 :          1 :   Cvc5Term conj2 = cvc5_mk_term(d_tm, CVC5_KIND_GT, args.size(), args.data());
    3191 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_get_abduct_with_grammar(d_solver, conj2, g),
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    3192                 :            :                     "invalid grammar, must have at least one rule");
    3193                 :          1 :   cvc5_grammar_add_rule(g, start, ttrue);
    3194                 :            : 
    3195                 :            :   // Call the abduction api, while the resulting abduct is the output
    3196                 :          1 :   Cvc5Term output2 = cvc5_get_abduct_with_grammar(d_solver, conj2, g);
    3197                 :            :   // abduct must be true
    3198 [ -  + ][ +  - ]:          1 :   ASSERT_TRUE(cvc5_term_is_equal(output2, ttrue));
    3199                 :            : 
    3200 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_get_abduct_with_grammar(nullptr, conj2, g),
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    3201                 :            :                     "unexpected NULL argument");
    3202 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_get_abduct_with_grammar(d_solver, nullptr, g),
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    3203                 :            :                     "invalid term");
    3204 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_get_abduct_with_grammar(d_solver, conj2, nullptr),
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    3205                 :            :                     "invalid grammar");
    3206                 :            : 
    3207                 :          1 :   Cvc5TermManager* tm = cvc5_term_manager_new();
    3208                 :          1 :   Cvc5* slv = cvc5_new(tm);
    3209                 :          1 :   cvc5_set_option(slv, "produce-abducts", "true");
    3210                 :          1 :   Cvc5Sort int_sort = cvc5_get_integer_sort(tm);
    3211                 :          1 :   Cvc5Term zzero = cvc5_mk_integer_int64(tm, 0);
    3212                 :          1 :   Cvc5Term xx = cvc5_mk_const(tm, int_sort, "x");
    3213                 :          1 :   Cvc5Term yy = cvc5_mk_const(tm, int_sort, "y");
    3214                 :          1 :   Cvc5Term sstart = cvc5_mk_var(tm, cvc5_get_boolean_sort(tm), "start");
    3215                 :          1 :   args = {xx, yy};
    3216                 :          1 :   Cvc5Term add = cvc5_mk_term(tm, CVC5_KIND_ADD, args.size(), args.data());
    3217                 :          1 :   args = {add, zzero};
    3218                 :          1 :   cvc5_assert_formula(slv,
    3219                 :          1 :                       cvc5_mk_term(tm, CVC5_KIND_GT, args.size(), args.data()));
    3220                 :          1 :   std::vector<Cvc5Term> ssymbols = {sstart};
    3221                 :            :   Cvc5Grammar gg =
    3222                 :          1 :       cvc5_mk_grammar(slv, 0, nullptr, ssymbols.size(), ssymbols.data());
    3223                 :          1 :   cvc5_grammar_add_rule(gg, sstart, cvc5_mk_true(tm));
    3224                 :          1 :   std::vector<Cvc5Term> aargs = {zzero, zzero};
    3225                 :            :   Cvc5Term cconj2 =
    3226                 :          1 :       cvc5_mk_term(tm, CVC5_KIND_EQUAL, aargs.size(), aargs.data());
    3227                 :          1 :   (void)cvc5_get_abduct_with_grammar(slv, cconj2, gg);
    3228 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    3229                 :            :       cvc5_get_abduct(slv, conj2),
    3230                 :            :       "term is not associated with the term manager of this solver");
    3231 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    3232                 :            :       cvc5_get_abduct_with_grammar(slv, conj2, gg),
    3233                 :            :       "term is not associated with the term manager of this solver");
    3234 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    3235                 :            :       cvc5_get_abduct_with_grammar(slv, cconj2, g),
    3236                 :            :       "grammar is not associated with the term manager of this solver");
    3237                 :          1 :   cvc5_delete(slv);
    3238                 :          1 :   cvc5_term_manager_release(tm);
    3239                 :          1 :   cvc5_term_manager_delete(tm);
    3240         [ +  - ]:          1 : }
    3241                 :            : 
    3242                 :          4 : TEST_F(TestCApiBlackSolver, get_abduct2)
    3243                 :            : {
    3244                 :          1 :   cvc5_set_logic(d_solver, "QF_LIA");
    3245                 :          1 :   cvc5_set_option(d_solver, "incremental", "false");
    3246                 :            : 
    3247                 :          1 :   Cvc5Term zero = cvc5_mk_integer_int64(d_tm, 0);
    3248                 :          1 :   Cvc5Term x = cvc5_mk_const(d_tm, d_int, "x");
    3249                 :          1 :   Cvc5Term y = cvc5_mk_const(d_tm, d_int, "y");
    3250                 :            :   // Assumptions for abduction: x > 0
    3251                 :          1 :   std::vector<Cvc5Term> args = {x, zero};
    3252                 :          1 :   cvc5_assert_formula(
    3253                 :          1 :       d_solver, cvc5_mk_term(d_tm, CVC5_KIND_GT, args.size(), args.data()));
    3254                 :            :   // Conjecture for abduction: y > 0
    3255                 :          1 :   args = {y, zero};
    3256                 :          1 :   Cvc5Term conj = cvc5_mk_term(d_tm, CVC5_KIND_GT, args.size(), args.data());
    3257                 :            :   // Fails due to option not set
    3258 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_get_abduct(d_solver, conj),
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    3259                 :            :                     "unless abducts are enabled");
    3260         [ +  - ]:          1 : }
    3261                 :            : 
    3262                 :          4 : TEST_F(TestCApiBlackSolver, get_abduct_next)
    3263                 :            : {
    3264                 :          1 :   cvc5_set_logic(d_solver, "QF_LIA");
    3265                 :          1 :   cvc5_set_option(d_solver, "produce-abducts", "true");
    3266                 :          1 :   cvc5_set_option(d_solver, "incremental", "true");
    3267                 :            : 
    3268                 :          1 :   Cvc5Term zero = cvc5_mk_integer_int64(d_tm, 0);
    3269                 :          1 :   Cvc5Term x = cvc5_mk_const(d_tm, d_int, "x");
    3270                 :          1 :   Cvc5Term y = cvc5_mk_const(d_tm, d_int, "y");
    3271                 :            : 
    3272                 :            :   // Assumptions for abduction: x > 0
    3273                 :          1 :   std::vector<Cvc5Term> args = {x, zero};
    3274                 :          1 :   cvc5_assert_formula(
    3275                 :          1 :       d_solver, cvc5_mk_term(d_tm, CVC5_KIND_GT, args.size(), args.data()));
    3276                 :            :   // Conjecture for abduction: y > 0
    3277                 :          1 :   args = {y, zero};
    3278                 :          1 :   Cvc5Term conj = cvc5_mk_term(d_tm, CVC5_KIND_GT, args.size(), args.data());
    3279                 :            :   // Call the abduction api, while the resulting abduct is the output
    3280                 :          1 :   Cvc5Term output = cvc5_get_abduct(d_solver, conj);
    3281                 :          1 :   Cvc5Term output2 = cvc5_get_abduct_next(d_solver);
    3282                 :            : 
    3283 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_get_abduct(nullptr, conj), "unexpected NULL argument");
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    3284 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_get_abduct(d_solver, nullptr), "invalid term");
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    3285                 :            : 
    3286 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_get_abduct_next(nullptr), "unexpected NULL argument");
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    3287                 :            : 
    3288                 :            :   // should produce a different output
    3289 [ -  + ][ +  - ]:          1 :   ASSERT_TRUE(cvc5_term_is_disequal(output, output2));
    3290         [ +  - ]:          1 : }
    3291                 :            : 
    3292                 :          4 : TEST_F(TestCApiBlackSolver, block_model1)
    3293                 :            : {
    3294                 :          1 :   Cvc5Term x = cvc5_mk_const(d_tm, d_bool, "x");
    3295                 :          1 :   std::vector<Cvc5Term> args = {x, x};
    3296                 :          1 :   cvc5_assert_formula(
    3297                 :          1 :       d_solver, cvc5_mk_term(d_tm, CVC5_KIND_EQUAL, args.size(), args.data()));
    3298                 :          1 :   cvc5_check_sat(d_solver);
    3299 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_block_model(d_solver, CVC5_BLOCK_MODELS_MODE_LITERALS),
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    3300                 :            :                     "cannot get value");
    3301         [ +  - ]:          1 : }
    3302                 :            : 
    3303                 :          4 : TEST_F(TestCApiBlackSolver, block_model2)
    3304                 :            : {
    3305                 :          1 :   cvc5_set_option(d_solver, "produce-models", "true");
    3306                 :          1 :   Cvc5Term x = cvc5_mk_const(d_tm, d_bool, "x");
    3307                 :          1 :   std::vector<Cvc5Term> args = {x, x};
    3308                 :          1 :   cvc5_assert_formula(
    3309                 :          1 :       d_solver, cvc5_mk_term(d_tm, CVC5_KIND_EQUAL, args.size(), args.data()));
    3310 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_block_model(d_solver, CVC5_BLOCK_MODELS_MODE_LITERALS),
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    3311                 :            :                     "after SAT or UNKNOWN");
    3312         [ +  - ]:          1 : }
    3313                 :            : 
    3314                 :          4 : TEST_F(TestCApiBlackSolver, block_model3)
    3315                 :            : {
    3316                 :          1 :   cvc5_set_option(d_solver, "produce-models", "true");
    3317                 :          1 :   Cvc5Term x = cvc5_mk_const(d_tm, d_bool, "x");
    3318                 :          1 :   std::vector<Cvc5Term> args = {x, x};
    3319                 :          1 :   cvc5_assert_formula(
    3320                 :          1 :       d_solver, cvc5_mk_term(d_tm, CVC5_KIND_EQUAL, args.size(), args.data()));
    3321                 :          1 :   cvc5_check_sat(d_solver);
    3322                 :          1 :   cvc5_block_model(d_solver, CVC5_BLOCK_MODELS_MODE_LITERALS);
    3323 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_block_model(nullptr, CVC5_BLOCK_MODELS_MODE_LITERALS),
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    3324                 :            :                     "unexpected NULL argument");
    3325         [ +  - ]:          1 : }
    3326                 :            : 
    3327                 :          4 : TEST_F(TestCApiBlackSolver, block_model_values1)
    3328                 :            : {
    3329                 :          1 :   cvc5_set_option(d_solver, "produce-models", "true");
    3330                 :          1 :   Cvc5Term x = cvc5_mk_const(d_tm, d_bool, "x");
    3331                 :          1 :   std::vector<Cvc5Term> args = {x, x};
    3332                 :          1 :   cvc5_assert_formula(
    3333                 :          1 :       d_solver, cvc5_mk_term(d_tm, CVC5_KIND_EQUAL, args.size(), args.data()));
    3334                 :          1 :   cvc5_check_sat(d_solver);
    3335                 :          1 :   args = {cvc5_mk_true(d_tm)};
    3336                 :          1 :   cvc5_block_model_values(d_solver, args.size(), args.data());
    3337                 :            : 
    3338 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_block_model_values(nullptr, args.size(), args.data()),
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    3339                 :            :                     "unexpected NULL argument");
    3340 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_block_model_values(d_solver, 0, nullptr),
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    3341                 :            :                     "unexpected NULL argument");
    3342                 :          1 :   args = {nullptr};
    3343 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_block_model_values(d_solver, args.size(), args.data()),
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    3344                 :            :                     "invalid term at index 0");
    3345                 :            : 
    3346                 :          1 :   Cvc5TermManager* tm = cvc5_term_manager_new();
    3347                 :          1 :   Cvc5* slv = cvc5_new(tm);
    3348                 :          1 :   cvc5_set_option(slv, "produce-models", "true");
    3349                 :          1 :   cvc5_check_sat(slv);
    3350                 :          1 :   args = {cvc5_mk_true(d_tm)};
    3351 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    3352                 :            :       cvc5_block_model_values(slv, args.size(), args.data()),
    3353                 :            :       "expected a term associated with the term manager of this solver");
    3354                 :          1 :   cvc5_delete(slv);
    3355                 :          1 :   cvc5_term_manager_release(tm);
    3356                 :          1 :   cvc5_term_manager_delete(tm);
    3357         [ +  - ]:          1 : }
    3358                 :            : 
    3359                 :          4 : TEST_F(TestCApiBlackSolver, block_model_values2)
    3360                 :            : {
    3361                 :          1 :   cvc5_set_option(d_solver, "produce-models", "true");
    3362                 :          1 :   Cvc5Term x = cvc5_mk_const(d_tm, d_bool, "x");
    3363                 :          1 :   std::vector<Cvc5Term> args = {x, x};
    3364                 :          1 :   cvc5_assert_formula(
    3365                 :          1 :       d_solver, cvc5_mk_term(d_tm, CVC5_KIND_EQUAL, args.size(), args.data()));
    3366                 :          1 :   cvc5_check_sat(d_solver);
    3367                 :          1 :   args = {x};
    3368                 :          1 :   cvc5_block_model_values(d_solver, args.size(), args.data());
    3369                 :          1 : }
    3370                 :            : 
    3371                 :          4 : TEST_F(TestCApiBlackSolver, block_model_values3)
    3372                 :            : {
    3373                 :          1 :   Cvc5Term x = cvc5_mk_const(d_tm, d_bool, "x");
    3374                 :          1 :   std::vector<Cvc5Term> args = {x, x};
    3375                 :          1 :   cvc5_assert_formula(
    3376                 :          1 :       d_solver, cvc5_mk_term(d_tm, CVC5_KIND_EQUAL, args.size(), args.data()));
    3377                 :          1 :   cvc5_check_sat(d_solver);
    3378                 :          1 :   args = {x};
    3379 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_block_model_values(d_solver, args.size(), args.data()),
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    3380                 :            :                     "cannot get value");
    3381         [ +  - ]:          1 : }
    3382                 :            : 
    3383                 :          4 : TEST_F(TestCApiBlackSolver, block_model_values4)
    3384                 :            : {
    3385                 :          1 :   cvc5_set_option(d_solver, "produce-models", "true");
    3386                 :          1 :   Cvc5Term x = cvc5_mk_const(d_tm, d_bool, "x");
    3387                 :          1 :   std::vector<Cvc5Term> args = {x, x};
    3388                 :          1 :   cvc5_assert_formula(
    3389                 :          1 :       d_solver, cvc5_mk_term(d_tm, CVC5_KIND_EQUAL, args.size(), args.data()));
    3390                 :          1 :   args = {x};
    3391 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_block_model_values(d_solver, args.size(), args.data()),
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    3392                 :            :                     "SAT or UNKNOWN response");
    3393         [ +  - ]:          1 : }
    3394                 :            : 
    3395                 :          4 : TEST_F(TestCApiBlackSolver, block_model_values5)
    3396                 :            : {
    3397                 :          1 :   cvc5_set_option(d_solver, "produce-models", "true");
    3398                 :          1 :   Cvc5Term x = cvc5_mk_const(d_tm, d_bool, "x");
    3399                 :          1 :   std::vector<Cvc5Term> args = {x, x};
    3400                 :          1 :   cvc5_assert_formula(
    3401                 :          1 :       d_solver, cvc5_mk_term(d_tm, CVC5_KIND_EQUAL, args.size(), args.data()));
    3402                 :          1 :   cvc5_check_sat(d_solver);
    3403                 :          1 :   args = {x};
    3404                 :          1 :   cvc5_block_model_values(d_solver, args.size(), args.data());
    3405                 :          1 : }
    3406                 :            : 
    3407                 :          4 : TEST_F(TestCApiBlackSolver, get_instantiations)
    3408                 :            : {
    3409                 :          1 :   std::vector<Cvc5Sort> sorts = {d_int};
    3410                 :            :   Cvc5Term p =
    3411                 :          1 :       cvc5_declare_fun(d_solver, "p", sorts.size(), sorts.data(), d_bool, true);
    3412                 :          1 :   Cvc5Term x = cvc5_mk_var(d_tm, d_int, "x");
    3413                 :          1 :   std::vector<Cvc5Term> args = {x};
    3414                 :            :   Cvc5Term bvl =
    3415                 :          1 :       cvc5_mk_term(d_tm, CVC5_KIND_VARIABLE_LIST, args.size(), args.data());
    3416                 :          1 :   args = {p, x};
    3417                 :            :   Cvc5Term app =
    3418                 :          1 :       cvc5_mk_term(d_tm, CVC5_KIND_APPLY_UF, args.size(), args.data());
    3419                 :          1 :   args = {bvl, app};
    3420                 :          1 :   Cvc5Term q = cvc5_mk_term(d_tm, CVC5_KIND_FORALL, args.size(), args.data());
    3421                 :          1 :   cvc5_assert_formula(d_solver, q);
    3422                 :          1 :   Cvc5Term five = cvc5_mk_integer_int64(d_tm, 5);
    3423                 :          1 :   args = {p, five};
    3424                 :          1 :   args = {cvc5_mk_term(d_tm, CVC5_KIND_APPLY_UF, args.size(), args.data())};
    3425                 :          1 :   Cvc5Term app2 = cvc5_mk_term(d_tm, CVC5_KIND_NOT, args.size(), args.data());
    3426                 :          1 :   cvc5_assert_formula(d_solver, app2);
    3427 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_get_instantiations(d_solver),
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    3428                 :            :                     "after a UNSAT, SAT or UNKNOWN response");
    3429                 :          1 :   cvc5_check_sat(d_solver);
    3430                 :          1 :   cvc5_get_instantiations(d_solver);
    3431 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_get_instantiations(nullptr),
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    3432                 :            :                     "unexpected NULL argument");
    3433 [ +  - ][ +  - ]:          1 : }
    3434                 :            : 
    3435                 :          4 : TEST_F(TestCApiBlackSolver, add_sygus_constraint)
    3436                 :            : {
    3437                 :          1 :   cvc5_set_option(d_solver, "sygus", "true");
    3438                 :          1 :   Cvc5Term tbool = cvc5_mk_true(d_tm);
    3439                 :            : 
    3440                 :          1 :   cvc5_add_sygus_constraint(d_solver, tbool);
    3441 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_add_sygus_constraint(nullptr, tbool),
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    3442                 :            :                     "unexpected NULL argument");
    3443 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_add_sygus_constraint(d_solver, nullptr),
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    3444                 :            :                     "invalid term");
    3445                 :            : 
    3446                 :          1 :   Cvc5TermManager* tm = cvc5_term_manager_new();
    3447                 :          1 :   Cvc5* slv = cvc5_new(tm);
    3448                 :          1 :   cvc5_set_option(slv, "sygus", "true");
    3449 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    3450                 :            :       cvc5_add_sygus_constraint(slv, tbool),
    3451                 :            :       "term is not associated with the term manager of this solver");
    3452                 :          1 :   cvc5_delete(slv);
    3453                 :          1 :   cvc5_term_manager_release(tm);
    3454                 :          1 :   cvc5_term_manager_delete(tm);
    3455                 :            : }
    3456                 :            : 
    3457                 :          4 : TEST_F(TestCApiBlackSolver, get_sygus_constraints)
    3458                 :            : {
    3459                 :          1 :   cvc5_set_option(d_solver, "sygus", "true");
    3460                 :          1 :   Cvc5Term ttrue = cvc5_mk_true(d_tm);
    3461                 :          1 :   Cvc5Term tfalse = cvc5_mk_false(d_tm);
    3462                 :          1 :   cvc5_add_sygus_constraint(d_solver, ttrue);
    3463                 :          1 :   cvc5_add_sygus_constraint(d_solver, tfalse);
    3464                 :            :   size_t size;
    3465                 :          1 :   const Cvc5Term* constraints = cvc5_get_sygus_constraints(d_solver, &size);
    3466 [ -  + ][ +  - ]:          1 :   ASSERT_TRUE(cvc5_term_is_equal(ttrue, constraints[0]));
    3467 [ -  + ][ +  - ]:          1 :   ASSERT_TRUE(cvc5_term_is_equal(tfalse, constraints[1]));
    3468 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_get_sygus_constraints(nullptr, &size),
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    3469                 :            :                     "unexpected NULL argument");
    3470 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_get_sygus_constraints(d_solver, nullptr),
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    3471                 :            :                     "unexpected NULL argument");
    3472                 :            : }
    3473                 :            : 
    3474                 :          4 : TEST_F(TestCApiBlackSolver, add_sygus_assume)
    3475                 :            : {
    3476                 :          1 :   cvc5_set_option(d_solver, "sygus", "true");
    3477                 :          1 :   Cvc5Term tbool = cvc5_mk_false(d_tm);
    3478                 :          1 :   Cvc5Term tint = cvc5_mk_integer_int64(d_tm, 1);
    3479                 :            : 
    3480                 :          1 :   cvc5_add_sygus_assume(d_solver, tbool);
    3481 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_add_sygus_assume(nullptr, tbool),
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    3482                 :            :                     "unexpected NULL argument");
    3483 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_add_sygus_assume(d_solver, nullptr), "invalid term");
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    3484 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_add_sygus_assume(d_solver, tint), "invalid argument");
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    3485                 :            : 
    3486                 :          1 :   Cvc5TermManager* tm = cvc5_term_manager_new();
    3487                 :          1 :   Cvc5* slv = cvc5_new(tm);
    3488                 :          1 :   cvc5_set_option(slv, "sygus", "true");
    3489 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    3490                 :            :       cvc5_add_sygus_assume(slv, tbool),
    3491                 :            :       "term is not associated with the term manager of this solver");
    3492                 :          1 :   cvc5_delete(slv);
    3493                 :          1 :   cvc5_term_manager_release(tm);
    3494                 :          1 :   cvc5_term_manager_delete(tm);
    3495                 :            : }
    3496                 :            : 
    3497                 :          4 : TEST_F(TestCApiBlackSolver, get_sygus_assumptions)
    3498                 :            : {
    3499                 :          1 :   cvc5_set_option(d_solver, "sygus", "true");
    3500                 :          1 :   Cvc5Term ttrue = cvc5_mk_true(d_tm);
    3501                 :          1 :   Cvc5Term tfalse = cvc5_mk_false(d_tm);
    3502                 :          1 :   cvc5_add_sygus_assume(d_solver, ttrue);
    3503                 :          1 :   cvc5_add_sygus_assume(d_solver, tfalse);
    3504                 :          1 :   cvc5_add_sygus_assume(d_solver, ttrue);
    3505                 :          1 :   cvc5_add_sygus_assume(d_solver, tfalse);
    3506                 :            :   size_t size;
    3507                 :          1 :   const Cvc5Term* assumptions = cvc5_get_sygus_assumptions(d_solver, &size);
    3508 [ -  + ][ +  - ]:          1 :   ASSERT_TRUE(cvc5_term_is_equal(ttrue, assumptions[0]));
    3509 [ -  + ][ +  - ]:          1 :   ASSERT_TRUE(cvc5_term_is_equal(tfalse, assumptions[1]));
    3510 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_get_sygus_assumptions(nullptr, &size),
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    3511                 :            :                     "unexpected NULL argument");
    3512 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_get_sygus_assumptions(d_solver, nullptr),
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    3513                 :            :                     "unexpected NULL argument");
    3514                 :            : }
    3515                 :            : 
    3516                 :          4 : TEST_F(TestCApiBlackSolver, add_sygus_inv_constraint)
    3517                 :            : {
    3518                 :          1 :   cvc5_set_option(d_solver, "sygus", "true");
    3519                 :          1 :   Cvc5Term tint = cvc5_mk_integer_int64(d_tm, 1);
    3520                 :            : 
    3521                 :          1 :   std::vector<Cvc5Sort> domain = {d_real};
    3522                 :          1 :   Cvc5Term inv = cvc5_declare_fun(
    3523                 :          1 :       d_solver, "inv", domain.size(), domain.data(), d_bool, true);
    3524                 :          1 :   Cvc5Term pre = cvc5_declare_fun(
    3525                 :          1 :       d_solver, "pre", domain.size(), domain.data(), d_bool, true);
    3526                 :          1 :   domain = {d_real, d_real};
    3527                 :          1 :   Cvc5Term trans = cvc5_declare_fun(
    3528                 :          1 :       d_solver, "trans", domain.size(), domain.data(), d_bool, true);
    3529                 :          1 :   domain = {d_real};
    3530                 :          1 :   Cvc5Term post = cvc5_declare_fun(
    3531                 :          1 :       d_solver, "post", domain.size(), domain.data(), d_bool, true);
    3532                 :            : 
    3533                 :          1 :   Cvc5Term inv1 = cvc5_declare_fun(
    3534                 :          1 :       d_solver, "inv1", domain.size(), domain.data(), d_real, true);
    3535                 :          1 :   domain = {d_bool, d_real};
    3536                 :          1 :   Cvc5Term trans1 = cvc5_declare_fun(
    3537                 :          1 :       d_solver, "trans1", domain.size(), domain.data(), d_bool, true);
    3538                 :          1 :   domain = {d_real, d_bool};
    3539                 :          1 :   Cvc5Term trans2 = cvc5_declare_fun(
    3540                 :          1 :       d_solver, "trans2", domain.size(), domain.data(), d_bool, true);
    3541                 :          1 :   domain = {d_real, d_real};
    3542                 :          1 :   Cvc5Term trans3 = cvc5_declare_fun(
    3543                 :          1 :       d_solver, "trans3", domain.size(), domain.data(), d_real, true);
    3544                 :            : 
    3545                 :          1 :   cvc5_add_sygus_inv_constraint(d_solver, inv, pre, trans, post);
    3546                 :            : 
    3547 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    3548                 :            :       cvc5_add_sygus_inv_constraint(nullptr, inv, pre, trans, post),
    3549                 :            :       "unexpected NULL argument");
    3550 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    3551                 :            :       cvc5_add_sygus_inv_constraint(d_solver, nullptr, pre, trans, post),
    3552                 :            :       "invalid term");
    3553 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    3554                 :            :       cvc5_add_sygus_inv_constraint(d_solver, inv, nullptr, trans, post),
    3555                 :            :       "invalid term");
    3556 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    3557                 :            :       cvc5_add_sygus_inv_constraint(d_solver, inv, pre, nullptr, post),
    3558                 :            :       "invalid term");
    3559 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    3560                 :            :       cvc5_add_sygus_inv_constraint(d_solver, inv, pre, trans, nullptr),
    3561                 :            :       "invalid term");
    3562                 :            : 
    3563 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    3564                 :            :       cvc5_add_sygus_inv_constraint(d_solver, tint, pre, trans, post),
    3565                 :            :       "invalid argument");
    3566 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    3567                 :            :       cvc5_add_sygus_inv_constraint(d_solver, inv1, pre, trans, post),
    3568                 :            :       "invalid argument");
    3569 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    3570                 :            :       cvc5_add_sygus_inv_constraint(d_solver, inv, trans, trans, post),
    3571                 :            :       "have the same sort");
    3572 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    3573                 :            :       cvc5_add_sygus_inv_constraint(d_solver, inv, pre, tint, post),
    3574                 :            :       "expected the sort of trans");
    3575 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    3576                 :            :       cvc5_add_sygus_inv_constraint(d_solver, inv, pre, pre, post),
    3577                 :            :       "expected the sort of trans");
    3578 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    3579                 :            :       cvc5_add_sygus_inv_constraint(d_solver, inv, pre, trans1, post),
    3580                 :            :       "expected the sort of trans");
    3581 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    3582                 :            :       cvc5_add_sygus_inv_constraint(d_solver, inv, pre, trans2, post),
    3583                 :            :       "expected the sort of trans");
    3584 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    3585                 :            :       cvc5_add_sygus_inv_constraint(d_solver, inv, pre, trans3, post),
    3586                 :            :       "expected the sort of trans");
    3587 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    3588                 :            :       cvc5_add_sygus_inv_constraint(d_solver, inv, pre, trans, trans),
    3589                 :            :       "expected inv and post to have the same sort");
    3590                 :            : 
    3591                 :          1 :   Cvc5TermManager* tm = cvc5_term_manager_new();
    3592                 :          1 :   Cvc5* slv = cvc5_new(tm);
    3593                 :          1 :   cvc5_set_option(slv, "sygus", "true");
    3594                 :          1 :   Cvc5Sort bool_sort = cvc5_get_boolean_sort(tm);
    3595                 :          1 :   Cvc5Sort real_sort = cvc5_get_real_sort(tm);
    3596                 :          1 :   std::vector<Cvc5Sort> domain2 = {real_sort};
    3597                 :          1 :   Cvc5Term inv22 = cvc5_declare_fun(
    3598                 :          1 :       slv, "inv", domain2.size(), domain2.data(), bool_sort, true);
    3599                 :          1 :   Cvc5Term pre22 = cvc5_declare_fun(
    3600                 :          1 :       slv, "pre", domain2.size(), domain2.data(), bool_sort, true);
    3601                 :          1 :   domain2 = {real_sort, real_sort};
    3602                 :          1 :   Cvc5Term trans22 = cvc5_declare_fun(
    3603                 :          1 :       slv, "trans", domain2.size(), domain2.data(), bool_sort, true);
    3604                 :          1 :   domain2 = {real_sort};
    3605                 :          1 :   Cvc5Term post22 = cvc5_declare_fun(
    3606                 :          1 :       slv, "post", domain2.size(), domain2.data(), bool_sort, true);
    3607                 :          1 :   cvc5_add_sygus_inv_constraint(slv, inv22, pre22, trans22, post22);
    3608 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    3609                 :            :       cvc5_add_sygus_inv_constraint(slv, inv, pre22, trans22, post22),
    3610                 :            :       "term is not associated with the term manager of this solver");
    3611 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    3612                 :            :       cvc5_add_sygus_inv_constraint(slv, inv22, pre, trans22, post22),
    3613                 :            :       "term is not associated with the term manager of this solver");
    3614 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    3615                 :            :       cvc5_add_sygus_inv_constraint(slv, inv22, pre22, trans, post22),
    3616                 :            :       "term is not associated with the term manager of this solver");
    3617 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    3618                 :            :       cvc5_add_sygus_inv_constraint(slv, inv22, pre22, trans22, post),
    3619                 :            :       "term is not associated with the term manager of this solver");
    3620                 :          1 :   cvc5_delete(slv);
    3621                 :          1 :   cvc5_term_manager_release(tm);
    3622                 :          1 :   cvc5_term_manager_delete(tm);
    3623         [ +  - ]:          1 : }
    3624                 :            : 
    3625                 :          4 : TEST_F(TestCApiBlackSolver, check_synth)
    3626                 :            : {
    3627                 :            :   // requires option to be set
    3628 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_check_synth(d_solver),
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    3629                 :            :                     "cannot check for a synthesis solution");
    3630                 :          1 :   cvc5_set_option(d_solver, "sygus", "true");
    3631                 :          1 :   cvc5_check_synth(d_solver);
    3632 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_check_synth(nullptr), "unexpected NULL argument");
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    3633                 :            : }
    3634                 :            : 
    3635                 :          4 : TEST_F(TestCApiBlackSolver, get_synth_solution)
    3636                 :            : {
    3637                 :          1 :   cvc5_set_option(d_solver, "sygus", "true");
    3638                 :          1 :   cvc5_set_option(d_solver, "incremental", "false");
    3639                 :            : 
    3640                 :          1 :   Cvc5Term x = cvc5_mk_false(d_tm);
    3641                 :          1 :   Cvc5Term f = cvc5_synth_fun(d_solver, "f", 0, nullptr, d_bool);
    3642                 :            : 
    3643 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_get_synth_solution(d_solver, f), "not in a state");
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    3644                 :            : 
    3645                 :          1 :   Cvc5SynthResult res = cvc5_check_synth(d_solver);
    3646 [ -  + ][ +  - ]:          1 :   ASSERT_TRUE(cvc5_synth_result_has_solution(res));
    3647                 :            : 
    3648                 :          1 :   cvc5_get_synth_solution(d_solver, f);
    3649                 :          1 :   cvc5_get_synth_solution(d_solver, f);
    3650                 :            : 
    3651 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_get_synth_solution(nullptr, f),
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    3652                 :            :                     "unexpected NULL argument");
    3653 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_get_synth_solution(d_solver, nullptr), "invalid term");
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    3654 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_get_synth_solution(d_solver, x),
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    3655                 :            :                     "synthesis solution not found for given term");
    3656                 :            : 
    3657                 :          1 :   Cvc5TermManager* tm = cvc5_term_manager_new();
    3658                 :          1 :   Cvc5* slv = cvc5_new(tm);
    3659 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    3660                 :            :       cvc5_get_synth_solution(slv, f),
    3661                 :            :       "term is not associated with the term manager of this solver");
    3662                 :          1 :   cvc5_delete(slv);
    3663                 :          1 :   cvc5_term_manager_release(tm);
    3664                 :          1 :   cvc5_term_manager_delete(tm);
    3665                 :            : }
    3666                 :            : 
    3667                 :          4 : TEST_F(TestCApiBlackSolver, get_synth_solutions)
    3668                 :            : {
    3669                 :          1 :   cvc5_set_option(d_solver, "sygus", "true");
    3670                 :          1 :   cvc5_set_option(d_solver, "incremental", "false");
    3671                 :            : 
    3672                 :          1 :   Cvc5Term x = cvc5_mk_false(d_tm);
    3673                 :          1 :   Cvc5Term f = cvc5_synth_fun(d_solver, "f", 0, nullptr, d_bool);
    3674                 :            : 
    3675                 :          1 :   std::vector<Cvc5Term> args{f};
    3676 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    3677                 :            :       cvc5_get_synth_solutions(d_solver, args.size(), args.data()),
    3678                 :            :       "not in a state");
    3679                 :            : 
    3680                 :          1 :   cvc5_check_synth(d_solver);
    3681                 :            : 
    3682                 :          1 :   cvc5_get_synth_solutions(d_solver, args.size(), args.data());
    3683                 :          1 :   args = {f, f};
    3684                 :          1 :   cvc5_get_synth_solutions(d_solver, args.size(), args.data());
    3685                 :            : 
    3686 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_get_synth_solutions(d_solver, 0, nullptr),
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    3687                 :            :                     "unexpected NULL argument");
    3688 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_get_synth_solutions(nullptr, args.size(), args.data()),
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    3689                 :            :                     "unexpected NULL argument");
    3690                 :          1 :   args = {nullptr};
    3691 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    3692                 :            :       cvc5_get_synth_solutions(d_solver, args.size(), args.data()),
    3693                 :            :       "invalid term at index 0");
    3694                 :          1 :   args = {x};
    3695 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    3696                 :            :       cvc5_get_synth_solutions(d_solver, args.size(), args.data()),
    3697                 :            :       "synthesis solution not found for term at index 0");
    3698                 :            : 
    3699                 :          1 :   Cvc5TermManager* tm = cvc5_term_manager_new();
    3700                 :          1 :   Cvc5* slv = cvc5_new(tm);
    3701 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    3702                 :            :       cvc5_get_synth_solutions(slv, args.size(), args.data()),
    3703                 :            :       "expected a term associated with the term manager of this solver");
    3704                 :          1 :   cvc5_delete(slv);
    3705                 :          1 :   cvc5_term_manager_release(tm);
    3706                 :          1 :   cvc5_term_manager_delete(tm);
    3707         [ +  - ]:          1 : }
    3708                 :            : 
    3709                 :          4 : TEST_F(TestCApiBlackSolver, check_synth_next)
    3710                 :            : {
    3711                 :          1 :   cvc5_set_option(d_solver, "sygus", "true");
    3712                 :          1 :   cvc5_set_option(d_solver, "incremental", "true");
    3713                 :            : 
    3714                 :          1 :   Cvc5Term f = cvc5_synth_fun(d_solver, "f", 0, nullptr, d_bool);
    3715                 :            : 
    3716                 :          1 :   Cvc5SynthResult res = cvc5_check_synth(d_solver);
    3717 [ -  + ][ +  - ]:          1 :   ASSERT_TRUE(cvc5_synth_result_has_solution(res));
    3718                 :            : 
    3719                 :          1 :   std::vector<Cvc5Term> args{f};
    3720                 :          1 :   cvc5_get_synth_solutions(d_solver, args.size(), args.data());
    3721                 :            : 
    3722                 :          1 :   res = cvc5_check_synth_next(d_solver);
    3723 [ -  + ][ +  - ]:          1 :   ASSERT_TRUE(cvc5_synth_result_has_solution(res));
    3724                 :          1 :   cvc5_get_synth_solutions(d_solver, args.size(), args.data());
    3725                 :            : 
    3726 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_check_synth_next(nullptr), "unexpected NULL argument");
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    3727                 :            : }
    3728                 :            : 
    3729                 :          4 : TEST_F(TestCApiBlackSolver, check_synth_next2)
    3730                 :            : {
    3731                 :          1 :   cvc5_set_option(d_solver, "sygus", "true");
    3732                 :          1 :   cvc5_set_option(d_solver, "incremental", "false");
    3733                 :          1 :   (void)cvc5_synth_fun(d_solver, "f", 0, nullptr, d_bool);
    3734                 :          1 :   cvc5_check_synth(d_solver);
    3735 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_check_synth_next(d_solver),
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    3736                 :            :                     "cannot check for a next synthesis solution");
    3737                 :            : }
    3738                 :            : 
    3739                 :          4 : TEST_F(TestCApiBlackSolver, check_synth_next3)
    3740                 :            : {
    3741                 :          1 :   cvc5_set_option(d_solver, "sygus", "true");
    3742                 :          1 :   cvc5_set_option(d_solver, "incremental", "true");
    3743                 :          1 :   (void)cvc5_synth_fun(d_solver, "f", 0, nullptr, d_bool);
    3744 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_check_synth_next(d_solver),
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    3745                 :            :                     "unless immediately preceded");
    3746                 :            : }
    3747                 :            : 
    3748                 :          4 : TEST_F(TestCApiBlackSolver, find_synth)
    3749                 :            : {
    3750                 :          1 :   cvc5_set_option(d_solver, "sygus", "true");
    3751                 :          1 :   Cvc5Term start = cvc5_mk_var(d_tm, d_bool, "start");
    3752                 :          1 :   std::vector<Cvc5Term> symbols = {start};
    3753                 :            :   Cvc5Grammar g =
    3754                 :          1 :       cvc5_mk_grammar(d_solver, 0, nullptr, symbols.size(), symbols.data());
    3755                 :            : 
    3756 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    3757                 :            :       cvc5_synth_fun_with_grammar(d_solver, "f", 0, nullptr, d_bool, g),
    3758                 :            :       "invalid grammar");
    3759                 :            : 
    3760                 :          1 :   Cvc5Term ttrue = cvc5_mk_true(d_tm);
    3761                 :          1 :   Cvc5Term tfalse = cvc5_mk_false(d_tm);
    3762                 :          1 :   cvc5_grammar_add_rule(g, start, ttrue);
    3763                 :          1 :   cvc5_grammar_add_rule(g, start, tfalse);
    3764                 :          1 :   (void)cvc5_synth_fun_with_grammar(d_solver, "f", 0, nullptr, d_bool, g);
    3765                 :            : 
    3766                 :            :   // should enumerate based on the grammar of the function to synthesize above
    3767                 :          1 :   Cvc5Term t = cvc5_find_synth(d_solver, CVC5_FIND_SYNTH_TARGET_ENUM);
    3768 [ +  - ][ +  - ]:          1 :   ASSERT_TRUE(t && cvc5_sort_is_boolean(cvc5_term_get_sort(t)));
         [ -  + ][ +  - ]
    3769                 :            : 
    3770 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_find_synth(nullptr, CVC5_FIND_SYNTH_TARGET_ENUM),
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    3771                 :            :                     "unexpected NULL argument");
    3772 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    3773                 :            :       cvc5_find_synth(d_solver, static_cast<Cvc5FindSynthTarget>(125)),
    3774                 :            :       "invalid find synthesis target");
    3775                 :            : 
    3776 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    3777                 :            :       cvc5_find_synth_with_grammar(nullptr, CVC5_FIND_SYNTH_TARGET_ENUM, g),
    3778                 :            :       "unexpected NULL argument");
    3779 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_find_synth_with_grammar(
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    3780                 :            :                         d_solver, static_cast<Cvc5FindSynthTarget>(125), g),
    3781                 :            :                     "invalid find synthesis target");
    3782 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_find_synth_with_grammar(
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    3783                 :            :                         d_solver, CVC5_FIND_SYNTH_TARGET_ENUM, nullptr),
    3784                 :            :                     "invalid grammar");
    3785         [ +  - ]:          1 : }
    3786                 :            : 
    3787                 :          4 : TEST_F(TestCApiBlackSolver, find_synth2)
    3788                 :            : {
    3789                 :          1 :   cvc5_set_option(d_solver, "sygus", "true");
    3790                 :          1 :   cvc5_set_option(d_solver, "incremental", "true");
    3791                 :            : 
    3792                 :          1 :   Cvc5Term start = cvc5_mk_var(d_tm, d_bool, "start");
    3793                 :          1 :   std::vector<Cvc5Term> symbols = {start};
    3794                 :            :   Cvc5Grammar g =
    3795                 :          1 :       cvc5_mk_grammar(d_solver, 0, nullptr, symbols.size(), symbols.data());
    3796                 :          1 :   Cvc5Term ttrue = cvc5_mk_true(d_tm);
    3797                 :          1 :   Cvc5Term tfalse = cvc5_mk_false(d_tm);
    3798                 :          1 :   cvc5_grammar_add_rule(g, start, ttrue);
    3799                 :          1 :   cvc5_grammar_add_rule(g, start, tfalse);
    3800                 :            : 
    3801                 :            :   // should enumerate true/false
    3802                 :            :   Cvc5Term t =
    3803                 :          1 :       cvc5_find_synth_with_grammar(d_solver, CVC5_FIND_SYNTH_TARGET_ENUM, g);
    3804 [ +  - ][ +  - ]:          1 :   ASSERT_TRUE(t && cvc5_sort_is_boolean(cvc5_term_get_sort(t)));
         [ -  + ][ +  - ]
    3805                 :          1 :   t = cvc5_find_synth_next(d_solver);
    3806 [ +  - ][ +  - ]:          1 :   ASSERT_TRUE(t && cvc5_sort_is_boolean(cvc5_term_get_sort(t)));
         [ -  + ][ +  - ]
    3807                 :            : 
    3808 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_find_synth_next(nullptr), "unexpected NULL argument");
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    3809         [ +  - ]:          1 : }
    3810                 :            : 
    3811                 :          4 : TEST_F(TestCApiBlackSolver, get_statistics)
    3812                 :            : {
    3813 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_get_statistics(nullptr), "unexpected NULL argument");
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    3814                 :            : 
    3815                 :            :   // do some reasoning to make sure we have statistics
    3816                 :            :   {
    3817                 :          1 :     Cvc5Sort s2 = cvc5_mk_array_sort(d_tm, d_int, d_int);
    3818                 :          1 :     Cvc5Term t1 = cvc5_mk_const(d_tm, d_int, "i");
    3819                 :          1 :     Cvc5Term t2 = cvc5_mk_const(d_tm, s2, "a");
    3820                 :          1 :     std::vector<Cvc5Term> args = {t2, t1};
    3821                 :          1 :     args = {cvc5_mk_term(d_tm, CVC5_KIND_SELECT, args.size(), args.data()), t1};
    3822                 :          1 :     cvc5_assert_formula(
    3823                 :            :         d_solver,
    3824                 :          1 :         cvc5_mk_term(d_tm, CVC5_KIND_DISTINCT, args.size(), args.data()));
    3825                 :          1 :     cvc5_check_sat(d_solver);
    3826                 :          1 :   }
    3827                 :          1 :   Cvc5Statistics stats = cvc5_get_statistics(d_solver);
    3828                 :          1 :   (void)cvc5_stats_to_string(stats);
    3829                 :            : 
    3830                 :          1 :   Cvc5Stat stat1 = cvc5_stats_get(stats, "global::totalTime");
    3831 [ -  + ][ +  - ]:          1 :   ASSERT_FALSE(cvc5_stat_is_internal(stat1));
    3832 [ -  + ][ +  - ]:          1 :   ASSERT_FALSE(cvc5_stat_is_default(stat1));
    3833 [ -  + ][ +  - ]:          1 :   ASSERT_TRUE(cvc5_stat_is_string(stat1));
    3834                 :          1 :   (void)cvc5_stat_to_string(stat1);
    3835                 :            : 
    3836                 :          1 :   std::string time = cvc5_stat_get_string(stat1);
    3837 [ -  + ][ +  - ]:          1 :   ASSERT_TRUE(time.rfind("ms") == time.size() - 2);  // ends with "ms"
    3838 [ -  + ][ +  - ]:          1 :   ASSERT_FALSE(cvc5_stat_is_double(stat1));
    3839                 :            : 
    3840                 :          1 :   Cvc5Stat stat2 = cvc5_stats_get(stats, "resource::resourceUnitsUsed");
    3841 [ -  + ][ +  - ]:          1 :   ASSERT_TRUE(cvc5_stat_is_internal(stat2));
    3842 [ -  + ][ +  - ]:          1 :   ASSERT_FALSE(cvc5_stat_is_default(stat2));
    3843 [ -  + ][ +  - ]:          1 :   ASSERT_TRUE(cvc5_stat_is_int(stat2));
    3844 [ -  + ][ +  - ]:          1 :   ASSERT_TRUE(cvc5_stat_get_int(stat2) >= 0);
    3845                 :          1 :   (void)cvc5_stat_to_string(stat2);
    3846                 :            : 
    3847                 :          1 :   cvc5_stats_iter_init(stats, true, true);
    3848                 :          1 :   bool hasstats = false;
    3849         [ +  + ]:        522 :   while (cvc5_stats_iter_has_next(stats))
    3850                 :            :   {
    3851                 :        521 :     hasstats = true;
    3852                 :            :     const char* name;
    3853                 :        521 :     Cvc5Stat stat = cvc5_stats_iter_next(stats, &name);
    3854                 :        521 :     (void)cvc5_stat_to_string(stat);
    3855         [ +  + ]:        521 :     if (name == std::string("theory::arrays::avgIndexListLength"))
    3856                 :            :     {
    3857 [ -  + ][ +  - ]:          1 :       ASSERT_TRUE(cvc5_stat_is_internal(stat));
    3858 [ -  + ][ +  - ]:          1 :       ASSERT_TRUE(cvc5_stat_is_double(stat));
    3859 [ -  + ][ +  - ]:          1 :       ASSERT_TRUE(std::isnan(cvc5_stat_get_double(stat)));
    3860                 :            :     }
    3861                 :            :   }
    3862 [ -  + ][ +  - ]:          1 :   ASSERT_TRUE(hasstats);
    3863                 :            : }
    3864                 :            : 
    3865                 :          4 : TEST_F(TestCApiBlackSolver, print_statistics_safe)
    3866                 :            : {
    3867                 :          1 :   testing::internal::CaptureStdout();
    3868                 :          1 :   cvc5_print_stats_safe(d_solver, STDOUT_FILENO);
    3869                 :          1 :   testing::internal::GetCapturedStdout();
    3870                 :          1 : }
    3871                 :            : 
    3872                 :            : namespace {
    3873                 :          2 : const Cvc5Term* plugin_unsat_check(size_t* size, void* state)
    3874                 :            : {
    3875         [ +  + ]:          2 :   static thread_local std::vector<Cvc5Term> lemmas;
    3876                 :            :   // add the "false" lemma.
    3877                 :          2 :   Cvc5Term flem = cvc5_mk_false(static_cast<Cvc5TermManager*>(state));
    3878                 :          2 :   lemmas = {flem};
    3879                 :          2 :   *size = lemmas.size();
    3880                 :          2 :   return lemmas.data();
    3881                 :            : }
    3882                 :          3 : const char* plugin_unsat_get_name() { return "PluginUnsat"; }
    3883                 :            : }  // namespace
    3884                 :            : 
    3885                 :          4 : TEST_F(TestCApiBlackSolver, plugin_unsat)
    3886                 :            : {
    3887                 :          1 :   cvc5_set_option(d_solver, "sat-solver", "minisat");
    3888                 :          1 :   Cvc5Plugin plugin{&plugin_unsat_check,
    3889                 :            :                     nullptr,
    3890                 :            :                     nullptr,
    3891                 :            :                     &plugin_unsat_get_name,
    3892                 :          1 :                     d_tm,
    3893                 :            :                     nullptr,
    3894                 :          1 :                     nullptr};
    3895                 :          1 :   cvc5_add_plugin(d_solver, &plugin);
    3896 [ -  + ][ +  - ]:          1 :   ASSERT_TRUE(plugin.get_name() == std::string("PluginUnsat"));
    3897                 :            :   // should be unsat since the plugin above asserts "false" as a lemma
    3898 [ -  + ][ +  - ]:          1 :   ASSERT_TRUE(cvc5_result_is_unsat(cvc5_check_sat(d_solver)));
    3899                 :            : }
    3900                 :            : 
    3901                 :            : namespace {
    3902                 :          1 : const Cvc5Term* plugin_count_check(size_t* size, void* state)
    3903                 :            : {
    3904         [ +  - ]:          1 :   static thread_local std::vector<Cvc5Term> lemmas;
    3905                 :          1 :   ++*static_cast<size_t*>(state);
    3906                 :          1 :   *size = lemmas.size();
    3907                 :          1 :   return lemmas.data();
    3908                 :            : }
    3909                 :          1 : const char* plugin_count_get_name() { return "PluginCount"; }
    3910                 :            : }  // namespace
    3911                 :            : 
    3912                 :          4 : TEST_F(TestCApiBlackSolver, plugin_multiple)
    3913                 :            : {
    3914                 :          1 :   cvc5_set_option(d_solver, "sat-solver", "minisat");
    3915                 :          1 :   size_t num_checks = 0;
    3916                 :          1 :   Cvc5Plugin plugin_unsat{&plugin_unsat_check,
    3917                 :            :                           nullptr,
    3918                 :            :                           nullptr,
    3919                 :            :                           &plugin_unsat_get_name,
    3920                 :          1 :                           d_tm,
    3921                 :            :                           nullptr,
    3922                 :          1 :                           nullptr};
    3923                 :          1 :   Cvc5Plugin plugin_count{&plugin_count_check,
    3924                 :            :                           nullptr,
    3925                 :            :                           nullptr,
    3926                 :            :                           &plugin_count_get_name,
    3927                 :            :                           &num_checks,
    3928                 :            :                           nullptr,
    3929                 :          1 :                           nullptr};
    3930                 :            :   // adding a second plugin must not invalidate the first one
    3931                 :          1 :   cvc5_add_plugin(d_solver, &plugin_unsat);
    3932                 :          1 :   cvc5_add_plugin(d_solver, &plugin_count);
    3933                 :            :   // should be unsat since the first plugin asserts "false" as a lemma
    3934 [ -  + ][ +  - ]:          1 :   ASSERT_TRUE(cvc5_result_is_unsat(cvc5_check_sat(d_solver)));
    3935 [ -  + ][ +  - ]:          1 :   ASSERT_GT(num_checks, 0);
    3936                 :            : }
    3937                 :            : 
    3938                 :            : namespace {
    3939                 :          2 : const Cvc5Term* plugin_null_check(size_t* size, void* state)
    3940                 :            : {
    3941                 :            :   // no lemmas, return NULL instead of an array
    3942                 :          2 :   ++*static_cast<size_t*>(state);
    3943                 :          2 :   *size = 0;
    3944                 :          2 :   return nullptr;
    3945                 :            : }
    3946                 :          1 : const char* plugin_null_get_name() { return "PluginNull"; }
    3947                 :            : }  // namespace
    3948                 :            : 
    3949                 :          4 : TEST_F(TestCApiBlackSolver, plugin_null)
    3950                 :            : {
    3951                 :          1 :   cvc5_set_option(d_solver, "sat-solver", "minisat");
    3952                 :          1 :   size_t num_checks = 0;
    3953                 :          1 :   Cvc5Plugin plugin{&plugin_null_check,
    3954                 :            :                     nullptr,
    3955                 :            :                     nullptr,
    3956                 :            :                     &plugin_null_get_name,
    3957                 :            :                     &num_checks,
    3958                 :            :                     nullptr,
    3959                 :          1 :                     nullptr};
    3960                 :          1 :   cvc5_add_plugin(d_solver, &plugin);
    3961                 :          1 :   Cvc5Term x = cvc5_mk_const(d_tm, cvc5_get_boolean_sort(d_tm), "x");
    3962                 :          1 :   cvc5_assert_formula(d_solver, x);
    3963 [ -  + ][ +  - ]:          1 :   ASSERT_TRUE(cvc5_result_is_sat(cvc5_check_sat(d_solver)));
    3964 [ -  + ][ +  - ]:          1 :   ASSERT_GT(num_checks, 0);
    3965                 :            : }
    3966                 :            : 
    3967                 :            : namespace {
    3968                 :          3 : void plugin_listen_notify_sat_clause(const Cvc5Term, void* state)
    3969                 :            : {
    3970                 :          3 :   *static_cast<bool*>(state) = true;
    3971                 :          3 : }
    3972                 :          4 : void plugin_listen_notify_theory_lemma(const Cvc5Term, void* state)
    3973                 :            : {
    3974                 :          4 :   *static_cast<bool*>(state) = true;
    3975                 :          4 : }
    3976                 :          1 : const char* plugin_listen_get_name() { return "PluginListen"; }
    3977                 :            : }  // namespace
    3978                 :            : 
    3979                 :          4 : TEST_F(TestCApiBlackSolver, plugin_listen)
    3980                 :            : {
    3981                 :          1 :   bool clause_seen = false;
    3982                 :          1 :   bool lemma_seen = false;
    3983                 :          1 :   Cvc5Plugin plugin{nullptr,
    3984                 :            :                     &plugin_listen_notify_sat_clause,
    3985                 :            :                     &plugin_listen_notify_theory_lemma,
    3986                 :            :                     &plugin_listen_get_name,
    3987                 :            :                     nullptr,
    3988                 :            :                     &clause_seen,
    3989                 :          1 :                     &lemma_seen};
    3990                 :            : 
    3991                 :          1 :   cvc5_set_option(d_solver, "sat-solver", "minisat");
    3992                 :            :   // Allow notifications for unit clauses added before the main solve.
    3993                 :          1 :   cvc5_set_option(d_solver, "plugin-notify-sat-clause-in-solve", "false");
    3994                 :          1 :   cvc5_add_plugin(d_solver, &plugin);
    3995                 :          1 :   Cvc5Sort string_sort = cvc5_get_string_sort(d_tm);
    3996                 :          1 :   Cvc5Term x = cvc5_mk_const(d_tm, string_sort, "x");
    3997                 :          1 :   Cvc5Term y = cvc5_mk_const(d_tm, string_sort, "y");
    3998                 :          1 :   std::vector<Cvc5Term> args{x, y};
    3999                 :            :   Cvc5Term ctn1 =
    4000                 :          1 :       cvc5_mk_term(d_tm, CVC5_KIND_STRING_CONTAINS, args.size(), args.data());
    4001                 :          1 :   args = {y, x};
    4002                 :            :   Cvc5Term ctn2 =
    4003                 :          1 :       cvc5_mk_term(d_tm, CVC5_KIND_STRING_CONTAINS, args.size(), args.data());
    4004                 :          1 :   args = {ctn1, ctn2};
    4005                 :          1 :   cvc5_assert_formula(
    4006                 :          1 :       d_solver, cvc5_mk_term(d_tm, CVC5_KIND_OR, args.size(), args.data()));
    4007                 :          1 :   args = {x};
    4008                 :            :   Cvc5Term lx =
    4009                 :          1 :       cvc5_mk_term(d_tm, CVC5_KIND_STRING_LENGTH, args.size(), args.data());
    4010                 :          1 :   args = {y};
    4011                 :            :   Cvc5Term ly =
    4012                 :          1 :       cvc5_mk_term(d_tm, CVC5_KIND_STRING_LENGTH, args.size(), args.data());
    4013                 :          1 :   args = {lx, ly};
    4014                 :          1 :   Cvc5Term lc = cvc5_mk_term(d_tm, CVC5_KIND_GT, args.size(), args.data());
    4015                 :          1 :   cvc5_assert_formula(d_solver, lc);
    4016 [ -  + ][ +  - ]:          1 :   ASSERT_TRUE(cvc5_result_is_sat(cvc5_check_sat(d_solver)));
    4017                 :            :   // above input formulas should induce a theory lemma and SAT clause learning
    4018 [ -  + ][ +  - ]:          1 :   ASSERT_TRUE(lemma_seen);
    4019 [ -  + ][ +  - ]:          1 :   ASSERT_TRUE(clause_seen);
    4020         [ +  - ]:          1 : }
    4021                 :            : 
    4022                 :          4 : TEST_F(TestCApiBlackSolver, tuple_project)
    4023                 :            : {
    4024                 :          1 :   std::vector<Cvc5Term> args = {cvc5_mk_string(d_tm, "Z", false)};
    4025                 :            :   std::vector<Cvc5Term> elements = {
    4026                 :          1 :       cvc5_mk_true(d_tm),
    4027                 :          2 :       cvc5_mk_integer_int64(d_tm, 3),
    4028                 :          2 :       cvc5_mk_string(d_tm, "C", false),
    4029                 :          1 :       cvc5_mk_term(d_tm, CVC5_KIND_SET_SINGLETON, args.size(), args.data())};
    4030                 :            : 
    4031                 :          1 :   Cvc5Term tuple = cvc5_mk_tuple(d_tm, elements.size(), elements.data());
    4032                 :            : 
    4033                 :          1 :   std::vector<uint32_t> indices1 = {};
    4034                 :          1 :   std::vector<uint32_t> indices2 = {0};
    4035                 :          1 :   std::vector<uint32_t> indices3 = {0, 1};
    4036                 :          1 :   std::vector<uint32_t> indices4 = {0, 0, 2, 2, 3, 3, 0};
    4037                 :          1 :   std::vector<uint32_t> indices5 = {4};
    4038                 :          1 :   std::vector<uint32_t> indices6 = {0, 4};
    4039                 :            : 
    4040                 :          1 :   args = {tuple};
    4041                 :          2 :   (void)cvc5_mk_term_from_op(
    4042                 :            :       d_tm,
    4043                 :            :       cvc5_mk_op(
    4044                 :          1 :           d_tm, CVC5_KIND_TUPLE_PROJECT, indices1.size(), indices1.data()),
    4045                 :            :       args.size(),
    4046                 :          1 :       args.data());
    4047                 :          2 :   (void)cvc5_mk_term_from_op(
    4048                 :            :       d_tm,
    4049                 :            :       cvc5_mk_op(
    4050                 :          1 :           d_tm, CVC5_KIND_TUPLE_PROJECT, indices2.size(), indices2.data()),
    4051                 :            :       args.size(),
    4052                 :          1 :       args.data());
    4053                 :          2 :   (void)cvc5_mk_term_from_op(
    4054                 :            :       d_tm,
    4055                 :            :       cvc5_mk_op(
    4056                 :          1 :           d_tm, CVC5_KIND_TUPLE_PROJECT, indices3.size(), indices3.data()),
    4057                 :            :       args.size(),
    4058                 :          1 :       args.data());
    4059                 :          2 :   (void)cvc5_mk_term_from_op(
    4060                 :            :       d_tm,
    4061                 :            :       cvc5_mk_op(
    4062                 :          1 :           d_tm, CVC5_KIND_TUPLE_PROJECT, indices4.size(), indices4.data()),
    4063                 :            :       args.size(),
    4064                 :          1 :       args.data());
    4065                 :            : 
    4066 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    4067                 :            :       cvc5_mk_term_from_op(
    4068                 :            :           d_tm,
    4069                 :            :           cvc5_mk_op(
    4070                 :            :               d_tm, CVC5_KIND_TUPLE_PROJECT, indices5.size(), indices5.data()),
    4071                 :            :           args.size(),
    4072                 :            :           args.data()),
    4073                 :            :       "Project index 4");
    4074 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    4075                 :            :       cvc5_mk_term_from_op(
    4076                 :            :           d_tm,
    4077                 :            :           cvc5_mk_op(
    4078                 :            :               d_tm, CVC5_KIND_TUPLE_PROJECT, indices6.size(), indices6.data()),
    4079                 :            :           args.size(),
    4080                 :            :           args.data()),
    4081                 :            :       "Project index 4");
    4082                 :            : 
    4083                 :          1 :   std::vector<uint32_t> indices = {0, 3, 2, 0, 1, 2};
    4084                 :            : 
    4085                 :            :   Cvc5Op op =
    4086                 :          1 :       cvc5_mk_op(d_tm, CVC5_KIND_TUPLE_PROJECT, indices.size(), indices.data());
    4087                 :            :   Cvc5Term projection =
    4088                 :          1 :       cvc5_mk_term_from_op(d_tm, op, args.size(), args.data());
    4089                 :            : 
    4090                 :          1 :   Cvc5Datatype datatype = cvc5_sort_get_datatype(cvc5_term_get_sort(tuple));
    4091                 :          1 :   Cvc5DatatypeConstructor cons = cvc5_dt_get_constructor(datatype, 0);
    4092                 :            : 
    4093         [ +  + ]:          7 :   for (size_t i = 0; i < indices.size(); i++)
    4094                 :            :   {
    4095                 :          6 :     args = {cvc5_dt_sel_get_term(cvc5_dt_cons_get_selector(cons, indices[i])),
    4096                 :          6 :             tuple};
    4097                 :            :     Cvc5Term selected =
    4098                 :          6 :         cvc5_mk_term(d_tm, CVC5_KIND_APPLY_SELECTOR, args.size(), args.data());
    4099                 :          6 :     Cvc5Term simplified = cvc5_simplify(d_solver, selected, false);
    4100 [ -  + ][ +  - ]:          6 :     ASSERT_TRUE(cvc5_term_is_equal(elements[indices[i]], simplified));
    4101                 :            :   }
    4102                 :            : 
    4103         [ -  + ]:          2 :   ASSERT_EQ(
    4104                 :            :       std::string(
    4105                 :            :           "((_ tuple.project 0 3 2 0 1 2) (tuple true 3 \"C\" (set.singleton "
    4106                 :            :           "\"Z\")))"),
    4107         [ +  - ]:          1 :       cvc5_term_to_string(projection));
    4108 [ +  - ][ +  - ]:          1 : }
         [ +  - ][ +  - ]
         [ +  - ][ +  - ]
         [ +  - ][ +  - ]
    4109                 :            : 
    4110                 :          4 : TEST_F(TestCApiBlackSolver, vertical_bars)
    4111                 :            : {
    4112                 :          1 :   Cvc5Term a = cvc5_declare_fun(d_solver, "|a |", 0, nullptr, d_real, true);
    4113 [ -  + ][ +  - ]:          2 :   ASSERT_EQ(std::string("|a |"), cvc5_term_to_string(a));
    4114                 :            : }
    4115                 :            : 
    4116                 :          4 : TEST_F(TestCApiBlackSolver, get_version)
    4117                 :            : {
    4118                 :          1 :   std::cout << cvc5_get_version(d_solver) << std::endl;
    4119                 :          1 : }
    4120                 :            : 
    4121                 :          4 : TEST_F(TestCApiBlackSolver, multiple_solvers)
    4122                 :            : {
    4123                 :            :   Cvc5Term zero, value1, value2;
    4124                 :            :   Cvc5Term deffun;
    4125                 :            :   {
    4126                 :          1 :     Cvc5* s1 = cvc5_new(d_tm);
    4127                 :          1 :     cvc5_set_logic(s1, "ALL");
    4128                 :          1 :     cvc5_set_option(s1, "produce-models", "true");
    4129                 :          1 :     Cvc5Term fun1 = cvc5_declare_fun(s1, "f1", 0, nullptr, d_int, true);
    4130                 :          1 :     Cvc5Term x = cvc5_mk_var(d_tm, d_int, "x");
    4131                 :          1 :     zero = cvc5_mk_integer_int64(d_tm, 0);
    4132                 :          1 :     std::vector<Cvc5Term> args = {x};
    4133                 :            :     deffun =
    4134                 :          1 :         cvc5_define_fun(s1, "f", args.size(), args.data(), d_int, zero, true);
    4135                 :          1 :     args = {fun1, zero};
    4136                 :          1 :     cvc5_assert_formula(
    4137                 :          1 :         s1, cvc5_mk_term(d_tm, CVC5_KIND_EQUAL, args.size(), args.data()));
    4138                 :          1 :     cvc5_check_sat(s1);
    4139                 :          1 :     value1 = cvc5_get_value(s1, fun1);
    4140                 :          1 :     cvc5_delete(s1);
    4141                 :          1 :   }
    4142 [ -  + ][ +  - ]:          1 :   ASSERT_TRUE(cvc5_term_is_equal(zero, value1));
    4143                 :            :   {
    4144                 :          1 :     Cvc5* s2 = cvc5_new(d_tm);
    4145                 :          1 :     cvc5_set_logic(s2, "ALL");
    4146                 :          1 :     cvc5_set_option(s2, "produce-models", "true");
    4147                 :          1 :     Cvc5Term fun2 = cvc5_declare_fun(s2, "f2", 0, nullptr, d_int, true);
    4148                 :          1 :     std::vector<Cvc5Term> args = {fun2, value1};
    4149                 :          1 :     cvc5_assert_formula(
    4150                 :          1 :         s2, cvc5_mk_term(d_tm, CVC5_KIND_EQUAL, args.size(), args.data()));
    4151                 :          1 :     cvc5_check_sat(s2);
    4152                 :          1 :     value2 = cvc5_get_value(s2, fun2);
    4153                 :          1 :     cvc5_delete(s2);
    4154                 :          1 :   }
    4155 [ -  + ][ +  - ]:          1 :   ASSERT_TRUE(cvc5_term_is_equal(value1, value2));
    4156                 :            :   {
    4157                 :          1 :     Cvc5* s3 = cvc5_new(d_tm);
    4158                 :          1 :     cvc5_set_logic(s3, "ALL");
    4159                 :          1 :     cvc5_set_option(s3, "produce-models", "true");
    4160                 :          1 :     Cvc5Term fun3 = cvc5_declare_fun(s3, "f3", 0, nullptr, d_int, true);
    4161                 :          1 :     std::vector<Cvc5Term> args = {deffun, zero};
    4162                 :            :     Cvc5Term apply =
    4163                 :          1 :         cvc5_mk_term(d_tm, CVC5_KIND_APPLY_UF, args.size(), args.data());
    4164                 :          1 :     args = {fun3, apply};
    4165                 :          1 :     cvc5_assert_formula(
    4166                 :          1 :         s3, cvc5_mk_term(d_tm, CVC5_KIND_EQUAL, args.size(), args.data()));
    4167                 :          1 :     cvc5_check_sat(s3);
    4168                 :          1 :     Cvc5Term value3 = cvc5_get_value(s3, fun3);
    4169 [ -  + ][ +  - ]:          1 :     ASSERT_TRUE(cvc5_term_is_equal(value1, value3));
    4170                 :          1 :     cvc5_delete(s3);
    4171         [ +  - ]:          1 :   }
    4172                 :            : }
    4173                 :            : 
    4174                 :            : #ifdef CVC5_USE_COCOA
    4175                 :            : 
    4176                 :          4 : TEST_F(TestCApiBlackSolver, basic_finite_field)
    4177                 :            : {
    4178                 :          1 :   cvc5_set_option(d_solver, "produce-models", "true");
    4179                 :            : 
    4180                 :          1 :   Cvc5Sort ff_sort = cvc5_mk_ff_sort(d_tm, "5", 10);
    4181                 :          1 :   Cvc5Term a = cvc5_mk_const(d_tm, ff_sort, "a");
    4182                 :          1 :   Cvc5Term b = cvc5_mk_const(d_tm, ff_sort, "b");
    4183 [ -  + ][ +  - ]:          2 :   ASSERT_EQ(std::string("5"), cvc5_sort_ff_get_size(ff_sort));
    4184                 :            : 
    4185                 :          1 :   std::vector<Cvc5Term> args = {a, b};
    4186                 :          0 :   args = {
    4187                 :          1 :       cvc5_mk_term(d_tm, CVC5_KIND_FINITE_FIELD_MULT, args.size(), args.data()),
    4188                 :          1 :       cvc5_mk_ff_elem(d_tm, "1", ff_sort, 10)};
    4189                 :          1 :   Cvc5Term inv = cvc5_mk_term(d_tm, CVC5_KIND_EQUAL, args.size(), args.data());
    4190                 :          1 :   args = {a, cvc5_mk_ff_elem(d_tm, "2", ff_sort, 10)};
    4191                 :            :   Cvc5Term a_is_two =
    4192                 :          1 :       cvc5_mk_term(d_tm, CVC5_KIND_EQUAL, args.size(), args.data());
    4193                 :            : 
    4194                 :          1 :   cvc5_assert_formula(d_solver, inv);
    4195                 :          1 :   cvc5_assert_formula(d_solver, a_is_two);
    4196 [ -  + ][ +  - ]:          1 :   ASSERT_TRUE(cvc5_result_is_sat(cvc5_check_sat(d_solver)));
    4197         [ -  + ]:          1 :   ASSERT_EQ(cvc5_term_get_ff_value(cvc5_get_value(d_solver, a)),
    4198         [ +  - ]:          1 :             std::string("2"));
    4199         [ -  + ]:          1 :   ASSERT_EQ(cvc5_term_get_ff_value(cvc5_get_value(d_solver, b)),
    4200         [ +  - ]:          1 :             std::string("-2"));
    4201                 :            : 
    4202                 :          1 :   args = {b, cvc5_mk_ff_elem(d_tm, "2", ff_sort, 10)};
    4203                 :            :   Cvc5Term b_is_two =
    4204                 :          1 :       cvc5_mk_term(d_tm, CVC5_KIND_EQUAL, args.size(), args.data());
    4205                 :          1 :   cvc5_assert_formula(d_solver, b_is_two);
    4206 [ -  + ][ +  - ]:          1 :   ASSERT_FALSE(cvc5_result_is_sat(cvc5_check_sat(d_solver)));
    4207                 :            : }
    4208                 :            : 
    4209                 :          4 : TEST_F(TestCApiBlackSolver, basic_finite_field_base)
    4210                 :            : {
    4211                 :          1 :   cvc5_set_option(d_solver, "produce-models", "true");
    4212                 :            : 
    4213                 :          1 :   Cvc5Sort ff_sort = cvc5_mk_ff_sort(d_tm, "101", 2);
    4214                 :          1 :   Cvc5Term a = cvc5_mk_const(d_tm, ff_sort, "a");
    4215                 :          1 :   Cvc5Term b = cvc5_mk_const(d_tm, ff_sort, "b");
    4216 [ -  + ][ +  - ]:          2 :   ASSERT_EQ(std::string("5"), cvc5_sort_ff_get_size(ff_sort));
    4217                 :            : 
    4218                 :          1 :   std::vector<Cvc5Term> args = {a, b};
    4219                 :          0 :   args = {
    4220                 :          1 :       cvc5_mk_term(d_tm, CVC5_KIND_FINITE_FIELD_MULT, args.size(), args.data()),
    4221                 :          1 :       cvc5_mk_ff_elem(d_tm, "1", ff_sort, 3)};
    4222                 :          1 :   Cvc5Term inv = cvc5_mk_term(d_tm, CVC5_KIND_EQUAL, args.size(), args.data());
    4223                 :            : 
    4224                 :          1 :   args = {a, cvc5_mk_ff_elem(d_tm, "10", ff_sort, 2)};
    4225                 :            :   Cvc5Term a_is_two =
    4226                 :          1 :       cvc5_mk_term(d_tm, CVC5_KIND_EQUAL, args.size(), args.data());
    4227                 :            : 
    4228                 :          1 :   cvc5_assert_formula(d_solver, inv);
    4229                 :          1 :   cvc5_assert_formula(d_solver, a_is_two);
    4230 [ -  + ][ +  - ]:          1 :   ASSERT_TRUE(cvc5_result_is_sat(cvc5_check_sat(d_solver)));
    4231         [ -  + ]:          1 :   ASSERT_EQ(cvc5_term_get_ff_value(cvc5_get_value(d_solver, a)),
    4232         [ +  - ]:          1 :             std::string("2"));
    4233         [ -  + ]:          1 :   ASSERT_EQ(cvc5_term_get_ff_value(cvc5_get_value(d_solver, b)),
    4234         [ +  - ]:          1 :             std::string("-2"));
    4235                 :            : 
    4236                 :          1 :   args = {b, cvc5_mk_ff_elem(d_tm, "2", ff_sort, 10)};
    4237                 :            :   Cvc5Term b_is_two =
    4238                 :          1 :       cvc5_mk_term(d_tm, CVC5_KIND_EQUAL, args.size(), args.data());
    4239                 :          1 :   cvc5_assert_formula(d_solver, b_is_two);
    4240 [ -  + ][ +  - ]:          1 :   ASSERT_FALSE(cvc5_result_is_sat(cvc5_check_sat(d_solver)));
    4241                 :            : }
    4242                 :            : #endif  // CVC5_USE_COCOA
    4243                 :            : 
    4244                 :          4 : TEST_F(TestCApiBlackSolver, output1)
    4245                 :            : {
    4246 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_is_output_on(nullptr, "inst"),
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    4247                 :            :                     "unexpected NULL argument");
    4248 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_is_output_on(d_solver, nullptr),
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    4249                 :            :                     "unexpected NULL argument");
    4250 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_is_output_on(d_solver, "foo-invalid"),
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    4251                 :            :                     "invalid output tag");
    4252                 :            : 
    4253 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_get_output(nullptr, "inst", "<stdout>"),
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    4254                 :            :                     "unexpected NULL argument");
    4255 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_get_output(d_solver, nullptr, "<stdout>"),
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    4256                 :            :                     "unexpected NULL argument");
    4257 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_get_output(d_solver, "inst", nullptr),
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    4258                 :            :                     "unexpected NULL argument");
    4259 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_get_output(d_solver, "foo-invalid", "<stdout>"),
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    4260                 :            :                     "invalid output tag");
    4261                 :            : 
    4262 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_close_output(nullptr, "<stdout>"),
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    4263                 :            :                     "unexpected NULL argument");
    4264 [ -  + ][ +  - ]:          5 :   ASSERT_CVC5_ERROR(cvc5_close_output(d_solver, nullptr),
         [ -  + ][ +  - ]
         [ +  - ][ +  - ]
    4265                 :            :                     "unexpected NULL argument");
    4266                 :            :   // should not fail
    4267                 :          1 :   cvc5_close_output(d_solver, "<stdout>");
    4268                 :            : }
    4269                 :            : 
    4270                 :          4 : TEST_F(TestCApiBlackSolver, output2)
    4271                 :            : {
    4272 [ -  + ][ +  - ]:          1 :   ASSERT_FALSE(cvc5_is_output_on(d_solver, "inst"));
    4273                 :            :   // noop if output tag is not enabled
    4274                 :          1 :   cvc5_get_output(d_solver, "inst", "<stdout>");
    4275                 :          1 :   cvc5_set_option(d_solver, "output", "inst");
    4276 [ -  + ][ +  - ]:          1 :   ASSERT_TRUE(cvc5_is_output_on(d_solver, "inst"));
    4277                 :          1 :   cvc5_get_output(d_solver, "inst", "<stdout>");
    4278                 :            : }
    4279                 :            : 
    4280                 :          4 : TEST_F(TestCApiBlackSolver, output3)
    4281                 :            : {
    4282                 :          1 :   cvc5_set_option(d_solver, "output", "post-asserts");
    4283                 :          1 :   cvc5_get_output(d_solver, "post-asserts", "<stdout>");
    4284                 :            : 
    4285                 :          1 :   testing::internal::CaptureStdout();
    4286                 :            : 
    4287                 :          1 :   std::vector<Cvc5Term> vars = {cvc5_mk_var(d_tm, d_bool, "b")};
    4288                 :          1 :   Cvc5Term g = cvc5_define_fun(
    4289                 :          1 :       d_solver, "g", vars.size(), vars.data(), d_bool, vars[0], true);
    4290                 :          1 :   std::vector<Cvc5Term> args = {g, cvc5_mk_true(d_tm)};
    4291                 :          1 :   args = {cvc5_mk_term(d_tm, CVC5_KIND_APPLY_UF, args.size(), args.data())};
    4292                 :          1 :   Cvc5Term appnot = cvc5_mk_term(d_tm, CVC5_KIND_NOT, args.size(), args.data());
    4293                 :          1 :   args = {cvc5_define_fun(
    4294                 :          1 :       d_solver, "f", 0, nullptr, d_bool, cvc5_mk_true(d_tm), true)};
    4295                 :          1 :   args = {cvc5_mk_term(d_tm, CVC5_KIND_NOT, args.size(), args.data()), appnot};
    4296                 :          1 :   cvc5_assert_formula(
    4297                 :          1 :       d_solver, cvc5_mk_term(d_tm, CVC5_KIND_OR, args.size(), args.data()));
    4298                 :          1 :   cvc5_check_sat(d_solver);
    4299                 :            : 
    4300                 :          1 :   std::string out = testing::internal::GetCapturedStdout();
    4301                 :          1 :   std::stringstream expected;
    4302                 :          1 :   expected << ";; post-asserts start" << std::endl;
    4303                 :          1 :   expected << "(set-logic ALL)" << std::endl;
    4304                 :          1 :   expected << "(define-fun f () Bool true)" << std::endl;
    4305                 :          1 :   expected << "(define-fun g ((b Bool)) Bool b)" << std::endl;
    4306                 :          1 :   expected << "(assert false)" << std::endl;
    4307                 :          1 :   expected << "(check-sat)" << std::endl;
    4308                 :          1 :   expected << ";; post-asserts end" << std::endl;
    4309 [ -  + ][ +  - ]:          2 :   ASSERT_EQ(out, expected.str());
    4310 [ +  - ][ +  - ]:          1 : }
         [ +  - ][ +  - ]
    4311                 :            : 
    4312                 :          4 : TEST_F(TestCApiBlackSolver, output4)
    4313                 :            : {
    4314                 :          1 :   const char* filename = "foo.out";
    4315                 :          1 :   cvc5_set_option(d_solver, "output", "post-asserts");
    4316                 :          1 :   cvc5_get_output(d_solver, "post-asserts", filename);
    4317                 :            : 
    4318                 :          1 :   std::vector<Cvc5Term> vars = {cvc5_mk_var(d_tm, d_bool, "b")};
    4319                 :          1 :   Cvc5Term g = cvc5_define_fun(
    4320                 :          1 :       d_solver, "g", vars.size(), vars.data(), d_bool, vars[0], true);
    4321                 :          1 :   std::vector<Cvc5Term> args = {g, cvc5_mk_true(d_tm)};
    4322                 :          1 :   args = {cvc5_mk_term(d_tm, CVC5_KIND_APPLY_UF, args.size(), args.data())};
    4323                 :          1 :   Cvc5Term appnot = cvc5_mk_term(d_tm, CVC5_KIND_NOT, args.size(), args.data());
    4324                 :          1 :   args = {cvc5_define_fun(
    4325                 :          1 :       d_solver, "f", 0, nullptr, d_bool, cvc5_mk_true(d_tm), true)};
    4326                 :          1 :   args = {cvc5_mk_term(d_tm, CVC5_KIND_NOT, args.size(), args.data()), appnot};
    4327                 :          1 :   cvc5_assert_formula(
    4328                 :          1 :       d_solver, cvc5_mk_term(d_tm, CVC5_KIND_OR, args.size(), args.data()));
    4329                 :          1 :   cvc5_check_sat(d_solver);
    4330                 :            : 
    4331                 :          1 :   cvc5_close_output(d_solver, filename);
    4332                 :          1 :   std::ifstream in(filename);
    4333                 :          1 :   std::stringstream out;
    4334                 :          1 :   out << in.rdbuf();
    4335                 :          1 :   std::stringstream expected;
    4336                 :          1 :   expected << ";; post-asserts start" << std::endl;
    4337                 :          1 :   expected << "(set-logic ALL)" << std::endl;
    4338                 :          1 :   expected << "(define-fun f () Bool true)" << std::endl;
    4339                 :          1 :   expected << "(define-fun g ((b Bool)) Bool b)" << std::endl;
    4340                 :          1 :   expected << "(assert false)" << std::endl;
    4341                 :          1 :   expected << "(check-sat)" << std::endl;
    4342                 :          1 :   expected << ";; post-asserts end" << std::endl;
    4343 [ -  + ][ +  - ]:          2 :   ASSERT_EQ(out.str(), expected.str());
    4344                 :          1 :   std::remove(filename);
    4345 [ +  - ][ +  - ]:          1 : }
         [ +  - ][ +  - ]
                 [ +  - ]
    4346                 :            : }  // namespace cvc5::internal::test

Generated by: LCOV version 1.14