22#include <xrpl/basics/random.h>
23#include <xrpl/beast/unit_test.h>
24#include <xrpl/protocol/STAmount.h>
70 if (valueDigits == 999999999)
102 BEAST_EXPECT(!res.
native());
106 BEAST_EXPECT(!cmp.
native());
127 BEAST_EXPECT(!prod1.
native());
138 fail(
"Multiplication result is not exact");
153 BEAST_EXPECT(amount.
getText() == value);
240 unexpected(zeroSt != beast::zero,
"STAmount fail");
242 unexpected(hundred == beast::zero,
"STAmount fail");
243 unexpected((zeroSt < zeroSt),
"STAmount fail");
245 unexpected(!(zeroSt < hundred),
"STAmount fail");
249 unexpected((hundred < zeroSt),
"STAmount fail");
251 unexpected((hundred < hundred),
"STAmount fail");
252 unexpected((zeroSt > zeroSt),
"STAmount fail");
254 unexpected((zeroSt > hundred),
"STAmount fail");
258 unexpected(!(hundred > zeroSt),
"STAmount fail");
260 unexpected((hundred > hundred),
"STAmount fail");
261 unexpected(!(zeroSt <= zeroSt),
"STAmount fail");
263 unexpected(!(zeroSt <= hundred),
"STAmount fail");
267 unexpected((hundred <= zeroSt),
"STAmount fail");
269 unexpected(!(hundred <= hundred),
"STAmount fail");
270 unexpected(!(zeroSt >= zeroSt),
"STAmount fail");
272 unexpected((zeroSt >= hundred),
"STAmount fail");
276 unexpected(!(hundred >= zeroSt),
"STAmount fail");
278 unexpected(!(hundred >= hundred),
"STAmount fail");
279 unexpected(!(zeroSt == zeroSt),
"STAmount fail");
281 unexpected((zeroSt == hundred),
"STAmount fail");
285 unexpected((hundred == zeroSt),
"STAmount fail");
287 unexpected(!(hundred == hundred),
"STAmount fail");
288 unexpected((zeroSt != zeroSt),
"STAmount fail");
290 unexpected(!(zeroSt != hundred),
"STAmount fail");
294 unexpected(!(hundred != zeroSt),
"STAmount fail");
296 unexpected((hundred != hundred),
"STAmount fail");
305 std::string const cur =
"015841551A748AD2C1F76FF6ECB0CCCD00000000";
323 unexpected(zeroSt != beast::zero,
"STAmount fail");
325 unexpected(hundred == beast::zero,
"STAmount fail");
326 unexpected((zeroSt < zeroSt),
"STAmount fail");
328 unexpected(!(zeroSt < hundred),
"STAmount fail");
332 unexpected((hundred < zeroSt),
"STAmount fail");
334 unexpected((hundred < hundred),
"STAmount fail");
335 unexpected((zeroSt > zeroSt),
"STAmount fail");
337 unexpected((zeroSt > hundred),
"STAmount fail");
341 unexpected(!(hundred > zeroSt),
"STAmount fail");
343 unexpected((hundred > hundred),
"STAmount fail");
344 unexpected(!(zeroSt <= zeroSt),
"STAmount fail");
346 unexpected(!(zeroSt <= hundred),
"STAmount fail");
350 unexpected((hundred <= zeroSt),
"STAmount fail");
352 unexpected(!(hundred <= hundred),
"STAmount fail");
353 unexpected(!(zeroSt >= zeroSt),
"STAmount fail");
355 unexpected((zeroSt >= hundred),
"STAmount fail");
359 unexpected(!(hundred >= zeroSt),
"STAmount fail");
361 unexpected(!(hundred >= hundred),
"STAmount fail");
362 unexpected(!(zeroSt == zeroSt),
"STAmount fail");
364 unexpected((zeroSt == hundred),
"STAmount fail");
368 unexpected((hundred == zeroSt),
"STAmount fail");
370 unexpected(!(hundred == hundred),
"STAmount fail");
371 unexpected((zeroSt != zeroSt),
"STAmount fail");
373 unexpected(!(zeroSt != hundred),
"STAmount fail");
377 unexpected(!(hundred != zeroSt),
"STAmount fail");
379 unexpected((hundred != hundred),
"STAmount fail");
391 "STAmount multiply fail 1");
395 "STAmount multiply fail 2");
398 "STAmount multiply fail 3");
401 "STAmount multiply fail 4");
409 fail(
"STAmount divide fail");
419 "STAmount divide fail");
424 "STAmount divide fail");
429 "STAmount divide fail");
435 "STAmount setRate(getRate) fail");
439 "STAmount setRate(getRate) fail");
455 (((100ull - 14) << (64 - 8)) | 1000000000000000ull),
456 "STAmount getRate fail 1");
460 (((100ull - 16) << (64 - 8)) | 1000000000000000ull),
461 "STAmount getRate fail 2");
465 (((100ull - 14) << (64 - 8)) | 1000000000000000ull),
466 "STAmount getRate fail 3");
470 (((100ull - 16) << (64 - 8)) | 1000000000000000ull),
471 "STAmount getRate fail 4");
475 (((100ull - 14) << (64 - 8)) | 1000000000000000ull),
476 "STAmount getRate fail 5");
480 (((100ull - 16) << (64 - 8)) | 1000000000000000ull),
481 "STAmount getRate fail 6");
485 (((100ull - 14) << (64 - 8)) | 1000000000000000ull),
486 "STAmount getRate fail 7");
490 (((100ull - 16) << (64 - 8)) | 1000000000000000ull),
491 "STAmount getRate fail 8");
500 for (
int i = 0; i <= 100000; ++i)
526 BEAST_EXPECT(smallXsmall == beast::zero);
530 BEAST_EXPECT(bigDsmall == beast::zero);
532 BEAST_EXPECT(bigDsmall == beast::zero);
536 BEAST_EXPECT(bigDsmall == beast::zero);
540 BEAST_EXPECT(bigDsmall == beast::zero);
545 BEAST_EXPECT(r == 0);
548 r =
getRate(bigValue, smallValue);
550 BEAST_EXPECT(r == 0);
562 beginTestCase (
"rounding ");
593 STAmount fourThirdsB = twoThird2 + twoThird2;
610 testcase(
"STAmount to XRPAmount conversions");
619 auto const s = t.xrp();
620 BEAST_EXPECT(s.drops() == drops);
636 fail(
"wrong exception");
643 testcase(
"STAmount to IOUAmount conversions");
649 dollars = dollars / 10)
652 auto const s = t.iou();
653 BEAST_EXPECT(t ==
STAmount(s, usd));
654 BEAST_EXPECT(s.mantissa() == t.mantissa());
655 BEAST_EXPECT(s.exponent() == t.exponent());
669 fail(
"wrong exception");
682 BEAST_EXPECT(
canAdd(amt1, amt2) ==
true);
689 BEAST_EXPECT(
canAdd(amt1, amt2) ==
true);
696 BEAST_EXPECT(
canAdd(amt1, amt2) ==
true);
703 BEAST_EXPECT(
canAdd(amt1, amt2) ==
true);
710 BEAST_EXPECT(
canAdd(amt1, amt2) ==
true);
717 BEAST_EXPECT(
canAdd(amt1, amt2) ==
false);
725 BEAST_EXPECT(
canAdd(amt1, amt2) ==
false);
741 BEAST_EXPECT(
canAdd(amt1, amt2) ==
true);
748 BEAST_EXPECT(
canAdd(amt1, amt2) ==
true);
755 BEAST_EXPECT(
canAdd(amt1, amt2) ==
false);
762 BEAST_EXPECT(
canAdd(amt1, amt2) ==
false);
769 BEAST_EXPECT(
canAdd(amt1, amt2) ==
false);
776 BEAST_EXPECT(
canAdd(amt1, amt2) ==
false);
783 BEAST_EXPECT(
canAdd(amt1, amt2) ==
false);
799 BEAST_EXPECT(
canAdd(amt1, amt2) ==
true);
806 BEAST_EXPECT(
canAdd(amt1, amt2) ==
true);
813 BEAST_EXPECT(
canAdd(amt1, amt2) ==
true);
820 BEAST_EXPECT(
canAdd(amt1, amt2) ==
true);
827 BEAST_EXPECT(
canAdd(amt1, amt2) ==
true);
835 BEAST_EXPECT(
canAdd(amt1, amt2) ==
false);
846 BEAST_EXPECT(
canAdd(amt1, amt2) ==
false);
853 BEAST_EXPECT(
canAdd(amt1, amt2) ==
false);
860 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)