1#include <xrpl/basics/Blob.h>
2#include <xrpl/basics/base_uint.h>
3#include <xrpl/basics/hardened_hash.h>
4#include <xrpl/beast/unit_test/suite.h>
5#include <xrpl/beast/utility/Zero.h>
7#include <boost/endian/detail/order.hpp>
26template <std::
size_t Bits>
29 static constexpr auto kEndian = boost::endian::order::big;
40 memcpy(
data.data(), key, len);
61 {{
"0000000000000000",
"0000000000000001"},
62 {
"0000000000000000",
"ffffffffffffffff"},
63 {
"1234567812345678",
"2345678923456789"},
64 {
"8000000000000000",
"8000000000000001"},
65 {
"aaaaaaaaaaaaaaa9",
"aaaaaaaaaaaaaaaa"},
66 {
"fffffffffffffffe",
"ffffffffffffffff"}}};
68 for (
auto const&
arg : kTestArgs)
74 BEAST_EXPECT(!(u == v));
75 BEAST_EXPECT(!(u > v));
76 BEAST_EXPECT(!(u >= v));
77 BEAST_EXPECT(!(v < u));
78 BEAST_EXPECT(!(v <= u));
80 BEAST_EXPECT(!(v == u));
91 {
"000000000000000000000000",
"000000000000000000000001"},
92 {
"000000000000000000000000",
"ffffffffffffffffffffffff"},
93 {
"0123456789ab0123456789ab",
"123456789abc123456789abc"},
94 {
"555555555555555555555555",
"55555555555a555555555555"},
95 {
"aaaaaaaaaaaaaaa9aaaaaaaa",
"aaaaaaaaaaaaaaaaaaaaaaaa"},
96 {
"fffffffffffffffffffffffe",
"ffffffffffffffffffffffff"},
99 for (
auto const&
arg : kTestArgs)
103 BEAST_EXPECT(u <= v);
104 BEAST_EXPECT(u != v);
105 BEAST_EXPECT(!(u == v));
106 BEAST_EXPECT(!(u > v));
107 BEAST_EXPECT(!(u >= v));
108 BEAST_EXPECT(!(v < u));
109 BEAST_EXPECT(!(v <= u));
110 BEAST_EXPECT(v != u);
111 BEAST_EXPECT(!(v == u));
113 BEAST_EXPECT(v >= u);
114 BEAST_EXPECT(u == u);
115 BEAST_EXPECT(v == v);
123 testcase(
"base_uint: general purpose tests");
133 Blob const raw{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};
138 BEAST_EXPECT(raw.
size() == u.
size());
139 BEAST_EXPECT(
to_string(u) ==
"0102030405060708090A0B0C");
141 BEAST_EXPECT(*u.
data() == 1);
142 BEAST_EXPECT(u.
signum() == 1);
144 BEAST_EXPECT(!u.
isZero());
149 BEAST_EXPECT(d == ++t);
158 BEAST_EXPECT(w == u);
162 BEAST_EXPECT(
to_string(v) ==
"FEFDFCFBFAF9F8F7F6F5F4F3");
164 BEAST_EXPECT(*v.
data() == 0xfe);
165 BEAST_EXPECT(v.
signum() == 1);
167 BEAST_EXPECT(!v.
isZero());
172 BEAST_EXPECT(d == --t);
179 BEAST_EXPECT(v == u);
183 BEAST_EXPECT(
to_string(z) ==
"000000000000000000000000");
185 BEAST_EXPECT(*z.
data() == 0);
186 BEAST_EXPECT(*z.
begin() == 0);
188 BEAST_EXPECT(z.
signum() == 0);
194 BEAST_EXPECT(d == 0);
199 BEAST_EXPECT(n ==
test96(1));
201 BEAST_EXPECT(n == beast::kZero);
202 BEAST_EXPECT(n == z);
204 BEAST_EXPECT(
to_string(n) ==
"FFFFFFFFFFFFFFFFFFFFFFFF");
207 BEAST_EXPECT(n == z);
213 test96 const x{zm1 ^ zp1};
218 BEAST_EXPECT(uset.
size() == 4);
222 BEAST_EXPECT(tmp == u);
238 x[i] = (
'G' + (i % 10));
264 static_assert(
test96{}.signum() == 0);
266 static_assert(
test96(
"000000000000000000000000").
signum() == 0);
267 static_assert(
test96(
"000000000000000000000001").
signum() == 1);
268 static_assert(
test96(
"800000000000000000000000").
signum() == 1);
273 static_assert(
test96(
"00000000000000000000000").
signum() == 0);
276 static_assert(
test96(
"0000000000000000000000000").
signum() == 0);
279 static_assert(
test96(
"00000000000000000000000 ").
signum() == 1);
280 static_assert(
test96(
"00000000000000000000000/").
signum() == 1);
281 static_assert(
test96(
"00000000000000000000000:").
signum() == 1);
282 static_assert(
test96(
"00000000000000000000000@").
signum() == 1);
283 static_assert(
test96(
"00000000000000000000000G").
signum() == 1);
284 static_assert(
test96(
"00000000000000000000000`").
signum() == 1);
285 static_assert(
test96(
"00000000000000000000000g").
signum() == 1);
286 static_assert(
test96(
"00000000000000000000000~").
signum() == 1);
299 [[maybe_unused]]
test96 const t96(sView);
303 BEAST_EXPECT(e.
what() ==
std::string(
"invalid length for hex string"));
306 BEAST_EXPECT(caught);
317 [[maybe_unused]]
test96 const t96(sView);
324 BEAST_EXPECT(caught);
331 char const*
const str;
334 constexpr StrBaseUInt(
char const* s) : str(s), tst(s)
338 static constexpr StrBaseUInt kTestCases[] = {
339 "000000000000000000000000",
340 "000000000000000000000001",
341 "fedcba9876543210ABCDEF91",
342 "19FEDCBA0123456789abcdef",
343 "800000000000000000000000",
344 "fFfFfFfFfFfFfFfFfFfFfFfF"};
346 for (StrBaseUInt
const& t : kTestCases)
350 BEAST_EXPECT(t96 == t.tst);
TestcaseT testcase
Memberspace for declaring test cases.
std::string const & arg() const
Return the argument associated with the runner.
Integers of any length that is a multiple of 32-bits.
static BaseUInt fromRaw(Container const &c)
constexpr int signum() const
static constexpr std::size_t kBytes
static constexpr std::size_t size()
constexpr bool parseHex(std::string_view sv)
Parse a hex string into a base_uint.
T is_copy_constructible_v
void hash_append(Hasher &h, Account const &v) noexcept
BEAST_DEFINE_TESTSUITE(AMMClawback, app, xrpl)
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
std::string to_string(BaseUInt< Bits, Tag > const &a)
std::string toShortString(BaseUInt< Bits, Tag > const &a)
std::vector< unsigned char > Blob
Storage for linear binary data.
void operator()(void const *key, std::size_t len) noexcept
std::array< std::uint8_t, kWidth > data
static constexpr auto kEndian
static constexpr std::size_t kWidth
void run() override
Runs the suite.