PIVX Core  5.6.99
P2P Digital Currency
scriptnum_tests.cpp
Go to the documentation of this file.
1 // Copyright (c) 2012-2014 The Bitcoin Core developers
2 // Copyright (c) 2017-2019 The PIVX Core developers
3 // Distributed under the MIT/X11 software license, see the accompanying
4 // file COPYING or http://www.opensource.org/licenses/mit-license.php.
5 
6 #include "libzerocoin/bignum.h"
7 #include "script/script.h"
8 #include "test/test_pivx.h"
9 
10 #include <boost/test/unit_test.hpp>
11 #include <limits.h>
12 #include <stdint.h>
13 
15 
16 
18 static const int64_t values[] = { 0, 1, -2, 127, 128, -255, 256, (1LL << 15) - 1, -(1LL << 16), (1LL << 24) - 1, (1LL << 31), 1 - (1LL << 32), 1LL << 40 };
19 
20 static const int64_t offsets[] = { 1, 0x79, 0x80, 0x81, 0xFF, 0x7FFF, 0x8000, 0xFFFF, 0x10000};
21 
22 static bool verify(const CBigNum& bignum, const CScriptNum& scriptnum)
23 {
24  return bignum.getvch() == scriptnum.getvch() && bignum.getint() == scriptnum.getint();
25 }
26 
27 static void CheckCreateVch(const long& num)
28 {
29  CBigNum bignum(num);
30  CScriptNum scriptnum(num);
31  BOOST_CHECK(verify(bignum, scriptnum));
32 
33  CBigNum bignum2(bignum.getvch());
34  CScriptNum scriptnum2(scriptnum.getvch(), false);
35  BOOST_CHECK(verify(bignum2, scriptnum2));
36 
37  CBigNum bignum3(scriptnum2.getvch());
38  CScriptNum scriptnum3(bignum2.getvch(), false);
39  BOOST_CHECK(verify(bignum3, scriptnum3));
40 }
41 
42 static void CheckCreateInt(const long& num)
43 {
44  CBigNum bignum(num);
45  CScriptNum scriptnum(num);
46  BOOST_CHECK(verify(bignum, scriptnum));
47  BOOST_CHECK(verify(bignum.getint(), CScriptNum(scriptnum.getint())));
48  BOOST_CHECK(verify(scriptnum.getint(), CScriptNum(bignum.getint())));
49  BOOST_CHECK(verify(CBigNum(scriptnum.getint()).getint(), CScriptNum(CScriptNum(bignum.getint()).getint())));
50 }
51 
52 
53 static void CheckAdd(const long& num1, const long& num2)
54 {
55  const CBigNum bignum1(num1);
56  const CBigNum bignum2(num2);
57  const CScriptNum scriptnum1(num1);
58  const CScriptNum scriptnum2(num2);
59  CBigNum bignum3(num1);
60  CBigNum bignum4(num1);
61  CScriptNum scriptnum3(num1);
62  CScriptNum scriptnum4(num1);
63 
64  // int64_t overflow is undefined.
65  bool invalid = (((num2 > 0) && (num1 > (std::numeric_limits<long>::max() - num2))) ||
66  ((num2 < 0) && (num1 < (std::numeric_limits<long>::min() - num2))));
67  if (!invalid)
68  {
69  BOOST_CHECK(verify(bignum1 + bignum2, scriptnum1 + scriptnum2));
70  BOOST_CHECK(verify(bignum1 + bignum2, scriptnum1 + num2));
71  BOOST_CHECK(verify(bignum1 + bignum2, scriptnum2 + num1));
72  }
73 }
74 
75 static void CheckNegate(const long& num)
76 {
77  const CBigNum bignum(num);
78  const CScriptNum scriptnum(num);
79 
80  // -INT64_MIN is undefined
81  if (num != std::numeric_limits<long>::min())
82  BOOST_CHECK(verify(-bignum, -scriptnum));
83 }
84 
85 static void CheckSubtract(const long& num1, const long& num2)
86 {
87  const CBigNum bignum1(num1);
88  const CBigNum bignum2(num2);
89  const CScriptNum scriptnum1(num1);
90  const CScriptNum scriptnum2(num2);
91  bool invalid = false;
92 
93  // int64_t overflow is undefined.
94  invalid = ((num2 > 0 && num1 < std::numeric_limits<long>::min() + num2) ||
95  (num2 < 0 && num1 > std::numeric_limits<long>::max() + num2));
96  if (!invalid)
97  {
98  BOOST_CHECK(verify(bignum1 - bignum2, scriptnum1 - scriptnum2));
99  BOOST_CHECK(verify(bignum1 - bignum2, scriptnum1 - num2));
100  }
101 
102  invalid = ((num1 > 0 && num2 < std::numeric_limits<long>::min() + num1) ||
103  (num1 < 0 && num2 > std::numeric_limits<long>::max() + num1));
104  if (!invalid)
105  {
106  BOOST_CHECK(verify(bignum2 - bignum1, scriptnum2 - scriptnum1));
107  BOOST_CHECK(verify(bignum2 - bignum1, scriptnum2 - num1));
108  }
109 }
110 
111 static void CheckCompare(const long& num1, const long& num2)
112 {
113  const CBigNum bignum1(num1);
114  const CBigNum bignum2(num2);
115  const CScriptNum scriptnum1(num1);
116  const CScriptNum scriptnum2(num2);
117 
118  BOOST_CHECK((bignum1 == bignum1) == (scriptnum1 == scriptnum1));
119  BOOST_CHECK((bignum1 != bignum1) == (scriptnum1 != scriptnum1));
120  BOOST_CHECK((bignum1 < bignum1) == (scriptnum1 < scriptnum1));
121  BOOST_CHECK((bignum1 > bignum1) == (scriptnum1 > scriptnum1));
122  BOOST_CHECK((bignum1 >= bignum1) == (scriptnum1 >= scriptnum1));
123  BOOST_CHECK((bignum1 <= bignum1) == (scriptnum1 <= scriptnum1));
124 
125  BOOST_CHECK((bignum1 == bignum1) == (scriptnum1 == num1));
126  BOOST_CHECK((bignum1 != bignum1) == (scriptnum1 != num1));
127  BOOST_CHECK((bignum1 < bignum1) == (scriptnum1 < num1));
128  BOOST_CHECK((bignum1 > bignum1) == (scriptnum1 > num1));
129  BOOST_CHECK((bignum1 >= bignum1) == (scriptnum1 >= num1));
130  BOOST_CHECK((bignum1 <= bignum1) == (scriptnum1 <= num1));
131 
132  BOOST_CHECK((bignum1 == bignum2) == (scriptnum1 == scriptnum2));
133  BOOST_CHECK((bignum1 != bignum2) == (scriptnum1 != scriptnum2));
134  BOOST_CHECK((bignum1 < bignum2) == (scriptnum1 < scriptnum2));
135  BOOST_CHECK((bignum1 > bignum2) == (scriptnum1 > scriptnum2));
136  BOOST_CHECK((bignum1 >= bignum2) == (scriptnum1 >= scriptnum2));
137  BOOST_CHECK((bignum1 <= bignum2) == (scriptnum1 <= scriptnum2));
138 
139  BOOST_CHECK((bignum1 == bignum2) == (scriptnum1 == num2));
140  BOOST_CHECK((bignum1 != bignum2) == (scriptnum1 != num2));
141  BOOST_CHECK((bignum1 < bignum2) == (scriptnum1 < num2));
142  BOOST_CHECK((bignum1 > bignum2) == (scriptnum1 > num2));
143  BOOST_CHECK((bignum1 >= bignum2) == (scriptnum1 >= num2));
144  BOOST_CHECK((bignum1 <= bignum2) == (scriptnum1 <= num2));
145 }
146 
147 static void RunCreate(const long& num)
148 {
149  CheckCreateInt(num);
150  CScriptNum scriptnum(num);
151  if (scriptnum.getvch().size() <= CScriptNum::nDefaultMaxNumSize)
152  CheckCreateVch(num);
153  else
154  {
155  BOOST_CHECK_THROW (CheckCreateVch(num), scriptnum_error);
156  }
157 }
158 
159 static void RunOperators(const long& num1, const int64_t& num2)
160 {
161  CheckAdd(num1, num2);
162  CheckSubtract(num1, num2);
163  CheckNegate(num1);
164  CheckCompare(num1, num2);
165 }
166 
168 {
169  for(size_t i = 0; i < sizeof(values) / sizeof(values[0]); ++i)
170  {
171  for(size_t j = 0; j < sizeof(offsets) / sizeof(offsets[0]); ++j)
172  {
173  RunCreate(values[i]);
174  RunCreate(values[i] + offsets[j]);
175  RunCreate(values[i] - offsets[j]);
176  }
177  }
178 }
179 
181 {
182  for(size_t i = 0; i < sizeof(values) / sizeof(values[0]); ++i)
183  {
184  for(size_t j = 0; j < sizeof(offsets) / sizeof(offsets[0]); ++j)
185  {
186  RunOperators(values[i], values[i]);
187  RunOperators(values[i], -values[i]);
188  RunOperators(values[i], values[j]);
189  RunOperators(values[i], -values[j]);
190  RunOperators(values[i] + values[j], values[j]);
191  RunOperators(values[i] + values[j], -values[j]);
192  RunOperators(values[i] - values[j], values[j]);
193  RunOperators(values[i] - values[j], -values[j]);
194  RunOperators(values[i] + values[j], values[i] + values[j]);
195  RunOperators(values[i] + values[j], values[i] - values[j]);
196  RunOperators(values[i] - values[j], values[i] + values[j]);
197  RunOperators(values[i] - values[j], values[i] - values[j]);
198  }
199  }
200 }
201 
C++ wrapper for BIGNUM.
Definition: bignum.h:35
std::vector< unsigned char > getvch() const
Definition: bignum.cpp:139
int getint() const
Definition: bignum.cpp:98
static const size_t nDefaultMaxNumSize
Definition: script.h:224
int getint() const
Definition: script.h:303
std::vector< unsigned char > getvch() const
Definition: script.h:312
BOOST_AUTO_TEST_SUITE_END()
#define BOOST_CHECK_THROW(stmt, excMatch)
Definition: object.cpp:19
#define BOOST_FIXTURE_TEST_SUITE(a, b)
Definition: object.cpp:14
#define BOOST_CHECK(expr)
Definition: object.cpp:17
BOOST_AUTO_TEST_CASE(creation)
Basic testing setup.
Definition: test_pivx.h:51