LCOV - code coverage report
Current view: top level - buildbot/coverage/build/test/unit/api/c - capi_term_black.cpp (source / functions) Hit Total Coverage
Test: coverage.info Lines: 760 762 99.7 %
Date: 2025-03-19 10:36:02 Functions: 64 64 100.0 %
Branches: 377 750 50.3 %

           Branch data     Line data    Source code
       1                 :            : /******************************************************************************
       2                 :            :  * Top contributors (to current version):
       3                 :            :  *   Aina Niemetz, Andrew Reynolds, Makai Mann
       4                 :            :  *
       5                 :            :  * This file is part of the cvc5 project.
       6                 :            :  *
       7                 :            :  * Copyright (c) 2009-2025 by the authors listed in the file AUTHORS
       8                 :            :  * in the top-level source directory and their institutional affiliations.
       9                 :            :  * All rights reserved.  See the file COPYING in the top-level source
      10                 :            :  * directory for licensing information.
      11                 :            :  * ****************************************************************************
      12                 :            :  *
      13                 :            :  * Black box testing of the guards of the C API functions.
      14                 :            :  */
      15                 :            : 
      16                 :            : extern "C" {
      17                 :            : #include <cvc5/c/cvc5.h>
      18                 :            : }
      19                 :            : 
      20                 :            : #include "base/output.h"
      21                 :            : #include "gtest/gtest.h"
      22                 :            : 
      23                 :            : namespace cvc5::internal::test {
      24                 :            : 
      25                 :            : class TestCApiBlackTerm : public ::testing::Test
      26                 :            : {
      27                 :            :  protected:
      28                 :       2331 :   void SetUp() override
      29                 :            :   {
      30                 :       2331 :     d_tm = cvc5_term_manager_new();
      31                 :       2331 :     d_solver = cvc5_new(d_tm);
      32                 :       2331 :     d_bool = cvc5_get_boolean_sort(d_tm);
      33                 :       2331 :     d_int = cvc5_get_integer_sort(d_tm);
      34                 :       2331 :     d_real = cvc5_get_real_sort(d_tm);
      35                 :       2331 :     d_uninterpreted = cvc5_mk_uninterpreted_sort(d_tm, "u");
      36                 :       2331 :   }
      37                 :       2203 :   void TearDown() override
      38                 :            :   {
      39                 :       2203 :     cvc5_delete(d_solver);
      40                 :       2203 :     cvc5_term_manager_delete(d_tm);
      41                 :       2203 :   }
      42                 :            : 
      43                 :            :   Cvc5TermManager* d_tm;
      44                 :            :   Cvc5* d_solver;
      45                 :            :   Cvc5Sort d_bool;
      46                 :            :   Cvc5Sort d_int;
      47                 :            :   Cvc5Sort d_real;
      48                 :            :   Cvc5Sort d_uninterpreted;
      49                 :            : };
      50                 :            : 
      51                 :        258 : TEST_F(TestCApiBlackTerm, hash)
      52                 :            : {
      53                 :        129 :   ASSERT_DEATH(cvc5_term_hash(nullptr), "invalid term");
      54                 :        128 :   (void)cvc5_term_hash(cvc5_mk_integer_int64(d_tm, 2));
      55                 :        128 :   Cvc5Term x = cvc5_mk_var(d_tm, d_int, "x");
      56                 :        128 :   Cvc5Term y = cvc5_mk_var(d_tm, d_int, "y");
      57         [ -  + ]:        128 :   ASSERT_EQ(cvc5_term_hash(x), cvc5_term_hash(x));
      58         [ -  + ]:        128 :   ASSERT_NE(cvc5_term_hash(x), cvc5_term_hash(y));
      59                 :            : }
      60                 :            : 
      61                 :        256 : TEST_F(TestCApiBlackTerm, copy_release)
      62                 :            : {
      63                 :        128 :   ASSERT_DEATH(cvc5_term_copy(nullptr), "invalid term");
      64                 :        127 :   ASSERT_DEATH(cvc5_term_release(nullptr), "invalid term");
      65                 :        126 :   Cvc5Term tint = cvc5_mk_integer_int64(d_tm, 2);
      66                 :        126 :   size_t hash1 = cvc5_term_hash(tint);
      67                 :        126 :   Cvc5Term tint_copy = cvc5_term_copy(tint);
      68                 :        126 :   size_t hash2 = cvc5_term_hash(tint_copy);
      69         [ -  + ]:        126 :   ASSERT_EQ(hash1, hash2);
      70                 :        126 :   cvc5_term_release(tint);
      71         [ -  + ]:        126 :   ASSERT_EQ(cvc5_term_hash(tint), cvc5_term_hash(tint_copy));
      72                 :        126 :   cvc5_term_release(tint);
      73                 :            :   // we cannot reliably check that querying on the (now freed) term fails
      74                 :            :   // unless ASAN is enabled
      75                 :            : }
      76                 :            : 
      77                 :        252 : TEST_F(TestCApiBlackTerm, compare)
      78                 :            : {
      79                 :        126 :   Cvc5Term x = cvc5_mk_var(d_tm, d_uninterpreted, "x");
      80                 :        126 :   Cvc5Term y = cvc5_mk_var(d_tm, d_uninterpreted, "y");
      81                 :        126 :   ASSERT_DEATH(cvc5_term_compare(x, nullptr), "invalid term");
      82                 :        125 :   ASSERT_DEATH(cvc5_term_compare(nullptr, y), "invalid term");
      83         [ -  + ]:        124 :   ASSERT_FALSE(cvc5_term_is_equal(x, nullptr));
      84         [ -  + ]:        124 :   ASSERT_TRUE(cvc5_term_is_disequal(x, nullptr));
      85         [ -  + ]:        124 :   ASSERT_EQ(cvc5_term_compare(x, x), 0);
      86         [ -  + ]:        124 :   ASSERT_NE(cvc5_term_compare(x, y), 0);
      87                 :            : }
      88                 :            : 
      89                 :        248 : TEST_F(TestCApiBlackTerm, get_id)
      90                 :            : {
      91                 :        124 :   ASSERT_DEATH(cvc5_term_get_id(nullptr), "invalid term");
      92                 :        123 :   Cvc5Term x = cvc5_mk_var(d_tm, d_int, "x");
      93                 :        123 :   Cvc5Term y = cvc5_term_copy(x);
      94                 :        123 :   Cvc5Term z = cvc5_mk_var(d_tm, d_int, "z");
      95                 :        123 :   (void)cvc5_term_get_id(x);
      96         [ -  + ]:        123 :   ASSERT_EQ(cvc5_term_get_id(x), cvc5_term_get_id(y));
      97         [ -  + ]:        123 :   ASSERT_NE(cvc5_term_get_id(x), cvc5_term_get_id(z));
      98                 :        123 :   cvc5_term_release(y);
      99                 :            : }
     100                 :            : 
     101                 :        246 : TEST_F(TestCApiBlackTerm, get_kind)
     102                 :            : {
     103                 :        123 :   std::vector<Cvc5Sort> domain = {d_uninterpreted};
     104                 :            :   Cvc5Sort fun_sort1 =
     105                 :        123 :       cvc5_mk_fun_sort(d_tm, domain.size(), domain.data(), d_int);
     106                 :        123 :   domain = {d_int};
     107                 :            :   Cvc5Sort fun_sort2 =
     108                 :        123 :       cvc5_mk_fun_sort(d_tm, domain.size(), domain.data(), d_int);
     109                 :            : 
     110                 :        123 :   ASSERT_DEATH(cvc5_term_get_kind(nullptr), "invalid term");
     111                 :            : 
     112                 :        122 :   Cvc5Term x = cvc5_mk_var(d_tm, d_uninterpreted, "x");
     113         [ -  + ]:        122 :   ASSERT_EQ(cvc5_term_get_kind(x), CVC5_KIND_VARIABLE);
     114                 :        122 :   Cvc5Term y = cvc5_mk_var(d_tm, d_uninterpreted, "y");
     115         [ -  + ]:        122 :   ASSERT_EQ(cvc5_term_get_kind(y), CVC5_KIND_VARIABLE);
     116                 :            : 
     117                 :        122 :   Cvc5Term f = cvc5_mk_var(d_tm, fun_sort1, "f");
     118         [ -  + ]:        122 :   ASSERT_EQ(cvc5_term_get_kind(f), CVC5_KIND_VARIABLE);
     119                 :        122 :   Cvc5Term p = cvc5_mk_var(d_tm, fun_sort2, "p");
     120         [ -  + ]:        122 :   ASSERT_EQ(cvc5_term_get_kind(p), CVC5_KIND_VARIABLE);
     121                 :            : 
     122                 :        122 :   Cvc5Term zero = cvc5_mk_integer_int64(d_tm, 0);
     123         [ -  + ]:        122 :   ASSERT_EQ(cvc5_term_get_kind(zero), CVC5_KIND_CONST_INTEGER);
     124                 :            : 
     125                 :        122 :   std::vector<Cvc5Term> args = {f, x};
     126                 :            :   Cvc5Term f_x =
     127                 :        122 :       cvc5_mk_term(d_tm, CVC5_KIND_APPLY_UF, args.size(), args.data());
     128         [ -  + ]:        122 :   ASSERT_EQ(cvc5_term_get_kind(f_x), CVC5_KIND_APPLY_UF);
     129                 :        122 :   args = {f, y};
     130                 :            :   Cvc5Term f_y =
     131                 :        122 :       cvc5_mk_term(d_tm, CVC5_KIND_APPLY_UF, args.size(), args.data());
     132         [ -  + ]:        122 :   ASSERT_EQ(cvc5_term_get_kind(f_y), CVC5_KIND_APPLY_UF);
     133                 :        122 :   args = {f_x, f_y};
     134                 :        122 :   Cvc5Term sum = cvc5_mk_term(d_tm, CVC5_KIND_ADD, args.size(), args.data());
     135         [ -  + ]:        122 :   ASSERT_EQ(cvc5_term_get_kind(sum), CVC5_KIND_ADD);
     136                 :        122 :   args = {p, zero};
     137                 :            :   Cvc5Term p_0 =
     138                 :        122 :       cvc5_mk_term(d_tm, CVC5_KIND_APPLY_UF, args.size(), args.data());
     139         [ -  + ]:        122 :   ASSERT_EQ(cvc5_term_get_kind(p_0), CVC5_KIND_APPLY_UF);
     140                 :        122 :   args = {p, f_y};
     141                 :            :   Cvc5Term p_f_y =
     142                 :        122 :       cvc5_mk_term(d_tm, CVC5_KIND_APPLY_UF, args.size(), args.data());
     143         [ -  + ]:        122 :   ASSERT_EQ(cvc5_term_get_kind(p_f_y), CVC5_KIND_APPLY_UF);
     144                 :            : 
     145                 :            :   // Sequence kinds do not exist internally, test that the API properly
     146                 :            :   // converts them back.
     147                 :        122 :   Cvc5Sort seq_sort = cvc5_mk_sequence_sort(d_tm, d_int);
     148                 :        122 :   Cvc5Term s = cvc5_mk_const(d_tm, seq_sort, "s");
     149                 :        122 :   args = {s, s};
     150                 :            :   Cvc5Term ss =
     151                 :        122 :       cvc5_mk_term(d_tm, CVC5_KIND_SEQ_CONCAT, args.size(), args.data());
     152         [ -  + ]:        122 :   ASSERT_EQ(cvc5_term_get_kind(ss), CVC5_KIND_SEQ_CONCAT);
     153                 :            : }
     154                 :            : 
     155                 :        244 : TEST_F(TestCApiBlackTerm, get_sort)
     156                 :            : {
     157                 :        122 :   Cvc5Sort bv_sort = cvc5_mk_bv_sort(d_tm, 8);
     158                 :        122 :   std::vector<Cvc5Sort> domain = {bv_sort};
     159                 :            :   Cvc5Sort fun_sort1 =
     160                 :        122 :       cvc5_mk_fun_sort(d_tm, domain.size(), domain.data(), d_int);
     161                 :        122 :   domain = {d_int};
     162                 :            :   Cvc5Sort fun_sort2 =
     163                 :        122 :       cvc5_mk_fun_sort(d_tm, domain.size(), domain.data(), d_bool);
     164                 :            : 
     165                 :        122 :   ASSERT_DEATH(cvc5_term_get_sort(nullptr), "invalid term");
     166                 :            : 
     167                 :        121 :   Cvc5Term x = cvc5_mk_var(d_tm, bv_sort, "x");
     168         [ -  + ]:        121 :   ASSERT_TRUE(cvc5_sort_is_equal(cvc5_term_get_sort(x), bv_sort));
     169                 :        121 :   Cvc5Term y = cvc5_mk_var(d_tm, bv_sort, "y");
     170         [ -  + ]:        121 :   ASSERT_TRUE(cvc5_sort_is_equal(cvc5_term_get_sort(x), cvc5_term_get_sort(y)));
     171                 :            : 
     172                 :        121 :   Cvc5Term f = cvc5_mk_var(d_tm, fun_sort1, "f");
     173         [ -  + ]:        121 :   ASSERT_TRUE(cvc5_sort_is_equal(cvc5_term_get_sort(f), fun_sort1));
     174                 :        121 :   Cvc5Term p = cvc5_mk_var(d_tm, fun_sort2, "p");
     175         [ -  + ]:        121 :   ASSERT_TRUE(cvc5_sort_is_equal(cvc5_term_get_sort(p), fun_sort2));
     176                 :            : 
     177                 :        121 :   Cvc5Term zero = cvc5_mk_integer_int64(d_tm, 0);
     178         [ -  + ]:        121 :   ASSERT_TRUE(cvc5_sort_is_equal(cvc5_term_get_sort(zero), d_int));
     179                 :            : 
     180                 :        121 :   std::vector<Cvc5Term> args = {f, x};
     181                 :            :   Cvc5Term f_x =
     182                 :        121 :       cvc5_mk_term(d_tm, CVC5_KIND_APPLY_UF, args.size(), args.data());
     183         [ -  + ]:        121 :   ASSERT_TRUE(cvc5_sort_is_equal(cvc5_term_get_sort(f_x), d_int));
     184                 :        121 :   args = {f, y};
     185                 :            :   Cvc5Term f_y =
     186                 :        121 :       cvc5_mk_term(d_tm, CVC5_KIND_APPLY_UF, args.size(), args.data());
     187         [ -  + ]:        121 :   ASSERT_TRUE(cvc5_sort_is_equal(cvc5_term_get_sort(f_y), d_int));
     188                 :        121 :   args = {f_x, f_y};
     189                 :        121 :   Cvc5Term sum = cvc5_mk_term(d_tm, CVC5_KIND_ADD, args.size(), args.data());
     190         [ -  + ]:        121 :   ASSERT_TRUE(cvc5_sort_is_equal(cvc5_term_get_sort(sum), d_int));
     191                 :        121 :   args = {p, zero};
     192                 :            :   Cvc5Term p_0 =
     193                 :        121 :       cvc5_mk_term(d_tm, CVC5_KIND_APPLY_UF, args.size(), args.data());
     194         [ -  + ]:        121 :   ASSERT_TRUE(cvc5_sort_is_equal(cvc5_term_get_sort(p_0), d_bool));
     195                 :        121 :   args = {p, f_y};
     196                 :            :   Cvc5Term p_f_y =
     197                 :        121 :       cvc5_mk_term(d_tm, CVC5_KIND_APPLY_UF, args.size(), args.data());
     198         [ -  + ]:        121 :   ASSERT_TRUE(cvc5_sort_is_equal(cvc5_term_get_sort(p_f_y), d_bool));
     199         [ -  + ]:        121 :   ASSERT_EQ(cvc5_term_get_kind(p_f_y), CVC5_KIND_APPLY_UF);
     200                 :            : }
     201                 :            : 
     202                 :        242 : TEST_F(TestCApiBlackTerm, get_op)
     203                 :            : {
     204                 :        121 :   ASSERT_DEATH(cvc5_term_has_op(nullptr), "invalid term");
     205                 :        120 :   ASSERT_DEATH(cvc5_term_get_op(nullptr), "invalid term");
     206                 :            : 
     207                 :        119 :   Cvc5Sort bv_sort = cvc5_mk_bv_sort(d_tm, 8);
     208                 :        119 :   Cvc5Sort arr_sort = cvc5_mk_array_sort(d_tm, bv_sort, d_int);
     209                 :        119 :   std::vector<Cvc5Sort> domain = {d_int};
     210                 :            :   Cvc5Sort fun_sort =
     211                 :        119 :       cvc5_mk_fun_sort(d_tm, domain.size(), domain.data(), bv_sort);
     212                 :            : 
     213                 :        119 :   Cvc5Term x = cvc5_mk_const(d_tm, d_int, "x");
     214                 :        119 :   Cvc5Term a = cvc5_mk_const(d_tm, arr_sort, "a");
     215                 :        119 :   Cvc5Term b = cvc5_mk_const(d_tm, bv_sort, "b");
     216                 :            : 
     217         [ -  + ]:        119 :   ASSERT_FALSE(cvc5_term_has_op(x));
     218                 :        119 :   ASSERT_DEATH(cvc5_term_get_op(x), "expected Term to have an Op");
     219                 :            : 
     220                 :        118 :   std::vector<Cvc5Term> args = {a, b};
     221                 :        118 :   Cvc5Term ab = cvc5_mk_term(d_tm, CVC5_KIND_SELECT, args.size(), args.data());
     222         [ -  + ]:        118 :   ASSERT_TRUE(cvc5_term_has_op(ab));
     223         [ -  + ]:        118 :   ASSERT_FALSE(cvc5_op_is_indexed(cvc5_term_get_op(ab)));
     224                 :            : 
     225                 :        118 :   std::vector<uint32_t> idxs = {4, 0};
     226                 :            :   Cvc5Op ext =
     227                 :        118 :       cvc5_mk_op(d_tm, CVC5_KIND_BITVECTOR_EXTRACT, idxs.size(), idxs.data());
     228                 :        118 :   args = {b};
     229                 :        118 :   Cvc5Term extb = cvc5_mk_term_from_op(d_tm, ext, args.size(), args.data());
     230         [ -  + ]:        118 :   ASSERT_EQ(cvc5_term_get_kind(extb), CVC5_KIND_BITVECTOR_EXTRACT);
     231                 :            :   // can compare directly to a Kind (will invoke Op constructor)
     232         [ -  + ]:        118 :   ASSERT_TRUE(cvc5_term_has_op(extb));
     233         [ -  + ]:        118 :   ASSERT_TRUE(cvc5_op_is_indexed(cvc5_term_get_op(extb)));
     234         [ -  + ]:        118 :   ASSERT_TRUE(cvc5_op_is_equal(cvc5_term_get_op(extb), ext));
     235                 :            : 
     236                 :        118 :   idxs = {4};
     237                 :            :   Cvc5Op bit =
     238                 :        118 :       cvc5_mk_op(d_tm, CVC5_KIND_BITVECTOR_BIT, idxs.size(), idxs.data());
     239                 :        118 :   Cvc5Term bitb = cvc5_mk_term_from_op(d_tm, bit, args.size(), args.data());
     240         [ -  + ]:        118 :   ASSERT_EQ(cvc5_term_get_kind(bitb), CVC5_KIND_BITVECTOR_BIT);
     241         [ -  + ]:        118 :   ASSERT_TRUE(cvc5_term_has_op(bitb));
     242         [ -  + ]:        118 :   ASSERT_TRUE(cvc5_op_is_equal(cvc5_term_get_op(bitb), bit));
     243         [ -  + ]:        118 :   ASSERT_TRUE(cvc5_op_is_indexed(cvc5_term_get_op(bitb)));
     244         [ -  + ]:        118 :   ASSERT_EQ(cvc5_op_get_num_indices(bit), 1);
     245         [ -  + ]:        118 :   ASSERT_TRUE(cvc5_term_is_equal(cvc5_op_get_index(bit, 0),
     246                 :            :                                  cvc5_mk_integer_int64(d_tm, 4)));
     247                 :            : 
     248                 :        118 :   Cvc5Term f = cvc5_mk_const(d_tm, fun_sort, "f");
     249                 :        118 :   args = {f, x};
     250                 :            :   Cvc5Term fx =
     251                 :        118 :       cvc5_mk_term(d_tm, CVC5_KIND_APPLY_UF, args.size(), args.data());
     252         [ -  + ]:        118 :   ASSERT_FALSE(cvc5_term_has_op(f));
     253                 :        118 :   ASSERT_DEATH(cvc5_term_get_op(f), "expected Term to have an Op");
     254         [ -  + ]:        117 :   ASSERT_TRUE(cvc5_term_has_op(fx));
     255                 :            : 
     256                 :            :   // testing rebuild from op and children
     257         [ -  + ]:        117 :   ASSERT_TRUE(cvc5_term_is_equal(
     258                 :            :       fx,
     259                 :            :       cvc5_mk_term_from_op(
     260                 :            :           d_tm, cvc5_term_get_op(fx), args.size(), args.data())));
     261                 :            : 
     262                 :            :   // Test Datatypes Ops
     263                 :        117 :   Cvc5Sort sort = cvc5_mk_param_sort(d_tm, "T");
     264                 :        117 :   std::vector<Cvc5Sort> sorts = {sort};
     265                 :        117 :   Cvc5DatatypeDecl decl = cvc5_mk_dt_decl_with_params(
     266                 :        117 :       d_tm, "paramlist", sorts.size(), sorts.data(), false);
     267                 :        117 :   Cvc5DatatypeConstructorDecl cons = cvc5_mk_dt_cons_decl(d_tm, "cons");
     268                 :        117 :   cvc5_dt_cons_decl_add_selector(cons, "head", sort);
     269                 :        117 :   cvc5_dt_cons_decl_add_selector_self(cons, "tail");
     270                 :        117 :   cvc5_dt_decl_add_constructor(decl, cons);
     271                 :        117 :   Cvc5DatatypeConstructorDecl nil = cvc5_mk_dt_cons_decl(d_tm, "nil");
     272                 :        117 :   cvc5_dt_decl_add_constructor(decl, nil);
     273                 :        117 :   Cvc5Sort list_sort = cvc5_mk_dt_sort(d_tm, decl);
     274                 :        117 :   sorts = {d_int};
     275                 :            :   Cvc5Sort int_list_sort =
     276                 :        117 :       cvc5_sort_instantiate(list_sort, sorts.size(), sorts.data());
     277                 :            : 
     278                 :        117 :   Cvc5Term c = cvc5_mk_const(d_tm, int_list_sort, "c");
     279                 :        117 :   Cvc5Datatype list = cvc5_sort_get_datatype(list_sort);
     280                 :            :   // list datatype constructor and selector operator terms
     281                 :            :   Cvc5Term cons_term =
     282                 :        117 :       cvc5_dt_cons_get_term(cvc5_dt_get_constructor_by_name(list, "cons"));
     283                 :            :   Cvc5Term nil_term =
     284                 :        117 :       cvc5_dt_cons_get_term(cvc5_dt_get_constructor_by_name(list, "nil"));
     285                 :        117 :   Cvc5Term head_term = cvc5_dt_sel_get_term(cvc5_dt_get_selector(list, "head"));
     286                 :        117 :   Cvc5Term tail_term = cvc5_dt_sel_get_term(cvc5_dt_get_selector(list, "tail"));
     287                 :            : 
     288                 :        117 :   args = {nil_term};
     289                 :            :   Cvc5Term apply_nil_term =
     290                 :        117 :       cvc5_mk_term(d_tm, CVC5_KIND_APPLY_CONSTRUCTOR, args.size(), args.data());
     291                 :        117 :   args = {cons_term, cvc5_mk_integer_int64(d_tm, 0), apply_nil_term};
     292                 :            :   Cvc5Term apply_cons_term =
     293                 :        117 :       cvc5_mk_term(d_tm, CVC5_KIND_APPLY_CONSTRUCTOR, args.size(), args.data());
     294                 :        117 :   args = {head_term, apply_cons_term};
     295                 :            :   Cvc5Term apply_head_term =
     296                 :        117 :       cvc5_mk_term(d_tm, CVC5_KIND_APPLY_SELECTOR, args.size(), args.data());
     297                 :        117 :   args = {tail_term, apply_cons_term};
     298                 :            :   Cvc5Term apply_tail_term =
     299                 :        117 :       cvc5_mk_term(d_tm, CVC5_KIND_APPLY_SELECTOR, args.size(), args.data());
     300                 :            : 
     301         [ -  + ]:        117 :   ASSERT_FALSE(cvc5_term_has_op(c));
     302         [ -  + ]:        117 :   ASSERT_TRUE(cvc5_term_has_op(apply_nil_term));
     303         [ -  + ]:        117 :   ASSERT_TRUE(cvc5_term_has_op(apply_cons_term));
     304         [ -  + ]:        117 :   ASSERT_TRUE(cvc5_term_has_op(apply_head_term));
     305         [ -  + ]:        117 :   ASSERT_TRUE(cvc5_term_has_op(apply_tail_term));
     306                 :            : 
     307                 :            :   // Test rebuilding
     308                 :        117 :   args.clear();
     309         [ +  + ]:        351 :   for (size_t i = 0, n = cvc5_term_get_num_children(apply_head_term); i < n;
     310                 :            :        ++i)
     311                 :            :   {
     312                 :        234 :     args.push_back(cvc5_term_get_child(apply_head_term, i));
     313                 :            :   }
     314         [ -  + ]:        117 :   ASSERT_TRUE(cvc5_term_is_equal(
     315                 :            :       apply_head_term,
     316                 :            :       cvc5_mk_term_from_op(
     317                 :            :           d_tm, cvc5_term_get_op(apply_head_term), args.size(), args.data())));
     318                 :            : }
     319                 :            : 
     320                 :        234 : TEST_F(TestCApiBlackTerm, has_get_symbol)
     321                 :            : {
     322                 :        117 :   ASSERT_DEATH(cvc5_term_has_symbol(nullptr), "invalid term");
     323                 :        116 :   ASSERT_DEATH(cvc5_term_get_symbol(nullptr), "invalid term");
     324                 :            : 
     325                 :        115 :   Cvc5Term t = cvc5_mk_true(d_tm);
     326                 :        115 :   Cvc5Term c = cvc5_mk_const(d_tm, d_bool, "|\\|");
     327                 :            : 
     328         [ -  + ]:        115 :   ASSERT_FALSE(cvc5_term_has_symbol(t));
     329         [ -  + ]:        115 :   ASSERT_TRUE(cvc5_term_has_symbol(c));
     330                 :            : 
     331                 :        115 :   ASSERT_DEATH(cvc5_term_get_symbol(t), "cannot get symbol");
     332         [ -  + ]:        114 :   ASSERT_EQ(cvc5_term_get_symbol(c), std::string("|\\|"));
     333                 :            : }
     334                 :            : 
     335                 :        228 : TEST_F(TestCApiBlackTerm, assignment)
     336                 :            : {
     337                 :        114 :   Cvc5Term t1 = cvc5_mk_integer_int64(d_tm, 1);
     338                 :        114 :   Cvc5Term t2 = cvc5_term_copy(t1);
     339                 :        114 :   t2 = cvc5_mk_integer_int64(d_tm, 2);
     340         [ -  + ]:        114 :   ASSERT_TRUE(cvc5_term_is_equal(t1, cvc5_mk_integer_int64(d_tm, 1)));
     341         [ -  + ]:        114 :   ASSERT_TRUE(cvc5_term_is_equal(t2, cvc5_mk_integer_int64(d_tm, 2)));
     342         [ -  + ]:        114 :   ASSERT_FALSE(cvc5_term_is_equal(t1, t2));
     343                 :        114 :   cvc5_term_release(t1);
     344         [ -  + ]:        114 :   ASSERT_TRUE(cvc5_term_is_equal(t1, cvc5_mk_integer_int64(d_tm, 1)));
     345         [ -  + ]:        114 :   ASSERT_TRUE(cvc5_term_is_equal(t2, cvc5_mk_integer_int64(d_tm, 2)));
     346         [ -  + ]:        114 :   ASSERT_FALSE(cvc5_term_is_equal(t1, t2));
     347                 :            : }
     348                 :            : 
     349                 :        228 : TEST_F(TestCApiBlackTerm, children)
     350                 :            : {
     351                 :        114 :   ASSERT_DEATH(cvc5_term_get_num_children(nullptr), "invalid term");
     352                 :        113 :   ASSERT_DEATH(cvc5_term_get_child(nullptr, 0), "invalid term");
     353                 :            :   // simple term 2+3
     354                 :        112 :   Cvc5Term two = cvc5_mk_integer_int64(d_tm, 2);
     355                 :        112 :   std::vector<Cvc5Term> args = {two, cvc5_mk_integer_int64(d_tm, 3)};
     356                 :        112 :   Cvc5Term t1 = cvc5_mk_term(d_tm, CVC5_KIND_ADD, args.size(), args.data());
     357         [ -  + ]:        112 :   ASSERT_EQ(cvc5_term_get_num_children(t1), 2);
     358         [ -  + ]:        112 :   ASSERT_TRUE(cvc5_term_is_equal(cvc5_term_get_child(t1, 0), two));
     359                 :            : 
     360         [ +  + ]:        336 :   for (size_t i = 0, n = cvc5_term_get_num_children(t1); i < n; ++i)
     361                 :            :   {
     362                 :        224 :     (void)cvc5_term_get_child(t1, i);
     363                 :            :   }
     364                 :            : 
     365                 :            :   // apply term f(2)
     366                 :        112 :   std::vector<Cvc5Sort> domain = {d_int};
     367                 :            :   Cvc5Sort fun_sort =
     368                 :        112 :       cvc5_mk_fun_sort(d_tm, domain.size(), domain.data(), d_int);
     369                 :        112 :   Cvc5Term f = cvc5_mk_const(d_tm, fun_sort, "f");
     370                 :        112 :   args = {f, two};
     371                 :            :   Cvc5Term t2 =
     372                 :        112 :       cvc5_mk_term(d_tm, CVC5_KIND_APPLY_UF, args.size(), args.data());
     373                 :            :   // due to our higher-order view of terms, we treat f as a child of APPLY_UF
     374         [ -  + ]:        112 :   ASSERT_EQ(cvc5_term_get_num_children(t2), 2);
     375         [ -  + ]:        112 :   ASSERT_TRUE(cvc5_term_is_equal(cvc5_term_get_child(t2, 0), f));
     376         [ -  + ]:        112 :   ASSERT_TRUE(cvc5_term_is_equal(cvc5_term_get_child(t2, 1), two));
     377                 :            : }
     378                 :            : 
     379                 :        224 : TEST_F(TestCApiBlackTerm, get_integer)
     380                 :            : {
     381                 :        112 :   ASSERT_DEATH(cvc5_mk_integer(nullptr, "2"), "unexpected NULL argument");
     382                 :        111 :   ASSERT_DEATH(cvc5_mk_integer(d_tm, nullptr), "unexpected NULL argument");
     383                 :            : 
     384                 :        110 :   Cvc5Term int1 = cvc5_mk_integer(d_tm, "-18446744073709551616");
     385                 :        110 :   Cvc5Term int2 = cvc5_mk_integer(d_tm, "-18446744073709551615");
     386                 :        110 :   Cvc5Term int3 = cvc5_mk_integer(d_tm, "-4294967296");
     387                 :        110 :   Cvc5Term int4 = cvc5_mk_integer(d_tm, "-4294967295");
     388                 :        110 :   Cvc5Term int5 = cvc5_mk_integer(d_tm, "-10");
     389                 :        110 :   Cvc5Term int6 = cvc5_mk_integer(d_tm, "0");
     390                 :        110 :   Cvc5Term int7 = cvc5_mk_integer(d_tm, "10");
     391                 :        110 :   Cvc5Term int8 = cvc5_mk_integer(d_tm, "4294967295");
     392                 :        110 :   Cvc5Term int9 = cvc5_mk_integer(d_tm, "4294967296");
     393                 :        110 :   Cvc5Term int10 = cvc5_mk_integer(d_tm, "18446744073709551615");
     394                 :        110 :   Cvc5Term int11 = cvc5_mk_integer(d_tm, "18446744073709551616");
     395                 :        110 :   Cvc5Term int12 = cvc5_mk_integer(d_tm, "-0");
     396                 :            : 
     397                 :        110 :   ASSERT_DEATH(cvc5_mk_integer(d_tm, ""), "invalid argument");
     398                 :        109 :   ASSERT_DEATH(cvc5_mk_integer(d_tm, "-"), "invalid argument");
     399                 :        108 :   ASSERT_DEATH(cvc5_mk_integer(d_tm, "-1-"), "invalid argument");
     400                 :        107 :   ASSERT_DEATH(cvc5_mk_integer(d_tm, "0.0"), "invalid argument");
     401                 :        106 :   ASSERT_DEATH(cvc5_mk_integer(d_tm, "-0.1"), "invalid argument");
     402                 :        105 :   ASSERT_DEATH(cvc5_mk_integer(d_tm, "012"), "invalid argument");
     403                 :        104 :   ASSERT_DEATH(cvc5_mk_integer(d_tm, "0000"), "invalid argument");
     404                 :        103 :   ASSERT_DEATH(cvc5_mk_integer(d_tm, "-01"), "invalid argument");
     405                 :        102 :   ASSERT_DEATH(cvc5_mk_integer(d_tm, "-00"), "invalid argument");
     406                 :            : 
     407                 :        101 :   ASSERT_DEATH(cvc5_term_is_int32_value(nullptr), "invalid term");
     408                 :        100 :   ASSERT_DEATH(cvc5_term_is_uint32_value(nullptr), "invalid term");
     409                 :         99 :   ASSERT_DEATH(cvc5_term_is_int64_value(nullptr), "invalid term");
     410                 :         98 :   ASSERT_DEATH(cvc5_term_is_uint64_value(nullptr), "invalid term");
     411                 :         97 :   ASSERT_DEATH(cvc5_term_is_integer_value(nullptr), "invalid term");
     412                 :         96 :   ASSERT_DEATH(cvc5_term_get_integer_value(nullptr), "invalid term");
     413                 :         95 :   ASSERT_DEATH(cvc5_term_get_int32_value(nullptr), "invalid term");
     414                 :         94 :   ASSERT_DEATH(cvc5_term_get_int64_value(nullptr), "invalid term");
     415                 :         93 :   ASSERT_DEATH(cvc5_term_get_uint32_value(nullptr), "invalid term");
     416                 :         92 :   ASSERT_DEATH(cvc5_term_get_uint64_value(nullptr), "invalid term");
     417                 :         91 :   ASSERT_DEATH(cvc5_term_get_real_or_integer_value_sign(nullptr),
     418                 :            :                "invalid term");
     419                 :            : 
     420 [ +  - ][ +  - ]:         90 :   ASSERT_TRUE(
         [ +  - ][ +  - ]
         [ +  - ][ -  + ]
     421                 :            :       !cvc5_term_is_int32_value(int1) && !cvc5_term_is_uint32_value(int1)
     422                 :            :       && !cvc5_term_is_int64_value(int1) && !cvc5_term_is_uint64_value(int1)
     423                 :            :       && cvc5_term_is_integer_value(int1));
     424         [ -  + ]:         90 :   ASSERT_EQ(cvc5_term_get_integer_value(int1),
     425                 :            :             std::string("-18446744073709551616"));
     426         [ -  + ]:         90 :   ASSERT_EQ(cvc5_term_get_real_or_integer_value_sign(int1), -1);
     427                 :            : 
     428 [ +  - ][ +  - ]:         90 :   ASSERT_TRUE(
         [ +  - ][ +  - ]
         [ +  - ][ -  + ]
     429                 :            :       !cvc5_term_is_int32_value(int2) && !cvc5_term_is_uint32_value(int2)
     430                 :            :       && !cvc5_term_is_int64_value(int2) && !cvc5_term_is_uint64_value(int2)
     431                 :            :       && cvc5_term_is_integer_value(int2));
     432         [ -  + ]:         90 :   ASSERT_EQ(cvc5_term_get_integer_value(int2),
     433                 :            :             std::string("-18446744073709551615"));
     434         [ -  + ]:         90 :   ASSERT_EQ(cvc5_term_get_real_or_integer_value_sign(int2), -1);
     435                 :            : 
     436 [ +  - ][ +  - ]:         90 :   ASSERT_TRUE(
         [ +  - ][ +  - ]
         [ +  - ][ -  + ]
     437                 :            :       !cvc5_term_is_int32_value(int3) && !cvc5_term_is_uint32_value(int3)
     438                 :            :       && cvc5_term_is_int64_value(int3) && !cvc5_term_is_uint64_value(int3)
     439                 :            :       && cvc5_term_is_integer_value(int3));
     440         [ -  + ]:         90 :   ASSERT_EQ(cvc5_term_get_integer_value(int3), std::string("-4294967296"));
     441         [ -  + ]:         90 :   ASSERT_EQ(cvc5_term_get_real_or_integer_value_sign(int3), -1);
     442         [ -  + ]:         90 :   ASSERT_EQ(cvc5_term_get_int64_value(int3), -4294967296);
     443                 :            : 
     444 [ +  - ][ +  - ]:         90 :   ASSERT_TRUE(
         [ +  - ][ +  - ]
         [ +  - ][ -  + ]
     445                 :            :       !cvc5_term_is_int32_value(int4) && !cvc5_term_is_uint32_value(int4)
     446                 :            :       && cvc5_term_is_int64_value(int4) && !cvc5_term_is_uint64_value(int4)
     447                 :            :       && cvc5_term_is_integer_value(int4));
     448         [ -  + ]:         90 :   ASSERT_EQ(cvc5_term_get_integer_value(int4), std::string("-4294967295"));
     449         [ -  + ]:         90 :   ASSERT_EQ(cvc5_term_get_real_or_integer_value_sign(int4), -1);
     450         [ -  + ]:         90 :   ASSERT_EQ(cvc5_term_get_int64_value(int4), -4294967295);
     451                 :            : 
     452 [ +  - ][ +  - ]:         90 :   ASSERT_TRUE(cvc5_term_is_int32_value(int5) && !cvc5_term_is_uint32_value(int5)
         [ +  - ][ +  - ]
         [ +  - ][ -  + ]
     453                 :            :               && cvc5_term_is_int64_value(int5)
     454                 :            :               && !cvc5_term_is_uint64_value(int5)
     455                 :            :               && cvc5_term_is_integer_value(int5));
     456         [ -  + ]:         90 :   ASSERT_EQ(cvc5_term_get_integer_value(int5), std::string("-10"));
     457         [ -  + ]:         90 :   ASSERT_EQ(cvc5_term_get_real_or_integer_value_sign(int5), -1);
     458         [ -  + ]:         90 :   ASSERT_EQ(cvc5_term_get_int32_value(int5), -10);
     459         [ -  + ]:         90 :   ASSERT_EQ(cvc5_term_get_int64_value(int5), -10);
     460                 :            : 
     461 [ +  - ][ +  - ]:         90 :   ASSERT_TRUE(cvc5_term_is_int32_value(int6) && cvc5_term_is_uint32_value(int6)
         [ +  - ][ +  - ]
         [ +  - ][ -  + ]
     462                 :            :               && cvc5_term_is_int64_value(int6)
     463                 :            :               && cvc5_term_is_uint64_value(int6)
     464                 :            :               && cvc5_term_is_integer_value(int6));
     465         [ -  + ]:         90 :   ASSERT_EQ(cvc5_term_get_integer_value(int6), std::string("0"));
     466         [ -  + ]:         90 :   ASSERT_EQ(cvc5_term_get_real_or_integer_value_sign(int6), 0);
     467         [ -  + ]:         90 :   ASSERT_EQ(cvc5_term_get_int32_value(int6), 0);
     468         [ -  + ]:         90 :   ASSERT_EQ(cvc5_term_get_int64_value(int6), 0);
     469         [ -  + ]:         90 :   ASSERT_EQ(cvc5_term_get_uint32_value(int6), 0);
     470         [ -  + ]:         90 :   ASSERT_EQ(cvc5_term_get_uint64_value(int6), 0);
     471                 :            : 
     472 [ +  - ][ +  - ]:         90 :   ASSERT_TRUE(cvc5_term_is_int32_value(int7) && cvc5_term_is_uint32_value(int7)
         [ +  - ][ +  - ]
         [ +  - ][ -  + ]
     473                 :            :               && cvc5_term_is_int64_value(int7)
     474                 :            :               && cvc5_term_is_uint64_value(int7)
     475                 :            :               && cvc5_term_is_integer_value(int7));
     476         [ -  + ]:         90 :   ASSERT_EQ(cvc5_term_get_integer_value(int7), std::string("10"));
     477         [ -  + ]:         90 :   ASSERT_EQ(cvc5_term_get_real_or_integer_value_sign(int7), 1);
     478         [ -  + ]:         90 :   ASSERT_EQ(cvc5_term_get_int32_value(int7), 10);
     479         [ -  + ]:         90 :   ASSERT_EQ(cvc5_term_get_int64_value(int7), 10);
     480         [ -  + ]:         90 :   ASSERT_EQ(cvc5_term_get_uint32_value(int7), 10);
     481         [ -  + ]:         90 :   ASSERT_EQ(cvc5_term_get_uint64_value(int7), 10);
     482                 :            : 
     483 [ +  - ][ +  - ]:         90 :   ASSERT_TRUE(!cvc5_term_is_int32_value(int8) && cvc5_term_is_uint32_value(int8)
         [ +  - ][ +  - ]
         [ +  - ][ -  + ]
     484                 :            :               && cvc5_term_is_int64_value(int8)
     485                 :            :               && cvc5_term_is_uint64_value(int8)
     486                 :            :               && cvc5_term_is_integer_value(int8));
     487         [ -  + ]:         90 :   ASSERT_EQ(cvc5_term_get_integer_value(int8), std::string("4294967295"));
     488         [ -  + ]:         90 :   ASSERT_EQ(cvc5_term_get_real_or_integer_value_sign(int8), 1);
     489         [ -  + ]:         90 :   ASSERT_EQ(cvc5_term_get_int64_value(int8), 4294967295);
     490         [ -  + ]:         90 :   ASSERT_EQ(cvc5_term_get_uint32_value(int8), 4294967295);
     491         [ -  + ]:         90 :   ASSERT_EQ(cvc5_term_get_uint64_value(int8), 4294967295);
     492                 :            : 
     493 [ +  - ][ +  - ]:         90 :   ASSERT_TRUE(
         [ +  - ][ +  - ]
         [ +  - ][ -  + ]
     494                 :            :       !cvc5_term_is_int32_value(int9) && !cvc5_term_is_uint32_value(int9)
     495                 :            :       && cvc5_term_is_int64_value(int9) && cvc5_term_is_uint64_value(int9)
     496                 :            :       && cvc5_term_is_integer_value(int9));
     497         [ -  + ]:         90 :   ASSERT_EQ(cvc5_term_get_integer_value(int9), std::string("4294967296"));
     498         [ -  + ]:         90 :   ASSERT_EQ(cvc5_term_get_real_or_integer_value_sign(int9), 1);
     499         [ -  + ]:         90 :   ASSERT_EQ(cvc5_term_get_int64_value(int9), 4294967296);
     500         [ -  + ]:         90 :   ASSERT_EQ(cvc5_term_get_uint64_value(int9), 4294967296);
     501                 :            : 
     502 [ +  - ][ +  - ]:         90 :   ASSERT_TRUE(
         [ +  - ][ +  - ]
         [ +  - ][ -  + ]
     503                 :            :       !cvc5_term_is_int32_value(int10) && !cvc5_term_is_uint32_value(int10)
     504                 :            :       && !cvc5_term_is_int64_value(int10) && cvc5_term_is_uint64_value(int10)
     505                 :            :       && cvc5_term_is_integer_value(int10));
     506         [ -  + ]:         90 :   ASSERT_EQ(cvc5_term_get_integer_value(int10),
     507                 :            :             std::string("18446744073709551615"));
     508         [ -  + ]:         90 :   ASSERT_EQ(cvc5_term_get_real_or_integer_value_sign(int10), 1);
     509         [ -  + ]:         90 :   ASSERT_EQ(cvc5_term_get_uint64_value(int10), 18446744073709551615ull);
     510                 :            : 
     511 [ +  - ][ +  - ]:         90 :   ASSERT_TRUE(
         [ +  - ][ +  - ]
         [ +  - ][ -  + ]
     512                 :            :       !cvc5_term_is_int32_value(int11) && !cvc5_term_is_uint32_value(int11)
     513                 :            :       && !cvc5_term_is_int64_value(int11) && !cvc5_term_is_uint64_value(int11)
     514                 :            :       && cvc5_term_is_integer_value(int11));
     515         [ -  + ]:         90 :   ASSERT_EQ(cvc5_term_get_integer_value(int11),
     516                 :            :             std::string("18446744073709551616"));
     517         [ -  + ]:         90 :   ASSERT_EQ(cvc5_term_get_real_or_integer_value_sign(int11), 1);
     518                 :            : 
     519 [ +  - ][ +  - ]:         90 :   ASSERT_TRUE(
         [ +  - ][ +  - ]
         [ +  - ][ -  + ]
     520                 :            :       cvc5_term_is_int32_value(int12) && cvc5_term_is_uint32_value(int12)
     521                 :            :       && cvc5_term_is_int64_value(int12) && cvc5_term_is_uint64_value(int12)
     522                 :            :       && cvc5_term_is_integer_value(int12));
     523         [ -  + ]:         90 :   ASSERT_EQ(cvc5_term_get_integer_value(int12), std::string("0"));
     524         [ -  + ]:         90 :   ASSERT_EQ(cvc5_term_get_real_or_integer_value_sign(int12), 0);
     525         [ -  + ]:         90 :   ASSERT_EQ(cvc5_term_get_int32_value(int12), 0);
     526         [ -  + ]:         90 :   ASSERT_EQ(cvc5_term_get_int64_value(int12), 0);
     527         [ -  + ]:         90 :   ASSERT_EQ(cvc5_term_get_uint32_value(int12), 0);
     528         [ -  + ]:         90 :   ASSERT_EQ(cvc5_term_get_uint64_value(int12), 0);
     529                 :            : }
     530                 :            : 
     531                 :        180 : TEST_F(TestCApiBlackTerm, get_string)
     532                 :            : {
     533                 :         90 :   ASSERT_DEATH(cvc5_mk_string(nullptr, "abcde", false),
     534                 :            :                "unexpected NULL argument");
     535                 :         89 :   ASSERT_DEATH(cvc5_term_is_string_value(nullptr), "invalid term");
     536                 :         88 :   ASSERT_DEATH(cvc5_term_get_string_value(nullptr), "invalid term");
     537                 :         87 :   ASSERT_DEATH(cvc5_mk_string(d_tm, nullptr, false),
     538                 :            :                "unexpected NULL argument");
     539                 :         86 :   Cvc5Term s1 = cvc5_mk_string(d_tm, "abcde", false);
     540         [ -  + ]:         86 :   ASSERT_TRUE(cvc5_term_is_string_value(s1));
     541         [ -  + ]:         86 :   ASSERT_EQ(cvc5_term_get_string_value(s1), std::wstring(L"abcde"));
     542                 :            : }
     543                 :            : 
     544                 :        172 : TEST_F(TestCApiBlackTerm, get_real)
     545                 :            : {
     546                 :            :   int32_t num32;
     547                 :            :   uint32_t den32;
     548                 :            :   int64_t num64;
     549                 :            :   uint64_t den64;
     550                 :            : 
     551                 :         86 :   ASSERT_DEATH(cvc5_mk_real(nullptr, "2"), "unexpected NULL argument");
     552                 :         85 :   ASSERT_DEATH(cvc5_mk_real(d_tm, nullptr), "unexpected NULL argument");
     553                 :            : 
     554                 :         84 :   Cvc5Term real1 = cvc5_mk_real(d_tm, "0");
     555                 :         84 :   Cvc5Term real2 = cvc5_mk_real(d_tm, ".0");
     556                 :         84 :   Cvc5Term real3 = cvc5_mk_real(d_tm, "-17");
     557                 :         84 :   Cvc5Term real4 = cvc5_mk_real(d_tm, "-3/5");
     558                 :         84 :   Cvc5Term real5 = cvc5_mk_real(d_tm, "12.7");
     559                 :         84 :   Cvc5Term real6 = cvc5_mk_real(d_tm, "1/4294967297");
     560                 :         84 :   Cvc5Term real7 = cvc5_mk_real(d_tm, "4294967297");
     561                 :         84 :   Cvc5Term real8 = cvc5_mk_real(d_tm, "1/18446744073709551617");
     562                 :         84 :   Cvc5Term real9 = cvc5_mk_real(d_tm, "18446744073709551617");
     563                 :         84 :   Cvc5Term real10 = cvc5_mk_real(d_tm, "2343.2343");
     564                 :            : 
     565                 :         84 :   ASSERT_DEATH(cvc5_term_is_real32_value(nullptr), "invalid term");
     566                 :         83 :   ASSERT_DEATH(cvc5_term_is_real64_value(nullptr), "invalid term");
     567                 :         82 :   ASSERT_DEATH(cvc5_term_is_real_value(nullptr), "invalid term");
     568                 :         81 :   ASSERT_DEATH(cvc5_term_get_real_value(nullptr), "invalid term");
     569                 :         80 :   ASSERT_DEATH(cvc5_term_get_real32_value(nullptr, &num32, &den32),
     570                 :            :                "invalid term");
     571                 :         79 :   ASSERT_DEATH(cvc5_term_get_real32_value(real1, nullptr, &den32),
     572                 :            :                "unexpected NULL argument");
     573                 :         78 :   ASSERT_DEATH(cvc5_term_get_real32_value(real1, &num32, nullptr),
     574                 :            :                "unexpected NULL argument");
     575                 :         77 :   ASSERT_DEATH(cvc5_term_get_real64_value(real1, nullptr, &den64),
     576                 :            :                "unexpected NULL argument");
     577                 :         76 :   ASSERT_DEATH(cvc5_term_get_real64_value(real1, &num64, nullptr),
     578                 :            :                "unexpected NULL argument");
     579                 :         75 :   ASSERT_DEATH(cvc5_term_get_real64_value(nullptr, &num64, &den64),
     580                 :            :                "invalid term");
     581                 :         74 :   ASSERT_DEATH(cvc5_term_get_real_or_integer_value_sign(nullptr),
     582                 :            :                "invalid term");
     583                 :            : 
     584 [ +  - ][ +  - ]:         73 :   ASSERT_TRUE(cvc5_term_is_real_value(real1) && cvc5_term_is_real64_value(real1)
         [ +  - ][ -  + ]
     585                 :            :               && cvc5_term_is_real32_value(real1));
     586 [ +  - ][ +  - ]:         73 :   ASSERT_TRUE(cvc5_term_is_real_value(real2) && cvc5_term_is_real64_value(real2)
         [ +  - ][ -  + ]
     587                 :            :               && cvc5_term_is_real32_value(real2));
     588 [ +  - ][ +  - ]:         73 :   ASSERT_TRUE(cvc5_term_is_real_value(real3) && cvc5_term_is_real64_value(real3)
         [ +  - ][ -  + ]
     589                 :            :               && cvc5_term_is_real32_value(real3));
     590 [ +  - ][ +  - ]:         73 :   ASSERT_TRUE(cvc5_term_is_real_value(real4) && cvc5_term_is_real64_value(real4)
         [ +  - ][ -  + ]
     591                 :            :               && cvc5_term_is_real32_value(real4));
     592 [ +  - ][ +  - ]:         73 :   ASSERT_TRUE(cvc5_term_is_real_value(real5) && cvc5_term_is_real64_value(real5)
         [ +  - ][ -  + ]
     593                 :            :               && cvc5_term_is_real32_value(real5));
     594 [ +  - ][ +  - ]:         73 :   ASSERT_TRUE(cvc5_term_is_real_value(real6)
                 [ -  + ]
     595                 :            :               && cvc5_term_is_real64_value(real6));
     596 [ +  - ][ +  - ]:         73 :   ASSERT_TRUE(cvc5_term_is_real_value(real7)
                 [ -  + ]
     597                 :            :               && cvc5_term_is_real64_value(real7));
     598         [ -  + ]:         73 :   ASSERT_TRUE(cvc5_term_is_real_value(real8));
     599         [ -  + ]:         73 :   ASSERT_TRUE(cvc5_term_is_real_value(real9));
     600         [ -  + ]:         73 :   ASSERT_TRUE(cvc5_term_is_real_value(real10));
     601                 :            : 
     602                 :         73 :   cvc5_term_get_real32_value(real1, &num32, &den32);
     603         [ -  + ]:         73 :   ASSERT_EQ(num32, 0);
     604         [ -  + ]:         73 :   ASSERT_EQ(den32, 1);
     605                 :         73 :   cvc5_term_get_real64_value(real1, &num64, &den64);
     606         [ -  + ]:         73 :   ASSERT_EQ(num64, 0);
     607         [ -  + ]:         73 :   ASSERT_EQ(den64, 1);
     608         [ -  + ]:         73 :   ASSERT_EQ(cvc5_term_get_real_value(real1), std::string("0/1"));
     609                 :            : 
     610                 :         73 :   cvc5_term_get_real32_value(real2, &num32, &den32);
     611         [ -  + ]:         73 :   ASSERT_EQ(num32, 0);
     612         [ -  + ]:         73 :   ASSERT_EQ(den32, 1);
     613                 :         73 :   cvc5_term_get_real64_value(real2, &num64, &den64);
     614         [ -  + ]:         73 :   ASSERT_EQ(num64, 0);
     615         [ -  + ]:         73 :   ASSERT_EQ(den64, 1);
     616         [ -  + ]:         73 :   ASSERT_EQ(cvc5_term_get_real_value(real2), std::string("0/1"));
     617                 :            : 
     618                 :         73 :   cvc5_term_get_real32_value(real3, &num32, &den32);
     619         [ -  + ]:         73 :   ASSERT_EQ(num32, -17);
     620         [ -  + ]:         73 :   ASSERT_EQ(den32, 1);
     621                 :         73 :   cvc5_term_get_real64_value(real3, &num64, &den64);
     622         [ -  + ]:         73 :   ASSERT_EQ(num64, -17);
     623         [ -  + ]:         73 :   ASSERT_EQ(den64, 1);
     624         [ -  + ]:         73 :   ASSERT_EQ(cvc5_term_get_real_value(real3), std::string("-17/1"));
     625                 :            : 
     626                 :         73 :   cvc5_term_get_real32_value(real4, &num32, &den32);
     627         [ -  + ]:         73 :   ASSERT_EQ(num32, -3);
     628         [ -  + ]:         73 :   ASSERT_EQ(den32, 5);
     629                 :         73 :   cvc5_term_get_real64_value(real4, &num64, &den64);
     630         [ -  + ]:         73 :   ASSERT_EQ(num64, -3);
     631         [ -  + ]:         73 :   ASSERT_EQ(den64, 5);
     632         [ -  + ]:         73 :   ASSERT_EQ(cvc5_term_get_real_value(real4), std::string("-3/5"));
     633                 :            : 
     634                 :         73 :   cvc5_term_get_real32_value(real5, &num32, &den32);
     635         [ -  + ]:         73 :   ASSERT_EQ(num32, 127);
     636         [ -  + ]:         73 :   ASSERT_EQ(den32, 10);
     637                 :         73 :   cvc5_term_get_real64_value(real5, &num64, &den64);
     638         [ -  + ]:         73 :   ASSERT_EQ(num64, 127);
     639         [ -  + ]:         73 :   ASSERT_EQ(den64, 10);
     640         [ -  + ]:         73 :   ASSERT_EQ(cvc5_term_get_real_value(real5), std::string("127/10"));
     641                 :            : 
     642                 :         73 :   cvc5_term_get_real64_value(real6, &num64, &den64);
     643         [ -  + ]:         73 :   ASSERT_EQ(num64, 1);
     644         [ -  + ]:         73 :   ASSERT_EQ(den64, 4294967297);
     645         [ -  + ]:         73 :   ASSERT_EQ(cvc5_term_get_real_value(real6), std::string("1/4294967297"));
     646                 :            : 
     647                 :         73 :   cvc5_term_get_real64_value(real7, &num64, &den64);
     648         [ -  + ]:         73 :   ASSERT_EQ(num64, 4294967297);
     649         [ -  + ]:         73 :   ASSERT_EQ(den64, 1);
     650         [ -  + ]:         73 :   ASSERT_EQ(cvc5_term_get_real_value(real7), std::string("4294967297/1"));
     651                 :            : 
     652         [ -  + ]:         73 :   ASSERT_EQ(cvc5_term_get_real_value(real8),
     653                 :            :             std::string("1/18446744073709551617"));
     654                 :            : 
     655         [ -  + ]:         73 :   ASSERT_EQ(cvc5_term_get_real_value(real9),
     656                 :            :             std::string("18446744073709551617/1"));
     657                 :            : 
     658         [ -  + ]:         73 :   ASSERT_EQ(cvc5_term_get_real_value(real10), std::string("23432343/10000"));
     659                 :            : }
     660                 :            : 
     661                 :        146 : TEST_F(TestCApiBlackTerm, get_const_array_base)
     662                 :            : {
     663                 :         73 :   Cvc5Sort arr_sort = cvc5_mk_array_sort(d_tm, d_int, d_int);
     664                 :         73 :   Cvc5Term one = cvc5_mk_integer_int64(d_tm, 1);
     665                 :         73 :   Cvc5Term const_arr = cvc5_mk_const_array(d_tm, arr_sort, one);
     666                 :            : 
     667                 :         73 :   ASSERT_DEATH(cvc5_term_is_const_array(nullptr), "invalid term");
     668                 :         72 :   ASSERT_DEATH(cvc5_term_get_const_array_base(nullptr), "invalid term");
     669                 :            : 
     670         [ -  + ]:         71 :   ASSERT_TRUE(cvc5_term_is_const_array(const_arr));
     671         [ -  + ]:         71 :   ASSERT_TRUE(
     672                 :            :       cvc5_term_is_equal(cvc5_term_get_const_array_base(const_arr), one));
     673                 :            : 
     674                 :         71 :   Cvc5Term a = cvc5_mk_const(d_tm, arr_sort, "a");
     675                 :         71 :   ASSERT_DEATH(cvc5_term_get_const_array_base(a), "invalid argument");
     676                 :         70 :   ASSERT_DEATH(cvc5_term_get_const_array_base(one), "invalid argument");
     677                 :            : }
     678                 :            : 
     679                 :        138 : TEST_F(TestCApiBlackTerm, get_boolean_value)
     680                 :            : {
     681                 :         69 :   Cvc5Term b1 = cvc5_mk_true(d_tm);
     682                 :         69 :   Cvc5Term b2 = cvc5_mk_false(d_tm);
     683                 :            : 
     684                 :         69 :   ASSERT_DEATH(cvc5_term_is_boolean_value(nullptr), "invalid term");
     685                 :         68 :   ASSERT_DEATH(cvc5_term_get_boolean_value(nullptr), "invalid term");
     686         [ -  + ]:         67 :   ASSERT_TRUE(cvc5_term_is_boolean_value(b1));
     687         [ -  + ]:         67 :   ASSERT_TRUE(cvc5_term_is_boolean_value(b2));
     688         [ -  + ]:         67 :   ASSERT_TRUE(cvc5_term_get_boolean_value(b1));
     689         [ -  + ]:         67 :   ASSERT_FALSE(cvc5_term_get_boolean_value(b2));
     690                 :            : }
     691                 :            : 
     692                 :        134 : TEST_F(TestCApiBlackTerm, get_bv_value)
     693                 :            : {
     694                 :         67 :   ASSERT_DEATH(cvc5_mk_bv_uint64(nullptr, 8, 15), "unexpected NULL argument");
     695                 :         66 :   ASSERT_DEATH(cvc5_term_is_bv_value(nullptr), "invalid term");
     696                 :            : 
     697                 :         65 :   Cvc5Term b1 = cvc5_mk_bv_uint64(d_tm, 8, 15);
     698                 :         65 :   Cvc5Term b2 = cvc5_mk_bv(d_tm, 8, "00001111", 2);
     699                 :         65 :   Cvc5Term b3 = cvc5_mk_bv(d_tm, 8, "15", 10);
     700                 :         65 :   Cvc5Term b4 = cvc5_mk_bv(d_tm, 8, "0f", 16);
     701                 :         65 :   Cvc5Term b5 = cvc5_mk_bv(d_tm, 9, "00001111", 2);
     702                 :         65 :   Cvc5Term b6 = cvc5_mk_bv(d_tm, 9, "15", 10);
     703                 :         65 :   Cvc5Term b7 = cvc5_mk_bv(d_tm, 9, "0f", 16);
     704                 :            : 
     705         [ -  + ]:         65 :   ASSERT_TRUE(cvc5_term_is_bv_value(b1));
     706         [ -  + ]:         65 :   ASSERT_TRUE(cvc5_term_is_bv_value(b2));
     707         [ -  + ]:         65 :   ASSERT_TRUE(cvc5_term_is_bv_value(b3));
     708         [ -  + ]:         65 :   ASSERT_TRUE(cvc5_term_is_bv_value(b4));
     709         [ -  + ]:         65 :   ASSERT_TRUE(cvc5_term_is_bv_value(b5));
     710         [ -  + ]:         65 :   ASSERT_TRUE(cvc5_term_is_bv_value(b6));
     711         [ -  + ]:         65 :   ASSERT_TRUE(cvc5_term_is_bv_value(b7));
     712                 :            : 
     713         [ -  + ]:        130 :   ASSERT_EQ(std::string("00001111"), cvc5_term_get_bv_value(b1, 2));
     714         [ -  + ]:        130 :   ASSERT_EQ(std::string("15"), cvc5_term_get_bv_value(b1, 10));
     715         [ -  + ]:        130 :   ASSERT_EQ(std::string("f"), cvc5_term_get_bv_value(b1, 16));
     716         [ -  + ]:        130 :   ASSERT_EQ(std::string("00001111"), cvc5_term_get_bv_value(b2, 2));
     717         [ -  + ]:        130 :   ASSERT_EQ(std::string("15"), cvc5_term_get_bv_value(b2, 10));
     718         [ -  + ]:        130 :   ASSERT_EQ(std::string("f"), cvc5_term_get_bv_value(b2, 16));
     719         [ -  + ]:        130 :   ASSERT_EQ(std::string("00001111"), cvc5_term_get_bv_value(b3, 2));
     720         [ -  + ]:        130 :   ASSERT_EQ(std::string("15"), cvc5_term_get_bv_value(b3, 10));
     721         [ -  + ]:        130 :   ASSERT_EQ(std::string("f"), cvc5_term_get_bv_value(b3, 16));
     722         [ -  + ]:        130 :   ASSERT_EQ(std::string("00001111"), cvc5_term_get_bv_value(b4, 2));
     723         [ -  + ]:        130 :   ASSERT_EQ(std::string("15"), cvc5_term_get_bv_value(b4, 10));
     724         [ -  + ]:        130 :   ASSERT_EQ(std::string("f"), cvc5_term_get_bv_value(b4, 16));
     725         [ -  + ]:        130 :   ASSERT_EQ(std::string("000001111"), cvc5_term_get_bv_value(b5, 2));
     726         [ -  + ]:        130 :   ASSERT_EQ(std::string("15"), cvc5_term_get_bv_value(b5, 10));
     727         [ -  + ]:        130 :   ASSERT_EQ(std::string("f"), cvc5_term_get_bv_value(b5, 16));
     728         [ -  + ]:        130 :   ASSERT_EQ(std::string("000001111"), cvc5_term_get_bv_value(b6, 2));
     729         [ -  + ]:        130 :   ASSERT_EQ(std::string("15"), cvc5_term_get_bv_value(b6, 10));
     730         [ -  + ]:        130 :   ASSERT_EQ(std::string("f"), cvc5_term_get_bv_value(b6, 16));
     731         [ -  + ]:        130 :   ASSERT_EQ(std::string("000001111"), cvc5_term_get_bv_value(b7, 2));
     732         [ -  + ]:        130 :   ASSERT_EQ(std::string("15"), cvc5_term_get_bv_value(b7, 10));
     733         [ -  + ]:        130 :   ASSERT_EQ(std::string("f"), cvc5_term_get_bv_value(b7, 16));
     734                 :            : }
     735                 :            : 
     736                 :        130 : TEST_F(TestCApiBlackTerm, is_ff_value)
     737                 :            : {
     738                 :         65 :   ASSERT_DEATH(cvc5_term_is_ff_value(nullptr), "invalid term");
     739                 :         64 :   Cvc5Sort fs = cvc5_mk_ff_sort(d_tm, "7", 10);
     740                 :         64 :   Cvc5Term fv = cvc5_mk_ff_elem(d_tm, "1", fs, 10);
     741         [ -  + ]:         64 :   ASSERT_TRUE(cvc5_term_is_ff_value(fv));
     742                 :         64 :   Cvc5Term b1 = cvc5_mk_bv_uint64(d_tm, 8, 15);
     743         [ -  + ]:         64 :   ASSERT_FALSE(cvc5_term_is_ff_value(b1));
     744                 :            : }
     745                 :            : 
     746                 :        128 : TEST_F(TestCApiBlackTerm, get_ff_value)
     747                 :            : {
     748                 :         64 :   ASSERT_DEATH(cvc5_term_get_ff_value(nullptr), "invalid term");
     749                 :         63 :   Cvc5Sort fs = cvc5_mk_ff_sort(d_tm, "7", 10);
     750                 :         63 :   Cvc5Term fv = cvc5_mk_ff_elem(d_tm, "1", fs, 10);
     751         [ -  + ]:        126 :   ASSERT_EQ(std::string("1"), cvc5_term_get_ff_value(fv));
     752                 :         63 :   Cvc5Term b1 = cvc5_mk_bv_uint64(d_tm, 8, 15);
     753                 :         63 :   ASSERT_DEATH(cvc5_term_get_ff_value(b1),
     754                 :            :                "expected Term to be a finite field value");
     755                 :            : }
     756                 :            : 
     757                 :        124 : TEST_F(TestCApiBlackTerm, get_uninterpreted_sort_value)
     758                 :            : {
     759                 :         62 :   ASSERT_DEATH(cvc5_term_get_uninterpreted_sort_value(nullptr), "invalid term");
     760                 :         61 :   cvc5_set_option(d_solver, "produce-models", "true");
     761                 :         61 :   Cvc5Term x = cvc5_mk_const(d_tm, d_uninterpreted, "x");
     762                 :         61 :   Cvc5Term y = cvc5_mk_const(d_tm, d_uninterpreted, "y");
     763                 :         61 :   std::vector<Cvc5Term> args = {x, y};
     764                 :         61 :   cvc5_assert_formula(
     765                 :         61 :       d_solver, cvc5_mk_term(d_tm, CVC5_KIND_EQUAL, args.size(), args.data()));
     766                 :         61 :   Cvc5Result res = cvc5_check_sat(d_solver);
     767         [ -  + ]:         61 :   ASSERT_TRUE(cvc5_result_is_sat(res));
     768                 :         61 :   Cvc5Term vx = cvc5_get_value(d_solver, x);
     769                 :         61 :   Cvc5Term vy = cvc5_get_value(d_solver, y);
     770         [ -  + ]:         61 :   ASSERT_TRUE(cvc5_term_is_uninterpreted_sort_value(vx));
     771         [ -  + ]:         61 :   ASSERT_TRUE(cvc5_term_is_uninterpreted_sort_value(vy));
     772         [ -  + ]:        122 :   ASSERT_EQ(std::string(cvc5_term_get_uninterpreted_sort_value(vx)),
     773                 :            :             cvc5_term_get_uninterpreted_sort_value(vy));
     774                 :            : }
     775                 :            : 
     776                 :        122 : TEST_F(TestCApiBlackTerm, is_rm_value)
     777                 :            : {
     778                 :         61 :   ASSERT_DEATH(cvc5_term_is_rm_value(nullptr), "invalid term");
     779         [ -  + ]:         60 :   ASSERT_FALSE(cvc5_term_is_rm_value(cvc5_mk_integer_int64(d_tm, 15)));
     780         [ -  + ]:         60 :   ASSERT_TRUE(cvc5_term_is_rm_value(
     781                 :            :       cvc5_mk_rm(d_tm, CVC5_RM_ROUND_NEAREST_TIES_TO_EVEN)));
     782         [ -  + ]:         60 :   ASSERT_FALSE(
     783                 :            :       cvc5_term_is_rm_value(cvc5_mk_const(d_tm, cvc5_get_rm_sort(d_tm), "")));
     784                 :            : }
     785                 :            : 
     786                 :        120 : TEST_F(TestCApiBlackTerm, get_rm_value)
     787                 :            : {
     788                 :         60 :   ASSERT_DEATH(cvc5_term_get_rm_value(nullptr), "invalid term");
     789                 :         59 :   ASSERT_DEATH(cvc5_term_get_rm_value(cvc5_mk_integer_int64(d_tm, 15)),
     790                 :            :                "invalid argument");
     791                 :            : 
     792         [ -  + ]:         58 :   ASSERT_EQ(cvc5_term_get_rm_value(
     793                 :            :                 cvc5_mk_rm(d_tm, CVC5_RM_ROUND_NEAREST_TIES_TO_EVEN)),
     794                 :            :             CVC5_RM_ROUND_NEAREST_TIES_TO_EVEN);
     795         [ -  + ]:         58 :   ASSERT_EQ(cvc5_term_get_rm_value(
     796                 :            :                 cvc5_mk_rm(d_tm, CVC5_RM_ROUND_NEAREST_TIES_TO_AWAY)),
     797                 :            :             CVC5_RM_ROUND_NEAREST_TIES_TO_AWAY);
     798         [ -  + ]:         58 :   ASSERT_EQ(
     799                 :            :       cvc5_term_get_rm_value(cvc5_mk_rm(d_tm, CVC5_RM_ROUND_TOWARD_POSITIVE)),
     800                 :            :       CVC5_RM_ROUND_TOWARD_POSITIVE);
     801         [ -  + ]:         58 :   ASSERT_EQ(
     802                 :            :       cvc5_term_get_rm_value(cvc5_mk_rm(d_tm, CVC5_RM_ROUND_TOWARD_NEGATIVE)),
     803                 :            :       CVC5_RM_ROUND_TOWARD_NEGATIVE);
     804         [ -  + ]:         58 :   ASSERT_EQ(cvc5_term_get_rm_value(cvc5_mk_rm(d_tm, CVC5_RM_ROUND_TOWARD_ZERO)),
     805                 :            :             CVC5_RM_ROUND_TOWARD_ZERO);
     806                 :            : }
     807                 :            : 
     808                 :        116 : TEST_F(TestCApiBlackTerm, get_tuple)
     809                 :            : {
     810                 :         58 :   Cvc5Term t1 = cvc5_mk_integer_int64(d_tm, 15);
     811                 :         58 :   Cvc5Term t2 = cvc5_mk_real_num_den(d_tm, 17, 25);
     812                 :         58 :   Cvc5Term t3 = cvc5_mk_string(d_tm, "abc", false);
     813                 :         58 :   std::vector<Cvc5Term> args = {t1, t2, t3};
     814                 :         58 :   Cvc5Term tup = cvc5_mk_tuple(d_tm, args.size(), args.data());
     815                 :            : 
     816                 :            :   size_t size;
     817                 :         58 :   ASSERT_DEATH(cvc5_term_get_tuple_value(nullptr, &size), "invalid term");
     818                 :         57 :   ASSERT_DEATH(cvc5_term_get_tuple_value(tup, nullptr),
     819                 :            :                "unexpected NULL argument");
     820                 :         56 :   ASSERT_DEATH(cvc5_term_is_tuple_value(nullptr), "invalid term");
     821                 :            : 
     822         [ -  + ]:         55 :   ASSERT_TRUE(cvc5_term_is_tuple_value(tup));
     823                 :         55 :   const Cvc5Term* val = cvc5_term_get_tuple_value(tup, &size);
     824         [ -  + ]:         55 :   ASSERT_EQ(size, 3);
     825         [ -  + ]:         55 :   ASSERT_TRUE(cvc5_term_is_equal(val[0], t1));
     826         [ -  + ]:         55 :   ASSERT_TRUE(cvc5_term_is_equal(val[1], t2));
     827         [ -  + ]:         55 :   ASSERT_TRUE(cvc5_term_is_equal(val[2], t3));
     828                 :            : }
     829                 :            : 
     830                 :        110 : TEST_F(TestCApiBlackTerm, get_fp_value)
     831                 :            : {
     832                 :            :   uint32_t ew, sw;
     833                 :            :   Cvc5Term res;
     834                 :         55 :   Cvc5Term bv_val = cvc5_mk_bv(d_tm, 16, "0000110000000011", 2);
     835                 :         55 :   Cvc5Term fp_val = cvc5_mk_fp(d_tm, 5, 11, bv_val);
     836                 :            : 
     837                 :         55 :   ASSERT_DEATH(cvc5_term_is_fp_value(nullptr), "invalid term");
     838                 :         54 :   ASSERT_DEATH(cvc5_term_is_fp_pos_zero(nullptr), "invalid term");
     839                 :         53 :   ASSERT_DEATH(cvc5_term_is_fp_neg_zero(nullptr), "invalid term");
     840                 :         52 :   ASSERT_DEATH(cvc5_term_is_fp_pos_inf(nullptr), "invalid term");
     841                 :         51 :   ASSERT_DEATH(cvc5_term_is_fp_neg_inf(nullptr), "invalid term");
     842                 :         50 :   ASSERT_DEATH(cvc5_term_is_fp_nan(nullptr), "invalid term");
     843                 :         49 :   ASSERT_DEATH(cvc5_term_get_fp_value(nullptr, &ew, &sw, &res), "invalid term");
     844                 :         48 :   ASSERT_DEATH(cvc5_term_get_fp_value(fp_val, nullptr, &sw, &res),
     845                 :            :                "unexpected NULL argument");
     846                 :         47 :   ASSERT_DEATH(cvc5_term_get_fp_value(fp_val, &ew, nullptr, &res),
     847                 :            :                "unexpected NULL argument");
     848                 :         46 :   ASSERT_DEATH(cvc5_term_get_fp_value(fp_val, &ew, &sw, nullptr),
     849                 :            :                "unexpected NULL argument");
     850                 :            : 
     851         [ -  + ]:         45 :   ASSERT_TRUE(cvc5_term_is_fp_value(fp_val));
     852         [ -  + ]:         45 :   ASSERT_FALSE(cvc5_term_is_fp_pos_zero(fp_val));
     853         [ -  + ]:         45 :   ASSERT_FALSE(cvc5_term_is_fp_neg_zero(fp_val));
     854         [ -  + ]:         45 :   ASSERT_FALSE(cvc5_term_is_fp_pos_inf(fp_val));
     855         [ -  + ]:         45 :   ASSERT_FALSE(cvc5_term_is_fp_neg_inf(fp_val));
     856         [ -  + ]:         45 :   ASSERT_FALSE(cvc5_term_is_fp_nan(fp_val));
     857                 :            : 
     858                 :         45 :   cvc5_term_get_fp_value(fp_val, &ew, &sw, &res);
     859         [ -  + ]:         45 :   ASSERT_EQ(ew, 5u);
     860         [ -  + ]:         45 :   ASSERT_EQ(sw, 11u);
     861         [ -  + ]:         45 :   ASSERT_TRUE(cvc5_term_is_equal(bv_val, res));
     862                 :            : 
     863         [ -  + ]:         45 :   ASSERT_TRUE(cvc5_term_is_fp_pos_zero(cvc5_mk_fp_pos_zero(d_tm, 5, 11)));
     864         [ -  + ]:         45 :   ASSERT_TRUE(cvc5_term_is_fp_neg_zero(cvc5_mk_fp_neg_zero(d_tm, 5, 11)));
     865         [ -  + ]:         45 :   ASSERT_TRUE(cvc5_term_is_fp_pos_inf(cvc5_mk_fp_pos_inf(d_tm, 5, 11)));
     866         [ -  + ]:         45 :   ASSERT_TRUE(cvc5_term_is_fp_neg_inf(cvc5_mk_fp_neg_inf(d_tm, 5, 11)));
     867         [ -  + ]:         45 :   ASSERT_TRUE(cvc5_term_is_fp_nan(cvc5_mk_fp_nan(d_tm, 5, 11)));
     868                 :            : }
     869                 :            : 
     870                 :         90 : TEST_F(TestCApiBlackTerm, get_set_value)
     871                 :            : {
     872                 :         45 :   Cvc5Sort s = cvc5_mk_set_sort(d_tm, d_int);
     873                 :            : 
     874                 :         45 :   Cvc5Term i1 = cvc5_mk_integer_int64(d_tm, 5);
     875                 :         45 :   Cvc5Term i2 = cvc5_mk_integer_int64(d_tm, 7);
     876                 :            : 
     877                 :         45 :   Cvc5Term s1 = cvc5_mk_empty_set(d_tm, s);
     878                 :         45 :   std::vector<Cvc5Term> args = {i1};
     879                 :            :   Cvc5Term s2 =
     880                 :         45 :       cvc5_mk_term(d_tm, CVC5_KIND_SET_SINGLETON, args.size(), args.data());
     881                 :            :   Cvc5Term s3 =
     882                 :         45 :       cvc5_mk_term(d_tm, CVC5_KIND_SET_SINGLETON, args.size(), args.data());
     883                 :         45 :   args = {i2};
     884                 :            :   Cvc5Term s4 =
     885                 :         45 :       cvc5_mk_term(d_tm, CVC5_KIND_SET_SINGLETON, args.size(), args.data());
     886                 :         45 :   args = {s3, s4};
     887                 :          0 :   args = {s2,
     888                 :         45 :           cvc5_mk_term(d_tm, CVC5_KIND_SET_UNION, args.size(), args.data())};
     889                 :            :   Cvc5Term s5 =
     890                 :         45 :       cvc5_mk_term(d_tm, CVC5_KIND_SET_UNION, args.size(), args.data());
     891                 :            : 
     892                 :         45 :   ASSERT_DEATH(cvc5_term_is_set_value(nullptr), "invalid term");
     893         [ -  + ]:         44 :   ASSERT_TRUE(cvc5_term_is_set_value(s1));
     894         [ -  + ]:         44 :   ASSERT_TRUE(cvc5_term_is_set_value(s2));
     895         [ -  + ]:         44 :   ASSERT_TRUE(cvc5_term_is_set_value(s3));
     896         [ -  + ]:         44 :   ASSERT_TRUE(cvc5_term_is_set_value(s4));
     897         [ -  + ]:         44 :   ASSERT_FALSE(cvc5_term_is_set_value(s5));
     898                 :         44 :   s5 = cvc5_simplify(d_solver, s5, false);
     899         [ -  + ]:         44 :   ASSERT_TRUE(cvc5_term_is_set_value(s5));
     900                 :            : 
     901                 :            :   size_t size;
     902                 :         44 :   ASSERT_DEATH(cvc5_term_get_set_value(nullptr, &size), "invalid term");
     903                 :         43 :   ASSERT_DEATH(cvc5_term_get_set_value(s1, nullptr),
     904                 :            :                "unexpected NULL argument");
     905                 :         42 :   (void)cvc5_term_get_set_value(s1, &size);
     906         [ -  + ]:         42 :   ASSERT_EQ(size, 0);
     907                 :         42 :   const Cvc5Term* res2 = cvc5_term_get_set_value(s2, &size);
     908         [ -  + ]:         42 :   ASSERT_EQ(size, 1);
     909         [ -  + ]:         42 :   ASSERT_TRUE(cvc5_term_is_equal(res2[0], i1));
     910                 :         42 :   const Cvc5Term* res3 = cvc5_term_get_set_value(s3, &size);
     911         [ -  + ]:         42 :   ASSERT_EQ(size, 1);
     912         [ -  + ]:         42 :   ASSERT_TRUE(cvc5_term_is_equal(res3[0], i1));
     913                 :         42 :   const Cvc5Term* res4 = cvc5_term_get_set_value(s4, &size);
     914         [ -  + ]:         42 :   ASSERT_EQ(size, 1);
     915         [ -  + ]:         42 :   ASSERT_TRUE(cvc5_term_is_equal(res4[0], i2));
     916                 :         42 :   const Cvc5Term* res5 = cvc5_term_get_set_value(s5, &size);
     917         [ -  + ]:         42 :   ASSERT_EQ(size, 2);
     918         [ -  + ]:         42 :   ASSERT_TRUE(cvc5_term_is_equal(res5[0], i1));
     919         [ -  + ]:         42 :   ASSERT_TRUE(cvc5_term_is_equal(res5[1], i2));
     920                 :            : }
     921                 :            : 
     922                 :         84 : TEST_F(TestCApiBlackTerm, get_sequence_value)
     923                 :            : {
     924                 :         42 :   Cvc5Sort seq_sort = cvc5_mk_sequence_sort(d_tm, d_int);
     925                 :            : 
     926                 :         42 :   Cvc5Term i1 = cvc5_mk_integer_int64(d_tm, 5);
     927                 :         42 :   Cvc5Term i2 = cvc5_mk_integer_int64(d_tm, 7);
     928                 :            : 
     929                 :         42 :   Cvc5Term s1 = cvc5_mk_empty_sequence(d_tm, seq_sort);
     930                 :         42 :   std::vector<Cvc5Term> args = {i1};
     931                 :            :   Cvc5Term s2 =
     932                 :         42 :       cvc5_mk_term(d_tm, CVC5_KIND_SEQ_UNIT, args.size(), args.data());
     933                 :            :   Cvc5Term s3 =
     934                 :         42 :       cvc5_mk_term(d_tm, CVC5_KIND_SEQ_UNIT, args.size(), args.data());
     935                 :         42 :   args = {i2};
     936                 :            :   Cvc5Term s4 =
     937                 :         42 :       cvc5_mk_term(d_tm, CVC5_KIND_SEQ_UNIT, args.size(), args.data());
     938                 :         42 :   args = {s3, s4};
     939                 :          0 :   args = {s2,
     940                 :         42 :           cvc5_mk_term(d_tm, CVC5_KIND_SEQ_CONCAT, args.size(), args.data())};
     941                 :            :   Cvc5Term s5 =
     942                 :         42 :       cvc5_mk_term(d_tm, CVC5_KIND_SEQ_CONCAT, args.size(), args.data());
     943                 :            : 
     944                 :         42 :   ASSERT_DEATH(cvc5_mk_empty_sequence(nullptr, seq_sort),
     945                 :            :                "unexpected NULL argument");
     946                 :         41 :   ASSERT_DEATH(cvc5_mk_empty_sequence(d_tm, nullptr), "invalid sort");
     947                 :         40 :   ASSERT_DEATH(cvc5_term_is_sequence_value(nullptr), "invalid term");
     948                 :            : 
     949         [ -  + ]:         39 :   ASSERT_TRUE(cvc5_term_is_sequence_value(s1));
     950         [ -  + ]:         39 :   ASSERT_FALSE(cvc5_term_is_sequence_value(s2));
     951         [ -  + ]:         39 :   ASSERT_FALSE(cvc5_term_is_sequence_value(s3));
     952         [ -  + ]:         39 :   ASSERT_FALSE(cvc5_term_is_sequence_value(s4));
     953         [ -  + ]:         39 :   ASSERT_FALSE(cvc5_term_is_sequence_value(s5));
     954                 :         39 :   s2 = cvc5_simplify(d_solver, s2, false);
     955         [ -  + ]:         39 :   ASSERT_TRUE(cvc5_term_is_sequence_value(s2));
     956                 :         39 :   s3 = cvc5_simplify(d_solver, s3, false);
     957         [ -  + ]:         39 :   ASSERT_TRUE(cvc5_term_is_sequence_value(s3));
     958                 :         39 :   s4 = cvc5_simplify(d_solver, s4, false);
     959         [ -  + ]:         39 :   ASSERT_TRUE(cvc5_term_is_sequence_value(s4));
     960                 :         39 :   s5 = cvc5_simplify(d_solver, s5, false);
     961         [ -  + ]:         39 :   ASSERT_TRUE(cvc5_term_is_sequence_value(s5));
     962                 :            : 
     963                 :            :   size_t size;
     964                 :         39 :   ASSERT_DEATH(cvc5_term_get_sequence_value(nullptr, &size), "invalid term");
     965                 :         38 :   ASSERT_DEATH(cvc5_term_get_sequence_value(s1, nullptr),
     966                 :            :                "unexpected NULL argument");
     967                 :         37 :   (void)cvc5_term_get_sequence_value(s1, &size);
     968         [ -  + ]:         37 :   ASSERT_EQ(size, 0);
     969                 :         37 :   const Cvc5Term* res2 = cvc5_term_get_sequence_value(s2, &size);
     970         [ -  + ]:         37 :   ASSERT_EQ(size, 1);
     971         [ -  + ]:         37 :   ASSERT_TRUE(cvc5_term_is_equal(res2[0], i1));
     972                 :         37 :   const Cvc5Term* res3 = cvc5_term_get_sequence_value(s3, &size);
     973         [ -  + ]:         37 :   ASSERT_EQ(size, 1);
     974         [ -  + ]:         37 :   ASSERT_TRUE(cvc5_term_is_equal(res3[0], i1));
     975                 :         37 :   const Cvc5Term* res4 = cvc5_term_get_sequence_value(s4, &size);
     976         [ -  + ]:         37 :   ASSERT_EQ(size, 1);
     977         [ -  + ]:         37 :   ASSERT_TRUE(cvc5_term_is_equal(res4[0], i2));
     978                 :         37 :   const Cvc5Term* res5 = cvc5_term_get_sequence_value(s5, &size);
     979         [ -  + ]:         37 :   ASSERT_EQ(size, 3);
     980         [ -  + ]:         37 :   ASSERT_TRUE(cvc5_term_is_equal(res5[0], i1));
     981         [ -  + ]:         37 :   ASSERT_TRUE(cvc5_term_is_equal(res5[1], i1));
     982         [ -  + ]:         37 :   ASSERT_TRUE(cvc5_term_is_equal(res5[2], i2));
     983                 :            : 
     984                 :         37 :   seq_sort = cvc5_mk_sequence_sort(d_tm, d_real);
     985                 :         37 :   Cvc5Term s = cvc5_mk_empty_sequence(d_tm, seq_sort);
     986         [ -  + ]:         37 :   ASSERT_EQ(cvc5_term_get_kind(s), CVC5_KIND_CONST_SEQUENCE);
     987                 :            :   // empty sequence has zero elements
     988                 :         37 :   (void)cvc5_term_get_sequence_value(s, &size);
     989         [ -  + ]:         37 :   ASSERT_EQ(size, 0);
     990                 :            : 
     991                 :            :   // A seq.unit app is not a constant sequence (regardless of whether it is
     992                 :            :   // applied to a constant).
     993                 :         37 :   args = {cvc5_mk_real_int64(d_tm, 1)};
     994                 :            :   Cvc5Term su =
     995                 :         37 :       cvc5_mk_term(d_tm, CVC5_KIND_SEQ_UNIT, args.size(), args.data());
     996                 :         37 :   ASSERT_DEATH(cvc5_term_get_sequence_value(su, &size), "invalid argument");
     997                 :            : }
     998                 :            : 
     999                 :         72 : TEST_F(TestCApiBlackTerm, substitute)
    1000                 :            : {
    1001                 :         36 :   Cvc5Term x = cvc5_mk_const(d_tm, d_int, "x");
    1002                 :         36 :   Cvc5Term one = cvc5_mk_integer_int64(d_tm, 1);
    1003                 :         36 :   Cvc5Term ttrue = cvc5_mk_true(d_tm);
    1004                 :         36 :   std::vector<Cvc5Term> args = {x, x};
    1005                 :         36 :   Cvc5Term xpx = cvc5_mk_term(d_tm, CVC5_KIND_ADD, args.size(), args.data());
    1006                 :         36 :   args = {one, one};
    1007                 :            :   Cvc5Term onepone =
    1008                 :         36 :       cvc5_mk_term(d_tm, CVC5_KIND_ADD, args.size(), args.data());
    1009                 :            : 
    1010                 :         36 :   ASSERT_DEATH(cvc5_term_substitute_term(nullptr, x, one), "invalid term");
    1011                 :         35 :   ASSERT_DEATH(cvc5_term_substitute_term(xpx, nullptr, one), "invalid term");
    1012                 :         34 :   ASSERT_DEATH(cvc5_term_substitute_term(xpx, x, nullptr), "invalid term");
    1013                 :            : 
    1014         [ -  + ]:         33 :   ASSERT_TRUE(
    1015                 :            :       cvc5_term_is_equal(cvc5_term_substitute_term(xpx, x, one), onepone));
    1016                 :            :   // incorrect due to type
    1017                 :         33 :   ASSERT_DEATH(cvc5_term_substitute_term(xpx, one, ttrue),
    1018                 :            :                "expected terms of the same sort");
    1019                 :            : 
    1020                 :            :   // simultaneous substitution
    1021                 :         32 :   Cvc5Term y = cvc5_mk_const(d_tm, d_int, "y");
    1022                 :         32 :   args = {x, y};
    1023                 :         32 :   Cvc5Term xpy = cvc5_mk_term(d_tm, CVC5_KIND_ADD, args.size(), args.data());
    1024                 :         32 :   args = {y, one};
    1025                 :         32 :   Cvc5Term xpone = cvc5_mk_term(d_tm, CVC5_KIND_ADD, args.size(), args.data());
    1026                 :         32 :   std::vector<Cvc5Term> es = {x, y};
    1027                 :         32 :   std::vector<Cvc5Term> rs = {y, one};
    1028         [ -  + ]:         32 :   ASSERT_EQ(cvc5_term_substitute_terms(xpy, es.size(), es.data(), rs.data()),
    1029                 :            :             xpone);
    1030                 :            : 
    1031                 :            :   // incorrect substitution due to types
    1032                 :         32 :   rs[1] = ttrue;
    1033                 :         32 :   ASSERT_DEATH(cvc5_term_substitute_terms(xpy, es.size(), es.data(), rs.data()),
    1034                 :            :                "expecting terms of the same sort at index 1");
    1035                 :            : 
    1036                 :            :   // null cannot substitute
    1037                 :         31 :   es = {nullptr, y};
    1038                 :         31 :   rs = {y, one};
    1039                 :         31 :   ASSERT_DEATH(cvc5_term_substitute_terms(xpy, es.size(), es.data(), rs.data()),
    1040                 :            :                "invalid term at index 0");
    1041                 :         30 :   es = {x, nullptr};
    1042                 :         30 :   ASSERT_DEATH(cvc5_term_substitute_terms(xpy, es.size(), es.data(), rs.data()),
    1043                 :            :                "invalid term at index 1");
    1044                 :         29 :   es = {x, y};
    1045                 :         29 :   rs = {nullptr, one};
    1046                 :         29 :   ASSERT_DEATH(cvc5_term_substitute_terms(xpy, es.size(), es.data(), rs.data()),
    1047                 :            :                "invalid term at index 0");
    1048                 :         28 :   rs = {y, nullptr};
    1049                 :         28 :   ASSERT_DEATH(cvc5_term_substitute_terms(xpy, es.size(), es.data(), rs.data()),
    1050                 :            :                "invalid term at index 1");
    1051                 :            : }
    1052                 :            : 
    1053                 :         54 : TEST_F(TestCApiBlackTerm, const_array)
    1054                 :            : {
    1055                 :         27 :   Cvc5Sort arr_sort = cvc5_mk_array_sort(d_tm, d_int, d_int);
    1056                 :         27 :   Cvc5Term a = cvc5_mk_const(d_tm, arr_sort, "a");
    1057                 :         27 :   Cvc5Term one = cvc5_mk_integer_int64(d_tm, 1);
    1058                 :         27 :   Cvc5Term two = cvc5_mk_bv_uint64(d_tm, 2, 2);
    1059                 :         27 :   Cvc5Term i = cvc5_mk_const(d_tm, d_int, "i");
    1060                 :         27 :   Cvc5Term const_arr = cvc5_mk_const_array(d_tm, arr_sort, one);
    1061                 :            : 
    1062                 :         27 :   ASSERT_DEATH(cvc5_mk_const_array(nullptr, arr_sort, one),
    1063                 :            :                "unexpected NULL argument");
    1064                 :         26 :   ASSERT_DEATH(cvc5_mk_const_array(d_tm, nullptr, one), "invalid sort");
    1065                 :         25 :   ASSERT_DEATH(cvc5_mk_const_array(d_tm, arr_sort, nullptr), "invalid term");
    1066                 :         24 :   ASSERT_DEATH(cvc5_mk_const_array(d_tm, arr_sort, two),
    1067                 :            :                "value does not match element sort");
    1068                 :         23 :   ASSERT_DEATH(cvc5_mk_const_array(d_tm, arr_sort, i), "invalid argument");
    1069                 :            : 
    1070                 :         22 :   ASSERT_DEATH(cvc5_term_get_const_array_base(nullptr), "invalid term");
    1071                 :            : 
    1072         [ -  + ]:         21 :   ASSERT_EQ(cvc5_term_get_kind(const_arr), CVC5_KIND_CONST_ARRAY);
    1073         [ -  + ]:         21 :   ASSERT_TRUE(
    1074                 :            :       cvc5_term_is_equal(cvc5_term_get_const_array_base(const_arr), one));
    1075                 :         21 :   ASSERT_DEATH(cvc5_term_get_const_array_base(a), "invalid argument");
    1076                 :            : 
    1077                 :         20 :   arr_sort = cvc5_mk_array_sort(d_tm, d_real, d_real);
    1078                 :            :   Cvc5Term zero_array =
    1079                 :         20 :       cvc5_mk_const_array(d_tm, arr_sort, cvc5_mk_real_int64(d_tm, 0));
    1080                 :            :   std::vector<Cvc5Term> args = {
    1081                 :         20 :       zero_array, cvc5_mk_real_int64(d_tm, 1), cvc5_mk_real_int64(d_tm, 2)};
    1082                 :            :   Cvc5Term stores =
    1083                 :         20 :       cvc5_mk_term(d_tm, CVC5_KIND_STORE, args.size(), args.data());
    1084                 :         20 :   args = {stores, cvc5_mk_real_int64(d_tm, 2), cvc5_mk_real_int64(d_tm, 3)};
    1085                 :         20 :   stores = cvc5_mk_term(d_tm, CVC5_KIND_STORE, args.size(), args.data());
    1086                 :         20 :   args = {stores, cvc5_mk_real_int64(d_tm, 4), cvc5_mk_real_int64(d_tm, 5)};
    1087                 :         20 :   stores = cvc5_mk_term(d_tm, CVC5_KIND_STORE, args.size(), args.data());
    1088                 :            : }
    1089                 :            : 
    1090                 :         40 : TEST_F(TestCApiBlackTerm, get_cardinality_constraint)
    1091                 :            : {
    1092                 :         20 :   ASSERT_DEATH(cvc5_mk_cardinality_constraint(nullptr, d_uninterpreted, 3),
    1093                 :            :                "unexpected NULL argument");
    1094                 :         19 :   ASSERT_DEATH(cvc5_mk_cardinality_constraint(d_tm, nullptr, 3),
    1095                 :            :                "invalid sort");
    1096                 :         18 :   ASSERT_DEATH(cvc5_term_is_cardinality_constraint(nullptr), "invalid term");
    1097                 :            : 
    1098                 :         17 :   Cvc5Term t = cvc5_mk_cardinality_constraint(d_tm, d_uninterpreted, 3);
    1099         [ -  + ]:         17 :   ASSERT_TRUE(cvc5_term_is_cardinality_constraint(t));
    1100                 :            : 
    1101                 :            :   Cvc5Sort res;
    1102                 :            :   uint32_t res_upper;
    1103                 :         17 :   ASSERT_DEATH(cvc5_term_get_cardinality_constraint(nullptr, &res, &res_upper),
    1104                 :            :                "invalid term");
    1105                 :         16 :   ASSERT_DEATH(cvc5_term_get_cardinality_constraint(t, nullptr, &res_upper),
    1106                 :            :                "unexpected NULL argument");
    1107                 :         15 :   ASSERT_DEATH(cvc5_term_get_cardinality_constraint(t, &res, nullptr),
    1108                 :            :                "unexpected NULL argument");
    1109                 :            : 
    1110                 :         14 :   cvc5_term_get_cardinality_constraint(t, &res, &res_upper);
    1111         [ -  + ]:         14 :   ASSERT_TRUE(cvc5_sort_is_equal(res, d_uninterpreted));
    1112         [ -  + ]:         14 :   ASSERT_EQ(res_upper, 3);
    1113                 :            : 
    1114                 :         14 :   Cvc5Term x = cvc5_mk_const(d_tm, d_int, "x");
    1115         [ -  + ]:         14 :   ASSERT_FALSE(cvc5_term_is_cardinality_constraint(x));
    1116                 :         14 :   ASSERT_DEATH(cvc5_term_get_cardinality_constraint(x, &res, &res_upper),
    1117                 :            :                "invalid argument");
    1118                 :            : }
    1119                 :            : 
    1120                 :         26 : TEST_F(TestCApiBlackTerm, get_real_algebraic_number)
    1121                 :            : {
    1122                 :         13 :   cvc5_set_option(d_solver, "produce-models", "true");
    1123                 :         13 :   cvc5_set_logic(d_solver, "QF_NRA");
    1124                 :         13 :   Cvc5Term x = cvc5_mk_const(d_tm, d_real, "x");
    1125                 :         13 :   Cvc5Term y = cvc5_mk_var(d_tm, d_real, "y");
    1126                 :         13 :   std::vector<Cvc5Term> args = {x, x};
    1127                 :         13 :   Cvc5Term x2 = cvc5_mk_term(d_tm, CVC5_KIND_MULT, args.size(), args.data());
    1128                 :         13 :   Cvc5Term two = cvc5_mk_real_num_den(d_tm, 2, 1);
    1129                 :         13 :   args = {x2, two};
    1130                 :         13 :   Cvc5Term eq = cvc5_mk_term(d_tm, CVC5_KIND_EQUAL, args.size(), args.data());
    1131                 :         13 :   cvc5_assert_formula(d_solver, eq);
    1132                 :            : 
    1133                 :         13 :   ASSERT_DEATH(cvc5_term_is_real_algebraic_number(nullptr), "invalid term");
    1134                 :         12 :   ASSERT_DEATH(
    1135                 :            :       cvc5_term_get_real_algebraic_number_defining_polynomial(nullptr, y),
    1136                 :            :       "invalid term");
    1137                 :         11 :   ASSERT_DEATH(
    1138                 :            :       cvc5_term_get_real_algebraic_number_defining_polynomial(x, nullptr),
    1139                 :            :       "invalid term");
    1140                 :         10 :   ASSERT_DEATH(cvc5_term_get_real_algebraic_number_lower_bound(nullptr),
    1141                 :            :                "invalid term");
    1142                 :          9 :   ASSERT_DEATH(cvc5_term_get_real_algebraic_number_upper_bound(nullptr),
    1143                 :            :                "invalid term");
    1144                 :            : 
    1145                 :            :   // Note that check-sat should only return "sat" if libpoly is enabled.
    1146                 :            :   // Otherwise, we do not test the following functionality.
    1147         [ +  - ]:          8 :   if (cvc5_result_is_sat(cvc5_check_sat(d_solver)))
    1148                 :            :   {
    1149                 :            :     // We find a model for (x*x = 2), where x should be a real algebraic number.
    1150                 :            :     // We assert that its defining polynomial is non-null and its lower and
    1151                 :            :     // upper bounds are real.
    1152                 :          8 :     Cvc5Term vx = cvc5_get_value(d_solver, x);
    1153         [ -  + ]:          8 :     ASSERT_TRUE(cvc5_term_is_real_algebraic_number(vx));
    1154                 :            :     Cvc5Term poly =
    1155                 :          8 :         cvc5_term_get_real_algebraic_number_defining_polynomial(vx, y);
    1156         [ -  + ]:          8 :     ASSERT_NE(poly, nullptr);
    1157                 :            : 
    1158                 :          8 :     Cvc5Term lb = cvc5_term_get_real_algebraic_number_lower_bound(vx);
    1159                 :          8 :     Cvc5Term ub = cvc5_term_get_real_algebraic_number_upper_bound(vx);
    1160         [ -  + ]:          8 :     ASSERT_TRUE(cvc5_term_is_real_value(lb));
    1161         [ -  + ]:          8 :     ASSERT_TRUE(cvc5_term_is_real_value(ub));
    1162                 :            :     // cannot call with non-variable
    1163                 :          8 :     Cvc5Term yc = cvc5_mk_const(d_tm, d_real, "y");
    1164                 :          8 :     ASSERT_DEATH(
    1165                 :            :         cvc5_term_get_real_algebraic_number_defining_polynomial(vx, yc),
    1166                 :            :         "invalid argument");
    1167                 :            :   }
    1168                 :            : }
    1169                 :            : 
    1170                 :         14 : TEST_F(TestCApiBlackTerm, get_skolem)
    1171                 :            : {
    1172                 :            :   size_t size;
    1173                 :          7 :   ASSERT_DEATH(cvc5_term_is_skolem(nullptr), "invalid term");
    1174                 :          6 :   ASSERT_DEATH(cvc5_term_get_skolem_id(nullptr), "invalid term");
    1175                 :            :   // ordinary variables are not skolems
    1176                 :          5 :   Cvc5Term x = cvc5_mk_const(d_tm, d_int, "x");
    1177         [ -  + ]:          5 :   ASSERT_FALSE(cvc5_term_is_skolem(x));
    1178                 :          5 :   ASSERT_DEATH(cvc5_term_get_skolem_id(x), "invalid argument");
    1179                 :          4 :   ASSERT_DEATH(cvc5_term_get_skolem_indices(x, &size), "invalid argument");
    1180                 :          3 :   ASSERT_DEATH(cvc5_term_get_skolem_indices(nullptr, &size), "invalid term");
    1181                 :          2 :   ASSERT_DEATH(cvc5_term_get_skolem_indices(x, nullptr),
    1182                 :            :                "unexpected NULL argument");
    1183                 :            : }
    1184                 :            : 
    1185                 :          2 : TEST_F(TestCApiBlackTerm, term_scoped_to_string)
    1186                 :            : {
    1187                 :          1 :   Cvc5Term x = cvc5_mk_const(d_tm, d_int, "x");
    1188         [ -  + ]:          1 :   ASSERT_EQ(cvc5_term_to_string(x), std::string("x"));
    1189         [ -  + ]:          1 :   ASSERT_EQ(cvc5_term_to_string(x), std::string("x"));
    1190                 :            : }
    1191                 :            : 
    1192                 :            : }  // namespace cvc5::internal::test

Generated by: LCOV version 1.14