LCOV - code coverage report
Current view: top level - buildbot/coverage/build/test/unit/api/c - capi_op_black.cpp (source / functions) Hit Total Coverage
Test: coverage.info Lines: 211 211 100.0 %
Date: 2024-11-29 12:38:33 Functions: 18 18 100.0 %
Branches: 65 124 52.4 %

           Branch data     Line data    Source code
       1                 :            : /******************************************************************************
       2                 :            :  * Top contributors (to current version):
       3                 :            :  *   Aina Niemetz
       4                 :            :  *
       5                 :            :  * This file is part of the cvc5 project.
       6                 :            :  *
       7                 :            :  * Copyright (c) 2009-2024 by the authors listed in the file AUTHORS
       8                 :            :  * in the top-level source directory and their institutional affiliations.
       9                 :            :  * All rights reserved.  See the file COPYING in the top-level source
      10                 :            :  * directory for licensing information.
      11                 :            :  * ****************************************************************************
      12                 :            :  *
      13                 :            :  * Black box testing of the guards of the C API functions.
      14                 :            :  */
      15                 :            : 
      16                 :            : extern "C" {
      17                 :            : #include <cvc5/c/cvc5.h>
      18                 :            : }
      19                 :            : 
      20                 :            : #include "base/output.h"
      21                 :            : #include "gtest/gtest.h"
      22                 :            : 
      23                 :            : namespace cvc5::internal::test {
      24                 :            : 
      25                 :            : class TestCApiBlackOp : public ::testing::Test
      26                 :            : {
      27                 :            :  protected:
      28                 :         55 :   void SetUp() override
      29                 :            :   {
      30                 :         55 :     d_tm = cvc5_term_manager_new();
      31                 :         55 :     d_bool = cvc5_get_boolean_sort(d_tm);
      32                 :         55 :     d_int = cvc5_get_integer_sort(d_tm);
      33                 :         55 :     d_real = cvc5_get_real_sort(d_tm);
      34                 :         55 :     d_uninterpreted = cvc5_mk_uninterpreted_sort(d_tm, "u");
      35                 :         55 :   }
      36                 :         45 :   void TearDown() override { cvc5_term_manager_delete(d_tm); }
      37                 :            : 
      38                 :            :   Cvc5TermManager* d_tm;
      39                 :            :   Cvc5Sort d_bool;
      40                 :            :   Cvc5Sort d_int;
      41                 :            :   Cvc5Sort d_real;
      42                 :            :   Cvc5Sort d_uninterpreted;
      43                 :            : };
      44                 :            : 
      45                 :         22 : TEST_F(TestCApiBlackOp, equal)
      46                 :            : {
      47                 :         11 :   std::vector<uint32_t> idxs = {4, 0};
      48                 :            :   Cvc5Op op1 =
      49                 :         11 :       cvc5_mk_op(d_tm, CVC5_KIND_BITVECTOR_EXTRACT, idxs.size(), idxs.data());
      50                 :         11 :   idxs = {4, 1};
      51                 :            :   Cvc5Op op2 =
      52                 :         11 :       cvc5_mk_op(d_tm, CVC5_KIND_BITVECTOR_EXTRACT, idxs.size(), idxs.data());
      53         [ -  + ]:         11 :   ASSERT_TRUE(cvc5_op_is_equal(op1, op1));
      54         [ -  + ]:         11 :   ASSERT_TRUE(cvc5_op_is_disequal(op1, op2));
      55         [ -  + ]:         11 :   ASSERT_FALSE(cvc5_op_is_equal(op1, nullptr));
      56         [ -  + ]:         11 :   ASSERT_TRUE(cvc5_op_is_disequal(op1, nullptr));
      57                 :            : }
      58                 :            : 
      59                 :         22 : TEST_F(TestCApiBlackOp, hash)
      60                 :            : {
      61                 :         11 :   ASSERT_DEATH(cvc5_op_hash(nullptr), "invalid operator");
      62                 :         10 :   std::vector<uint32_t> idxs = {4, 0};
      63                 :            :   Cvc5Op op1 =
      64                 :         10 :       cvc5_mk_op(d_tm, CVC5_KIND_BITVECTOR_EXTRACT, idxs.size(), idxs.data());
      65                 :         10 :   idxs = {4, 1};
      66                 :            :   Cvc5Op op2 =
      67                 :         10 :       cvc5_mk_op(d_tm, CVC5_KIND_BITVECTOR_EXTRACT, idxs.size(), idxs.data());
      68         [ -  + ]:         10 :   ASSERT_EQ(cvc5_op_hash(op1), cvc5_op_hash(op1));
      69         [ -  + ]:         10 :   ASSERT_NE(cvc5_op_hash(op1), cvc5_op_hash(op2));
      70                 :            : }
      71                 :            : 
      72                 :         20 : TEST_F(TestCApiBlackOp, copy_release)
      73                 :            : {
      74                 :         10 :   ASSERT_DEATH(cvc5_op_copy(nullptr), "invalid op");
      75                 :          9 :   ASSERT_DEATH(cvc5_op_release(nullptr), "invalid op");
      76                 :          8 :   std::vector<uint32_t> idxs = {4, 0};
      77                 :            :   Cvc5Op op =
      78                 :          8 :       cvc5_mk_op(d_tm, CVC5_KIND_BITVECTOR_EXTRACT, idxs.size(), idxs.data());
      79                 :          8 :   Cvc5Op op_copy = cvc5_op_copy(op);
      80                 :          8 :   size_t hash1 = cvc5_op_hash(op);
      81                 :          8 :   size_t hash2 = cvc5_op_hash(op_copy);
      82         [ -  + ]:          8 :   ASSERT_EQ(hash1, hash2);
      83                 :          8 :   cvc5_op_release(op);
      84         [ -  + ]:          8 :   ASSERT_EQ(cvc5_op_hash(op), cvc5_op_hash(op_copy));
      85                 :          8 :   cvc5_op_release(op);
      86                 :            :   // we cannot reliably check that querying on the (now freed) term fails
      87                 :            :   // unless ASAN is enabled
      88                 :            : }
      89                 :            : 
      90                 :         16 : TEST_F(TestCApiBlackOp, get_kind)
      91                 :            : {
      92                 :          8 :   ASSERT_DEATH(cvc5_op_get_kind(nullptr), "invalid operator");
      93                 :          7 :   std::vector<uint32_t> idxs = {4, 0};
      94         [ -  + ]:          7 :   ASSERT_EQ(cvc5_op_get_kind(cvc5_mk_op(
      95                 :            :                 d_tm, CVC5_KIND_BITVECTOR_EXTRACT, idxs.size(), idxs.data())),
      96                 :            :             CVC5_KIND_BITVECTOR_EXTRACT);
      97                 :            : }
      98                 :            : 
      99                 :         14 : TEST_F(TestCApiBlackOp, mk_op)
     100                 :            : {
     101                 :          7 :   std::vector<uint32_t> idxs = {4, 0};
     102                 :          7 :   ASSERT_DEATH(
     103                 :            :       cvc5_mk_op(
     104                 :            :           nullptr, CVC5_KIND_BITVECTOR_EXTRACT, idxs.size(), idxs.data()),
     105                 :            :       "unexpected NULL argument");
     106                 :          6 :   ASSERT_DEATH(
     107                 :            :       cvc5_mk_op(d_tm, CVC5_KIND_BITVECTOR_EXTRACT, idxs.size(), nullptr),
     108                 :            :       "unexpected NULL argument");
     109                 :          5 :   (void)cvc5_mk_op(d_tm, CVC5_KIND_ADD, 0, nullptr);
     110                 :          5 :   idxs.push_back(2);
     111                 :          5 :   ASSERT_DEATH(
     112                 :            :       cvc5_mk_op(d_tm, CVC5_KIND_BITVECTOR_EXTRACT, idxs.size(), idxs.data()),
     113                 :            :       "invalid number of indices");
     114                 :            : }
     115                 :            : 
     116                 :          8 : TEST_F(TestCApiBlackOp, get_num_indices)
     117                 :            : {
     118                 :          4 :   ASSERT_DEATH(cvc5_op_get_num_indices(nullptr), "invalid operator");
     119                 :            : 
     120                 :            :   // Operators with 0 indices
     121                 :          3 :   Cvc5Op add = cvc5_mk_op(d_tm, CVC5_KIND_ADD, 0, nullptr);
     122         [ -  + ]:          3 :   ASSERT_EQ(cvc5_op_get_num_indices(add), 0);
     123                 :            : 
     124                 :            :   // Operators with 1 index
     125                 :          3 :   std::vector<uint32_t> idxs = {4};
     126                 :            :   Cvc5Op divisible =
     127                 :          3 :       cvc5_mk_op(d_tm, CVC5_KIND_DIVISIBLE, idxs.size(), idxs.data());
     128                 :          3 :   idxs = {5};
     129                 :            :   Cvc5Op bv_repeat =
     130                 :          3 :       cvc5_mk_op(d_tm, CVC5_KIND_BITVECTOR_REPEAT, idxs.size(), idxs.data());
     131                 :          3 :   idxs = {6};
     132                 :          3 :   Cvc5Op bv_zext = cvc5_mk_op(
     133                 :          3 :       d_tm, CVC5_KIND_BITVECTOR_ZERO_EXTEND, idxs.size(), idxs.data());
     134                 :          3 :   idxs = {7};
     135                 :          3 :   Cvc5Op bv_sext = cvc5_mk_op(
     136                 :          3 :       d_tm, CVC5_KIND_BITVECTOR_SIGN_EXTEND, idxs.size(), idxs.data());
     137                 :          3 :   idxs = {8};
     138                 :          3 :   Cvc5Op bv_rol = cvc5_mk_op(
     139                 :          3 :       d_tm, CVC5_KIND_BITVECTOR_ROTATE_LEFT, idxs.size(), idxs.data());
     140                 :          3 :   idxs = {9};
     141                 :          3 :   Cvc5Op bv_ror = cvc5_mk_op(
     142                 :          3 :       d_tm, CVC5_KIND_BITVECTOR_ROTATE_RIGHT, idxs.size(), idxs.data());
     143                 :          3 :   idxs = {10};
     144                 :            :   Cvc5Op int_to_bv =
     145                 :          3 :       cvc5_mk_op(d_tm, CVC5_KIND_INT_TO_BITVECTOR, idxs.size(), idxs.data());
     146                 :          3 :   idxs = {12};
     147                 :          3 :   Cvc5Op iand = cvc5_mk_op(d_tm, CVC5_KIND_IAND, idxs.size(), idxs.data());
     148                 :          3 :   idxs = {12};
     149                 :          3 :   Cvc5Op fp_to_ubv = cvc5_mk_op(
     150                 :          3 :       d_tm, CVC5_KIND_FLOATINGPOINT_TO_UBV, idxs.size(), idxs.data());
     151                 :          3 :   idxs = {13};
     152                 :          3 :   Cvc5Op fp_to_sbv = cvc5_mk_op(
     153                 :          3 :       d_tm, CVC5_KIND_FLOATINGPOINT_TO_SBV, idxs.size(), idxs.data());
     154                 :            : 
     155         [ -  + ]:          3 :   ASSERT_EQ(1, cvc5_op_get_num_indices(divisible));
     156         [ -  + ]:          3 :   ASSERT_EQ(1, cvc5_op_get_num_indices(bv_repeat));
     157         [ -  + ]:          3 :   ASSERT_EQ(1, cvc5_op_get_num_indices(bv_zext));
     158         [ -  + ]:          3 :   ASSERT_EQ(1, cvc5_op_get_num_indices(bv_sext));
     159         [ -  + ]:          3 :   ASSERT_EQ(1, cvc5_op_get_num_indices(bv_ror));
     160         [ -  + ]:          3 :   ASSERT_EQ(1, cvc5_op_get_num_indices(bv_rol));
     161         [ -  + ]:          3 :   ASSERT_EQ(1, cvc5_op_get_num_indices(int_to_bv));
     162         [ -  + ]:          3 :   ASSERT_EQ(1, cvc5_op_get_num_indices(iand));
     163         [ -  + ]:          3 :   ASSERT_EQ(1, cvc5_op_get_num_indices(fp_to_ubv));
     164         [ -  + ]:          3 :   ASSERT_EQ(1, cvc5_op_get_num_indices(fp_to_sbv));
     165                 :            : 
     166                 :            :   // Operators with 2 indices
     167                 :          3 :   idxs = {1, 0};
     168                 :            :   Cvc5Op bv_ext =
     169                 :          3 :       cvc5_mk_op(d_tm, CVC5_KIND_BITVECTOR_EXTRACT, idxs.size(), idxs.data());
     170                 :          3 :   idxs = {3, 2};
     171                 :            :   Cvc5Op to_fp_from_ieee =
     172                 :          3 :       cvc5_mk_op(d_tm,
     173                 :            :                  CVC5_KIND_FLOATINGPOINT_TO_FP_FROM_IEEE_BV,
     174                 :            :                  idxs.size(),
     175                 :          3 :                  idxs.data());
     176                 :          3 :   idxs = {5, 4};
     177                 :          3 :   Cvc5Op to_fp_from_fp = cvc5_mk_op(
     178                 :          3 :       d_tm, CVC5_KIND_FLOATINGPOINT_TO_FP_FROM_FP, idxs.size(), idxs.data());
     179                 :          3 :   idxs = {7, 6};
     180                 :          3 :   Cvc5Op to_fp_from_real = cvc5_mk_op(
     181                 :          3 :       d_tm, CVC5_KIND_FLOATINGPOINT_TO_FP_FROM_REAL, idxs.size(), idxs.data());
     182                 :          3 :   idxs = {9, 8};
     183                 :          3 :   Cvc5Op to_fp_from_sbv = cvc5_mk_op(
     184                 :          3 :       d_tm, CVC5_KIND_FLOATINGPOINT_TO_FP_FROM_SBV, idxs.size(), idxs.data());
     185                 :          3 :   idxs = {11, 10};
     186                 :          3 :   Cvc5Op to_fp_from_ubv = cvc5_mk_op(
     187                 :          3 :       d_tm, CVC5_KIND_FLOATINGPOINT_TO_FP_FROM_UBV, idxs.size(), idxs.data());
     188                 :          3 :   idxs = {15, 14};
     189                 :            :   Cvc5Op regexp_loop =
     190                 :          3 :       cvc5_mk_op(d_tm, CVC5_KIND_REGEXP_LOOP, idxs.size(), idxs.data());
     191                 :            : 
     192         [ -  + ]:          3 :   ASSERT_EQ(2, cvc5_op_get_num_indices(bv_ext));
     193         [ -  + ]:          3 :   ASSERT_EQ(2, cvc5_op_get_num_indices(to_fp_from_ieee));
     194         [ -  + ]:          3 :   ASSERT_EQ(2, cvc5_op_get_num_indices(to_fp_from_fp));
     195         [ -  + ]:          3 :   ASSERT_EQ(2, cvc5_op_get_num_indices(to_fp_from_real));
     196         [ -  + ]:          3 :   ASSERT_EQ(2, cvc5_op_get_num_indices(to_fp_from_sbv));
     197         [ -  + ]:          3 :   ASSERT_EQ(2, cvc5_op_get_num_indices(to_fp_from_ubv));
     198         [ -  + ]:          3 :   ASSERT_EQ(2, cvc5_op_get_num_indices(regexp_loop));
     199                 :            : 
     200                 :            :   // Operators with n indices
     201                 :          3 :   idxs = {0, 3, 2, 0, 1, 2};
     202                 :            :   Cvc5Op tuple_proj =
     203                 :          3 :       cvc5_mk_op(d_tm, CVC5_KIND_TUPLE_PROJECT, idxs.size(), idxs.data());
     204         [ -  + ]:          3 :   ASSERT_EQ(idxs.size(), cvc5_op_get_num_indices(tuple_proj));
     205                 :            : 
     206                 :            :   Cvc5Op rel_proj =
     207                 :          3 :       cvc5_mk_op(d_tm, CVC5_KIND_RELATION_PROJECT, idxs.size(), idxs.data());
     208         [ -  + ]:          3 :   ASSERT_EQ(idxs.size(), cvc5_op_get_num_indices(rel_proj));
     209                 :            : 
     210                 :            :   Cvc5Op table_proj =
     211                 :          3 :       cvc5_mk_op(d_tm, CVC5_KIND_TABLE_PROJECT, idxs.size(), idxs.data());
     212         [ -  + ]:          3 :   ASSERT_EQ(idxs.size(), cvc5_op_get_num_indices(table_proj));
     213                 :            : }
     214                 :            : 
     215                 :          6 : TEST_F(TestCApiBlackOp, subscript_operator)
     216                 :            : {
     217                 :            :   // Operators with 0 indices
     218                 :          3 :   Cvc5Op add = cvc5_mk_op(d_tm, CVC5_KIND_ADD, 0, nullptr);
     219                 :          3 :   ASSERT_DEATH(cvc5_op_get_index(nullptr, 0), "invalid operator");
     220                 :          2 :   ASSERT_DEATH(cvc5_op_get_index(add, 0), "Op is not indexed");
     221                 :            : 
     222                 :            :   // Operators with 1 index
     223                 :          1 :   std::vector<uint32_t> idxs = {4};
     224                 :            :   Cvc5Op divisible =
     225                 :          1 :       cvc5_mk_op(d_tm, CVC5_KIND_DIVISIBLE, idxs.size(), idxs.data());
     226                 :          1 :   idxs = {5};
     227                 :            :   Cvc5Op bv_repeat =
     228                 :          1 :       cvc5_mk_op(d_tm, CVC5_KIND_BITVECTOR_REPEAT, idxs.size(), idxs.data());
     229                 :          1 :   idxs = {6};
     230                 :          1 :   Cvc5Op bv_zext = cvc5_mk_op(
     231                 :          1 :       d_tm, CVC5_KIND_BITVECTOR_ZERO_EXTEND, idxs.size(), idxs.data());
     232                 :          1 :   idxs = {7};
     233                 :          1 :   Cvc5Op bv_sext = cvc5_mk_op(
     234                 :          1 :       d_tm, CVC5_KIND_BITVECTOR_SIGN_EXTEND, idxs.size(), idxs.data());
     235                 :          1 :   idxs = {8};
     236                 :          1 :   Cvc5Op bv_rol = cvc5_mk_op(
     237                 :          1 :       d_tm, CVC5_KIND_BITVECTOR_ROTATE_LEFT, idxs.size(), idxs.data());
     238                 :          1 :   idxs = {9};
     239                 :          1 :   Cvc5Op bv_ror = cvc5_mk_op(
     240                 :          1 :       d_tm, CVC5_KIND_BITVECTOR_ROTATE_RIGHT, idxs.size(), idxs.data());
     241                 :          1 :   idxs = {10};
     242                 :            :   Cvc5Op int_to_bv =
     243                 :          1 :       cvc5_mk_op(d_tm, CVC5_KIND_INT_TO_BITVECTOR, idxs.size(), idxs.data());
     244                 :          1 :   idxs = {11};
     245                 :          1 :   Cvc5Op iand = cvc5_mk_op(d_tm, CVC5_KIND_IAND, idxs.size(), idxs.data());
     246                 :          1 :   idxs = {12};
     247                 :          1 :   Cvc5Op fp_to_ubv = cvc5_mk_op(
     248                 :          1 :       d_tm, CVC5_KIND_FLOATINGPOINT_TO_UBV, idxs.size(), idxs.data());
     249                 :          1 :   idxs = {13};
     250                 :          1 :   Cvc5Op fp_to_sbv = cvc5_mk_op(
     251                 :          1 :       d_tm, CVC5_KIND_FLOATINGPOINT_TO_SBV, idxs.size(), idxs.data());
     252                 :          1 :   idxs = {14};
     253                 :            :   Cvc5Op regexp_repeat =
     254                 :          1 :       cvc5_mk_op(d_tm, CVC5_KIND_REGEXP_REPEAT, idxs.size(), idxs.data());
     255                 :            : 
     256         [ -  + ]:          1 :   ASSERT_EQ(4, cvc5_term_get_uint32_value(cvc5_op_get_index(divisible, 0)));
     257         [ -  + ]:          1 :   ASSERT_EQ(5, cvc5_term_get_uint32_value(cvc5_op_get_index(bv_repeat, 0)));
     258         [ -  + ]:          1 :   ASSERT_EQ(6, cvc5_term_get_uint32_value(cvc5_op_get_index(bv_zext, 0)));
     259         [ -  + ]:          1 :   ASSERT_EQ(7, cvc5_term_get_uint32_value(cvc5_op_get_index(bv_sext, 0)));
     260         [ -  + ]:          1 :   ASSERT_EQ(8, cvc5_term_get_uint32_value(cvc5_op_get_index(bv_rol, 0)));
     261         [ -  + ]:          1 :   ASSERT_EQ(9, cvc5_term_get_uint32_value(cvc5_op_get_index(bv_ror, 0)));
     262         [ -  + ]:          1 :   ASSERT_EQ(10, cvc5_term_get_uint32_value(cvc5_op_get_index(int_to_bv, 0)));
     263         [ -  + ]:          1 :   ASSERT_EQ(11, cvc5_term_get_uint32_value(cvc5_op_get_index(iand, 0)));
     264         [ -  + ]:          1 :   ASSERT_EQ(12, cvc5_term_get_uint32_value(cvc5_op_get_index(fp_to_ubv, 0)));
     265         [ -  + ]:          1 :   ASSERT_EQ(13, cvc5_term_get_uint32_value(cvc5_op_get_index(fp_to_sbv, 0)));
     266         [ -  + ]:          1 :   ASSERT_EQ(14,
     267                 :            :             cvc5_term_get_uint32_value(cvc5_op_get_index(regexp_repeat, 0)));
     268                 :            : 
     269                 :            :   // Operators with 2 indices
     270                 :          1 :   idxs = {1, 0};
     271                 :            :   Cvc5Op bv_ext =
     272                 :          1 :       cvc5_mk_op(d_tm, CVC5_KIND_BITVECTOR_EXTRACT, idxs.size(), idxs.data());
     273                 :          1 :   idxs = {3, 2};
     274                 :            :   Cvc5Op to_fp_from_ieee =
     275                 :          1 :       cvc5_mk_op(d_tm,
     276                 :            :                  CVC5_KIND_FLOATINGPOINT_TO_FP_FROM_IEEE_BV,
     277                 :            :                  idxs.size(),
     278                 :          1 :                  idxs.data());
     279                 :          1 :   idxs = {5, 4};
     280                 :          1 :   Cvc5Op to_fp_from_fp = cvc5_mk_op(
     281                 :          1 :       d_tm, CVC5_KIND_FLOATINGPOINT_TO_FP_FROM_FP, idxs.size(), idxs.data());
     282                 :          1 :   idxs = {7, 6};
     283                 :          1 :   Cvc5Op to_fp_from_real = cvc5_mk_op(
     284                 :          1 :       d_tm, CVC5_KIND_FLOATINGPOINT_TO_FP_FROM_REAL, idxs.size(), idxs.data());
     285                 :          1 :   idxs = {9, 8};
     286                 :          1 :   Cvc5Op to_fp_from_sbv = cvc5_mk_op(
     287                 :          1 :       d_tm, CVC5_KIND_FLOATINGPOINT_TO_FP_FROM_SBV, idxs.size(), idxs.data());
     288                 :          1 :   idxs = {11, 10};
     289                 :          1 :   Cvc5Op to_fp_from_ubv = cvc5_mk_op(
     290                 :          1 :       d_tm, CVC5_KIND_FLOATINGPOINT_TO_FP_FROM_UBV, idxs.size(), idxs.data());
     291                 :          1 :   idxs = {15, 14};
     292                 :            :   Cvc5Op regexp_loop =
     293                 :          1 :       cvc5_mk_op(d_tm, CVC5_KIND_REGEXP_LOOP, idxs.size(), idxs.data());
     294                 :            : 
     295         [ -  + ]:          1 :   ASSERT_EQ(1, cvc5_term_get_uint32_value(cvc5_op_get_index(bv_ext, 0)));
     296         [ -  + ]:          1 :   ASSERT_EQ(0, cvc5_term_get_uint32_value(cvc5_op_get_index(bv_ext, 1)));
     297         [ -  + ]:          1 :   ASSERT_EQ(3,
     298                 :            :             cvc5_term_get_uint32_value(cvc5_op_get_index(to_fp_from_ieee, 0)));
     299         [ -  + ]:          1 :   ASSERT_EQ(2,
     300                 :            :             cvc5_term_get_uint32_value(cvc5_op_get_index(to_fp_from_ieee, 1)));
     301         [ -  + ]:          1 :   ASSERT_EQ(5, cvc5_term_get_uint32_value(cvc5_op_get_index(to_fp_from_fp, 0)));
     302         [ -  + ]:          1 :   ASSERT_EQ(4, cvc5_term_get_uint32_value(cvc5_op_get_index(to_fp_from_fp, 1)));
     303         [ -  + ]:          1 :   ASSERT_EQ(7,
     304                 :            :             cvc5_term_get_uint32_value(cvc5_op_get_index(to_fp_from_real, 0)));
     305         [ -  + ]:          1 :   ASSERT_EQ(6,
     306                 :            :             cvc5_term_get_uint32_value(cvc5_op_get_index(to_fp_from_real, 1)));
     307         [ -  + ]:          1 :   ASSERT_EQ(9,
     308                 :            :             cvc5_term_get_uint32_value(cvc5_op_get_index(to_fp_from_sbv, 0)));
     309         [ -  + ]:          1 :   ASSERT_EQ(8,
     310                 :            :             cvc5_term_get_uint32_value(cvc5_op_get_index(to_fp_from_sbv, 1)));
     311         [ -  + ]:          1 :   ASSERT_EQ(11,
     312                 :            :             cvc5_term_get_uint32_value(cvc5_op_get_index(to_fp_from_ubv, 0)));
     313         [ -  + ]:          1 :   ASSERT_EQ(10,
     314                 :            :             cvc5_term_get_uint32_value(cvc5_op_get_index(to_fp_from_ubv, 1)));
     315         [ -  + ]:          1 :   ASSERT_EQ(15, cvc5_term_get_uint32_value(cvc5_op_get_index(regexp_loop, 0)));
     316         [ -  + ]:          1 :   ASSERT_EQ(14, cvc5_term_get_uint32_value(cvc5_op_get_index(regexp_loop, 1)));
     317                 :            : 
     318                 :            :   // Operators with n indices
     319                 :          1 :   idxs = {0, 3, 2, 0, 1, 2};
     320                 :            :   Cvc5Op tuple_proj =
     321                 :          1 :       cvc5_mk_op(d_tm, CVC5_KIND_TUPLE_PROJECT, idxs.size(), idxs.data());
     322         [ +  + ]:          7 :   for (size_t i = 0, size = cvc5_op_get_num_indices(tuple_proj); i < size; ++i)
     323                 :            :   {
     324         [ -  + ]:          6 :     ASSERT_EQ(idxs[i],
     325                 :            :               cvc5_term_get_uint32_value(cvc5_op_get_index(tuple_proj, i)));
     326                 :            :   }
     327                 :            : 
     328                 :            :   Cvc5Op rel_proj =
     329                 :          1 :       cvc5_mk_op(d_tm, CVC5_KIND_RELATION_PROJECT, idxs.size(), idxs.data());
     330         [ +  + ]:          7 :   for (size_t i = 0, size = cvc5_op_get_num_indices(rel_proj); i < size; ++i)
     331                 :            :   {
     332         [ -  + ]:          6 :     ASSERT_EQ(idxs[i],
     333                 :            :               cvc5_term_get_uint32_value(cvc5_op_get_index(rel_proj, i)));
     334                 :            :   }
     335                 :            : 
     336                 :            :   Cvc5Op table_proj =
     337                 :          1 :       cvc5_mk_op(d_tm, CVC5_KIND_TABLE_PROJECT, idxs.size(), idxs.data());
     338         [ +  + ]:          7 :   for (size_t i = 0, size = cvc5_op_get_num_indices(table_proj); i < size; ++i)
     339                 :            :   {
     340         [ -  + ]:          6 :     ASSERT_EQ(idxs[i],
     341                 :            :               cvc5_term_get_uint32_value(cvc5_op_get_index(table_proj, i)));
     342                 :            :   }
     343                 :            : }
     344                 :            : 
     345                 :          2 : TEST_F(TestCApiBlackOp, to_string)
     346                 :            : {
     347                 :          1 :   std::vector<uint32_t> idxs = {5};
     348                 :            :   Cvc5Op bv_repeat =
     349                 :          1 :       cvc5_mk_op(d_tm, CVC5_KIND_BITVECTOR_REPEAT, idxs.size(), idxs.data());
     350         [ -  + ]:          1 :   ASSERT_EQ(cvc5_op_to_string(bv_repeat), cvc5_op_to_string(bv_repeat));
     351                 :            : }
     352                 :            : }  // namespace cvc5::internal::test

Generated by: LCOV version 1.14