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: 807 809 99.8 %
Date: 2026-04-29 10:45:04 Functions: 126 126 100.0 %
Branches: 677 1350 50.1 %

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

Generated by: LCOV version 1.14