2#include <xrpl/basics/Number.h>
3#include <xrpl/basics/random.h>
4#include <xrpl/beast/unit_test/suite.h>
5#include <xrpl/beast/utility/Zero.h>
6#include <xrpl/json/json_forwards.h>
7#include <xrpl/json/json_value.h>
8#include <xrpl/protocol/AccountID.h>
9#include <xrpl/protocol/IOUAmount.h>
10#include <xrpl/protocol/Indexes.h>
11#include <xrpl/protocol/Issue.h>
12#include <xrpl/protocol/MPTAmount.h>
13#include <xrpl/protocol/MPTIssue.h>
14#include <xrpl/protocol/SField.h>
15#include <xrpl/protocol/STAmount.h>
16#include <xrpl/protocol/Serializer.h>
17#include <xrpl/protocol/UintTypes.h>
18#include <xrpl/protocol/XRPAmount.h>
68 if (valueDigits == 999999999)
96 BEAST_EXPECT(!res.
native());
100 BEAST_EXPECT(!cmp.
native());
120 BEAST_EXPECT(!prod1.
native());
129 fail(
"Multiplication result is not exact");
141 BEAST_EXPECT(amount.
getText() == value);
145 BEAST_EXPECT(!success);
231 unexpected(zeroSt != beast::kZero,
"STAmount fail");
232 unexpected(one == beast::kZero,
"STAmount fail");
233 unexpected(hundred == beast::kZero,
"STAmount fail");
234 unexpected((zeroSt < zeroSt),
"STAmount fail");
236 unexpected(!(zeroSt < hundred),
"STAmount fail");
239 unexpected(!(one < hundred),
"STAmount fail");
240 unexpected((hundred < zeroSt),
"STAmount fail");
242 unexpected((hundred < hundred),
"STAmount fail");
243 unexpected((zeroSt > zeroSt),
"STAmount fail");
245 unexpected((zeroSt > hundred),
"STAmount fail");
249 unexpected(!(hundred > zeroSt),
"STAmount fail");
250 unexpected(!(hundred > one),
"STAmount fail");
251 unexpected((hundred > hundred),
"STAmount fail");
252 unexpected(!(zeroSt <= zeroSt),
"STAmount fail");
253 unexpected(!(zeroSt <= one),
"STAmount fail");
254 unexpected(!(zeroSt <= hundred),
"STAmount fail");
257 unexpected(!(one <= hundred),
"STAmount fail");
258 unexpected((hundred <= zeroSt),
"STAmount fail");
259 unexpected((hundred <= one),
"STAmount fail");
260 unexpected(!(hundred <= hundred),
"STAmount fail");
261 unexpected(!(zeroSt >= zeroSt),
"STAmount fail");
263 unexpected((zeroSt >= hundred),
"STAmount fail");
264 unexpected(!(one >= zeroSt),
"STAmount fail");
266 unexpected((one >= hundred),
"STAmount fail");
267 unexpected(!(hundred >= zeroSt),
"STAmount fail");
268 unexpected(!(hundred >= one),
"STAmount fail");
269 unexpected(!(hundred >= hundred),
"STAmount fail");
270 unexpected(!(zeroSt == zeroSt),
"STAmount fail");
272 unexpected((zeroSt == hundred),
"STAmount fail");
275 unexpected((one == hundred),
"STAmount fail");
276 unexpected((hundred == zeroSt),
"STAmount fail");
277 unexpected((hundred == one),
"STAmount fail");
278 unexpected(!(hundred == hundred),
"STAmount fail");
279 unexpected((zeroSt != zeroSt),
"STAmount fail");
280 unexpected(!(zeroSt != one),
"STAmount fail");
281 unexpected(!(zeroSt != hundred),
"STAmount fail");
282 unexpected(!(one != zeroSt),
"STAmount fail");
284 unexpected(!(one != hundred),
"STAmount fail");
285 unexpected(!(hundred != zeroSt),
"STAmount fail");
286 unexpected(!(hundred != one),
"STAmount fail");
287 unexpected((hundred != hundred),
"STAmount fail");
296 std::string const cur =
"015841551A748AD2C1F76FF6ECB0CCCD00000000";
317 unexpected(zeroSt != beast::kZero,
"STAmount fail");
318 unexpected(one == beast::kZero,
"STAmount fail");
319 unexpected(hundred == beast::kZero,
"STAmount fail");
320 unexpected((zeroSt < zeroSt),
"STAmount fail");
322 unexpected(!(zeroSt < hundred),
"STAmount fail");
325 unexpected(!(one < hundred),
"STAmount fail");
326 unexpected((hundred < zeroSt),
"STAmount fail");
328 unexpected((hundred < hundred),
"STAmount fail");
329 unexpected((zeroSt > zeroSt),
"STAmount fail");
331 unexpected((zeroSt > hundred),
"STAmount fail");
335 unexpected(!(hundred > zeroSt),
"STAmount fail");
336 unexpected(!(hundred > one),
"STAmount fail");
337 unexpected((hundred > hundred),
"STAmount fail");
338 unexpected(!(zeroSt <= zeroSt),
"STAmount fail");
339 unexpected(!(zeroSt <= one),
"STAmount fail");
340 unexpected(!(zeroSt <= hundred),
"STAmount fail");
343 unexpected(!(one <= hundred),
"STAmount fail");
344 unexpected((hundred <= zeroSt),
"STAmount fail");
345 unexpected((hundred <= one),
"STAmount fail");
346 unexpected(!(hundred <= hundred),
"STAmount fail");
347 unexpected(!(zeroSt >= zeroSt),
"STAmount fail");
349 unexpected((zeroSt >= hundred),
"STAmount fail");
350 unexpected(!(one >= zeroSt),
"STAmount fail");
352 unexpected((one >= hundred),
"STAmount fail");
353 unexpected(!(hundred >= zeroSt),
"STAmount fail");
354 unexpected(!(hundred >= one),
"STAmount fail");
355 unexpected(!(hundred >= hundred),
"STAmount fail");
356 unexpected(!(zeroSt == zeroSt),
"STAmount fail");
358 unexpected((zeroSt == hundred),
"STAmount fail");
361 unexpected((one == hundred),
"STAmount fail");
362 unexpected((hundred == zeroSt),
"STAmount fail");
363 unexpected((hundred == one),
"STAmount fail");
364 unexpected(!(hundred == hundred),
"STAmount fail");
365 unexpected((zeroSt != zeroSt),
"STAmount fail");
366 unexpected(!(zeroSt != one),
"STAmount fail");
367 unexpected(!(zeroSt != hundred),
"STAmount fail");
368 unexpected(!(one != zeroSt),
"STAmount fail");
370 unexpected(!(one != hundred),
"STAmount fail");
371 unexpected(!(hundred != zeroSt),
"STAmount fail");
372 unexpected(!(hundred != one),
"STAmount fail");
373 unexpected((hundred != hundred),
"STAmount fail");
381 "STAmount multiply fail 1");
384 "STAmount multiply fail 2");
387 "STAmount multiply fail 3");
390 "STAmount multiply fail 4");
395 fail(
"STAmount divide fail");
404 "STAmount divide fail");
408 "STAmount divide fail");
412 "STAmount divide fail");
419 "STAmount setRate(getRate) fail");
423 "STAmount setRate(getRate) fail");
439 (((100ull - 14) << (64 - 8)) | 1000000000000000ull),
440 "STAmount getRate fail 1");
444 (((100ull - 16) << (64 - 8)) | 1000000000000000ull),
445 "STAmount getRate fail 2");
449 (((100ull - 14) << (64 - 8)) | 1000000000000000ull),
450 "STAmount getRate fail 3");
454 (((100ull - 16) << (64 - 8)) | 1000000000000000ull),
455 "STAmount getRate fail 4");
459 (((100ull - 14) << (64 - 8)) | 1000000000000000ull),
460 "STAmount getRate fail 5");
464 (((100ull - 16) << (64 - 8)) | 1000000000000000ull),
465 "STAmount getRate fail 6");
469 (((100ull - 14) << (64 - 8)) | 1000000000000000ull),
470 "STAmount getRate fail 7");
474 (((100ull - 16) << (64 - 8)) | 1000000000000000ull),
475 "STAmount getRate fail 8");
484 for (
int i = 0; i <= 100000; ++i)
506 BEAST_EXPECT(smallXSmall == beast::kZero);
510 BEAST_EXPECT(bigDsmall == beast::kZero);
512 BEAST_EXPECT(bigDsmall == beast::kZero);
516 BEAST_EXPECT(bigDsmall == beast::kZero);
520 BEAST_EXPECT(bigDsmall == beast::kZero);
525 BEAST_EXPECT(r == 0);
528 r =
getRate(bigValue, smallValue);
530 BEAST_EXPECT(r == 0);
542 beginTestCase (
"rounding ");
573 STAmount fourThirdsB = twoThird2 + twoThird2;
594 BEAST_EXPECT(stnum.
getSType() == STI_AMOUNT);
595 BEAST_EXPECT(stnum.
getText() ==
"0");
637 std::string const expected =
"XRP and MPT must be specified as integral amount.";
638 BEAST_EXPECT(e.
what() == expected);
649 std::string const expected =
"XRP and MPT must be specified as integral amount.";
650 BEAST_EXPECT(e.
what() == expected);
662 BEAST_EXPECT(e.
what() == expected);
672 std::string const expected =
"'e' is not a number";
673 BEAST_EXPECT(e.
what() == expected);
683 std::string const expected =
"'1e' is not a number";
684 BEAST_EXPECT(e.
what() == expected);
694 std::string const expected =
"'e2' is not a number";
695 BEAST_EXPECT(e.
what() == expected);
705 std::string const expected =
"XRP may not be specified with a null Json value";
706 BEAST_EXPECT(e.
what() == expected);
713 "123456789012345678901234567890123456789012345678901234"
715 "901234567890123456789012345678901234567890123456789012"
717 "78901234567890123456789012345678901234567890");
733 std::string const expected =
"'001' is not a number";
734 BEAST_EXPECT(e.
what() == expected);
744 std::string const expected =
"'000.0' is not a number";
745 BEAST_EXPECT(e.
what() == expected);
756 std::string const expected =
"'.1' is not a number";
757 BEAST_EXPECT(e.
what() == expected);
767 std::string const expected =
"'1.' is not a number";
768 BEAST_EXPECT(e.
what() == expected);
778 std::string const expected =
"'1.e3' is not a number";
779 BEAST_EXPECT(e.
what() == expected);
787 testcase(
"STAmount to XRPAmount conversions");
792 for (
std::uint64_t drops = 100000000000000000; drops != 1; drops = drops / 10)
795 auto const s = t.xrp();
796 BEAST_EXPECT(s.drops() == drops);
812 fail(
"wrong exception");
819 testcase(
"STAmount to IOUAmount conversions");
824 for (
std::uint64_t dollars = 10000000000; dollars != 1; dollars = dollars / 10)
827 auto const s = t.iou();
828 BEAST_EXPECT(t ==
STAmount(s, usd));
829 BEAST_EXPECT(s.mantissa() == t.mantissa());
830 BEAST_EXPECT(s.exponent() == t.exponent());
844 fail(
"wrong exception");
857 BEAST_EXPECT(
canAdd(amt1, amt2) ==
true);
864 BEAST_EXPECT(
canAdd(amt1, amt2) ==
true);
871 BEAST_EXPECT(
canAdd(amt1, amt2) ==
true);
878 BEAST_EXPECT(
canAdd(amt1, amt2) ==
true);
885 BEAST_EXPECT(
canAdd(amt1, amt2) ==
true);
892 BEAST_EXPECT(
canAdd(amt1, amt2) ==
false);
900 BEAST_EXPECT(
canAdd(amt1, amt2) ==
false);
916 BEAST_EXPECT(
canAdd(amt1, amt2) ==
true);
923 BEAST_EXPECT(
canAdd(amt1, amt2) ==
true);
930 BEAST_EXPECT(
canAdd(amt1, amt2) ==
false);
937 BEAST_EXPECT(
canAdd(amt1, amt2) ==
false);
944 BEAST_EXPECT(
canAdd(amt1, amt2) ==
false);
951 BEAST_EXPECT(
canAdd(amt1, amt2) ==
false);
958 BEAST_EXPECT(
canAdd(amt1, amt2) ==
false);
974 BEAST_EXPECT(
canAdd(amt1, amt2) ==
true);
981 BEAST_EXPECT(
canAdd(amt1, amt2) ==
true);
988 BEAST_EXPECT(
canAdd(amt1, amt2) ==
true);
995 BEAST_EXPECT(
canAdd(amt1, amt2) ==
true);
1002 BEAST_EXPECT(
canAdd(amt1, amt2) ==
true);
1009 BEAST_EXPECT(
canAdd(amt1, amt2) ==
false);
1020 BEAST_EXPECT(
canAdd(amt1, amt2) ==
false);
1027 BEAST_EXPECT(
canAdd(amt1, amt2) ==
false);
1034 BEAST_EXPECT(
canAdd(amt1, amt2) ==
false);
1217 int const refScale = ref.exponent();
1218 BEAST_EXPECT(refScale == -14);
1236 BEAST_EXPECT(!ref.isZeroAtScale(refScale));
bool unexpected(Condition shouldBeFalse, String const &reason)
void pass()
Record a successful test condition.
void fail(String const &reason, char const *file, int line)
Record a failure.
LogOs< char > log
Logging output stream.
TestcaseT testcase
Memberspace for declaring test cases.
A currency issued by an account.
Number is a floating point type that can represent a wide range of values.
static STAmount roundSelf(STAmount const &amount)
void testSetValue(std::string const &value, Issue const &issue, bool success=true)
void testCanSubtractXRP()
void run() override
Runs the suite.
void testCanSubtractMPT()
void mulTest(int a, int b)
void testCanSubtractIOU()
static STAmount serializeAndDeserialize(STAmount const &s)
void testNativeCurrency()
void roundTest(int n, int d, int m)
void testCustomCurrency()
constexpr TIss const & get() const
std::string getFullText() const override
void add(Serializer &s) const override
std::uint64_t mantissa() const noexcept
std::string getText() const override
static constexpr int kMinOffset
SerializedTypeID getSType() const override
bool negative() const noexcept
bool isDefault() const override
bool native() const noexcept
Asset const & asset() const
int exponent() const noexcept
bool isZeroAtScale(int scale) const
Checks if this amount evaluates to zero when constrained to a specific accounting scale.
static constexpr std::uint64_t kMinValue
static constexpr std::uint64_t kMaxValue
static constexpr std::uint64_t kMaxNative
static constexpr int kMaxOffset
STAmount const & value() const noexcept
Slice slice() const noexcept
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
STAmount divide(STAmount const &amount, Rate const &rate)
Issue const & xrpIssue()
Returns an asset specifier that represents XRP.
BaseUInt< 160, detail::CurrencyTag > Currency
Currency is a hash representing a specific currency.
std::enable_if_t< std::is_integral_v< Integral >, Integral > randInt()
STAmount amountFromString(Asset const &asset, std::string const &amount)
bool toCurrency(Currency &, std::string const &)
Tries to convert a string to a Currency, returns true on success.
STAmount divRound(STAmount const &v1, STAmount const &v2, Asset const &asset, bool roundUp)
std::string to_string(BaseUInt< Bits, Tag > const &a)
bool canAdd(STAmount const &amt1, STAmount const &amt2)
Safely checks if two STAmount values can be added without overflow, underflow, or precision loss.
STAmount amountFromQuality(std::uint64_t rate)
std::uint64_t getRate(STAmount const &offerOut, STAmount const &offerIn)
STAmount amountFromJson(SField const &name, json::Value const &v)
BaseUInt< 160, detail::AccountIDTag > AccountID
A 160-bit unsigned that uniquely identifies an account.
STAmount mulRound(STAmount const &v1, STAmount const &v2, Asset const &asset, bool roundUp)
bool canSubtract(STAmount const &amt1, STAmount const &amt2)
Determines if it is safe to subtract one STAmount from another.
Issue const & noIssue()
Returns an asset specifier that represents no account and currency.
STAmount multiply(STAmount const &amount, Number const &frac, Number::RoundingMode rm)
BEAST_DEFINE_TESTSUITE(AccountTxPaging, app, xrpl)
MPTID makeMptID(std::uint32_t sequence, AccountID const &account)
static void canonicalizeRound(bool integral, std::uint64_t &value, int &offset, bool)