1 // Copyright (c) 2012-2014 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.
6 #include "script/script.h"
7 #include "test/test_bitcoin.h"
9 #include <boost/test/unit_test.hpp>
13 BOOST_FIXTURE_TEST_SUITE(scriptnum_tests
, BasicTestingSetup
)
15 static const int64_t values
[] = \
16 { 0, 1, CHAR_MIN
, CHAR_MAX
, UCHAR_MAX
, SHRT_MIN
, USHRT_MAX
, INT_MIN
, INT_MAX
, UINT_MAX
, LONG_MIN
, LONG_MAX
};
17 static const int64_t offsets
[] = { 1, 0x79, 0x80, 0x81, 0xFF, 0x7FFF, 0x8000, 0xFFFF, 0x10000};
19 static bool verify(const CBigNum
& bignum
, const CScriptNum
& scriptnum
)
21 return bignum
.getvch() == scriptnum
.getvch() && bignum
.getint() == scriptnum
.getint();
24 static void CheckCreateVch(const int64_t& num
)
27 CScriptNum
scriptnum(num
);
28 BOOST_CHECK(verify(bignum
, scriptnum
));
30 CBigNum
bignum2(bignum
.getvch());
31 CScriptNum
scriptnum2(scriptnum
.getvch(), false);
32 BOOST_CHECK(verify(bignum2
, scriptnum2
));
34 CBigNum
bignum3(scriptnum2
.getvch());
35 CScriptNum
scriptnum3(bignum2
.getvch(), false);
36 BOOST_CHECK(verify(bignum3
, scriptnum3
));
39 static void CheckCreateInt(const int64_t& num
)
42 CScriptNum
scriptnum(num
);
43 BOOST_CHECK(verify(bignum
, scriptnum
));
44 BOOST_CHECK(verify(bignum
.getint(), CScriptNum(scriptnum
.getint())));
45 BOOST_CHECK(verify(scriptnum
.getint(), CScriptNum(bignum
.getint())));
46 BOOST_CHECK(verify(CBigNum(scriptnum
.getint()).getint(), CScriptNum(CScriptNum(bignum
.getint()).getint())));
50 static void CheckAdd(const int64_t& num1
, const int64_t& num2
)
52 const CBigNum
bignum1(num1
);
53 const CBigNum
bignum2(num2
);
54 const CScriptNum
scriptnum1(num1
);
55 const CScriptNum
scriptnum2(num2
);
56 CBigNum
bignum3(num1
);
57 CBigNum
bignum4(num1
);
58 CScriptNum
scriptnum3(num1
);
59 CScriptNum
scriptnum4(num1
);
61 // int64_t overflow is undefined.
62 bool invalid
= (((num2
> 0) && (num1
> (std::numeric_limits
<int64_t>::max() - num2
))) ||
63 ((num2
< 0) && (num1
< (std::numeric_limits
<int64_t>::min() - num2
))));
66 BOOST_CHECK(verify(bignum1
+ bignum2
, scriptnum1
+ scriptnum2
));
67 BOOST_CHECK(verify(bignum1
+ bignum2
, scriptnum1
+ num2
));
68 BOOST_CHECK(verify(bignum1
+ bignum2
, scriptnum2
+ num1
));
72 static void CheckNegate(const int64_t& num
)
74 const CBigNum
bignum(num
);
75 const CScriptNum
scriptnum(num
);
77 // -INT64_MIN is undefined
78 if (num
!= std::numeric_limits
<int64_t>::min())
79 BOOST_CHECK(verify(-bignum
, -scriptnum
));
82 static void CheckSubtract(const int64_t& num1
, const int64_t& num2
)
84 const CBigNum
bignum1(num1
);
85 const CBigNum
bignum2(num2
);
86 const CScriptNum
scriptnum1(num1
);
87 const CScriptNum
scriptnum2(num2
);
90 // int64_t overflow is undefined.
91 invalid
= ((num2
> 0 && num1
< std::numeric_limits
<int64_t>::min() + num2
) ||
92 (num2
< 0 && num1
> std::numeric_limits
<int64_t>::max() + num2
));
95 BOOST_CHECK(verify(bignum1
- bignum2
, scriptnum1
- scriptnum2
));
96 BOOST_CHECK(verify(bignum1
- bignum2
, scriptnum1
- num2
));
99 invalid
= ((num1
> 0 && num2
< std::numeric_limits
<int64_t>::min() + num1
) ||
100 (num1
< 0 && num2
> std::numeric_limits
<int64_t>::max() + num1
));
103 BOOST_CHECK(verify(bignum2
- bignum1
, scriptnum2
- scriptnum1
));
104 BOOST_CHECK(verify(bignum2
- bignum1
, scriptnum2
- num1
));
108 static void CheckCompare(const int64_t& num1
, const int64_t& num2
)
110 const CBigNum
bignum1(num1
);
111 const CBigNum
bignum2(num2
);
112 const CScriptNum
scriptnum1(num1
);
113 const CScriptNum
scriptnum2(num2
);
115 BOOST_CHECK((bignum1
== bignum1
) == (scriptnum1
== scriptnum1
));
116 BOOST_CHECK((bignum1
!= bignum1
) == (scriptnum1
!= scriptnum1
));
117 BOOST_CHECK((bignum1
< bignum1
) == (scriptnum1
< scriptnum1
));
118 BOOST_CHECK((bignum1
> bignum1
) == (scriptnum1
> scriptnum1
));
119 BOOST_CHECK((bignum1
>= bignum1
) == (scriptnum1
>= scriptnum1
));
120 BOOST_CHECK((bignum1
<= bignum1
) == (scriptnum1
<= scriptnum1
));
122 BOOST_CHECK((bignum1
== bignum1
) == (scriptnum1
== num1
));
123 BOOST_CHECK((bignum1
!= bignum1
) == (scriptnum1
!= num1
));
124 BOOST_CHECK((bignum1
< bignum1
) == (scriptnum1
< num1
));
125 BOOST_CHECK((bignum1
> bignum1
) == (scriptnum1
> num1
));
126 BOOST_CHECK((bignum1
>= bignum1
) == (scriptnum1
>= num1
));
127 BOOST_CHECK((bignum1
<= bignum1
) == (scriptnum1
<= num1
));
129 BOOST_CHECK((bignum1
== bignum2
) == (scriptnum1
== scriptnum2
));
130 BOOST_CHECK((bignum1
!= bignum2
) == (scriptnum1
!= scriptnum2
));
131 BOOST_CHECK((bignum1
< bignum2
) == (scriptnum1
< scriptnum2
));
132 BOOST_CHECK((bignum1
> bignum2
) == (scriptnum1
> scriptnum2
));
133 BOOST_CHECK((bignum1
>= bignum2
) == (scriptnum1
>= scriptnum2
));
134 BOOST_CHECK((bignum1
<= bignum2
) == (scriptnum1
<= scriptnum2
));
136 BOOST_CHECK((bignum1
== bignum2
) == (scriptnum1
== num2
));
137 BOOST_CHECK((bignum1
!= bignum2
) == (scriptnum1
!= num2
));
138 BOOST_CHECK((bignum1
< bignum2
) == (scriptnum1
< num2
));
139 BOOST_CHECK((bignum1
> bignum2
) == (scriptnum1
> num2
));
140 BOOST_CHECK((bignum1
>= bignum2
) == (scriptnum1
>= num2
));
141 BOOST_CHECK((bignum1
<= bignum2
) == (scriptnum1
<= num2
));
144 static void RunCreate(const int64_t& num
)
147 CScriptNum
scriptnum(num
);
148 if (scriptnum
.getvch().size() <= CScriptNum::nDefaultMaxNumSize
)
152 BOOST_CHECK_THROW (CheckCreateVch(num
), scriptnum_error
);
156 static void RunOperators(const int64_t& num1
, const int64_t& num2
)
158 CheckAdd(num1
, num2
);
159 CheckSubtract(num1
, num2
);
161 CheckCompare(num1
, num2
);
164 BOOST_AUTO_TEST_CASE(creation
)
166 for(size_t i
= 0; i
< sizeof(values
) / sizeof(values
[0]); ++i
)
168 for(size_t j
= 0; j
< sizeof(offsets
) / sizeof(offsets
[0]); ++j
)
170 RunCreate(values
[i
]);
171 RunCreate(values
[i
] + offsets
[j
]);
172 RunCreate(values
[i
] - offsets
[j
]);
177 BOOST_AUTO_TEST_CASE(operators
)
179 for(size_t i
= 0; i
< sizeof(values
) / sizeof(values
[0]); ++i
)
181 for(size_t j
= 0; j
< sizeof(offsets
) / sizeof(offsets
[0]); ++j
)
183 RunOperators(values
[i
], values
[i
]);
184 RunOperators(values
[i
], -values
[i
]);
185 RunOperators(values
[i
], values
[j
]);
186 RunOperators(values
[i
], -values
[j
]);
187 RunOperators(values
[i
] + values
[j
], values
[j
]);
188 RunOperators(values
[i
] + values
[j
], -values
[j
]);
189 RunOperators(values
[i
] - values
[j
], values
[j
]);
190 RunOperators(values
[i
] - values
[j
], -values
[j
]);
191 RunOperators(values
[i
] + values
[j
], values
[i
] + values
[j
]);
192 RunOperators(values
[i
] + values
[j
], values
[i
] - values
[j
]);
193 RunOperators(values
[i
] - values
[j
], values
[i
] + values
[j
]);
194 RunOperators(values
[i
] - values
[j
], values
[i
] - values
[j
]);
199 BOOST_AUTO_TEST_SUITE_END()