3#include <xrpl/beast/unit_test.h>
4#include <xrpl/json/json_reader.h>
5#include <xrpl/protocol/STNumber.h>
6#include <xrpl/protocol/STParsedJSON.h>
7#include <xrpl/protocol/STXChainBridge.h>
8#include <xrpl/protocol/st.h>
27 j[sfCloseResolution] = 255;
29 BEAST_EXPECT(obj.
object.has_value());
30 BEAST_EXPECT(obj.
object->isFieldPresent(sfCloseResolution));
31 BEAST_EXPECT(obj.
object->getFieldU8(sfCloseResolution) == 255);
37 j[sfCloseResolution] = 255u;
39 BEAST_EXPECT(obj.
object.has_value());
40 BEAST_EXPECT(obj.
object->isFieldPresent(sfCloseResolution));
41 BEAST_EXPECT(obj.
object->getFieldU8(sfCloseResolution) == 255);
47 j[sfCloseResolution] =
"255";
49 BEAST_EXPECT(obj.
object.has_value());
50 BEAST_EXPECT(obj.
object->isFieldPresent(sfCloseResolution));
51 BEAST_EXPECT(obj.
object->getFieldU8(sfCloseResolution) == 255);
57 j[sfCloseResolution] = 0;
59 BEAST_EXPECT(obj.
object.has_value());
60 BEAST_EXPECT(obj.
object->getFieldU8(sfCloseResolution) == 0);
66 j[sfCloseResolution] = -1;
68 BEAST_EXPECT(!obj.
object.has_value());
74 j[sfCloseResolution] = 256;
76 BEAST_EXPECT(!obj.
object.has_value());
84 BEAST_EXPECT(!obj.
object.has_value());
92 BEAST_EXPECT(!obj.
object.has_value());
103 j[sfLedgerEntryType] = 65535;
105 BEAST_EXPECT(obj.
object.has_value());
106 BEAST_EXPECT(obj.
object->isFieldPresent(sfLedgerEntryType));
107 BEAST_EXPECT(obj.
object->getFieldU16(sfLedgerEntryType) == 65535);
113 j[sfLedgerEntryType] = 65535u;
115 BEAST_EXPECT(obj.
object.has_value());
116 BEAST_EXPECT(obj.
object->isFieldPresent(sfLedgerEntryType));
117 BEAST_EXPECT(obj.
object->getFieldU16(sfLedgerEntryType) == 65535);
123 j[sfLedgerEntryType] =
"65535";
125 BEAST_EXPECT(obj.
object.has_value());
126 BEAST_EXPECT(obj.
object->isFieldPresent(sfLedgerEntryType));
127 BEAST_EXPECT(obj.
object->getFieldU16(sfLedgerEntryType) == 65535);
133 j[sfLedgerEntryType] = 0;
135 BEAST_EXPECT(obj.
object.has_value());
136 BEAST_EXPECT(obj.
object->getFieldU16(sfLedgerEntryType) == 0);
142 j[sfLedgerEntryType] = -1;
144 BEAST_EXPECT(!obj.
object.has_value());
150 j[sfLedgerEntryType] = 65536;
152 BEAST_EXPECT(!obj.
object.has_value());
158 j[sfLedgerEntryType] =
"65536";
160 BEAST_EXPECT(!obj.
object.has_value());
168 BEAST_EXPECT(!obj.
object.has_value());
176 BEAST_EXPECT(!obj.
object.has_value());
182 j[sfTransferFee] =
"Payment";
184 BEAST_EXPECT(!obj.
object.has_value());
194 j[sfNetworkID] = 4294967295u;
196 BEAST_EXPECT(obj.
object.has_value());
197 BEAST_EXPECT(obj.
object->isFieldPresent(sfNetworkID));
198 BEAST_EXPECT(obj.
object->getFieldU32(sfNetworkID) == 4294967295u);
204 j[sfNetworkID] =
"4294967295";
206 BEAST_EXPECT(obj.
object.has_value());
207 BEAST_EXPECT(obj.
object->isFieldPresent(sfNetworkID));
208 BEAST_EXPECT(obj.
object->getFieldU32(sfNetworkID) == 4294967295u);
216 BEAST_EXPECT(obj.
object.has_value());
217 BEAST_EXPECT(obj.
object->getFieldU32(sfNetworkID) == 0);
225 BEAST_EXPECT(!obj.
object.has_value());
231 j[sfNetworkID] =
"4294967296";
233 BEAST_EXPECT(!obj.
object.has_value());
241 BEAST_EXPECT(!obj.
object.has_value());
249 BEAST_EXPECT(!obj.
object.has_value());
259 j[sfIndexNext] =
"ffffffffffffffff";
261 BEAST_EXPECT(obj.
object.has_value());
262 BEAST_EXPECT(obj.
object->isFieldPresent(sfIndexNext));
263 BEAST_EXPECT(obj.
object->getFieldU64(sfIndexNext) == 18446744073709551615ull);
271 BEAST_EXPECT(obj.
object.has_value());
272 BEAST_EXPECT(obj.
object->getFieldU64(sfIndexNext) == 0ull);
280 BEAST_EXPECT(!obj.
object.has_value());
289 j[sfIndexNext] =
"10000000000000000";
291 BEAST_EXPECT(!obj.
object.has_value());
297 j[sfIndexNext] =
"0xabcdefabcdef";
299 BEAST_EXPECT(!obj.
object.has_value());
305 j[sfIndexNext] =
"abcdefga";
307 BEAST_EXPECT(!obj.
object.has_value());
315 BEAST_EXPECT(!obj.
object.has_value());
323 BEAST_EXPECT(!obj.
object.has_value());
333 j[sfEmailHash] =
"0123456789ABCDEF0123456789ABCDEF";
335 BEAST_EXPECT(obj.
object.has_value());
336 BEAST_EXPECT(obj.
object->isFieldPresent(sfEmailHash));
337 BEAST_EXPECT(obj.
object->getFieldH128(sfEmailHash).size() == 16);
339 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF, 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF};
340 BEAST_EXPECT(obj.
object->getFieldH128(sfEmailHash) ==
uint128{expected});
346 j[sfEmailHash] =
"0123456789abcdef0123456789abcdef";
348 BEAST_EXPECT(obj.
object.has_value());
349 BEAST_EXPECT(obj.
object->isFieldPresent(sfEmailHash));
350 BEAST_EXPECT(obj.
object->getFieldH128(sfEmailHash).size() == 16);
358 BEAST_EXPECT(obj.
object.has_value());
359 BEAST_EXPECT(obj.
object->isFieldPresent(sfEmailHash));
360 auto const& h128 = obj.
object->getFieldH128(sfEmailHash);
361 BEAST_EXPECT(h128.size() == 16);
362 bool allZero =
std::all_of(h128.begin(), h128.end(), [](
auto b) { return b == 0; });
363 BEAST_EXPECT(allZero);
369 j[sfEmailHash] =
"0123456789ABCDEF0123456789ABCDE";
371 BEAST_EXPECT(!obj.
object.has_value());
377 j[sfEmailHash] =
"nothexstring";
379 BEAST_EXPECT(!obj.
object.has_value());
385 j[sfEmailHash] =
"01234567";
387 BEAST_EXPECT(!obj.
object.has_value());
393 j[sfEmailHash] =
"0123456789ABCDEF0123456789ABCDEF00";
395 BEAST_EXPECT(!obj.
object.has_value());
403 BEAST_EXPECT(!obj.
object.has_value());
411 BEAST_EXPECT(!obj.
object.has_value());
421 j[sfTakerPaysCurrency] =
"0123456789ABCDEF0123456789ABCDEF01234567";
423 BEAST_EXPECT(obj.
object.has_value());
424 BEAST_EXPECT(obj.
object->isFieldPresent(sfTakerPaysCurrency));
425 BEAST_EXPECT(obj.
object->getFieldH160(sfTakerPaysCurrency).size() == 20);
426 std::array<uint8_t, 20> expected = {0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF, 0x01, 0x23,
427 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF, 0x01, 0x23, 0x45, 0x67};
428 BEAST_EXPECT(obj.
object->getFieldH160(sfTakerPaysCurrency) ==
uint160{expected});
433 j[sfTakerPaysCurrency] =
"0123456789abcdef0123456789abcdef01234567";
435 BEAST_EXPECT(obj.
object.has_value());
436 BEAST_EXPECT(obj.
object->isFieldPresent(sfTakerPaysCurrency));
437 BEAST_EXPECT(obj.
object->getFieldH160(sfTakerPaysCurrency).size() == 20);
443 j[sfTakerPaysCurrency] =
"";
445 BEAST_EXPECT(obj.
object.has_value());
446 BEAST_EXPECT(obj.
object->isFieldPresent(sfTakerPaysCurrency));
447 auto const& h160 = obj.
object->getFieldH160(sfTakerPaysCurrency);
448 BEAST_EXPECT(h160.size() == 20);
449 bool allZero =
std::all_of(h160.begin(), h160.end(), [](
auto b) { return b == 0; });
450 BEAST_EXPECT(allZero);
456 j[sfTakerPaysCurrency] =
"nothexstring";
458 BEAST_EXPECT(!obj.
object.has_value());
464 j[sfTakerPaysCurrency] =
"01234567";
466 BEAST_EXPECT(!obj.
object.has_value());
472 j[sfTakerPaysCurrency] =
"0123456789ABCDEF0123456789ABCDEF0123456789";
474 BEAST_EXPECT(!obj.
object.has_value());
482 BEAST_EXPECT(!obj.
object.has_value());
490 BEAST_EXPECT(!obj.
object.has_value());
500 j[sfMPTokenIssuanceID] =
"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF";
502 BEAST_EXPECT(obj.
object.has_value());
503 BEAST_EXPECT(obj.
object->isFieldPresent(sfMPTokenIssuanceID));
504 BEAST_EXPECT(obj.
object->getFieldH192(sfMPTokenIssuanceID).size() == 24);
505 std::array<uint8_t, 24> expected = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
506 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
507 BEAST_EXPECT(obj.
object->getFieldH192(sfMPTokenIssuanceID) ==
uint192{expected});
513 j[sfMPTokenIssuanceID] =
"ffffffffffffffffffffffffffffffffffffffffffffffff";
515 BEAST_EXPECT(obj.
object.has_value());
516 BEAST_EXPECT(obj.
object->isFieldPresent(sfMPTokenIssuanceID));
517 BEAST_EXPECT(obj.
object->getFieldH192(sfMPTokenIssuanceID).size() == 24);
523 j[sfMPTokenIssuanceID] =
"";
525 BEAST_EXPECT(obj.
object.has_value());
526 BEAST_EXPECT(obj.
object->isFieldPresent(sfMPTokenIssuanceID));
527 auto const& h192 = obj.
object->getFieldH192(sfMPTokenIssuanceID);
528 BEAST_EXPECT(h192.size() == 24);
529 bool allZero =
std::all_of(h192.begin(), h192.end(), [](
auto b) { return b == 0; });
530 BEAST_EXPECT(allZero);
536 j[sfMPTokenIssuanceID] =
"0123456789ABCDEF0123456789ABCDEF0123456789ABCDE";
538 BEAST_EXPECT(!obj.
object.has_value());
544 j[sfMPTokenIssuanceID] =
"nothexstring";
546 BEAST_EXPECT(!obj.
object.has_value());
552 j[sfMPTokenIssuanceID] =
"01234567";
554 BEAST_EXPECT(!obj.
object.has_value());
560 j[sfMPTokenIssuanceID] =
"0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF00";
562 BEAST_EXPECT(!obj.
object.has_value());
570 BEAST_EXPECT(!obj.
object.has_value());
578 BEAST_EXPECT(!obj.
object.has_value());
590 "0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCD"
593 BEAST_EXPECT(obj.
object.has_value());
594 BEAST_EXPECT(obj.
object->isFieldPresent(sfLedgerHash));
595 BEAST_EXPECT(obj.
object->getFieldH256(sfLedgerHash).size() == 32);
596 std::array<uint8_t, 32> expected = {0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF, 0x01, 0x23, 0x45,
597 0x67, 0x89, 0xAB, 0xCD, 0xEF, 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB,
598 0xCD, 0xEF, 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF};
599 BEAST_EXPECT(obj.
object->getFieldH256(sfLedgerHash) ==
uint256{expected});
605 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcd"
608 BEAST_EXPECT(obj.
object.has_value());
609 BEAST_EXPECT(obj.
object->isFieldPresent(sfLedgerHash));
610 BEAST_EXPECT(obj.
object->getFieldH256(sfLedgerHash).size() == 32);
616 j[sfLedgerHash] =
"";
618 BEAST_EXPECT(obj.
object.has_value());
619 BEAST_EXPECT(obj.
object->isFieldPresent(sfLedgerHash));
620 auto const& h256 = obj.
object->getFieldH256(sfLedgerHash);
621 BEAST_EXPECT(h256.size() == 32);
622 bool allZero =
std::all_of(h256.begin(), h256.end(), [](
auto b) { return b == 0; });
623 BEAST_EXPECT(allZero);
630 "0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCD"
633 BEAST_EXPECT(!obj.
object.has_value());
639 j[sfLedgerHash] =
"nothexstring";
641 BEAST_EXPECT(!obj.
object.has_value());
647 j[sfLedgerHash] =
"01234567";
649 BEAST_EXPECT(!obj.
object.has_value());
656 "0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCD"
659 BEAST_EXPECT(!obj.
object.has_value());
667 BEAST_EXPECT(!obj.
object.has_value());
675 BEAST_EXPECT(!obj.
object.has_value());
685 int const minInt32 = -2147483648;
686 j[sfLoanScale] = minInt32;
688 BEAST_EXPECT(obj.
object.has_value());
689 if (BEAST_EXPECT(obj.
object->isFieldPresent(sfLoanScale)))
690 BEAST_EXPECT(obj.
object->getFieldI32(sfLoanScale) == minInt32);
696 int const maxInt32 = 2147483647;
697 j[sfLoanScale] = maxInt32;
699 BEAST_EXPECT(obj.
object.has_value());
700 if (BEAST_EXPECT(obj.
object->isFieldPresent(sfLoanScale)))
701 BEAST_EXPECT(obj.
object->getFieldI32(sfLoanScale) == maxInt32);
707 unsigned int const maxUInt32 = 2147483647u;
708 j[sfLoanScale] = maxUInt32;
710 BEAST_EXPECT(obj.
object.has_value());
711 if (BEAST_EXPECT(obj.
object->isFieldPresent(sfLoanScale)))
712 BEAST_EXPECT(obj.
object->getFieldI32(sfLoanScale) ==
static_cast<int32_t
>(maxUInt32));
718 j[sfLoanScale] =
"2147483647";
720 BEAST_EXPECT(obj.
object.has_value());
721 if (BEAST_EXPECT(obj.
object->isFieldPresent(sfLoanScale)))
722 BEAST_EXPECT(obj.
object->getFieldI32(sfLoanScale) == 2147483647u);
728 int value = -2147483648;
731 BEAST_EXPECT(obj.
object.has_value());
732 if (BEAST_EXPECT(obj.
object->isFieldPresent(sfLoanScale)))
733 BEAST_EXPECT(obj.
object->getFieldI32(sfLoanScale) == value);
739 j[sfLoanScale] =
"-2147483649";
741 BEAST_EXPECT(!obj.
object.has_value());
747 j[sfLoanScale] = 2147483648u;
749 BEAST_EXPECT(!obj.
object.has_value());
755 j[sfLoanScale] =
"2147483648";
757 BEAST_EXPECT(!obj.
object.has_value());
765 BEAST_EXPECT(!obj.
object.has_value());
773 BEAST_EXPECT(!obj.
object.has_value());
784 j[sfPublicKey] =
"DEADBEEF";
786 BEAST_EXPECT(obj.
object.has_value());
787 BEAST_EXPECT(obj.
object->isFieldPresent(sfPublicKey));
788 auto const& blob = obj.
object->getFieldVL(sfPublicKey);
789 BEAST_EXPECT(blob.size() == 4);
790 BEAST_EXPECT(blob[0] == 0xDE);
791 BEAST_EXPECT(blob[1] == 0xAD);
792 BEAST_EXPECT(blob[2] == 0xBE);
793 BEAST_EXPECT(blob[3] == 0xEF);
801 BEAST_EXPECT(obj.
object.has_value());
802 BEAST_EXPECT(obj.
object->isFieldPresent(sfPublicKey));
803 auto const& blob = obj.
object->getFieldVL(sfPublicKey);
804 BEAST_EXPECT(blob.size() == 0);
810 j[sfPublicKey] =
"deadbeef";
812 BEAST_EXPECT(obj.
object.has_value());
813 BEAST_EXPECT(obj.
object->isFieldPresent(sfPublicKey));
814 auto const& blob = obj.
object->getFieldVL(sfPublicKey);
815 BEAST_EXPECT(blob.size() == 4);
816 BEAST_EXPECT(blob[0] == 0xDE);
817 BEAST_EXPECT(blob[1] == 0xAD);
818 BEAST_EXPECT(blob[2] == 0xBE);
819 BEAST_EXPECT(blob[3] == 0xEF);
825 j[sfPublicKey] =
"XYZ123";
827 BEAST_EXPECT(!obj.
object.has_value());
835 BEAST_EXPECT(!obj.
object.has_value());
843 BEAST_EXPECT(!obj.
object.has_value());
856 "0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCD"
859 "FEDCBA9876543210FEDCBA9876543210FEDCBA9876543210FEDCBA98765432"
863 BEAST_EXPECT(obj.
object.has_value());
864 BEAST_EXPECT(obj.
object->isFieldPresent(sfHashes));
865 auto const& vec = obj.
object->getFieldV256(sfHashes);
866 BEAST_EXPECT(vec.size() == 2);
867 BEAST_EXPECT(
to_string(vec[0]) == arr[0u].asString());
868 BEAST_EXPECT(
to_string(vec[1]) == arr[1u].asString());
876 BEAST_EXPECT(obj.
object.has_value());
877 BEAST_EXPECT(obj.
object->isFieldPresent(sfHashes));
878 auto const& vec = obj.
object->getFieldV256(sfHashes);
879 BEAST_EXPECT(vec.size() == 0);
886 arr.
append(
"nothexstring");
889 BEAST_EXPECT(!obj.
object.has_value());
896 arr.
append(
"0123456789ABCDEF");
899 BEAST_EXPECT(!obj.
object.has_value());
909 BEAST_EXPECT(!obj.
object.has_value());
915 j[sfHashes] =
"notanarray";
917 BEAST_EXPECT(!obj.
object.has_value());
925 objElem[
"foo"] =
"bar";
929 BEAST_EXPECT(!obj.
object.has_value());
940 j[sfAccount] =
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh";
942 BEAST_EXPECT(obj.
object.has_value());
943 BEAST_EXPECT(obj.
object->isFieldPresent(sfAccount));
944 auto const& acct = obj.
object->getAccountID(sfAccount);
945 BEAST_EXPECT(acct.size() == 20);
946 BEAST_EXPECT(
toBase58(acct) ==
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh");
952 j[sfAccount] =
"000102030405060708090A0B0C0D0E0F10111213";
954 BEAST_EXPECT(obj.
object.has_value());
955 BEAST_EXPECT(obj.
object->isFieldPresent(sfAccount));
956 auto const& acct = obj.
object->getAccountID(sfAccount);
957 BEAST_EXPECT(acct.size() == 20);
963 j[sfAccount] =
"notAValidBase58Account";
965 BEAST_EXPECT(!obj.
object.has_value());
971 j[sfAccount] =
"001122334455";
973 BEAST_EXPECT(!obj.
object.has_value());
979 j[sfAccount] =
"000102030405060708090A0B0C0D0E0F101112131415";
981 BEAST_EXPECT(!obj.
object.has_value());
987 j[sfAccount] =
"000102030405060708090A0B0C0D0E0F1011121G";
989 BEAST_EXPECT(!obj.
object.has_value());
997 BEAST_EXPECT(!obj.
object.has_value());
1005 BEAST_EXPECT(!obj.
object.has_value());
1013 BEAST_EXPECT(!obj.
object.has_value());
1024 j[sfBaseAsset] =
"USD";
1026 BEAST_EXPECT(obj.
object.has_value());
1027 BEAST_EXPECT(obj.
object->isFieldPresent(sfBaseAsset));
1028 auto const& curr = obj.
object->getFieldCurrency(sfBaseAsset);
1029 BEAST_EXPECT(curr.currency().size() == 20);
1035 j[sfBaseAsset] =
"EUR";
1037 BEAST_EXPECT(obj.
object.has_value());
1038 BEAST_EXPECT(obj.
object->isFieldPresent(sfBaseAsset));
1039 auto const& curr = obj.
object->getFieldCurrency(sfBaseAsset);
1040 BEAST_EXPECT(curr.currency().size() == 20);
1046 j[sfBaseAsset] =
"0123456789ABCDEF01230123456789ABCDEF0123";
1048 if (BEAST_EXPECT(obj.
object.has_value()))
1050 BEAST_EXPECT(obj.
object->isFieldPresent(sfBaseAsset));
1051 auto const& curr = obj.
object->getFieldCurrency(sfBaseAsset);
1052 BEAST_EXPECT(curr.currency().size() == 20);
1059 j[sfBaseAsset] =
"USDD";
1061 BEAST_EXPECT(!obj.
object.has_value());
1067 j[sfBaseAsset] =
"usd";
1069 BEAST_EXPECT(obj.
object.has_value());
1070 BEAST_EXPECT(obj.
object->isFieldPresent(sfBaseAsset));
1071 auto const& curr = obj.
object->getFieldCurrency(sfBaseAsset);
1072 BEAST_EXPECT(curr.currency().size() == 20);
1078 j[sfBaseAsset] =
"0123456789AB";
1080 BEAST_EXPECT(!obj.
object.has_value());
1086 j[sfBaseAsset] =
"0123456789ABCDEF0123456789";
1088 BEAST_EXPECT(!obj.
object.has_value());
1094 j[sfBaseAsset] =
"";
1096 BEAST_EXPECT(obj.
object.has_value());
1097 BEAST_EXPECT(obj.
object->isFieldPresent(sfBaseAsset));
1098 auto const& curr = obj.
object->getFieldCurrency(sfBaseAsset);
1099 BEAST_EXPECT(curr.currency().size() == 20);
1107 BEAST_EXPECT(!obj.
object.has_value());
1115 BEAST_EXPECT(!obj.
object.has_value());
1126 j[sfAmount] =
"100000000000000000";
1128 BEAST_EXPECT(obj.
object.has_value());
1129 BEAST_EXPECT(obj.
object->isFieldPresent(sfAmount));
1130 BEAST_EXPECT(obj.
object->getFieldAmount(sfAmount) ==
STAmount(100000000000000000ull));
1136 j[sfAmount] = 4294967295u;
1138 BEAST_EXPECT(obj.
object.has_value());
1139 BEAST_EXPECT(obj.
object->isFieldPresent(sfAmount));
1140 BEAST_EXPECT(obj.
object->getFieldAmount(sfAmount) ==
STAmount(4294967295u));
1146 j[sfAmount] =
"123.45";
1148 BEAST_EXPECT(!obj.
object.has_value());
1156 BEAST_EXPECT(!obj.
object.has_value());
1162 j[sfAmount] =
"notanumber";
1164 BEAST_EXPECT(!obj.
object.has_value());
1172 BEAST_EXPECT(!obj.
object.has_value());
1185 elem[
"account"] =
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh";
1186 elem[
"currency"] =
"USD";
1187 elem[
"issuer"] =
"rPT1Sjq2YGrBMTttX4GZHjKu9dyfzbpAYe";
1191 j[sfPaths] = pathset;
1193 if (BEAST_EXPECT(obj.
object.has_value()))
1195 BEAST_EXPECT(obj.
object->isFieldPresent(sfPaths));
1196 auto const& ps = obj.
object->getFieldPathSet(sfPaths);
1197 BEAST_EXPECT(!ps.empty());
1198 BEAST_EXPECT(ps.size() == 1);
1199 BEAST_EXPECT(ps[0].size() == 1);
1200 BEAST_EXPECT(ps[0][0].getAccountID() == parseBase58<AccountID>(
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh"));
1201 BEAST_EXPECT(
to_string(ps[0][0].getCurrency()) ==
"USD");
1202 BEAST_EXPECT(ps[0][0].getIssuerID() == parseBase58<AccountID>(
"rPT1Sjq2YGrBMTttX4GZHjKu9dyfzbpAYe"));
1211 elem[
"account"] =
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh";
1212 elem[
"currency"] =
"0123456789ABCDEF01230123456789ABCDEF0123";
1213 elem[
"issuer"] =
"rPT1Sjq2YGrBMTttX4GZHjKu9dyfzbpAYe";
1217 j[sfPaths] = pathset;
1219 BEAST_EXPECT(obj.
object.has_value());
1220 BEAST_EXPECT(obj.
object->isFieldPresent(sfPaths));
1221 auto const& ps = obj.
object->getFieldPathSet(sfPaths);
1222 BEAST_EXPECT(!ps.empty());
1228 j[sfPaths] =
"notanarray";
1230 BEAST_EXPECT(!obj.
object.has_value());
1237 pathset.
append(
"notanarray");
1238 j[sfPaths] = pathset;
1240 BEAST_EXPECT(!obj.
object.has_value());
1248 path.
append(
"notanobject");
1251 j[sfPaths] = pathset;
1253 BEAST_EXPECT(!obj.
object.has_value());
1262 elem[
"foo"] =
"bar";
1266 j[sfPaths] = pathset;
1268 BEAST_EXPECT(!obj.
object.has_value());
1277 elem[
"account"] =
"notAValidBase58Account";
1281 j[sfPaths] = pathset;
1283 BEAST_EXPECT(!obj.
object.has_value());
1291 elem[
"account"] = 12345;
1295 j[sfPaths] = pathset;
1297 BEAST_EXPECT(!obj.
object.has_value());
1305 elem[
"currency"] = 12345;
1309 j[sfPaths] = pathset;
1311 BEAST_EXPECT(!obj.
object.has_value());
1319 elem[
"currency"] =
"notAValidCurrency";
1323 j[sfPaths] = pathset;
1325 BEAST_EXPECT(!obj.
object.has_value());
1333 elem[
"issuer"] = 12345;
1337 j[sfPaths] = pathset;
1339 BEAST_EXPECT(!obj.
object.has_value());
1347 elem[
"issuer"] =
"notAValidBase58Account";
1351 j[sfPaths] = pathset;
1353 BEAST_EXPECT(!obj.
object.has_value());
1365 issueJson[
"currency"] =
"USD";
1366 issueJson[
"issuer"] =
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh";
1367 j[sfAsset] = issueJson;
1369 if (BEAST_EXPECT(obj.
object.has_value()))
1371 BEAST_EXPECT(obj.
object->isFieldPresent(sfAsset));
1372 auto const& issueField = (*obj.
object)[sfAsset];
1373 auto const issue = issueField.value().get<
Issue>();
1374 BEAST_EXPECT(issue.currency.size() == 20);
1375 BEAST_EXPECT(
to_string(issue.currency) ==
"USD");
1376 BEAST_EXPECT(issue.account.size() == 20);
1377 BEAST_EXPECT(issue.account == parseBase58<AccountID>(
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh"));
1385 issueJson[
"currency"] =
"0123456789ABCDEF01230123456789ABCDEF0123";
1386 issueJson[
"issuer"] =
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh";
1387 j[sfAsset] = issueJson;
1389 if (BEAST_EXPECT(obj.
object.has_value()))
1391 BEAST_EXPECT(obj.
object->isFieldPresent(sfAsset));
1392 auto const& issueField = (*obj.
object)[sfAsset];
1393 auto const issue = issueField.value().get<
Issue>();
1394 BEAST_EXPECT(issue.currency.size() == 20);
1395 BEAST_EXPECT(issue.account.size() == 20);
1403 issueJson[
"mpt_issuance_id"] =
"0000000000000000000000004D5054494431323334234234";
1404 j[sfAsset] = issueJson;
1406 if (BEAST_EXPECT(obj.
object.has_value()))
1408 BEAST_EXPECT(obj.
object->isFieldPresent(sfAsset));
1409 auto const& issueField = (*obj.
object)[sfAsset];
1410 auto const issue = issueField.value().get<
MPTIssue>();
1411 BEAST_EXPECT(issue.getMptID().size() == 24);
1419 issue[
"issuer"] =
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh";
1422 BEAST_EXPECT(!obj.
object.has_value());
1429 issue[
"currency"] =
"USD";
1432 BEAST_EXPECT(!obj.
object.has_value());
1439 issue[
"currency"] =
"USDD";
1440 issue[
"issuer"] =
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh";
1443 BEAST_EXPECT(!obj.
object.has_value());
1450 issue[
"currency"] =
"USD";
1451 issue[
"issuer"] =
"notAValidIssuer";
1454 BEAST_EXPECT(!obj.
object.has_value());
1462 issue[
"issuer"] =
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh";
1465 BEAST_EXPECT(!obj.
object.has_value());
1472 issue[
"currency"] =
"USD";
1476 BEAST_EXPECT(!obj.
object.has_value());
1482 j[sfAsset] =
"notanobject";
1484 BEAST_EXPECT(!obj.
object.has_value());
1497 issuingChainIssue[
"currency"] =
"USD";
1498 issuingChainIssue[
"issuer"] =
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh";
1500 lockingChainIssue[
"currency"] =
"EUR";
1501 lockingChainIssue[
"issuer"] =
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh";
1502 bridge[
"LockingChainIssue"] = lockingChainIssue;
1503 bridge[
"IssuingChainIssue"] = issuingChainIssue;
1504 bridge[
"LockingChainDoor"] =
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh";
1505 bridge[
"IssuingChainDoor"] =
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh";
1506 j[sfXChainBridge] = bridge;
1508 if (BEAST_EXPECT(obj.
object.has_value()))
1510 BEAST_EXPECT(obj.
object->isFieldPresent(sfXChainBridge));
1511 auto const& bridgeField = (*obj.
object)[sfXChainBridge];
1512 BEAST_EXPECT(bridgeField->lockingChainIssue().currency.size() == 20);
1513 BEAST_EXPECT(bridgeField->issuingChainIssue().currency.size() == 20);
1522 issuingChainIssue[
"currency"] =
"0123456789ABCDEF01230123456789ABCDEF0123";
1523 issuingChainIssue[
"issuer"] =
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh";
1525 lockingChainIssue[
"currency"] =
"0123456789ABCDEF01230123456789ABCDEF0123";
1526 lockingChainIssue[
"issuer"] =
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh";
1527 bridge[
"LockingChainIssue"] = lockingChainIssue;
1528 bridge[
"IssuingChainIssue"] = issuingChainIssue;
1529 bridge[
"LockingChainDoor"] =
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh";
1530 bridge[
"IssuingChainDoor"] =
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh";
1531 j[sfXChainBridge] = bridge;
1533 if (BEAST_EXPECT(obj.
object.has_value()))
1535 BEAST_EXPECT(obj.
object->isFieldPresent(sfXChainBridge));
1536 auto const& bridgeField = (*obj.
object)[sfXChainBridge];
1537 BEAST_EXPECT(bridgeField->lockingChainIssue().currency.size() == 20);
1538 BEAST_EXPECT(bridgeField->issuingChainIssue().currency.size() == 20);
1547 issuingChainIssue[
"currency"] =
"USD";
1548 issuingChainIssue[
"issuer"] =
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh";
1549 bridge[
"IssuingChainIssue"] = issuingChainIssue;
1550 bridge[
"LockingChainDoor"] =
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh";
1551 bridge[
"IssuingChainDoor"] =
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh";
1552 j[sfXChainBridge] = bridge;
1554 BEAST_EXPECT(!obj.
object.has_value());
1562 lockingChainIssue[
"currency"] =
"EUR";
1563 lockingChainIssue[
"issuer"] =
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh";
1564 bridge[
"LockingChainIssue"] = lockingChainIssue;
1565 bridge[
"LockingChainDoor"] =
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh";
1566 bridge[
"IssuingChainDoor"] =
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh";
1567 j[sfXChainBridge] = bridge;
1569 BEAST_EXPECT(!obj.
object.has_value());
1577 issuingChainIssue[
"currency"] =
"USD";
1578 issuingChainIssue[
"issuer"] =
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh";
1579 bridge[
"IssuingChainIssue"] = issuingChainIssue;
1581 lockingChainIssue[
"currency"] =
"EUR";
1582 lockingChainIssue[
"issuer"] =
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh";
1583 bridge[
"LockingChainIssue"] = lockingChainIssue;
1584 bridge[
"IssuingChainDoor"] =
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh";
1585 j[sfXChainBridge] = bridge;
1587 BEAST_EXPECT(!obj.
object.has_value());
1595 issuingChainIssue[
"currency"] =
"USD";
1596 issuingChainIssue[
"issuer"] =
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh";
1597 bridge[
"IssuingChainIssue"] = issuingChainIssue;
1599 lockingChainIssue[
"currency"] =
"EUR";
1600 lockingChainIssue[
"issuer"] =
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh";
1601 bridge[
"LockingChainIssue"] = lockingChainIssue;
1602 bridge[
"LockingChainDoor"] =
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh";
1603 j[sfXChainBridge] = bridge;
1605 BEAST_EXPECT(!obj.
object.has_value());
1612 bridge[
"LockingChainIssue"] =
"notanobject";
1613 bridge[
"IssuingChainIssue"] =
"notanobject";
1614 j[sfXChainBridge] = bridge;
1616 BEAST_EXPECT(!obj.
object.has_value());
1624 asset[
"issuer"] =
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh";
1626 lockingChainIssue[
"currency"] =
"EUR";
1627 lockingChainIssue[
"issuer"] =
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh";
1628 bridge[
"LockingChainIssue"] = lockingChainIssue;
1629 bridge[
"IssuingChainIssue"] = asset;
1630 j[sfXChainBridge] = bridge;
1632 BEAST_EXPECT(!obj.
object.has_value());
1640 asset[
"currency"] =
"USD";
1642 lockingChainIssue[
"currency"] =
"EUR";
1643 lockingChainIssue[
"issuer"] =
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh";
1644 bridge[
"LockingChainIssue"] = lockingChainIssue;
1645 bridge[
"IssuingChainIssue"] = asset;
1646 j[sfXChainBridge] = bridge;
1648 BEAST_EXPECT(!obj.
object.has_value());
1656 asset[
"currency"] =
"USD";
1657 asset[
"issuer"] =
"notAValidBase58Account";
1659 lockingChainIssue[
"currency"] =
"EUR";
1660 lockingChainIssue[
"issuer"] =
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh";
1661 bridge[
"LockingChainIssue"] = lockingChainIssue;
1662 bridge[
"IssuingChainIssue"] = asset;
1663 j[sfXChainBridge] = bridge;
1665 BEAST_EXPECT(!obj.
object.has_value());
1671 j[sfXChainBridge] =
"notanobject";
1673 BEAST_EXPECT(!obj.
object.has_value());
1684 j[sfNumber] = 12345;
1686 BEAST_EXPECT(obj.
object.has_value());
1687 BEAST_EXPECT(obj.
object->isFieldPresent(sfNumber));
1688 BEAST_EXPECT(obj.
object->getFieldNumber(sfNumber).value() ==
Number(12345, 0));
1694 j[sfNumber] = 12345u;
1696 BEAST_EXPECT(obj.
object.has_value());
1697 BEAST_EXPECT(obj.
object->isFieldPresent(sfNumber));
1698 BEAST_EXPECT(obj.
object->getFieldNumber(sfNumber).value() ==
Number(12345, 0));
1704 j[sfNumber] =
"67890";
1706 BEAST_EXPECT(obj.
object.has_value());
1707 BEAST_EXPECT(obj.
object->isFieldPresent(sfNumber));
1708 BEAST_EXPECT(obj.
object->getFieldNumber(sfNumber).value() ==
Number(67890, 0));
1716 BEAST_EXPECT(obj.
object.has_value());
1717 BEAST_EXPECT(obj.
object->isFieldPresent(sfNumber));
1718 BEAST_EXPECT(obj.
object->getFieldNumber(sfNumber).value() ==
Number(-42, 0));
1724 j[sfNumber] =
"-123";
1726 BEAST_EXPECT(obj.
object.has_value());
1727 BEAST_EXPECT(obj.
object->isFieldPresent(sfNumber));
1728 BEAST_EXPECT(obj.
object->getFieldNumber(sfNumber).value() ==
Number(-123, 0));
1734 j[sfNumber] =
"3.14159";
1736 if (BEAST_EXPECT(obj.
object.has_value()))
1738 BEAST_EXPECT(obj.
object->isFieldPresent(sfNumber));
1739 BEAST_EXPECT(obj.
object->getFieldNumber(sfNumber).value() ==
Number(314159, -5));
1746 j[sfNumber] =
"notanumber";
1748 BEAST_EXPECT(!obj.
object.has_value());
1756 BEAST_EXPECT(!obj.
object.has_value());
1764 BEAST_EXPECT(!obj.
object.has_value());
1772 BEAST_EXPECT(!obj.
object.has_value());
1784 objVal[sfTransactionResult] = 1;
1785 j[sfTransactionMetaData] = objVal;
1787 BEAST_EXPECT(obj.
object.has_value());
1788 BEAST_EXPECT(obj.
object->isFieldPresent(sfTransactionMetaData));
1789 auto const& result = obj.
object->peekFieldObject(sfTransactionMetaData);
1790 BEAST_EXPECT(result.getFieldU8(sfTransactionResult) == 1);
1796 j[sfTransactionMetaData] =
"notanobject";
1798 BEAST_EXPECT(!obj.
object.has_value());
1806 j[sfTransactionMetaData] = arr;
1808 BEAST_EXPECT(!obj.
object.has_value());
1816 BEAST_EXPECT(!obj.
object.has_value());
1825 for (
int i = 0; i < 63; ++i)
1828 (*current)[sfTransactionMetaData] = next;
1829 current = &((*current)[sfTransactionMetaData]);
1831 (*current)[sfTransactionResult.getJsonName()] = 1;
1832 j[sfTransactionMetaData] = obj;
1834 BEAST_EXPECT(parsed.
object.has_value());
1835 BEAST_EXPECT(parsed.
object->isFieldPresent(sfTransactionMetaData));
1843 for (
int i = 0; i < 64; ++i)
1846 (*current)[sfTransactionMetaData] = next;
1847 current = &((*current)[sfTransactionMetaData]);
1849 (*current)[sfTransactionResult.getJsonName()] = 1;
1850 j[sfTransactionMetaData] = obj;
1852 BEAST_EXPECT(!parsed.
object.has_value());
1865 elem[sfTransactionResult] = 2;
1867 elem2[sfTransactionMetaData] = elem;
1869 j[sfSignerEntries] = arr;
1871 BEAST_EXPECT(obj.
object.has_value());
1872 BEAST_EXPECT(obj.
object->isFieldPresent(sfSignerEntries));
1873 auto const& result = obj.
object->getFieldArray(sfSignerEntries);
1874 if (BEAST_EXPECT(result.size() == 1))
1876 BEAST_EXPECT(result[0].getFName() == sfTransactionMetaData);
1877 BEAST_EXPECT(result[0].
getJson(0) == elem);
1885 arr.
append(
"notanobject");
1886 j[sfSignerEntries] = arr;
1888 BEAST_EXPECT(!obj.
object.has_value());
1896 elem[
"invalidField"] = 1;
1898 j[sfSignerEntries] = arr;
1900 BEAST_EXPECT(!obj.
object.has_value());
1908 elem[sfTransactionResult] = 2;
1909 elem[sfNetworkID] = 3;
1911 j[sfSignerEntries] = arr;
1913 BEAST_EXPECT(!obj.
object.has_value());
1919 j[sfSignerEntries] =
"notanarray";
1921 BEAST_EXPECT(!obj.
object.has_value());
1930 elem[sfTransactionResult] =
"notanint";
1932 j[sfSignerEntries] = arr;
1934 BEAST_EXPECT(!obj.
object.has_value());
1941 j[sfSignerEntries] = arr;
1943 BEAST_EXPECT(obj.
object.has_value());
1944 BEAST_EXPECT(obj.
object->isFieldPresent(sfSignerEntries));
1952 obj[0u][sfTransactionResult] = 1;
1953 j[sfSignerEntries] = obj;
1955 BEAST_EXPECT(!parsed.
object.has_value());
1976 "\"ModifiedNode\":{\"Sequence\":1}, "
1977 "\"DeletedNode\":{\"Sequence\":1}"
1985 BEAST_EXPECT(!parsed.
object);
1990 unexpected(what.
find(
"First level children of `Template`") != 0);
2002 j[sfLedgerEntry] = 1;
2006 std::string const goodJson(R
"({"CloseResolution":19,"Method":250,)"
2007 R"("TransactionResult":"tecFROZEN"})");
2013 if (BEAST_EXPECT(parsed.
object))
2016 BEAST_EXPECT(serialized == goodJson);
2022 std::string const goodJson(R
"({"CloseResolution":19,"Method":"250",)"
2023 R"("TransactionResult":"tecFROZEN"})");
2024 std::string const expectedJson(R
"({"CloseResolution":19,"Method":250,)"
2025 R"("TransactionResult":"tecFROZEN"})");
2034 if (BEAST_EXPECT(parsed.
object))
2037 BEAST_EXPECT(serialized == expectedJson);
2043 std::string const goodJson(R
"({"CloseResolution":"19","Method":"250",)"
2044 R"("TransactionResult":"tecFROZEN"})");
2045 std::string const expectedJson(R
"({"CloseResolution":19,"Method":250,)"
2046 R"("TransactionResult":"tecFROZEN"})");
2055 if (BEAST_EXPECT(parsed.
object))
2058 BEAST_EXPECT(serialized == expectedJson);
2064 std::string const json(R
"({"CloseResolution":19,"Method":250,)"
2065 R"("TransactionResult":"terQUEUED"})");
2071 BEAST_EXPECT(!parsed.
object);
2072 BEAST_EXPECT(parsed.
error);
2073 BEAST_EXPECT(parsed.
error[jss::error] ==
"invalidParams");
2074 BEAST_EXPECT(parsed.
error[jss::error_message] ==
"Field 'test.TransactionResult' is out of range.");
2079 std::string const json(R
"({"CloseResolution":19,"Method":"pony",)"
2080 R"("TransactionResult":"tesSUCCESS"})");
2086 BEAST_EXPECT(!parsed.
object);
2087 BEAST_EXPECT(parsed.
error);
2088 BEAST_EXPECT(parsed.
error[jss::error] ==
"invalidParams");
2089 BEAST_EXPECT(parsed.
error[jss::error_message] ==
"Field 'test.Method' has bad type.");
2094 std::string const json(R
"({"CloseResolution":19,"Method":3294967296,)"
2095 R"("TransactionResult":"tesSUCCESS"})");
2101 BEAST_EXPECT(!parsed.
object);
2102 BEAST_EXPECT(parsed.
error);
2103 BEAST_EXPECT(parsed.
error[jss::error] ==
"invalidParams");
2104 BEAST_EXPECT(parsed.
error[jss::error_message] ==
"Field 'test.Method' is out of range.");
2109 std::string const json(R
"({"CloseResolution":-10,"Method":42,)"
2110 R"("TransactionResult":"tesSUCCESS"})");
2116 BEAST_EXPECT(!parsed.
object);
2117 BEAST_EXPECT(parsed.
error);
2118 BEAST_EXPECT(parsed.
error[jss::error] ==
"invalidParams");
2119 BEAST_EXPECT(parsed.
error[jss::error_message] ==
"Field 'test.CloseResolution' is out of range.");
2124 std::string const json(R
"({"CloseResolution":19,"Method":3.141592653,)"
2125 R"("TransactionResult":"tesSUCCESS"})");
2131 BEAST_EXPECT(!parsed.
object);
2132 BEAST_EXPECT(parsed.
error);
2133 BEAST_EXPECT(parsed.
error[jss::error] ==
"invalidParams");
2134 BEAST_EXPECT(parsed.
error[jss::error_message] ==
"Field 'test.Method' has bad type.");
2139 std::string const goodJson(R
"({"CloseResolution":19,"Method":250,)"
2140 R"("TransferFee":"65535"})");
2141 std::string const expectedJson(R
"({"CloseResolution":19,"Method":250,)"
2142 R"("TransferFee":65535})");
2148 if (BEAST_EXPECT(parsed.
object))
2151 BEAST_EXPECT(serialized == expectedJson);
2157 std::string const json(R
"({"CloseResolution":19,"Method":250,)"
2158 R"("TransferFee":"65536"})");
2164 BEAST_EXPECT(!parsed.
object);
2165 BEAST_EXPECT(parsed.
error);
2166 BEAST_EXPECT(parsed.
error[jss::error] ==
"invalidParams");
2167 BEAST_EXPECT(parsed.
error[jss::error_message] ==
"Field 'test.TransferFee' has invalid data.");
2172 std::string const json(R
"({"CloseResolution":19,"Method":250,)"
2173 R"("TransferFee":"Payment"})");
2179 BEAST_EXPECT(!parsed.
object);
2180 BEAST_EXPECT(parsed.
error);
2181 BEAST_EXPECT(parsed.
error[jss::error] ==
"invalidParams");
2182 BEAST_EXPECT(parsed.
error[jss::error_message] ==
"Field 'test.TransferFee' has invalid data.");
2187 std::string const json(R
"({"CloseResolution":19,"Method":250,)"
2188 R"("TransferFee":true})");
2194 BEAST_EXPECT(!parsed.
object);
2195 BEAST_EXPECT(parsed.
error);
2196 BEAST_EXPECT(parsed.
error[jss::error] ==
"invalidParams");
2197 BEAST_EXPECT(parsed.
error[jss::error_message] ==
"Field 'test.TransferFee' has bad type.");
Unserialize a JSON document into a Value.
bool parse(std::string const &document, Value &root)
Read a Value from a JSON document.
Value & append(Value const &value)
Append value to array at the end.
bool unexpected(Condition shouldBeFalse, String const &reason)
testcase_t 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.
Holds the serialized result of parsing an input JSON object.
std::optional< STObject > object
The STObject if the parse was successful.
Json::Value error
On failure, an appropriate set of error values.
void run() override
Runs the suite.
bool parseJSONString(std::string const &json, Json::Value &to)
Integers of any length that is a multiple of 32-bits.
A transaction testing environment.
@ arrayValue
array value (ordered list)
@ objectValue
object value (collection of name/value pairs).
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
Json::Value getJson(LedgerFill const &fill)
Return a new Json::Value representing the ledger with given options.
std::string to_string(base_uint< Bits, Tag > const &a)
std::string toBase58(AccountID const &v)
Convert AccountID to base58 checked string.
@ current
This was a new validation and was added.