LCOV - code coverage report
Current view: top level - src/test - arith_uint256_tests.cpp (source / functions) Hit Total Coverage
Test: coverage.lcov Lines: 422 422 100.0 %
Date: 2022-04-21 14:51:19 Functions: 16 16 100.0 %
Legend: Modified by patch:
Lines: hit not hit | Branches: + taken - not taken # not executed

Not modified by patch:
Lines: hit not hit | Branches: + taken - not taken # not executed
Branches: 80 80 100.0 %

           Branch data     Line data    Source code
#       1                 :            : // Copyright (c) 2011-2021 The Bitcoin Core developers
#       2                 :            : // Distributed under the MIT software license, see the accompanying
#       3                 :            : // file COPYING or http://www.opensource.org/licenses/mit-license.php.
#       4                 :            : 
#       5                 :            : #include <arith_uint256.h>
#       6                 :            : #include <uint256.h>
#       7                 :            : 
#       8                 :            : #include <boost/test/unit_test.hpp>
#       9                 :            : 
#      10                 :            : #include <cmath>
#      11                 :            : #include <cstdint>
#      12                 :            : #include <iomanip>
#      13                 :            : #include <limits>
#      14                 :            : #include <sstream>
#      15                 :            : #include <string>
#      16                 :            : #include <vector>
#      17                 :            : 
#      18                 :            : BOOST_AUTO_TEST_SUITE(arith_uint256_tests)
#      19                 :            : 
#      20                 :            : /// Convert vector to arith_uint256, via uint256 blob
#      21                 :            : static inline arith_uint256 arith_uint256V(const std::vector<unsigned char>& vch)
#      22                 :       2614 : {
#      23                 :       2614 :     return UintToArith256(uint256(vch));
#      24                 :       2614 : }
#      25                 :            : 
#      26                 :            : const unsigned char R1Array[] =
#      27                 :            :     "\x9c\x52\x4a\xdb\xcf\x56\x11\x12\x2b\x29\x12\x5e\x5d\x35\xd2\xd2"
#      28                 :            :     "\x22\x81\xaa\xb5\x33\xf0\x08\x32\xd5\x56\xb1\xf9\xea\xe5\x1d\x7d";
#      29                 :            : const char R1ArrayHex[] = "7D1DE5EAF9B156D53208F033B5AA8122D2d2355d5e12292b121156cfdb4a529c";
#      30                 :            : const double R1Ldouble = 0.4887374590559308955; // R1L equals roughly R1Ldouble * 2^256
#      31                 :            : const arith_uint256 R1L = arith_uint256V(std::vector<unsigned char>(R1Array,R1Array+32));
#      32                 :            : const uint64_t R1LLow64 = 0x121156cfdb4a529cULL;
#      33                 :            : 
#      34                 :            : const unsigned char R2Array[] =
#      35                 :            :     "\x70\x32\x1d\x7c\x47\xa5\x6b\x40\x26\x7e\x0a\xc3\xa6\x9c\xb6\xbf"
#      36                 :            :     "\x13\x30\x47\xa3\x19\x2d\xda\x71\x49\x13\x72\xf0\xb4\xca\x81\xd7";
#      37                 :            : const arith_uint256 R2L = arith_uint256V(std::vector<unsigned char>(R2Array,R2Array+32));
#      38                 :            : 
#      39                 :            : const char R1LplusR2L[] = "549FB09FEA236A1EA3E31D4D58F1B1369288D204211CA751527CFC175767850C";
#      40                 :            : 
#      41                 :            : const unsigned char ZeroArray[] =
#      42                 :            :     "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
#      43                 :            :     "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00";
#      44                 :            : const arith_uint256 ZeroL = arith_uint256V(std::vector<unsigned char>(ZeroArray,ZeroArray+32));
#      45                 :            : 
#      46                 :            : const unsigned char OneArray[] =
#      47                 :            :     "\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
#      48                 :            :     "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00";
#      49                 :            : const arith_uint256 OneL = arith_uint256V(std::vector<unsigned char>(OneArray,OneArray+32));
#      50                 :            : 
#      51                 :            : const unsigned char MaxArray[] =
#      52                 :            :     "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"
#      53                 :            :     "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff";
#      54                 :            : const arith_uint256 MaxL = arith_uint256V(std::vector<unsigned char>(MaxArray,MaxArray+32));
#      55                 :            : 
#      56                 :            : const arith_uint256 HalfL = (OneL << 255);
#      57                 :            : static std::string ArrayToString(const unsigned char A[], unsigned int width)
#      58                 :         12 : {
#      59                 :         12 :     std::stringstream Stream;
#      60                 :         12 :     Stream << std::hex;
#      61         [ +  + ]:        396 :     for (unsigned int i = 0; i < width; ++i)
#      62                 :        384 :     {
#      63                 :        384 :         Stream<<std::setw(2)<<std::setfill('0')<<(unsigned int)A[width-i-1];
#      64                 :        384 :     }
#      65                 :         12 :     return Stream.str();
#      66                 :         12 : }
#      67                 :            : 
#      68                 :            : BOOST_AUTO_TEST_CASE( basics ) // constructors, equality, inequality
#      69                 :          2 : {
#      70                 :          2 :     BOOST_CHECK(1 == 0+1);
#      71                 :            :     // constructor arith_uint256(vector<char>):
#      72                 :          2 :     BOOST_CHECK(R1L.ToString() == ArrayToString(R1Array,32));
#      73                 :          2 :     BOOST_CHECK(R2L.ToString() == ArrayToString(R2Array,32));
#      74                 :          2 :     BOOST_CHECK(ZeroL.ToString() == ArrayToString(ZeroArray,32));
#      75                 :          2 :     BOOST_CHECK(OneL.ToString() == ArrayToString(OneArray,32));
#      76                 :          2 :     BOOST_CHECK(MaxL.ToString() == ArrayToString(MaxArray,32));
#      77                 :          2 :     BOOST_CHECK(OneL.ToString() != ArrayToString(ZeroArray,32));
#      78                 :            : 
#      79                 :            :     // == and !=
#      80                 :          2 :     BOOST_CHECK(R1L != R2L);
#      81                 :          2 :     BOOST_CHECK(ZeroL != OneL);
#      82                 :          2 :     BOOST_CHECK(OneL != ZeroL);
#      83                 :          2 :     BOOST_CHECK(MaxL != ZeroL);
#      84                 :          2 :     BOOST_CHECK(~MaxL == ZeroL);
#      85                 :          2 :     BOOST_CHECK( ((R1L ^ R2L) ^ R1L) == R2L);
#      86                 :            : 
#      87                 :          2 :     uint64_t Tmp64 = 0xc4dab720d9c7acaaULL;
#      88         [ +  + ]:        514 :     for (unsigned int i = 0; i < 256; ++i)
#      89                 :        512 :     {
#      90                 :        512 :         BOOST_CHECK(ZeroL != (OneL << i));
#      91                 :        512 :         BOOST_CHECK((OneL << i) != ZeroL);
#      92                 :        512 :         BOOST_CHECK(R1L != (R1L ^ (OneL << i)));
#      93                 :        512 :         BOOST_CHECK(((arith_uint256(Tmp64) ^ (OneL << i) ) != Tmp64 ));
#      94                 :        512 :     }
#      95                 :          2 :     BOOST_CHECK(ZeroL == (OneL << 256));
#      96                 :            : 
#      97                 :            :     // String Constructor and Copy Constructor
#      98                 :          2 :     BOOST_CHECK(arith_uint256("0x"+R1L.ToString()) == R1L);
#      99                 :          2 :     BOOST_CHECK(arith_uint256("0x"+R2L.ToString()) == R2L);
#     100                 :          2 :     BOOST_CHECK(arith_uint256("0x"+ZeroL.ToString()) == ZeroL);
#     101                 :          2 :     BOOST_CHECK(arith_uint256("0x"+OneL.ToString()) == OneL);
#     102                 :          2 :     BOOST_CHECK(arith_uint256("0x"+MaxL.ToString()) == MaxL);
#     103                 :          2 :     BOOST_CHECK(arith_uint256(R1L.ToString()) == R1L);
#     104                 :          2 :     BOOST_CHECK(arith_uint256("   0x"+R1L.ToString()+"   ") == R1L);
#     105                 :          2 :     BOOST_CHECK(arith_uint256("") == ZeroL);
#     106                 :          2 :     BOOST_CHECK(R1L == arith_uint256(R1ArrayHex));
#     107                 :          2 :     BOOST_CHECK(arith_uint256(R1L) == R1L);
#     108                 :          2 :     BOOST_CHECK((arith_uint256(R1L^R2L)^R2L) == R1L);
#     109                 :          2 :     BOOST_CHECK(arith_uint256(ZeroL) == ZeroL);
#     110                 :          2 :     BOOST_CHECK(arith_uint256(OneL) == OneL);
#     111                 :            : 
#     112                 :            :     // uint64_t constructor
#     113                 :          2 :     BOOST_CHECK( (R1L & arith_uint256("0xffffffffffffffff")) == arith_uint256(R1LLow64));
#     114                 :          2 :     BOOST_CHECK(ZeroL == arith_uint256(0));
#     115                 :          2 :     BOOST_CHECK(OneL == arith_uint256(1));
#     116                 :          2 :     BOOST_CHECK(arith_uint256("0xffffffffffffffff") == arith_uint256(0xffffffffffffffffULL));
#     117                 :            : 
#     118                 :            :     // Assignment (from base_uint)
#     119                 :          2 :     arith_uint256 tmpL = ~ZeroL; BOOST_CHECK(tmpL == ~ZeroL);
#     120                 :          2 :     tmpL = ~OneL; BOOST_CHECK(tmpL == ~OneL);
#     121                 :          2 :     tmpL = ~R1L; BOOST_CHECK(tmpL == ~R1L);
#     122                 :          2 :     tmpL = ~R2L; BOOST_CHECK(tmpL == ~R2L);
#     123                 :          2 :     tmpL = ~MaxL; BOOST_CHECK(tmpL == ~MaxL);
#     124                 :          2 : }
#     125                 :            : 
#     126                 :            : static void shiftArrayRight(unsigned char* to, const unsigned char* from, unsigned int arrayLength, unsigned int bitsToShift)
#     127                 :       1024 : {
#     128         [ +  + ]:      33792 :     for (unsigned int T=0; T < arrayLength; ++T)
#     129                 :      32768 :     {
#     130                 :      32768 :         unsigned int F = (T+bitsToShift/8);
#     131         [ +  + ]:      32768 :         if (F < arrayLength)
#     132                 :      16896 :             to[T] = uint8_t(from[F] >> (bitsToShift % 8));
#     133                 :      15872 :         else
#     134                 :      15872 :             to[T] = 0;
#     135         [ +  + ]:      32768 :         if (F + 1 < arrayLength)
#     136                 :      15872 :             to[T] |= uint8_t(from[(F + 1)] << (8 - bitsToShift % 8));
#     137                 :      32768 :     }
#     138                 :       1024 : }
#     139                 :            : 
#     140                 :            : static void shiftArrayLeft(unsigned char* to, const unsigned char* from, unsigned int arrayLength, unsigned int bitsToShift)
#     141                 :       1536 : {
#     142         [ +  + ]:      50688 :     for (unsigned int T=0; T < arrayLength; ++T)
#     143                 :      49152 :     {
#     144         [ +  + ]:      49152 :         if (T >= bitsToShift/8)
#     145                 :      25344 :         {
#     146                 :      25344 :             unsigned int F = T-bitsToShift/8;
#     147                 :      25344 :             to[T] = uint8_t(from[F] << (bitsToShift % 8));
#     148         [ +  + ]:      25344 :             if (T >= bitsToShift/8+1)
#     149                 :      23808 :                 to[T] |= uint8_t(from[F - 1] >> (8 - bitsToShift % 8));
#     150                 :      25344 :         }
#     151                 :      23808 :         else {
#     152                 :      23808 :             to[T] = 0;
#     153                 :      23808 :         }
#     154                 :      49152 :     }
#     155                 :       1536 : }
#     156                 :            : 
#     157                 :          2 : BOOST_AUTO_TEST_CASE( shifts ) { // "<<"  ">>"  "<<="  ">>="
#     158                 :          2 :     unsigned char TmpArray[32];
#     159                 :          2 :     arith_uint256 TmpL;
#     160         [ +  + ]:        514 :     for (unsigned int i = 0; i < 256; ++i)
#     161                 :        512 :     {
#     162                 :        512 :         shiftArrayLeft(TmpArray, OneArray, 32, i);
#     163                 :        512 :         BOOST_CHECK(arith_uint256V(std::vector<unsigned char>(TmpArray,TmpArray+32)) == (OneL << i));
#     164                 :        512 :         TmpL = OneL; TmpL <<= i;
#     165                 :        512 :         BOOST_CHECK(TmpL == (OneL << i));
#     166                 :        512 :         BOOST_CHECK((HalfL >> (255-i)) == (OneL << i));
#     167                 :        512 :         TmpL = HalfL; TmpL >>= (255-i);
#     168                 :        512 :         BOOST_CHECK(TmpL == (OneL << i));
#     169                 :            : 
#     170                 :        512 :         shiftArrayLeft(TmpArray, R1Array, 32, i);
#     171                 :        512 :         BOOST_CHECK(arith_uint256V(std::vector<unsigned char>(TmpArray,TmpArray+32)) == (R1L << i));
#     172                 :        512 :         TmpL = R1L; TmpL <<= i;
#     173                 :        512 :         BOOST_CHECK(TmpL == (R1L << i));
#     174                 :            : 
#     175                 :        512 :         shiftArrayRight(TmpArray, R1Array, 32, i);
#     176                 :        512 :         BOOST_CHECK(arith_uint256V(std::vector<unsigned char>(TmpArray,TmpArray+32)) == (R1L >> i));
#     177                 :        512 :         TmpL = R1L; TmpL >>= i;
#     178                 :        512 :         BOOST_CHECK(TmpL == (R1L >> i));
#     179                 :            : 
#     180                 :        512 :         shiftArrayLeft(TmpArray, MaxArray, 32, i);
#     181                 :        512 :         BOOST_CHECK(arith_uint256V(std::vector<unsigned char>(TmpArray,TmpArray+32)) == (MaxL << i));
#     182                 :        512 :         TmpL = MaxL; TmpL <<= i;
#     183                 :        512 :         BOOST_CHECK(TmpL == (MaxL << i));
#     184                 :            : 
#     185                 :        512 :         shiftArrayRight(TmpArray, MaxArray, 32, i);
#     186                 :        512 :         BOOST_CHECK(arith_uint256V(std::vector<unsigned char>(TmpArray,TmpArray+32)) == (MaxL >> i));
#     187                 :        512 :         TmpL = MaxL; TmpL >>= i;
#     188                 :        512 :         BOOST_CHECK(TmpL == (MaxL >> i));
#     189                 :        512 :     }
#     190                 :          2 :     arith_uint256 c1L = arith_uint256(0x0123456789abcdefULL);
#     191                 :          2 :     arith_uint256 c2L = c1L << 128;
#     192         [ +  + ]:        258 :     for (unsigned int i = 0; i < 128; ++i) {
#     193                 :        256 :         BOOST_CHECK((c1L << i) == (c2L >> (128-i)));
#     194                 :        256 :     }
#     195         [ +  + ]:        258 :     for (unsigned int i = 128; i < 256; ++i) {
#     196                 :        256 :         BOOST_CHECK((c1L << i) == (c2L << (i-128)));
#     197                 :        256 :     }
#     198                 :          2 : }
#     199                 :            : 
#     200                 :            : BOOST_AUTO_TEST_CASE( unaryOperators ) // !    ~    -
#     201                 :          2 : {
#     202                 :          2 :     BOOST_CHECK(~ZeroL == MaxL);
#     203                 :            : 
#     204                 :          2 :     unsigned char TmpArray[32];
#     205         [ +  + ]:         66 :     for (unsigned int i = 0; i < 32; ++i) { TmpArray[i] = uint8_t(~R1Array[i]); }
#     206                 :          2 :     BOOST_CHECK(arith_uint256V(std::vector<unsigned char>(TmpArray,TmpArray+32)) == (~R1L));
#     207                 :            : 
#     208                 :          2 :     BOOST_CHECK(-ZeroL == ZeroL);
#     209                 :          2 :     BOOST_CHECK(-R1L == (~R1L)+1);
#     210         [ +  + ]:        514 :     for (unsigned int i = 0; i < 256; ++i)
#     211                 :        512 :         BOOST_CHECK(-(OneL<<i) == (MaxL << i));
#     212                 :          2 : }
#     213                 :            : 
#     214                 :            : 
#     215                 :            : // Check if doing _A_ _OP_ _B_ results in the same as applying _OP_ onto each
#     216                 :            : // element of Aarray and Barray, and then converting the result into an arith_uint256.
#     217                 :            : #define CHECKBITWISEOPERATOR(_A_,_B_,_OP_)                              \
#     218                 :       1386 :     for (unsigned int i = 0; i < 32; ++i) { TmpArray[i] = uint8_t(_A_##Array[i] _OP_ _B_##Array[i]); } \
#     219                 :         42 :     BOOST_CHECK(arith_uint256V(std::vector<unsigned char>(TmpArray,TmpArray+32)) == (_A_##L _OP_ _B_##L));
#     220                 :            : 
#     221                 :            : #define CHECKASSIGNMENTOPERATOR(_A_,_B_,_OP_)                           \
#     222                 :         30 :     TmpL = _A_##L; TmpL _OP_##= _B_##L; BOOST_CHECK(TmpL == (_A_##L _OP_ _B_##L));
#     223                 :            : 
#     224                 :            : BOOST_AUTO_TEST_CASE( bitwiseOperators )
#     225                 :          2 : {
#     226                 :          2 :     unsigned char TmpArray[32];
#     227                 :            : 
#     228         [ +  + ]:          2 :     CHECKBITWISEOPERATOR(R1,R2,|)
#     229         [ +  + ]:          2 :     CHECKBITWISEOPERATOR(R1,R2,^)
#     230         [ +  + ]:          2 :     CHECKBITWISEOPERATOR(R1,R2,&)
#     231         [ +  + ]:          2 :     CHECKBITWISEOPERATOR(R1,Zero,|)
#     232         [ +  + ]:          2 :     CHECKBITWISEOPERATOR(R1,Zero,^)
#     233         [ +  + ]:          2 :     CHECKBITWISEOPERATOR(R1,Zero,&)
#     234         [ +  + ]:          2 :     CHECKBITWISEOPERATOR(R1,Max,|)
#     235         [ +  + ]:          2 :     CHECKBITWISEOPERATOR(R1,Max,^)
#     236         [ +  + ]:          2 :     CHECKBITWISEOPERATOR(R1,Max,&)
#     237         [ +  + ]:          2 :     CHECKBITWISEOPERATOR(Zero,R1,|)
#     238         [ +  + ]:          2 :     CHECKBITWISEOPERATOR(Zero,R1,^)
#     239         [ +  + ]:          2 :     CHECKBITWISEOPERATOR(Zero,R1,&)
#     240         [ +  + ]:          2 :     CHECKBITWISEOPERATOR(Max,R1,|)
#     241         [ +  + ]:          2 :     CHECKBITWISEOPERATOR(Max,R1,^)
#     242         [ +  + ]:          2 :     CHECKBITWISEOPERATOR(Max,R1,&)
#     243                 :            : 
#     244                 :          2 :     arith_uint256 TmpL;
#     245                 :          2 :     CHECKASSIGNMENTOPERATOR(R1,R2,|)
#     246                 :          2 :     CHECKASSIGNMENTOPERATOR(R1,R2,^)
#     247                 :          2 :     CHECKASSIGNMENTOPERATOR(R1,R2,&)
#     248                 :          2 :     CHECKASSIGNMENTOPERATOR(R1,Zero,|)
#     249                 :          2 :     CHECKASSIGNMENTOPERATOR(R1,Zero,^)
#     250                 :          2 :     CHECKASSIGNMENTOPERATOR(R1,Zero,&)
#     251                 :          2 :     CHECKASSIGNMENTOPERATOR(R1,Max,|)
#     252                 :          2 :     CHECKASSIGNMENTOPERATOR(R1,Max,^)
#     253                 :          2 :     CHECKASSIGNMENTOPERATOR(R1,Max,&)
#     254                 :          2 :     CHECKASSIGNMENTOPERATOR(Zero,R1,|)
#     255                 :          2 :     CHECKASSIGNMENTOPERATOR(Zero,R1,^)
#     256                 :          2 :     CHECKASSIGNMENTOPERATOR(Zero,R1,&)
#     257                 :          2 :     CHECKASSIGNMENTOPERATOR(Max,R1,|)
#     258                 :          2 :     CHECKASSIGNMENTOPERATOR(Max,R1,^)
#     259                 :          2 :     CHECKASSIGNMENTOPERATOR(Max,R1,&)
#     260                 :            : 
#     261                 :          2 :     uint64_t Tmp64 = 0xe1db685c9a0b47a2ULL;
#     262                 :          2 :     TmpL = R1L; TmpL |= Tmp64;  BOOST_CHECK(TmpL == (R1L | arith_uint256(Tmp64)));
#     263                 :          2 :     TmpL = R1L; TmpL |= 0; BOOST_CHECK(TmpL == R1L);
#     264                 :          2 :     TmpL ^= 0; BOOST_CHECK(TmpL == R1L);
#     265                 :          2 :     TmpL ^= Tmp64;  BOOST_CHECK(TmpL == (R1L ^ arith_uint256(Tmp64)));
#     266                 :          2 : }
#     267                 :            : 
#     268                 :            : BOOST_AUTO_TEST_CASE( comparison ) // <= >= < >
#     269                 :          2 : {
#     270                 :          2 :     arith_uint256 TmpL;
#     271         [ +  + ]:        514 :     for (unsigned int i = 0; i < 256; ++i) {
#     272                 :        512 :         TmpL= OneL<< i;
#     273                 :        512 :         BOOST_CHECK( TmpL >= ZeroL && TmpL > ZeroL && ZeroL < TmpL && ZeroL <= TmpL);
#     274                 :        512 :         BOOST_CHECK( TmpL >= 0 && TmpL > 0 && 0 < TmpL && 0 <= TmpL);
#     275                 :        512 :         TmpL |= R1L;
#     276                 :        512 :         BOOST_CHECK( TmpL >= R1L ); BOOST_CHECK( (TmpL == R1L) != (TmpL > R1L)); BOOST_CHECK( (TmpL == R1L) || !( TmpL <= R1L));
#     277                 :        512 :         BOOST_CHECK( R1L <= TmpL ); BOOST_CHECK( (R1L == TmpL) != (R1L < TmpL)); BOOST_CHECK( (TmpL == R1L) || !( R1L >= TmpL));
#     278                 :        512 :         BOOST_CHECK(! (TmpL < R1L)); BOOST_CHECK(! (R1L > TmpL));
#     279                 :        512 :     }
#     280                 :          2 : }
#     281                 :            : 
#     282                 :            : BOOST_AUTO_TEST_CASE( plusMinus )
#     283                 :          2 : {
#     284                 :          2 :     arith_uint256 TmpL = 0;
#     285                 :          2 :     BOOST_CHECK(R1L+R2L == arith_uint256(R1LplusR2L));
#     286                 :          2 :     TmpL += R1L;
#     287                 :          2 :     BOOST_CHECK(TmpL == R1L);
#     288                 :          2 :     TmpL += R2L;
#     289                 :          2 :     BOOST_CHECK(TmpL == R1L + R2L);
#     290                 :          2 :     BOOST_CHECK(OneL+MaxL == ZeroL);
#     291                 :          2 :     BOOST_CHECK(MaxL+OneL == ZeroL);
#     292         [ +  + ]:        512 :     for (unsigned int i = 1; i < 256; ++i) {
#     293                 :        510 :         BOOST_CHECK( (MaxL >> i) + OneL == (HalfL >> (i-1)) );
#     294                 :        510 :         BOOST_CHECK( OneL + (MaxL >> i) == (HalfL >> (i-1)) );
#     295                 :        510 :         TmpL = (MaxL>>i); TmpL += OneL;
#     296                 :        510 :         BOOST_CHECK( TmpL == (HalfL >> (i-1)) );
#     297                 :        510 :         TmpL = (MaxL>>i); TmpL += 1;
#     298                 :        510 :         BOOST_CHECK( TmpL == (HalfL >> (i-1)) );
#     299                 :        510 :         TmpL = (MaxL>>i);
#     300                 :        510 :         BOOST_CHECK( TmpL++ == (MaxL>>i) );
#     301                 :        510 :         BOOST_CHECK( TmpL == (HalfL >> (i-1)));
#     302                 :        510 :     }
#     303                 :          2 :     BOOST_CHECK(arith_uint256(0xbedc77e27940a7ULL) + 0xee8d836fce66fbULL == arith_uint256(0xbedc77e27940a7ULL + 0xee8d836fce66fbULL));
#     304                 :          2 :     TmpL = arith_uint256(0xbedc77e27940a7ULL); TmpL += 0xee8d836fce66fbULL;
#     305                 :          2 :     BOOST_CHECK(TmpL == arith_uint256(0xbedc77e27940a7ULL+0xee8d836fce66fbULL));
#     306                 :          2 :     TmpL -= 0xee8d836fce66fbULL;  BOOST_CHECK(TmpL == 0xbedc77e27940a7ULL);
#     307                 :          2 :     TmpL = R1L;
#     308                 :          2 :     BOOST_CHECK(++TmpL == R1L+1);
#     309                 :            : 
#     310                 :          2 :     BOOST_CHECK(R1L -(-R2L) == R1L+R2L);
#     311                 :          2 :     BOOST_CHECK(R1L -(-OneL) == R1L+OneL);
#     312                 :          2 :     BOOST_CHECK(R1L - OneL == R1L+(-OneL));
#     313         [ +  + ]:        512 :     for (unsigned int i = 1; i < 256; ++i) {
#     314                 :        510 :         BOOST_CHECK((MaxL>>i) - (-OneL)  == (HalfL >> (i-1)));
#     315                 :        510 :         BOOST_CHECK((HalfL >> (i-1)) - OneL == (MaxL>>i));
#     316                 :        510 :         TmpL = (HalfL >> (i-1));
#     317                 :        510 :         BOOST_CHECK(TmpL-- == (HalfL >> (i-1)));
#     318                 :        510 :         BOOST_CHECK(TmpL == (MaxL >> i));
#     319                 :        510 :         TmpL = (HalfL >> (i-1));
#     320                 :        510 :         BOOST_CHECK(--TmpL == (MaxL >> i));
#     321                 :        510 :     }
#     322                 :          2 :     TmpL = R1L;
#     323                 :          2 :     BOOST_CHECK(--TmpL == R1L-1);
#     324                 :          2 : }
#     325                 :            : 
#     326                 :            : BOOST_AUTO_TEST_CASE( multiply )
#     327                 :          2 : {
#     328                 :          2 :     BOOST_CHECK((R1L * R1L).ToString() == "62a38c0486f01e45879d7910a7761bf30d5237e9873f9bff3642a732c4d84f10");
#     329                 :          2 :     BOOST_CHECK((R1L * R2L).ToString() == "de37805e9986996cfba76ff6ba51c008df851987d9dd323f0e5de07760529c40");
#     330                 :          2 :     BOOST_CHECK((R1L * ZeroL) == ZeroL);
#     331                 :          2 :     BOOST_CHECK((R1L * OneL) == R1L);
#     332                 :          2 :     BOOST_CHECK((R1L * MaxL) == -R1L);
#     333                 :          2 :     BOOST_CHECK((R2L * R1L) == (R1L * R2L));
#     334                 :          2 :     BOOST_CHECK((R2L * R2L).ToString() == "ac8c010096767d3cae5005dec28bb2b45a1d85ab7996ccd3e102a650f74ff100");
#     335                 :          2 :     BOOST_CHECK((R2L * ZeroL) == ZeroL);
#     336                 :          2 :     BOOST_CHECK((R2L * OneL) == R2L);
#     337                 :          2 :     BOOST_CHECK((R2L * MaxL) == -R2L);
#     338                 :            : 
#     339                 :          2 :     BOOST_CHECK(MaxL * MaxL == OneL);
#     340                 :            : 
#     341                 :          2 :     BOOST_CHECK((R1L * 0) == 0);
#     342                 :          2 :     BOOST_CHECK((R1L * 1) == R1L);
#     343                 :          2 :     BOOST_CHECK((R1L * 3).ToString() == "7759b1c0ed14047f961ad09b20ff83687876a0181a367b813634046f91def7d4");
#     344                 :          2 :     BOOST_CHECK((R2L * 0x87654321UL).ToString() == "23f7816e30c4ae2017257b7a0fa64d60402f5234d46e746b61c960d09a26d070");
#     345                 :          2 : }
#     346                 :            : 
#     347                 :            : BOOST_AUTO_TEST_CASE( divide )
#     348                 :          2 : {
#     349                 :          2 :     arith_uint256 D1L("AD7133AC1977FA2B7");
#     350                 :          2 :     arith_uint256 D2L("ECD751716");
#     351                 :          2 :     BOOST_CHECK((R1L / D1L).ToString() == "00000000000000000b8ac01106981635d9ed112290f8895545a7654dde28fb3a");
#     352                 :          2 :     BOOST_CHECK((R1L / D2L).ToString() == "000000000873ce8efec5b67150bad3aa8c5fcb70e947586153bf2cec7c37c57a");
#     353                 :          2 :     BOOST_CHECK(R1L / OneL == R1L);
#     354                 :          2 :     BOOST_CHECK(R1L / MaxL == ZeroL);
#     355                 :          2 :     BOOST_CHECK(MaxL / R1L == 2);
#     356                 :          2 :     BOOST_CHECK_THROW(R1L / ZeroL, uint_error);
#     357                 :          2 :     BOOST_CHECK((R2L / D1L).ToString() == "000000000000000013e1665895a1cc981de6d93670105a6b3ec3b73141b3a3c5");
#     358                 :          2 :     BOOST_CHECK((R2L / D2L).ToString() == "000000000e8f0abe753bb0afe2e9437ee85d280be60882cf0bd1aaf7fa3cc2c4");
#     359                 :          2 :     BOOST_CHECK(R2L / OneL == R2L);
#     360                 :          2 :     BOOST_CHECK(R2L / MaxL == ZeroL);
#     361                 :          2 :     BOOST_CHECK(MaxL / R2L == 1);
#     362                 :          2 :     BOOST_CHECK_THROW(R2L / ZeroL, uint_error);
#     363                 :          2 : }
#     364                 :            : 
#     365                 :            : 
#     366                 :            : static bool almostEqual(double d1, double d2)
#     367                 :        406 : {
#     368                 :        406 :     return fabs(d1-d2) <= 4*fabs(d1)*std::numeric_limits<double>::epsilon();
#     369                 :        406 : }
#     370                 :            : 
#     371                 :            : BOOST_AUTO_TEST_CASE( methods ) // GetHex SetHex size() GetLow64 GetSerializeSize, Serialize, Unserialize
#     372                 :          2 : {
#     373                 :          2 :     BOOST_CHECK(R1L.GetHex() == R1L.ToString());
#     374                 :          2 :     BOOST_CHECK(R2L.GetHex() == R2L.ToString());
#     375                 :          2 :     BOOST_CHECK(OneL.GetHex() == OneL.ToString());
#     376                 :          2 :     BOOST_CHECK(MaxL.GetHex() == MaxL.ToString());
#     377                 :          2 :     arith_uint256 TmpL(R1L);
#     378                 :          2 :     BOOST_CHECK(TmpL == R1L);
#     379                 :          2 :     TmpL.SetHex(R2L.ToString());   BOOST_CHECK(TmpL == R2L);
#     380                 :          2 :     TmpL.SetHex(ZeroL.ToString()); BOOST_CHECK(TmpL == 0);
#     381                 :          2 :     TmpL.SetHex(HalfL.ToString()); BOOST_CHECK(TmpL == HalfL);
#     382                 :            : 
#     383                 :          2 :     TmpL.SetHex(R1L.ToString());
#     384                 :          2 :     BOOST_CHECK(R1L.size() == 32);
#     385                 :          2 :     BOOST_CHECK(R2L.size() == 32);
#     386                 :          2 :     BOOST_CHECK(ZeroL.size() == 32);
#     387                 :          2 :     BOOST_CHECK(MaxL.size() == 32);
#     388                 :          2 :     BOOST_CHECK(R1L.GetLow64()  == R1LLow64);
#     389                 :          2 :     BOOST_CHECK(HalfL.GetLow64() ==0x0000000000000000ULL);
#     390                 :          2 :     BOOST_CHECK(OneL.GetLow64() ==0x0000000000000001ULL);
#     391                 :            : 
#     392         [ +  + ]:        512 :     for (unsigned int i = 0; i < 255; ++i)
#     393                 :        510 :     {
#     394                 :        510 :         BOOST_CHECK((OneL << i).getdouble() == ldexp(1.0,i));
#     395                 :        510 :     }
#     396                 :          2 :     BOOST_CHECK(ZeroL.getdouble() == 0.0);
#     397         [ +  + ]:        408 :     for (int i = 256; i > 53; --i)
#     398                 :        406 :         BOOST_CHECK(almostEqual((R1L>>(256-i)).getdouble(), ldexp(R1Ldouble,i)));
#     399                 :          2 :     uint64_t R1L64part = (R1L>>192).GetLow64();
#     400         [ +  + ]:        108 :     for (int i = 53; i > 0; --i) // doubles can store all integers in {0,...,2^54-1} exactly
#     401                 :        106 :     {
#     402                 :        106 :         BOOST_CHECK((R1L>>(256-i)).getdouble() == (double)(R1L64part >> (64-i)));
#     403                 :        106 :     }
#     404                 :          2 : }
#     405                 :            : 
#     406                 :            : BOOST_AUTO_TEST_CASE(bignum_SetCompact)
#     407                 :          2 : {
#     408                 :          2 :     arith_uint256 num;
#     409                 :          2 :     bool fNegative;
#     410                 :          2 :     bool fOverflow;
#     411                 :          2 :     num.SetCompact(0, &fNegative, &fOverflow);
#     412                 :          2 :     BOOST_CHECK_EQUAL(num.GetHex(), "0000000000000000000000000000000000000000000000000000000000000000");
#     413                 :          2 :     BOOST_CHECK_EQUAL(num.GetCompact(), 0U);
#     414                 :          2 :     BOOST_CHECK_EQUAL(fNegative, false);
#     415                 :          2 :     BOOST_CHECK_EQUAL(fOverflow, false);
#     416                 :            : 
#     417                 :          2 :     num.SetCompact(0x00123456, &fNegative, &fOverflow);
#     418                 :          2 :     BOOST_CHECK_EQUAL(num.GetHex(), "0000000000000000000000000000000000000000000000000000000000000000");
#     419                 :          2 :     BOOST_CHECK_EQUAL(num.GetCompact(), 0U);
#     420                 :          2 :     BOOST_CHECK_EQUAL(fNegative, false);
#     421                 :          2 :     BOOST_CHECK_EQUAL(fOverflow, false);
#     422                 :            : 
#     423                 :          2 :     num.SetCompact(0x01003456, &fNegative, &fOverflow);
#     424                 :          2 :     BOOST_CHECK_EQUAL(num.GetHex(), "0000000000000000000000000000000000000000000000000000000000000000");
#     425                 :          2 :     BOOST_CHECK_EQUAL(num.GetCompact(), 0U);
#     426                 :          2 :     BOOST_CHECK_EQUAL(fNegative, false);
#     427                 :          2 :     BOOST_CHECK_EQUAL(fOverflow, false);
#     428                 :            : 
#     429                 :          2 :     num.SetCompact(0x02000056, &fNegative, &fOverflow);
#     430                 :          2 :     BOOST_CHECK_EQUAL(num.GetHex(), "0000000000000000000000000000000000000000000000000000000000000000");
#     431                 :          2 :     BOOST_CHECK_EQUAL(num.GetCompact(), 0U);
#     432                 :          2 :     BOOST_CHECK_EQUAL(fNegative, false);
#     433                 :          2 :     BOOST_CHECK_EQUAL(fOverflow, false);
#     434                 :            : 
#     435                 :          2 :     num.SetCompact(0x03000000, &fNegative, &fOverflow);
#     436                 :          2 :     BOOST_CHECK_EQUAL(num.GetHex(), "0000000000000000000000000000000000000000000000000000000000000000");
#     437                 :          2 :     BOOST_CHECK_EQUAL(num.GetCompact(), 0U);
#     438                 :          2 :     BOOST_CHECK_EQUAL(fNegative, false);
#     439                 :          2 :     BOOST_CHECK_EQUAL(fOverflow, false);
#     440                 :            : 
#     441                 :          2 :     num.SetCompact(0x04000000, &fNegative, &fOverflow);
#     442                 :          2 :     BOOST_CHECK_EQUAL(num.GetHex(), "0000000000000000000000000000000000000000000000000000000000000000");
#     443                 :          2 :     BOOST_CHECK_EQUAL(num.GetCompact(), 0U);
#     444                 :          2 :     BOOST_CHECK_EQUAL(fNegative, false);
#     445                 :          2 :     BOOST_CHECK_EQUAL(fOverflow, false);
#     446                 :            : 
#     447                 :          2 :     num.SetCompact(0x00923456, &fNegative, &fOverflow);
#     448                 :          2 :     BOOST_CHECK_EQUAL(num.GetHex(), "0000000000000000000000000000000000000000000000000000000000000000");
#     449                 :          2 :     BOOST_CHECK_EQUAL(num.GetCompact(), 0U);
#     450                 :          2 :     BOOST_CHECK_EQUAL(fNegative, false);
#     451                 :          2 :     BOOST_CHECK_EQUAL(fOverflow, false);
#     452                 :            : 
#     453                 :          2 :     num.SetCompact(0x01803456, &fNegative, &fOverflow);
#     454                 :          2 :     BOOST_CHECK_EQUAL(num.GetHex(), "0000000000000000000000000000000000000000000000000000000000000000");
#     455                 :          2 :     BOOST_CHECK_EQUAL(num.GetCompact(), 0U);
#     456                 :          2 :     BOOST_CHECK_EQUAL(fNegative, false);
#     457                 :          2 :     BOOST_CHECK_EQUAL(fOverflow, false);
#     458                 :            : 
#     459                 :          2 :     num.SetCompact(0x02800056, &fNegative, &fOverflow);
#     460                 :          2 :     BOOST_CHECK_EQUAL(num.GetHex(), "0000000000000000000000000000000000000000000000000000000000000000");
#     461                 :          2 :     BOOST_CHECK_EQUAL(num.GetCompact(), 0U);
#     462                 :          2 :     BOOST_CHECK_EQUAL(fNegative, false);
#     463                 :          2 :     BOOST_CHECK_EQUAL(fOverflow, false);
#     464                 :            : 
#     465                 :          2 :     num.SetCompact(0x03800000, &fNegative, &fOverflow);
#     466                 :          2 :     BOOST_CHECK_EQUAL(num.GetHex(), "0000000000000000000000000000000000000000000000000000000000000000");
#     467                 :          2 :     BOOST_CHECK_EQUAL(num.GetCompact(), 0U);
#     468                 :          2 :     BOOST_CHECK_EQUAL(fNegative, false);
#     469                 :          2 :     BOOST_CHECK_EQUAL(fOverflow, false);
#     470                 :            : 
#     471                 :          2 :     num.SetCompact(0x04800000, &fNegative, &fOverflow);
#     472                 :          2 :     BOOST_CHECK_EQUAL(num.GetHex(), "0000000000000000000000000000000000000000000000000000000000000000");
#     473                 :          2 :     BOOST_CHECK_EQUAL(num.GetCompact(), 0U);
#     474                 :          2 :     BOOST_CHECK_EQUAL(fNegative, false);
#     475                 :          2 :     BOOST_CHECK_EQUAL(fOverflow, false);
#     476                 :            : 
#     477                 :          2 :     num.SetCompact(0x01123456, &fNegative, &fOverflow);
#     478                 :          2 :     BOOST_CHECK_EQUAL(num.GetHex(), "0000000000000000000000000000000000000000000000000000000000000012");
#     479                 :          2 :     BOOST_CHECK_EQUAL(num.GetCompact(), 0x01120000U);
#     480                 :          2 :     BOOST_CHECK_EQUAL(fNegative, false);
#     481                 :          2 :     BOOST_CHECK_EQUAL(fOverflow, false);
#     482                 :            : 
#     483                 :            :     // Make sure that we don't generate compacts with the 0x00800000 bit set
#     484                 :          2 :     num = 0x80;
#     485                 :          2 :     BOOST_CHECK_EQUAL(num.GetCompact(), 0x02008000U);
#     486                 :            : 
#     487                 :          2 :     num.SetCompact(0x01fedcba, &fNegative, &fOverflow);
#     488                 :          2 :     BOOST_CHECK_EQUAL(num.GetHex(), "000000000000000000000000000000000000000000000000000000000000007e");
#     489                 :          2 :     BOOST_CHECK_EQUAL(num.GetCompact(true), 0x01fe0000U);
#     490                 :          2 :     BOOST_CHECK_EQUAL(fNegative, true);
#     491                 :          2 :     BOOST_CHECK_EQUAL(fOverflow, false);
#     492                 :            : 
#     493                 :          2 :     num.SetCompact(0x02123456, &fNegative, &fOverflow);
#     494                 :          2 :     BOOST_CHECK_EQUAL(num.GetHex(), "0000000000000000000000000000000000000000000000000000000000001234");
#     495                 :          2 :     BOOST_CHECK_EQUAL(num.GetCompact(), 0x02123400U);
#     496                 :          2 :     BOOST_CHECK_EQUAL(fNegative, false);
#     497                 :          2 :     BOOST_CHECK_EQUAL(fOverflow, false);
#     498                 :            : 
#     499                 :          2 :     num.SetCompact(0x03123456, &fNegative, &fOverflow);
#     500                 :          2 :     BOOST_CHECK_EQUAL(num.GetHex(), "0000000000000000000000000000000000000000000000000000000000123456");
#     501                 :          2 :     BOOST_CHECK_EQUAL(num.GetCompact(), 0x03123456U);
#     502                 :          2 :     BOOST_CHECK_EQUAL(fNegative, false);
#     503                 :          2 :     BOOST_CHECK_EQUAL(fOverflow, false);
#     504                 :            : 
#     505                 :          2 :     num.SetCompact(0x04123456, &fNegative, &fOverflow);
#     506                 :          2 :     BOOST_CHECK_EQUAL(num.GetHex(), "0000000000000000000000000000000000000000000000000000000012345600");
#     507                 :          2 :     BOOST_CHECK_EQUAL(num.GetCompact(), 0x04123456U);
#     508                 :          2 :     BOOST_CHECK_EQUAL(fNegative, false);
#     509                 :          2 :     BOOST_CHECK_EQUAL(fOverflow, false);
#     510                 :            : 
#     511                 :          2 :     num.SetCompact(0x04923456, &fNegative, &fOverflow);
#     512                 :          2 :     BOOST_CHECK_EQUAL(num.GetHex(), "0000000000000000000000000000000000000000000000000000000012345600");
#     513                 :          2 :     BOOST_CHECK_EQUAL(num.GetCompact(true), 0x04923456U);
#     514                 :          2 :     BOOST_CHECK_EQUAL(fNegative, true);
#     515                 :          2 :     BOOST_CHECK_EQUAL(fOverflow, false);
#     516                 :            : 
#     517                 :          2 :     num.SetCompact(0x05009234, &fNegative, &fOverflow);
#     518                 :          2 :     BOOST_CHECK_EQUAL(num.GetHex(), "0000000000000000000000000000000000000000000000000000000092340000");
#     519                 :          2 :     BOOST_CHECK_EQUAL(num.GetCompact(), 0x05009234U);
#     520                 :          2 :     BOOST_CHECK_EQUAL(fNegative, false);
#     521                 :          2 :     BOOST_CHECK_EQUAL(fOverflow, false);
#     522                 :            : 
#     523                 :          2 :     num.SetCompact(0x20123456, &fNegative, &fOverflow);
#     524                 :          2 :     BOOST_CHECK_EQUAL(num.GetHex(), "1234560000000000000000000000000000000000000000000000000000000000");
#     525                 :          2 :     BOOST_CHECK_EQUAL(num.GetCompact(), 0x20123456U);
#     526                 :          2 :     BOOST_CHECK_EQUAL(fNegative, false);
#     527                 :          2 :     BOOST_CHECK_EQUAL(fOverflow, false);
#     528                 :            : 
#     529                 :          2 :     num.SetCompact(0xff123456, &fNegative, &fOverflow);
#     530                 :          2 :     BOOST_CHECK_EQUAL(fNegative, false);
#     531                 :          2 :     BOOST_CHECK_EQUAL(fOverflow, true);
#     532                 :          2 : }
#     533                 :            : 
#     534                 :            : 
#     535                 :            : BOOST_AUTO_TEST_CASE( getmaxcoverage ) // some more tests just to get 100% coverage
#     536                 :          2 : {
#     537                 :            :     // ~R1L give a base_uint<256>
#     538                 :          2 :     BOOST_CHECK((~~R1L >> 10) == (R1L >> 10));
#     539                 :          2 :     BOOST_CHECK((~~R1L << 10) == (R1L << 10));
#     540                 :          2 :     BOOST_CHECK(!(~~R1L < R1L));
#     541                 :          2 :     BOOST_CHECK(~~R1L <= R1L);
#     542                 :          2 :     BOOST_CHECK(!(~~R1L > R1L));
#     543                 :          2 :     BOOST_CHECK(~~R1L >= R1L);
#     544                 :          2 :     BOOST_CHECK(!(R1L < ~~R1L));
#     545                 :          2 :     BOOST_CHECK(R1L <= ~~R1L);
#     546                 :          2 :     BOOST_CHECK(!(R1L > ~~R1L));
#     547                 :          2 :     BOOST_CHECK(R1L >= ~~R1L);
#     548                 :            : 
#     549                 :          2 :     BOOST_CHECK(~~R1L + R2L == R1L + ~~R2L);
#     550                 :          2 :     BOOST_CHECK(~~R1L - R2L == R1L - ~~R2L);
#     551                 :          2 :     BOOST_CHECK(~R1L != R1L); BOOST_CHECK(R1L != ~R1L);
#     552                 :          2 :     unsigned char TmpArray[32];
#     553         [ +  + ]:          2 :     CHECKBITWISEOPERATOR(~R1,R2,|)
#     554         [ +  + ]:          2 :     CHECKBITWISEOPERATOR(~R1,R2,^)
#     555         [ +  + ]:          2 :     CHECKBITWISEOPERATOR(~R1,R2,&)
#     556         [ +  + ]:          2 :     CHECKBITWISEOPERATOR(R1,~R2,|)
#     557         [ +  + ]:          2 :     CHECKBITWISEOPERATOR(R1,~R2,^)
#     558         [ +  + ]:          2 :     CHECKBITWISEOPERATOR(R1,~R2,&)
#     559                 :          2 : }
#     560                 :            : 
#     561                 :            : BOOST_AUTO_TEST_SUITE_END()

Generated by: LCOV version 0-eol-96201-ge66f56f4af6a