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)