LCOV - code coverage report
Current view: top level - buildbot/coverage/build/test/unit/util - integer_black.cpp (source / functions) Hit Total Coverage
Test: coverage.info Lines: 397 397 100.0 %
Date: 2024-10-22 11:38:46 Functions: 49 49 100.0 %
Branches: 258 474 54.4 %

           Branch data     Line data    Source code
       1                 :            : /******************************************************************************
       2                 :            :  * Top contributors (to current version):
       3                 :            :  *   Aina Niemetz, Tim King, Gereon Kremer
       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 cvc5::Integer.
      14                 :            :  */
      15                 :            : 
      16                 :            : #include <limits>
      17                 :            : #include <sstream>
      18                 :            : 
      19                 :            : #include "base/exception.h"
      20                 :            : #include "test.h"
      21                 :            : #include "util/integer.h"
      22                 :            : 
      23                 :            : namespace cvc5::internal {
      24                 :            : namespace test {
      25                 :            : 
      26                 :            : class TestUtilBlackInteger : public TestInternal
      27                 :            : {
      28                 :            :  protected:
      29                 :         35 :   uint32_t internalLength(int32_t i)
      30                 :            :   {
      31         [ +  + ]:         35 :     if (i == 0)
      32                 :            :     {
      33                 :          1 :       return 1;
      34                 :            :     }
      35                 :            :     else
      36                 :            :     {
      37                 :         34 :       int32_t absi = i < 0 ? -i : i;
      38                 :         34 :       uint32_t n = 0;
      39                 :         34 :       int32_t powN = 1;
      40                 :         84 :       do
      41                 :            :       {
      42                 :        118 :         powN <<= 1;
      43                 :        118 :         ++n;
      44         [ +  + ]:        118 :       } while (absi >= powN);
      45                 :         34 :       return n;
      46                 :            :     }
      47                 :            :   }
      48                 :            :   static const char* s_large_val;
      49                 :            :   static const char* s_lots_of_leading_zeros;
      50                 :            : };
      51                 :            : 
      52                 :            : const char* TestUtilBlackInteger::s_large_val =
      53                 :            :     "4547897890548754897897897897890789078907890";
      54                 :            : const char* TestUtilBlackInteger::s_lots_of_leading_zeros =
      55                 :            :     "00000000000000000000000000000000000000000000000000000000000000000000000000"
      56                 :            :     "000000000000000000000000000000000000000000000000000000000000000000000001";
      57                 :            : 
      58                 :          2 : TEST_F(TestUtilBlackInteger, constructors)
      59                 :            : {
      60                 :          1 :   Integer z0(1);
      61         [ -  + ]:          1 :   ASSERT_EQ(z0.getLong(), 1);
      62                 :            : 
      63                 :          1 :   Integer z1(0);
      64         [ -  + ]:          1 :   ASSERT_EQ(z1.getLong(), 0);
      65                 :            : 
      66                 :          1 :   Integer z2(-1);
      67         [ -  + ]:          1 :   ASSERT_EQ(z2.getLong(), -1);
      68                 :            : 
      69                 :          1 :   Integer z3(0x890UL);
      70         [ -  + ]:          1 :   ASSERT_EQ(z3.getUnsignedLong(), 0x890UL);
      71                 :            : 
      72                 :          1 :   Integer z4;
      73         [ -  + ]:          1 :   ASSERT_EQ(z4.getLong(), 0);
      74                 :            : 
      75                 :          1 :   Integer z5("7896890");
      76         [ -  + ]:          1 :   ASSERT_EQ(z5.getUnsignedLong(), 7896890ul);
      77                 :            : 
      78                 :          1 :   Integer z6(z5);
      79         [ -  + ]:          1 :   ASSERT_EQ(z5.getUnsignedLong(), 7896890ul);
      80         [ -  + ]:          1 :   ASSERT_EQ(z6.getUnsignedLong(), 7896890ul);
      81                 :            : 
      82                 :          1 :   std::string bigValue("1536729");
      83                 :          1 :   Integer z7(bigValue);
      84         [ -  + ]:          1 :   ASSERT_EQ(z7.getUnsignedLong(), 1536729ul);
      85                 :            : }
      86                 :            : 
      87                 :          2 : TEST_F(TestUtilBlackInteger, compare_against_zero)
      88                 :            : {
      89                 :          1 :   Integer z(0);
      90 [ +  - ][ +  - ]:          1 :   ASSERT_NO_THROW((void)(z == 0););
      91         [ -  + ]:          1 :   ASSERT_EQ(z, 0);
      92                 :            : }
      93                 :            : 
      94                 :          2 : TEST_F(TestUtilBlackInteger, operator_assign)
      95                 :            : {
      96                 :          1 :   Integer x(0);
      97                 :          1 :   Integer y(79);
      98                 :          1 :   Integer z(45789);
      99                 :            : 
     100         [ -  + ]:          1 :   ASSERT_EQ(x.getUnsignedLong(), 0ul);
     101         [ -  + ]:          1 :   ASSERT_EQ(y.getUnsignedLong(), 79ul);
     102         [ -  + ]:          1 :   ASSERT_EQ(z.getUnsignedLong(), 45789ul);
     103                 :            : 
     104                 :          1 :   x = y = z;
     105                 :            : 
     106         [ -  + ]:          1 :   ASSERT_EQ(x.getUnsignedLong(), 45789ul);
     107         [ -  + ]:          1 :   ASSERT_EQ(y.getUnsignedLong(), 45789ul);
     108         [ -  + ]:          1 :   ASSERT_EQ(z.getUnsignedLong(), 45789ul);
     109                 :            : 
     110                 :          1 :   Integer a(2);
     111                 :            : 
     112                 :          1 :   y = a;
     113                 :            : 
     114         [ -  + ]:          1 :   ASSERT_EQ(a.getUnsignedLong(), 2ul);
     115         [ -  + ]:          1 :   ASSERT_EQ(y.getUnsignedLong(), 2ul);
     116         [ -  + ]:          1 :   ASSERT_EQ(x.getUnsignedLong(), 45789ul);
     117         [ -  + ]:          1 :   ASSERT_EQ(z.getUnsignedLong(), 45789ul);
     118                 :            : }
     119                 :            : 
     120                 :          2 : TEST_F(TestUtilBlackInteger, operator_equals)
     121                 :            : {
     122                 :          1 :   Integer a(0);
     123                 :          1 :   Integer b(79);
     124                 :          1 :   Integer c("79");
     125                 :          1 :   Integer d;
     126                 :            : 
     127         [ -  + ]:          1 :   ASSERT_TRUE(a == a);
     128         [ -  + ]:          1 :   ASSERT_FALSE(a == b);
     129         [ -  + ]:          1 :   ASSERT_FALSE(a == c);
     130         [ -  + ]:          1 :   ASSERT_TRUE(a == d);
     131                 :            : 
     132         [ -  + ]:          1 :   ASSERT_FALSE(b == a);
     133         [ -  + ]:          1 :   ASSERT_TRUE(b == b);
     134         [ -  + ]:          1 :   ASSERT_TRUE(b == c);
     135         [ -  + ]:          1 :   ASSERT_FALSE(b == d);
     136                 :            : 
     137         [ -  + ]:          1 :   ASSERT_FALSE(c == a);
     138         [ -  + ]:          1 :   ASSERT_TRUE(c == b);
     139         [ -  + ]:          1 :   ASSERT_TRUE(c == c);
     140         [ -  + ]:          1 :   ASSERT_FALSE(c == d);
     141                 :            : 
     142         [ -  + ]:          1 :   ASSERT_TRUE(d == a);
     143         [ -  + ]:          1 :   ASSERT_FALSE(d == b);
     144         [ -  + ]:          1 :   ASSERT_FALSE(d == c);
     145         [ -  + ]:          1 :   ASSERT_TRUE(d == d);
     146                 :            : }
     147                 :            : 
     148                 :          2 : TEST_F(TestUtilBlackInteger, operator_not_equals)
     149                 :            : {
     150                 :          1 :   Integer a(0);
     151                 :          1 :   Integer b(79);
     152                 :          1 :   Integer c("79");
     153                 :          1 :   Integer d;
     154                 :            : 
     155         [ -  + ]:          1 :   ASSERT_FALSE(a != a);
     156         [ -  + ]:          1 :   ASSERT_TRUE(a != b);
     157         [ -  + ]:          1 :   ASSERT_TRUE(a != c);
     158         [ -  + ]:          1 :   ASSERT_FALSE(a != d);
     159                 :            : 
     160         [ -  + ]:          1 :   ASSERT_TRUE(b != a);
     161         [ -  + ]:          1 :   ASSERT_FALSE(b != b);
     162         [ -  + ]:          1 :   ASSERT_FALSE(b != c);
     163         [ -  + ]:          1 :   ASSERT_TRUE(b != d);
     164                 :            : 
     165         [ -  + ]:          1 :   ASSERT_TRUE(c != a);
     166         [ -  + ]:          1 :   ASSERT_FALSE(c != b);
     167         [ -  + ]:          1 :   ASSERT_FALSE(c != c);
     168         [ -  + ]:          1 :   ASSERT_TRUE(c != d);
     169                 :            : 
     170         [ -  + ]:          1 :   ASSERT_FALSE(d != a);
     171         [ -  + ]:          1 :   ASSERT_TRUE(d != b);
     172         [ -  + ]:          1 :   ASSERT_TRUE(d != c);
     173         [ -  + ]:          1 :   ASSERT_FALSE(d != d);
     174                 :            : }
     175                 :            : 
     176                 :          2 : TEST_F(TestUtilBlackInteger, operator_subtract)
     177                 :            : {
     178                 :          1 :   Integer x(0);
     179                 :          1 :   Integer y(79);
     180                 :          1 :   Integer z(-34);
     181                 :            : 
     182                 :          1 :   Integer act0 = x - x;
     183                 :          1 :   Integer act1 = x - y;
     184                 :          1 :   Integer act2 = x - z;
     185                 :          1 :   Integer exp0(0);
     186                 :          1 :   Integer exp1(-79);
     187                 :          1 :   Integer exp2(34);
     188                 :            : 
     189                 :          1 :   Integer act3 = y - x;
     190                 :          1 :   Integer act4 = y - y;
     191                 :          1 :   Integer act5 = y - z;
     192                 :          1 :   Integer exp3(79);
     193                 :          1 :   Integer exp4(0);
     194                 :          1 :   Integer exp5(113);
     195                 :            : 
     196                 :          1 :   Integer act6 = z - x;
     197                 :          1 :   Integer act7 = z - y;
     198                 :          1 :   Integer act8 = z - z;
     199                 :          1 :   Integer exp6(-34);
     200                 :          1 :   Integer exp7(-113);
     201                 :          1 :   Integer exp8(0);
     202                 :            : 
     203         [ -  + ]:          1 :   ASSERT_EQ(act0, exp0);
     204         [ -  + ]:          1 :   ASSERT_EQ(act1, exp1);
     205         [ -  + ]:          1 :   ASSERT_EQ(act2, exp2);
     206         [ -  + ]:          1 :   ASSERT_EQ(act3, exp3);
     207         [ -  + ]:          1 :   ASSERT_EQ(act4, exp4);
     208         [ -  + ]:          1 :   ASSERT_EQ(act5, exp5);
     209         [ -  + ]:          1 :   ASSERT_EQ(act6, exp6);
     210         [ -  + ]:          1 :   ASSERT_EQ(act7, exp7);
     211         [ -  + ]:          1 :   ASSERT_EQ(act8, exp8);
     212                 :            : }
     213                 :            : 
     214                 :          2 : TEST_F(TestUtilBlackInteger, operator_add)
     215                 :            : {
     216                 :          1 :   Integer x(0);
     217                 :          1 :   Integer y(79);
     218                 :          1 :   Integer z(-34);
     219                 :            : 
     220                 :          1 :   Integer act0 = x + x;
     221                 :          1 :   Integer act1 = x + y;
     222                 :          1 :   Integer act2 = x + z;
     223                 :          1 :   Integer exp0(0);
     224                 :          1 :   Integer exp1(79);
     225                 :          1 :   Integer exp2(-34);
     226                 :            : 
     227                 :          1 :   Integer act3 = y + x;
     228                 :          1 :   Integer act4 = y + y;
     229                 :          1 :   Integer act5 = y + z;
     230                 :          1 :   Integer exp3(79);
     231                 :          1 :   Integer exp4(158);
     232                 :          1 :   Integer exp5(45);
     233                 :            : 
     234                 :          1 :   Integer act6 = z + x;
     235                 :          1 :   Integer act7 = z + y;
     236                 :          1 :   Integer act8 = z + z;
     237                 :          1 :   Integer exp6(-34);
     238                 :          1 :   Integer exp7(45);
     239                 :          1 :   Integer exp8(-68);
     240                 :            : 
     241         [ -  + ]:          1 :   ASSERT_EQ(act0, exp0);
     242         [ -  + ]:          1 :   ASSERT_EQ(act1, exp1);
     243         [ -  + ]:          1 :   ASSERT_EQ(act2, exp2);
     244         [ -  + ]:          1 :   ASSERT_EQ(act3, exp3);
     245         [ -  + ]:          1 :   ASSERT_EQ(act4, exp4);
     246         [ -  + ]:          1 :   ASSERT_EQ(act5, exp5);
     247         [ -  + ]:          1 :   ASSERT_EQ(act6, exp6);
     248         [ -  + ]:          1 :   ASSERT_EQ(act7, exp7);
     249         [ -  + ]:          1 :   ASSERT_EQ(act8, exp8);
     250                 :            : }
     251                 :            : 
     252                 :          2 : TEST_F(TestUtilBlackInteger, operator_mult)
     253                 :            : {
     254                 :          1 :   Integer x(0);
     255                 :          1 :   Integer y(79);
     256                 :          1 :   Integer z(-34);
     257                 :            : 
     258                 :          1 :   Integer act0 = x * x;
     259                 :          1 :   Integer act1 = x * y;
     260                 :          1 :   Integer act2 = x * z;
     261                 :          1 :   Integer exp0(0);
     262                 :          1 :   Integer exp1(0);
     263                 :          1 :   Integer exp2(0);
     264                 :            : 
     265                 :          1 :   Integer act3 = y * x;
     266                 :          1 :   Integer act4 = y * y;
     267                 :          1 :   Integer act5 = y * z;
     268                 :          1 :   Integer exp3(0);
     269                 :          1 :   Integer exp4(6241);
     270                 :          1 :   Integer exp5(-2686);
     271                 :            : 
     272                 :          1 :   Integer act6 = z * x;
     273                 :          1 :   Integer act7 = z * y;
     274                 :          1 :   Integer act8 = z * z;
     275                 :          1 :   Integer exp6(0);
     276                 :          1 :   Integer exp7(-2686);
     277                 :          1 :   Integer exp8(1156);
     278                 :            : 
     279         [ -  + ]:          1 :   ASSERT_EQ(act0, exp0);
     280         [ -  + ]:          1 :   ASSERT_EQ(act1, exp1);
     281         [ -  + ]:          1 :   ASSERT_EQ(act2, exp2);
     282         [ -  + ]:          1 :   ASSERT_EQ(act3, exp3);
     283         [ -  + ]:          1 :   ASSERT_EQ(act4, exp4);
     284         [ -  + ]:          1 :   ASSERT_EQ(act5, exp5);
     285         [ -  + ]:          1 :   ASSERT_EQ(act6, exp6);
     286         [ -  + ]:          1 :   ASSERT_EQ(act7, exp7);
     287         [ -  + ]:          1 :   ASSERT_EQ(act8, exp8);
     288                 :            : }
     289                 :            : 
     290                 :          2 : TEST_F(TestUtilBlackInteger, to_string)
     291                 :            : {
     292                 :          1 :   std::stringstream ss;
     293                 :          1 :   Integer large(s_large_val);
     294                 :          1 :   ss << large;
     295                 :          1 :   std::string res = ss.str();
     296                 :            : 
     297         [ -  + ]:          2 :   ASSERT_EQ(res, large.toString());
     298                 :            : }
     299                 :            : 
     300                 :          2 : TEST_F(TestUtilBlackInteger, base_inference)
     301                 :            : {
     302         [ -  + ]:          2 :   ASSERT_EQ(Integer("0xa", 0), 10);
     303         [ -  + ]:          2 :   ASSERT_EQ(Integer("0xff", 0), 255);
     304         [ -  + ]:          2 :   ASSERT_EQ(Integer("011", 0), 9);
     305         [ -  + ]:          2 :   ASSERT_EQ(Integer("0b1010", 0), 10);
     306         [ -  + ]:          2 :   ASSERT_EQ(Integer("-1", 0), -1);
     307         [ -  + ]:          2 :   ASSERT_EQ(Integer("42", 0), 42);
     308                 :            : }
     309                 :            : 
     310                 :          2 : TEST_F(TestUtilBlackInteger, parse_errors)
     311                 :            : {
     312 [ +  - ][ +  - ]:          2 :   ASSERT_THROW(Integer("abracadabra"), std::invalid_argument);
                 [ -  + ]
     313 [ +  - ][ +  - ]:          2 :   ASSERT_THROW(Integer("+-1"), std::invalid_argument);
                 [ -  + ]
     314 [ +  - ][ +  - ]:          2 :   ASSERT_THROW(Integer("-+1"), std::invalid_argument);
                 [ -  + ]
     315 [ +  - ][ +  - ]:          2 :   ASSERT_THROW(Integer("5i"), std::invalid_argument);
                 [ -  + ]
     316 [ +  - ][ +  - ]:          2 :   ASSERT_THROW(Integer("10xyz"), std::invalid_argument);
                 [ -  + ]
     317 [ +  - ][ +  - ]:          2 :   ASSERT_THROW(Integer("0xff", 10), std::invalid_argument);
                 [ -  + ]
     318 [ +  - ][ +  - ]:          2 :   ASSERT_THROW(Integer("#x5", 0), std::invalid_argument);
                 [ -  + ]
     319 [ +  - ][ +  - ]:          2 :   ASSERT_THROW(Integer("0b123", 0), std::invalid_argument);
                 [ -  + ]
     320                 :            : }
     321                 :            : 
     322                 :          2 : TEST_F(TestUtilBlackInteger, pow)
     323                 :            : {
     324         [ -  + ]:          2 :   ASSERT_EQ(Integer(1), Integer(1).pow(0));
     325         [ -  + ]:          2 :   ASSERT_EQ(Integer(1), Integer(5).pow(0));
     326         [ -  + ]:          2 :   ASSERT_EQ(Integer(1), Integer(-1).pow(0));
     327         [ -  + ]:          2 :   ASSERT_EQ(Integer(0), Integer(0).pow(1));
     328         [ -  + ]:          2 :   ASSERT_EQ(Integer(5), Integer(5).pow(1));
     329         [ -  + ]:          2 :   ASSERT_EQ(Integer(-5), Integer(-5).pow(1));
     330         [ -  + ]:          2 :   ASSERT_EQ(Integer(16), Integer(2).pow(4));
     331         [ -  + ]:          2 :   ASSERT_EQ(Integer(16), Integer(-2).pow(4));
     332         [ -  + ]:          2 :   ASSERT_EQ(Integer(1000), Integer(10).pow(3));
     333         [ -  + ]:          2 :   ASSERT_EQ(Integer(-1000), Integer(-10).pow(3));
     334                 :            : }
     335                 :            : 
     336                 :          2 : TEST_F(TestUtilBlackInteger, overly_long_signed)
     337                 :            : {
     338                 :          1 :   int64_t sl = std::numeric_limits<int64_t>::max();
     339                 :          1 :   Integer i(sl);
     340                 :            :   if constexpr (sizeof(unsigned long) == sizeof(uint64_t))
     341                 :            :   {
     342         [ -  + ]:          1 :     ASSERT_EQ(i.getLong(), sl);
     343                 :            :   }
     344 [ +  - ][ +  - ]:          1 :   ASSERT_NO_THROW(i.getSigned64());
     345         [ -  + ]:          1 :   ASSERT_EQ(i.getSigned64(), sl);
     346                 :          1 :   i = i + 1;
     347                 :          1 :   ASSERT_DEATH(i.getSigned64(), "Overflow detected");
     348                 :            : }
     349                 :            : 
     350                 :          2 : TEST_F(TestUtilBlackInteger, overly_long_unsigned)
     351                 :            : {
     352                 :          1 :   uint64_t ul = std::numeric_limits<uint64_t>::max();
     353                 :          1 :   Integer i(ul);
     354                 :            :   if constexpr (sizeof(unsigned long) == sizeof(uint64_t))
     355                 :            :   {
     356         [ -  + ]:          1 :     ASSERT_EQ(i.getUnsignedLong(), ul);
     357                 :            :   }
     358                 :          1 :   ASSERT_DEATH(i.getLong(), "Overflow detected");
     359 [ +  - ][ +  - ]:          1 :   ASSERT_NO_THROW(i.getUnsigned64());
     360         [ -  + ]:          1 :   ASSERT_EQ(i.getUnsigned64(), ul);
     361                 :          1 :   uint64_t ulplus1 = ul + 1;
     362         [ -  + ]:          1 :   ASSERT_EQ(ulplus1, 0);
     363                 :          1 :   i = i + 1;
     364                 :          1 :   ASSERT_DEATH(i.getUnsignedLong(), "Overflow detected");
     365                 :            : }
     366                 :            : 
     367                 :          2 : TEST_F(TestUtilBlackInteger, getSigned64)
     368                 :            : {
     369                 :            :   {
     370                 :          1 :     int64_t i = std::numeric_limits<int64_t>::max();
     371                 :          1 :     Integer a(i);
     372         [ -  + ]:          1 :     ASSERT_EQ(a.getSigned64(), i);
     373                 :          1 :     ASSERT_DEATH((a + 1).getSigned64(), "Overflow detected");
     374                 :            :   }
     375                 :            :   {
     376                 :          1 :     int64_t i = std::numeric_limits<int64_t>::min();
     377                 :          1 :     Integer a(i);
     378         [ -  + ]:          1 :     ASSERT_EQ(a.getSigned64(), i);
     379                 :          1 :     ASSERT_DEATH((a - 1).getSigned64(), "Overflow detected");
     380                 :            :   }
     381                 :            : }
     382                 :            : 
     383                 :          2 : TEST_F(TestUtilBlackInteger, getUnsigned64)
     384                 :            : {
     385                 :            :   {
     386                 :          1 :     uint64_t i = std::numeric_limits<uint64_t>::max();
     387                 :          1 :     Integer a(i);
     388         [ -  + ]:          1 :     ASSERT_EQ(a.getUnsigned64(), i);
     389                 :          1 :     ASSERT_DEATH((a + 1).getUnsigned64(), "Overflow detected");
     390                 :            :   }
     391                 :            :   {
     392                 :          1 :     uint64_t i = std::numeric_limits<uint64_t>::min();
     393                 :          1 :     Integer a(i);
     394         [ -  + ]:          1 :     ASSERT_EQ(a.getUnsigned64(), i);
     395                 :          1 :     ASSERT_DEATH((a - 1).getUnsigned64(), "Overflow detected");
     396                 :            :   }
     397                 :            : }
     398                 :            : 
     399                 :          2 : TEST_F(TestUtilBlackInteger, testBit)
     400                 :            : {
     401         [ -  + ]:          1 :   ASSERT_FALSE(Integer(0).testBit(6));
     402         [ -  + ]:          1 :   ASSERT_FALSE(Integer(0).testBit(5));
     403         [ -  + ]:          1 :   ASSERT_FALSE(Integer(0).testBit(4));
     404         [ -  + ]:          1 :   ASSERT_FALSE(Integer(0).testBit(3));
     405         [ -  + ]:          1 :   ASSERT_FALSE(Integer(0).testBit(2));
     406         [ -  + ]:          1 :   ASSERT_FALSE(Integer(0).testBit(1));
     407         [ -  + ]:          1 :   ASSERT_FALSE(Integer(0).testBit(0));
     408                 :            : 
     409         [ -  + ]:          1 :   ASSERT_TRUE(Integer(-1).testBit(6));
     410         [ -  + ]:          1 :   ASSERT_TRUE(Integer(-1).testBit(5));
     411         [ -  + ]:          1 :   ASSERT_TRUE(Integer(-1).testBit(4));
     412         [ -  + ]:          1 :   ASSERT_TRUE(Integer(-1).testBit(3));
     413         [ -  + ]:          1 :   ASSERT_TRUE(Integer(-1).testBit(2));
     414         [ -  + ]:          1 :   ASSERT_TRUE(Integer(-1).testBit(1));
     415         [ -  + ]:          1 :   ASSERT_TRUE(Integer(-1).testBit(0));
     416                 :            : 
     417         [ -  + ]:          1 :   ASSERT_FALSE(Integer(10).testBit(6));
     418         [ -  + ]:          1 :   ASSERT_FALSE(Integer(10).testBit(5));
     419         [ -  + ]:          1 :   ASSERT_FALSE(Integer(10).testBit(4));
     420         [ -  + ]:          1 :   ASSERT_TRUE(Integer(10).testBit(3));
     421         [ -  + ]:          1 :   ASSERT_FALSE(Integer(10).testBit(2));
     422         [ -  + ]:          1 :   ASSERT_TRUE(Integer(10).testBit(1));
     423         [ -  + ]:          1 :   ASSERT_FALSE(Integer(10).testBit(0));
     424                 :            : 
     425         [ -  + ]:          1 :   ASSERT_FALSE(Integer(14).testBit(6));
     426         [ -  + ]:          1 :   ASSERT_FALSE(Integer(14).testBit(5));
     427         [ -  + ]:          1 :   ASSERT_FALSE(Integer(14).testBit(4));
     428         [ -  + ]:          1 :   ASSERT_TRUE(Integer(14).testBit(3));
     429         [ -  + ]:          1 :   ASSERT_TRUE(Integer(14).testBit(2));
     430         [ -  + ]:          1 :   ASSERT_TRUE(Integer(14).testBit(1));
     431         [ -  + ]:          1 :   ASSERT_FALSE(Integer(14).testBit(0));
     432                 :            : 
     433         [ -  + ]:          1 :   ASSERT_TRUE(Integer(64).testBit(6));
     434         [ -  + ]:          1 :   ASSERT_FALSE(Integer(64).testBit(5));
     435         [ -  + ]:          1 :   ASSERT_FALSE(Integer(64).testBit(4));
     436         [ -  + ]:          1 :   ASSERT_FALSE(Integer(64).testBit(3));
     437         [ -  + ]:          1 :   ASSERT_FALSE(Integer(64).testBit(2));
     438         [ -  + ]:          1 :   ASSERT_FALSE(Integer(64).testBit(1));
     439         [ -  + ]:          1 :   ASSERT_FALSE(Integer(64).testBit(0));
     440                 :            : }
     441                 :            : 
     442                 :          2 : TEST_F(TestUtilBlackInteger, length)
     443                 :            : {
     444         [ +  + ]:         36 :   for (int32_t i = -17; i <= 17; ++i)
     445                 :            :   {
     446         [ -  + ]:         35 :     ASSERT_EQ(Integer(i).length(), internalLength(i));
     447                 :            :   }
     448                 :            : }
     449                 :            : 
     450                 :          2 : TEST_F(TestUtilBlackInteger, euclidianQR)
     451                 :            : {
     452                 :          1 :   Integer q, r;
     453                 :            : 
     454                 :          1 :   Integer::euclidianQR(q, r, 1, 4);
     455         [ -  + ]:          2 :   ASSERT_EQ(q, Integer(0));
     456         [ -  + ]:          2 :   ASSERT_EQ(r, Integer(1));
     457                 :            : 
     458                 :          1 :   Integer::euclidianQR(q, r, 1, -4);
     459         [ -  + ]:          2 :   ASSERT_EQ(q, Integer(0));
     460         [ -  + ]:          2 :   ASSERT_EQ(r, Integer(1));
     461                 :            : 
     462                 :          1 :   Integer::euclidianQR(q, r, -1, 4);
     463         [ -  + ]:          2 :   ASSERT_EQ(q, Integer(-1));
     464         [ -  + ]:          2 :   ASSERT_EQ(r, Integer(3));
     465                 :            : 
     466                 :          1 :   Integer::euclidianQR(q, r, -1, -4);
     467         [ -  + ]:          2 :   ASSERT_EQ(q, Integer(1));
     468         [ -  + ]:          2 :   ASSERT_EQ(r, Integer(3));
     469                 :            : 
     470                 :          1 :   Integer::euclidianQR(q, r, 5, 4);
     471         [ -  + ]:          2 :   ASSERT_EQ(q, Integer(1));
     472         [ -  + ]:          2 :   ASSERT_EQ(r, Integer(1));
     473                 :            : 
     474                 :          1 :   Integer::euclidianQR(q, r, 5, -4);
     475         [ -  + ]:          2 :   ASSERT_EQ(q, Integer(-1));
     476         [ -  + ]:          2 :   ASSERT_EQ(r, Integer(1));
     477                 :            : 
     478                 :          1 :   Integer::euclidianQR(q, r, -5, 4);
     479         [ -  + ]:          2 :   ASSERT_EQ(q, Integer(-2));
     480         [ -  + ]:          2 :   ASSERT_EQ(r, Integer(3));
     481                 :            : 
     482                 :          1 :   Integer::euclidianQR(q, r, -5, -4);
     483         [ -  + ]:          2 :   ASSERT_EQ(q, Integer(2));
     484         [ -  + ]:          2 :   ASSERT_EQ(r, Integer(3));
     485                 :            : }
     486                 :            : 
     487                 :          2 : TEST_F(TestUtilBlackInteger, floorQR)
     488                 :            : {
     489                 :          1 :   Integer q, r;
     490                 :            : 
     491                 :          1 :   Integer::floorQR(q, r, 1, 4);
     492         [ -  + ]:          2 :   ASSERT_EQ(q, Integer(0));
     493         [ -  + ]:          2 :   ASSERT_EQ(r, Integer(1));
     494                 :            : 
     495                 :          1 :   Integer::floorQR(q, r, 1, -4);
     496         [ -  + ]:          2 :   ASSERT_EQ(q, Integer(-1));
     497         [ -  + ]:          2 :   ASSERT_EQ(r, Integer(-3));
     498                 :            : 
     499                 :          1 :   Integer::floorQR(q, r, -1, 4);
     500         [ -  + ]:          2 :   ASSERT_EQ(q, Integer(-1));
     501         [ -  + ]:          2 :   ASSERT_EQ(r, Integer(3));
     502                 :            : 
     503                 :          1 :   Integer::floorQR(q, r, -1, -4);
     504         [ -  + ]:          2 :   ASSERT_EQ(q, Integer(0));
     505         [ -  + ]:          2 :   ASSERT_EQ(r, Integer(-1));
     506                 :            : 
     507                 :          1 :   Integer::floorQR(q, r, 5, 4);
     508         [ -  + ]:          2 :   ASSERT_EQ(q, Integer(1));
     509         [ -  + ]:          2 :   ASSERT_EQ(r, Integer(1));
     510                 :            : 
     511                 :          1 :   Integer::floorQR(q, r, 5, -4);
     512         [ -  + ]:          2 :   ASSERT_EQ(q, Integer(-2));
     513         [ -  + ]:          2 :   ASSERT_EQ(r, Integer(-3));
     514                 :            : 
     515                 :          1 :   Integer::floorQR(q, r, -5, 4);
     516         [ -  + ]:          2 :   ASSERT_EQ(q, Integer(-2));
     517         [ -  + ]:          2 :   ASSERT_EQ(r, Integer(3));
     518                 :            : 
     519                 :          1 :   Integer::floorQR(q, r, -5, -4);
     520         [ -  + ]:          2 :   ASSERT_EQ(q, Integer(1));
     521         [ -  + ]:          2 :   ASSERT_EQ(r, Integer(-1));
     522                 :            : }
     523                 :            : 
     524                 :          2 : TEST_F(TestUtilBlackInteger, leadingZeros)
     525                 :            : {
     526                 :          1 :   std::string leadingZeros(s_lots_of_leading_zeros);
     527                 :          1 :   Integer one(1u);
     528                 :          1 :   Integer one_from_string(leadingZeros, 2);
     529         [ -  + ]:          1 :   ASSERT_EQ(one, one_from_string);
     530                 :            : }
     531                 :            : 
     532                 :          2 : TEST_F(TestUtilBlackInteger, modAdd)
     533                 :            : {
     534         [ +  + ]:         12 :   for (uint32_t i = 0; i <= 10; ++i)
     535                 :            :   {
     536         [ +  + ]:        132 :     for (uint32_t j = 0; j <= 10; ++j)
     537                 :            :     {
     538                 :        121 :       Integer yy;
     539                 :        121 :       Integer x(i);
     540                 :        121 :       Integer y = x + j;
     541                 :        242 :       Integer yp = x.modAdd(j, 3);
     542         [ +  + ]:        484 :       for (yy = y; yy >= 3; yy -= 3)
     543                 :            :         ;
     544         [ -  + ]:        121 :       ASSERT_EQ(yp, yy);
     545                 :        121 :       yp = x.modAdd(j, 7);
     546         [ +  + ]:        242 :       for (yy = y; yy >= 7; yy -= 7)
     547                 :            :         ;
     548         [ -  + ]:        121 :       ASSERT_EQ(yp, yy);
     549                 :        121 :       yp = x.modAdd(j, 11);
     550         [ +  + ]:        176 :       for (yy = y; yy >= 11; yy -= 11)
     551                 :            :         ;
     552         [ -  + ]:        121 :       ASSERT_EQ(yp, yy);
     553                 :            :     }
     554                 :            :   }
     555                 :            : }
     556                 :            : 
     557                 :          2 : TEST_F(TestUtilBlackInteger, modMultiply)
     558                 :            : {
     559         [ +  + ]:         12 :   for (uint32_t i = 0; i <= 10; ++i)
     560                 :            :   {
     561         [ +  + ]:        132 :     for (uint32_t j = 0; j <= 10; ++j)
     562                 :            :     {
     563                 :        121 :       Integer yy;
     564                 :        121 :       Integer x(i);
     565                 :        121 :       Integer y = x * j;
     566                 :        242 :       Integer yp = x.modMultiply(j, 3);
     567         [ +  + ]:       1105 :       for (yy = y; yy >= 3; yy -= 3)
     568                 :            :         ;
     569         [ -  + ]:        121 :       ASSERT_EQ(yp, yy);
     570                 :        121 :       yp = x.modMultiply(j, 7);
     571         [ +  + ]:        513 :       for (yy = y; yy >= 7; yy -= 7)
     572                 :            :         ;
     573         [ -  + ]:        121 :       ASSERT_EQ(yp, yy);
     574                 :        121 :       yp = x.modMultiply(j, 11);
     575         [ +  + ]:        346 :       for (yy = y; yy >= 11; yy -= 11)
     576                 :            :         ;
     577         [ -  + ]:        121 :       ASSERT_EQ(yp, yy);
     578                 :            :     }
     579                 :            :   }
     580                 :            : }
     581                 :            : 
     582                 :          2 : TEST_F(TestUtilBlackInteger, modInverse)
     583                 :            : {
     584         [ +  + ]:         12 :   for (uint32_t i = 0; i <= 10; ++i)
     585                 :            :   {
     586                 :         11 :     Integer x(i);
     587                 :         11 :     Integer inv = x.modInverse(3);
     588 [ +  + ][ +  + ]:         11 :     if (i == 0 || i == 3 || i == 6 || i == 9)
         [ +  + ][ +  + ]
     589                 :            :     {
     590         [ -  + ]:          8 :       ASSERT_EQ(inv, -1); /* no inverse */
     591                 :            :     }
     592                 :            :     else
     593                 :            :     {
     594         [ -  + ]:         14 :       ASSERT_EQ(x.modMultiply(inv, 3), 1);
     595                 :            :     }
     596                 :         11 :     inv = x.modInverse(7);
     597 [ +  + ][ +  + ]:         11 :     if (i == 0 || i == 7)
     598                 :            :     {
     599         [ -  + ]:          4 :       ASSERT_EQ(inv, -1); /* no inverse */
     600                 :            :     }
     601                 :            :     else
     602                 :            :     {
     603         [ -  + ]:         18 :       ASSERT_EQ(x.modMultiply(inv, 7), 1);
     604                 :            :     }
     605                 :         11 :     inv = x.modInverse(11);
     606         [ +  + ]:         11 :     if (i == 0)
     607                 :            :     {
     608         [ -  + ]:          1 :       ASSERT_EQ(inv, -1); /* no inverse */
     609                 :            :     }
     610                 :            :     else
     611                 :            :     {
     612         [ -  + ]:         20 :       ASSERT_EQ(x.modMultiply(inv, 11), 1);
     613                 :            :     }
     614                 :            :   }
     615                 :            : }
     616                 :            : }  // namespace test
     617                 :            : }  // namespace cvc5::internal

Generated by: LCOV version 1.14