3#include <xrpl/basics/random.h>
4#include <xrpl/beast/unit_test.h>
5#include <xrpl/protocol/STAmount.h>
6#include <xrpl/protocol/XRPAmount.h>
38 return {amount.issue(), mantissa, amount.exponent(), amount.negative()};
40 return {amount.issue(), mantissa, amount.exponent(), amount.negative(),
STAmount::unchecked{}};
43 if (valueDigits == 999999999)
48 return {amount.issue(), mantissa, amount.exponent(), amount.negative()};
50 return {amount.issue(), mantissa, amount.exponent(), amount.negative(),
STAmount::unchecked{}};
66 BEAST_EXPECT(!res.
native());
70 BEAST_EXPECT(!cmp.
native());
90 BEAST_EXPECT(!prod1.
native());
98 fail(
"Multiplication result is not exact");
110 BEAST_EXPECT(amount.getText() == value);
189 STAmount zeroSt, one(1), hundred(100);
196 unexpected(zeroSt != beast::zero,
"STAmount fail");
197 unexpected(one == beast::zero,
"STAmount fail");
198 unexpected(hundred == beast::zero,
"STAmount fail");
199 unexpected((zeroSt < zeroSt),
"STAmount fail");
201 unexpected(!(zeroSt < hundred),
"STAmount fail");
204 unexpected(!(one < hundred),
"STAmount fail");
205 unexpected((hundred < zeroSt),
"STAmount fail");
207 unexpected((hundred < hundred),
"STAmount fail");
208 unexpected((zeroSt > zeroSt),
"STAmount fail");
210 unexpected((zeroSt > hundred),
"STAmount fail");
214 unexpected(!(hundred > zeroSt),
"STAmount fail");
215 unexpected(!(hundred > one),
"STAmount fail");
216 unexpected((hundred > hundred),
"STAmount fail");
217 unexpected(!(zeroSt <= zeroSt),
"STAmount fail");
218 unexpected(!(zeroSt <= one),
"STAmount fail");
219 unexpected(!(zeroSt <= hundred),
"STAmount fail");
222 unexpected(!(one <= hundred),
"STAmount fail");
223 unexpected((hundred <= zeroSt),
"STAmount fail");
224 unexpected((hundred <= one),
"STAmount fail");
225 unexpected(!(hundred <= hundred),
"STAmount fail");
226 unexpected(!(zeroSt >= zeroSt),
"STAmount fail");
228 unexpected((zeroSt >= hundred),
"STAmount fail");
229 unexpected(!(one >= zeroSt),
"STAmount fail");
231 unexpected((one >= hundred),
"STAmount fail");
232 unexpected(!(hundred >= zeroSt),
"STAmount fail");
233 unexpected(!(hundred >= one),
"STAmount fail");
234 unexpected(!(hundred >= hundred),
"STAmount fail");
235 unexpected(!(zeroSt == zeroSt),
"STAmount fail");
237 unexpected((zeroSt == hundred),
"STAmount fail");
240 unexpected((one == hundred),
"STAmount fail");
241 unexpected((hundred == zeroSt),
"STAmount fail");
242 unexpected((hundred == one),
"STAmount fail");
243 unexpected(!(hundred == hundred),
"STAmount fail");
244 unexpected((zeroSt != zeroSt),
"STAmount fail");
245 unexpected(!(zeroSt != one),
"STAmount fail");
246 unexpected(!(zeroSt != hundred),
"STAmount fail");
247 unexpected(!(one != zeroSt),
"STAmount fail");
249 unexpected(!(one != hundred),
"STAmount fail");
250 unexpected(!(hundred != zeroSt),
"STAmount fail");
251 unexpected(!(hundred != one),
"STAmount fail");
252 unexpected((hundred != hundred),
"STAmount fail");
261 std::string const cur =
"015841551A748AD2C1F76FF6ECB0CCCD00000000";
278 unexpected(zeroSt != beast::zero,
"STAmount fail");
279 unexpected(one == beast::zero,
"STAmount fail");
280 unexpected(hundred == beast::zero,
"STAmount fail");
281 unexpected((zeroSt < zeroSt),
"STAmount fail");
283 unexpected(!(zeroSt < hundred),
"STAmount fail");
286 unexpected(!(one < hundred),
"STAmount fail");
287 unexpected((hundred < zeroSt),
"STAmount fail");
289 unexpected((hundred < hundred),
"STAmount fail");
290 unexpected((zeroSt > zeroSt),
"STAmount fail");
292 unexpected((zeroSt > hundred),
"STAmount fail");
296 unexpected(!(hundred > zeroSt),
"STAmount fail");
297 unexpected(!(hundred > one),
"STAmount fail");
298 unexpected((hundred > hundred),
"STAmount fail");
299 unexpected(!(zeroSt <= zeroSt),
"STAmount fail");
300 unexpected(!(zeroSt <= one),
"STAmount fail");
301 unexpected(!(zeroSt <= hundred),
"STAmount fail");
304 unexpected(!(one <= hundred),
"STAmount fail");
305 unexpected((hundred <= zeroSt),
"STAmount fail");
306 unexpected((hundred <= one),
"STAmount fail");
307 unexpected(!(hundred <= hundred),
"STAmount fail");
308 unexpected(!(zeroSt >= zeroSt),
"STAmount fail");
310 unexpected((zeroSt >= hundred),
"STAmount fail");
311 unexpected(!(one >= zeroSt),
"STAmount fail");
313 unexpected((one >= hundred),
"STAmount fail");
314 unexpected(!(hundred >= zeroSt),
"STAmount fail");
315 unexpected(!(hundred >= one),
"STAmount fail");
316 unexpected(!(hundred >= hundred),
"STAmount fail");
317 unexpected(!(zeroSt == zeroSt),
"STAmount fail");
319 unexpected((zeroSt == hundred),
"STAmount fail");
322 unexpected((one == hundred),
"STAmount fail");
323 unexpected((hundred == zeroSt),
"STAmount fail");
324 unexpected((hundred == one),
"STAmount fail");
325 unexpected(!(hundred == hundred),
"STAmount fail");
326 unexpected((zeroSt != zeroSt),
"STAmount fail");
327 unexpected(!(zeroSt != one),
"STAmount fail");
328 unexpected(!(zeroSt != hundred),
"STAmount fail");
329 unexpected(!(one != zeroSt),
"STAmount fail");
331 unexpected(!(one != hundred),
"STAmount fail");
332 unexpected(!(hundred != zeroSt),
"STAmount fail");
333 unexpected(!(hundred != one),
"STAmount fail");
334 unexpected((hundred != hundred),
"STAmount fail");
350 fail(
"STAmount divide fail");
361 "STAmount divide fail");
365 "STAmount divide fail");
387 "STAmount getRate fail 1");
391 "STAmount getRate fail 2");
395 (((100ull - 14) << (64 - 8)) | 1000000000000000ull),
396 "STAmount getRate fail 3");
400 (((100ull - 16) << (64 - 8)) | 1000000000000000ull),
401 "STAmount getRate fail 4");
405 "STAmount getRate fail 5");
409 "STAmount getRate fail 6");
413 "STAmount getRate fail 7");
417 "STAmount getRate fail 8");
426 for (
int i = 0; i <= 100000; ++i)
446 BEAST_EXPECT(smallXsmall == beast::zero);
450 BEAST_EXPECT(bigDsmall == beast::zero);
452 BEAST_EXPECT(bigDsmall == beast::zero);
456 BEAST_EXPECT(bigDsmall == beast::zero);
460 BEAST_EXPECT(bigDsmall == beast::zero);
465 BEAST_EXPECT(r == 0);
468 r =
getRate(bigValue, smallValue);
470 BEAST_EXPECT(r == 0);
482 beginTestCase (
"rounding ");
513 STAmount fourThirdsB = twoThird2 + twoThird2;
534 BEAST_EXPECT(stnum.getSType() == STI_AMOUNT);
535 BEAST_EXPECT(stnum.getText() ==
"0");
536 BEAST_EXPECT(stnum.isDefault() ==
true);
537 BEAST_EXPECT(stnum.value() ==
Number{0});
577 std::string const expected =
"XRP and MPT must be specified as integral amount.";
578 BEAST_EXPECT(e.
what() == expected);
589 std::string const expected =
"XRP and MPT must be specified as integral amount.";
590 BEAST_EXPECT(e.
what() == expected);
602 BEAST_EXPECT(e.
what() == expected);
612 std::string const expected =
"'e' is not a number";
613 BEAST_EXPECT(e.
what() == expected);
623 std::string const expected =
"'1e' is not a number";
624 BEAST_EXPECT(e.
what() == expected);
634 std::string const expected =
"'e2' is not a number";
635 BEAST_EXPECT(e.
what() == expected);
645 std::string const expected =
"XRP may not be specified with a null Json value";
646 BEAST_EXPECT(e.
what() == expected);
653 "123456789012345678901234567890123456789012345678901234"
655 "901234567890123456789012345678901234567890123456789012"
657 "78901234567890123456789012345678901234567890");
673 std::string const expected =
"'001' is not a number";
674 BEAST_EXPECT(e.
what() == expected);
684 std::string const expected =
"'000.0' is not a number";
685 BEAST_EXPECT(e.
what() == expected);
696 std::string const expected =
"'.1' is not a number";
697 BEAST_EXPECT(e.
what() == expected);
707 std::string const expected =
"'1.' is not a number";
708 BEAST_EXPECT(e.
what() == expected);
718 std::string const expected =
"'1.e3' is not a number";
719 BEAST_EXPECT(e.
what() == expected);
727 testcase(
"STAmount to XRPAmount conversions");
732 for (
std::uint64_t drops = 100000000000000000; drops != 1; drops = drops / 10)
735 auto const s = t.xrp();
736 BEAST_EXPECT(s.drops() == drops);
752 fail(
"wrong exception");
759 testcase(
"STAmount to IOUAmount conversions");
764 for (
std::uint64_t dollars = 10000000000; dollars != 1; dollars = dollars / 10)
767 auto const s = t.iou();
768 BEAST_EXPECT(t ==
STAmount(s, usd));
769 BEAST_EXPECT(s.mantissa() == t.mantissa());
770 BEAST_EXPECT(s.exponent() == t.exponent());
784 fail(
"wrong exception");
797 BEAST_EXPECT(
canAdd(amt1, amt2) ==
true);
804 BEAST_EXPECT(
canAdd(amt1, amt2) ==
true);
811 BEAST_EXPECT(
canAdd(amt1, amt2) ==
true);
818 BEAST_EXPECT(
canAdd(amt1, amt2) ==
true);
825 BEAST_EXPECT(
canAdd(amt1, amt2) ==
true);
832 BEAST_EXPECT(
canAdd(amt1, amt2) ==
false);
840 BEAST_EXPECT(
canAdd(amt1, amt2) ==
false);
856 BEAST_EXPECT(
canAdd(amt1, amt2) ==
true);
863 BEAST_EXPECT(
canAdd(amt1, amt2) ==
true);
870 BEAST_EXPECT(
canAdd(amt1, amt2) ==
false);
877 BEAST_EXPECT(
canAdd(amt1, amt2) ==
false);
884 BEAST_EXPECT(
canAdd(amt1, amt2) ==
false);
891 BEAST_EXPECT(
canAdd(amt1, amt2) ==
false);
898 BEAST_EXPECT(
canAdd(amt1, amt2) ==
false);
914 BEAST_EXPECT(
canAdd(amt1, amt2) ==
true);
921 BEAST_EXPECT(
canAdd(amt1, amt2) ==
true);
928 BEAST_EXPECT(
canAdd(amt1, amt2) ==
true);
935 BEAST_EXPECT(
canAdd(amt1, amt2) ==
true);
942 BEAST_EXPECT(
canAdd(amt1, amt2) ==
true);
949 BEAST_EXPECT(
canAdd(amt1, amt2) ==
false);
960 BEAST_EXPECT(
canAdd(amt1, amt2) ==
false);
967 BEAST_EXPECT(
canAdd(amt1, amt2) ==
false);
974 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.
Number is a floating point type that can represent a wide range of values.
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()
std::string getFullText() const override
static constexpr std::uint64_t cMaxValue
Issue const & issue() const
void add(Serializer &s) const override
std::string getText() const override
static int const cMaxOffset
bool native() const noexcept
static constexpr std::uint64_t cMinValue
static int const cMinOffset
static constexpr std::uint64_t cMaxNative
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)
base_uint< 160, detail::CurrencyTag > Currency
Currency is a hash representing a specific currency.
Issue const & xrpIssue()
Returns an asset specifier that represents XRP.
static void canonicalizeRound(bool native, std::uint64_t &value, int &offset, bool)
STAmount amountFromJson(SField const &name, Json::Value const &v)
std::string to_string(base_uint< Bits, Tag > const &a)
STAmount amountFromString(Asset const &asset, std::string const &amount)
std::enable_if_t< std::is_integral< Integral >::value, Integral > rand_int()
STAmount divRound(STAmount const &v1, STAmount const &v2, Asset const &asset, bool roundUp)
STAmount multiply(STAmount const &amount, Rate const &rate)
base_uint< 160, detail::AccountIDTag > AccountID
A 160-bit unsigned that uniquely identifies an account.
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 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.
bool to_currency(Currency &, std::string const &)
Tries to convert a string to a Currency, returns true on success.
MPTID makeMptID(std::uint32_t sequence, AccountID const &account)