Files
triangles_v5/src/test/bignum_tests.cpp
T
Ethan Clay e6ae48d4d7 security: harden wallet, bootstrap, consensus, and RPC
(cherry picked from commit bed3d72099e04813393561a535b7dec9c0ac5e7f)
2026-07-31 00:38:45 -07:00

75 lines
1.6 KiB
C++

#include <boost/test/unit_test.hpp>
#include <limits>
#include <string>
#include "bignum.h"
#include "util.h"
BOOST_AUTO_TEST_SUITE(bignum_tests)
#if defined(__GNUC__)
#define NOINLINE __attribute__((noinline))
#elif defined(_MSC_VER)
#define NOINLINE __declspec(noinline)
#else
#define NOINLINE
#endif
NOINLINE void mysetint64(CBigNum& num, int64_t n)
{
num.setint64(n);
}
BOOST_AUTO_TEST_CASE(bignum_setint64)
{
const int64_t values[] = {
0,
1,
-1,
5,
-5,
std::numeric_limits<int64_t>::min(),
std::numeric_limits<int64_t>::max(),
};
for (int64_t value : values) {
CBigNum num(value);
BOOST_CHECK_EQUAL(num.ToString(), std::to_string(value));
num.setulong(0);
BOOST_CHECK_EQUAL(num.ToString(), "0");
mysetint64(num, value);
BOOST_CHECK_EQUAL(num.ToString(), std::to_string(value));
}
}
BOOST_AUTO_TEST_CASE(bignum_uint64_roundtrip_boundaries)
{
const uint64_t values[] = {
0,
1,
0x7f,
0x80,
uint64_t{1} << 32,
uint64_t{1} << 63,
std::numeric_limits<uint64_t>::max(),
};
for (uint64_t value : values) {
CBigNum num(value);
BOOST_CHECK_EQUAL(num.getuint64(), value);
}
CBigNum negative(-1);
BOOST_CHECK_EQUAL(negative.getuint64(), uint64_t{1});
}
BOOST_AUTO_TEST_CASE(bignum_rejects_invalid_output_base)
{
CBigNum value(42);
BOOST_CHECK_THROW(value.ToString(0), bignum_error);
BOOST_CHECK_THROW(value.ToString(1), bignum_error);
BOOST_CHECK_THROW(value.ToString(17), bignum_error);
}
BOOST_AUTO_TEST_SUITE_END()