3#include <xrpl/basics/random.h>
4#include <xrpl/beast/unit_test.h>
5#include <xrpl/protocol/STAmount.h>
51 if (valueDigits == 999999999)
83 BEAST_EXPECT(!res.
native());
87 BEAST_EXPECT(!cmp.
native());
108 BEAST_EXPECT(!prod1.
native());
119 fail(
"Multiplication result is not exact");
134 BEAST_EXPECT(amount.
getText() == value);
221 unexpected(zeroSt != beast::zero,
"STAmount fail");
223 unexpected(hundred == beast::zero,
"STAmount fail");
224 unexpected((zeroSt < zeroSt),
"STAmount fail");
226 unexpected(!(zeroSt < hundred),
"STAmount fail");
230 unexpected((hundred < zeroSt),
"STAmount fail");
232 unexpected((hundred < hundred),
"STAmount fail");
233 unexpected((zeroSt > zeroSt),
"STAmount fail");
235 unexpected((zeroSt > hundred),
"STAmount fail");
239 unexpected(!(hundred > zeroSt),
"STAmount fail");
241 unexpected((hundred > hundred),
"STAmount fail");
242 unexpected(!(zeroSt <= zeroSt),
"STAmount fail");
244 unexpected(!(zeroSt <= hundred),
"STAmount fail");
248 unexpected((hundred <= zeroSt),
"STAmount fail");
250 unexpected(!(hundred <= hundred),
"STAmount fail");
251 unexpected(!(zeroSt >= zeroSt),
"STAmount fail");
253 unexpected((zeroSt >= hundred),
"STAmount fail");
257 unexpected(!(hundred >= zeroSt),
"STAmount fail");
259 unexpected(!(hundred >= hundred),
"STAmount fail");
260 unexpected(!(zeroSt == zeroSt),
"STAmount fail");
262 unexpected((zeroSt == hundred),
"STAmount fail");
266 unexpected((hundred == zeroSt),
"STAmount fail");
268 unexpected(!(hundred == hundred),
"STAmount fail");
269 unexpected((zeroSt != zeroSt),
"STAmount fail");
271 unexpected(!(zeroSt != hundred),
"STAmount fail");
275 unexpected(!(hundred != zeroSt),
"STAmount fail");
277 unexpected((hundred != hundred),
"STAmount fail");
286 std::string const cur =
"015841551A748AD2C1F76FF6ECB0CCCD00000000";
304 unexpected(zeroSt != beast::zero,
"STAmount fail");
306 unexpected(hundred == beast::zero,
"STAmount fail");
307 unexpected((zeroSt < zeroSt),
"STAmount fail");
309 unexpected(!(zeroSt < hundred),
"STAmount fail");
313 unexpected((hundred < zeroSt),
"STAmount fail");
315 unexpected((hundred < hundred),
"STAmount fail");
316 unexpected((zeroSt > zeroSt),
"STAmount fail");
318 unexpected((zeroSt > hundred),
"STAmount fail");
322 unexpected(!(hundred > zeroSt),
"STAmount fail");
324 unexpected((hundred > hundred),
"STAmount fail");
325 unexpected(!(zeroSt <= zeroSt),
"STAmount fail");
327 unexpected(!(zeroSt <= hundred),
"STAmount fail");
331 unexpected((hundred <= zeroSt),
"STAmount fail");
333 unexpected(!(hundred <= hundred),
"STAmount fail");
334 unexpected(!(zeroSt >= zeroSt),
"STAmount fail");
336 unexpected((zeroSt >= hundred),
"STAmount fail");
340 unexpected(!(hundred >= zeroSt),
"STAmount fail");
342 unexpected(!(hundred >= hundred),
"STAmount fail");
343 unexpected(!(zeroSt == zeroSt),
"STAmount fail");
345 unexpected((zeroSt == hundred),
"STAmount fail");
349 unexpected((hundred == zeroSt),
"STAmount fail");
351 unexpected(!(hundred == hundred),
"STAmount fail");
352 unexpected((zeroSt != zeroSt),
"STAmount fail");
354 unexpected(!(zeroSt != hundred),
"STAmount fail");
358 unexpected(!(hundred != zeroSt),
"STAmount fail");
360 unexpected((hundred != hundred),
"STAmount fail");
372 "STAmount multiply fail 1");
376 "STAmount multiply fail 2");
379 "STAmount multiply fail 3");
382 "STAmount multiply fail 4");
390 fail(
"STAmount divide fail");
400 "STAmount divide fail");
405 "STAmount divide fail");
410 "STAmount divide fail");
416 "STAmount setRate(getRate) fail");
420 "STAmount setRate(getRate) fail");
436 (((100ull - 14) << (64 - 8)) | 1000000000000000ull),
437 "STAmount getRate fail 1");
441 (((100ull - 16) << (64 - 8)) | 1000000000000000ull),
442 "STAmount getRate fail 2");
446 (((100ull - 14) << (64 - 8)) | 1000000000000000ull),
447 "STAmount getRate fail 3");
451 (((100ull - 16) << (64 - 8)) | 1000000000000000ull),
452 "STAmount getRate fail 4");
456 (((100ull - 14) << (64 - 8)) | 1000000000000000ull),
457 "STAmount getRate fail 5");
461 (((100ull - 16) << (64 - 8)) | 1000000000000000ull),
462 "STAmount getRate fail 6");
466 (((100ull - 14) << (64 - 8)) | 1000000000000000ull),
467 "STAmount getRate fail 7");
471 (((100ull - 16) << (64 - 8)) | 1000000000000000ull),
472 "STAmount getRate fail 8");
481 for (
int i = 0; i <= 100000; ++i)
507 BEAST_EXPECT(smallXsmall == beast::zero);
511 BEAST_EXPECT(bigDsmall == beast::zero);
513 BEAST_EXPECT(bigDsmall == beast::zero);
517 BEAST_EXPECT(bigDsmall == beast::zero);
521 BEAST_EXPECT(bigDsmall == beast::zero);
526 BEAST_EXPECT(r == 0);
529 r =
getRate(bigValue, smallValue);
531 BEAST_EXPECT(r == 0);
543 beginTestCase (
"rounding ");
574 STAmount fourThirdsB = twoThird2 + twoThird2;
591 testcase(
"STAmount to XRPAmount conversions");
600 auto const s = t.xrp();
601 BEAST_EXPECT(s.drops() == drops);
617 fail(
"wrong exception");
624 testcase(
"STAmount to IOUAmount conversions");
630 dollars = dollars / 10)
633 auto const s = t.iou();
634 BEAST_EXPECT(t ==
STAmount(s, usd));
635 BEAST_EXPECT(s.mantissa() == t.mantissa());
636 BEAST_EXPECT(s.exponent() == t.exponent());
650 fail(
"wrong exception");
663 BEAST_EXPECT(
canAdd(amt1, amt2) ==
true);
670 BEAST_EXPECT(
canAdd(amt1, amt2) ==
true);
677 BEAST_EXPECT(
canAdd(amt1, amt2) ==
true);
684 BEAST_EXPECT(
canAdd(amt1, amt2) ==
true);
691 BEAST_EXPECT(
canAdd(amt1, amt2) ==
true);
698 BEAST_EXPECT(
canAdd(amt1, amt2) ==
false);
706 BEAST_EXPECT(
canAdd(amt1, amt2) ==
false);
722 BEAST_EXPECT(
canAdd(amt1, amt2) ==
true);
729 BEAST_EXPECT(
canAdd(amt1, amt2) ==
true);
736 BEAST_EXPECT(
canAdd(amt1, amt2) ==
false);
743 BEAST_EXPECT(
canAdd(amt1, amt2) ==
false);
750 BEAST_EXPECT(
canAdd(amt1, amt2) ==
false);
757 BEAST_EXPECT(
canAdd(amt1, amt2) ==
false);
764 BEAST_EXPECT(
canAdd(amt1, amt2) ==
false);
780 BEAST_EXPECT(
canAdd(amt1, amt2) ==
true);
787 BEAST_EXPECT(
canAdd(amt1, amt2) ==
true);
794 BEAST_EXPECT(
canAdd(amt1, amt2) ==
true);
801 BEAST_EXPECT(
canAdd(amt1, amt2) ==
true);
808 BEAST_EXPECT(
canAdd(amt1, amt2) ==
true);
816 BEAST_EXPECT(
canAdd(amt1, amt2) ==
false);
827 BEAST_EXPECT(
canAdd(amt1, amt2) ==
false);
834 BEAST_EXPECT(
canAdd(amt1, amt2) ==
false);
841 BEAST_EXPECT(
canAdd(amt1, amt2) ==
false);
log_os< char > log
Logging output stream.
void pass()
Record a successful test condition.
bool unexpected(Condition shouldBeFalse, String const &reason)
testcase_t testcase
Memberspace for declaring test cases.
void fail(String const &reason, char const *file, int line)
Record a failure.
A currency issued by an account.
void roundTest(int n, int d, int m)
void testNativeCurrency()
void testCanSubtractMPT()
STAmount roundSelf(STAmount const &amount)
static STAmount serializeAndDeserialize(STAmount const &s)
void testSetValue(std::string const &value, Issue const &issue, bool success=true)
void testCanSubtractIOU()
void testCustomCurrency()
void testCanSubtractXRP()
void mulTest(int a, int b)
void run() override
Runs the suite.
int exponent() const noexcept
static int const cMaxOffset
static int const cMinOffset
static std::uint64_t const cMinValue
void add(Serializer &s) const override
static std::uint64_t const cMaxValue
std::string getText() const override
bool negative() const noexcept
Issue const & issue() const
static std::uint64_t const cMaxNative
std::uint64_t mantissa() const noexcept
std::string getFullText() const override
bool native() const noexcept
Slice slice() const noexcept
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
base_uint< 160, detail::AccountIDTag > AccountID
A 160-bit unsigned that uniquely identifies an account.
Issue const & xrpIssue()
Returns an asset specifier that represents XRP.
STAmount divide(STAmount const &amount, Rate const &rate)
std::enable_if_t< std::is_integral< Integral >::value, Integral > rand_int()
bool canSubtract(STAmount const &amt1, STAmount const &amt2)
Determines if it is safe to subtract one STAmount from another.
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)
STAmount multiply(STAmount const &amount, Rate const &rate)
std::uint64_t getRate(STAmount const &offerOut, STAmount const &offerIn)
base_uint< 160, detail::CurrencyTag > Currency
Currency is a hash representing a specific currency.
Issue const & noIssue()
Returns an asset specifier that represents no account and currency.
STAmount divRound(STAmount const &v1, STAmount const &v2, Asset const &asset, bool roundUp)
std::string to_string(base_uint< Bits, Tag > const &a)
STAmount amountFromString(Asset const &asset, std::string const &amount)
STAmount mulRound(STAmount const &v1, STAmount const &v2, Asset const &asset, bool roundUp)
MPTID makeMptID(std::uint32_t sequence, AccountID const &account)
bool to_currency(Currency &, std::string const &)
Tries to convert a string to a Currency, returns true on success.
static void canonicalizeRound(bool native, std::uint64_t &value, int &offset, bool)