22#include <xrpl/beast/unit_test.h>
23#include <xrpl/json/json_reader.h>
24#include <xrpl/protocol/STNumber.h>
25#include <xrpl/protocol/STParsedJSON.h>
26#include <xrpl/protocol/STXChainBridge.h>
27#include <xrpl/protocol/st.h>
46 j[sfCloseResolution] = 255;
48 BEAST_EXPECT(obj.
object.has_value());
49 BEAST_EXPECT(obj.
object->isFieldPresent(sfCloseResolution));
50 BEAST_EXPECT(obj.
object->getFieldU8(sfCloseResolution) == 255);
56 j[sfCloseResolution] = 255u;
58 BEAST_EXPECT(obj.
object.has_value());
59 BEAST_EXPECT(obj.
object->isFieldPresent(sfCloseResolution));
60 BEAST_EXPECT(obj.
object->getFieldU8(sfCloseResolution) == 255);
66 j[sfCloseResolution] =
"255";
68 BEAST_EXPECT(obj.
object.has_value());
69 BEAST_EXPECT(obj.
object->isFieldPresent(sfCloseResolution));
70 BEAST_EXPECT(obj.
object->getFieldU8(sfCloseResolution) == 255);
76 j[sfCloseResolution] = 0;
78 BEAST_EXPECT(obj.
object.has_value());
79 BEAST_EXPECT(obj.
object->getFieldU8(sfCloseResolution) == 0);
85 j[sfCloseResolution] = -1;
87 BEAST_EXPECT(!obj.
object.has_value());
93 j[sfCloseResolution] = 256;
95 BEAST_EXPECT(!obj.
object.has_value());
103 BEAST_EXPECT(!obj.
object.has_value());
111 BEAST_EXPECT(!obj.
object.has_value());
122 j[sfLedgerEntryType] = 65535;
124 BEAST_EXPECT(obj.
object.has_value());
125 BEAST_EXPECT(obj.
object->isFieldPresent(sfLedgerEntryType));
126 BEAST_EXPECT(obj.
object->getFieldU16(sfLedgerEntryType) == 65535);
132 j[sfLedgerEntryType] = 65535u;
134 BEAST_EXPECT(obj.
object.has_value());
135 BEAST_EXPECT(obj.
object->isFieldPresent(sfLedgerEntryType));
136 BEAST_EXPECT(obj.
object->getFieldU16(sfLedgerEntryType) == 65535);
142 j[sfLedgerEntryType] =
"65535";
144 BEAST_EXPECT(obj.
object.has_value());
145 BEAST_EXPECT(obj.
object->isFieldPresent(sfLedgerEntryType));
146 BEAST_EXPECT(obj.
object->getFieldU16(sfLedgerEntryType) == 65535);
152 j[sfLedgerEntryType] = 0;
154 BEAST_EXPECT(obj.
object.has_value());
155 BEAST_EXPECT(obj.
object->getFieldU16(sfLedgerEntryType) == 0);
161 j[sfLedgerEntryType] = -1;
163 BEAST_EXPECT(!obj.
object.has_value());
169 j[sfLedgerEntryType] = 65536;
171 BEAST_EXPECT(!obj.
object.has_value());
177 j[sfLedgerEntryType] =
"65536";
179 BEAST_EXPECT(!obj.
object.has_value());
187 BEAST_EXPECT(!obj.
object.has_value());
195 BEAST_EXPECT(!obj.
object.has_value());
201 j[sfTransferFee] =
"Payment";
203 BEAST_EXPECT(!obj.
object.has_value());
213 j[sfNetworkID] = 4294967295u;
215 BEAST_EXPECT(obj.
object.has_value());
216 BEAST_EXPECT(obj.
object->isFieldPresent(sfNetworkID));
217 BEAST_EXPECT(obj.
object->getFieldU32(sfNetworkID) == 4294967295u);
223 j[sfNetworkID] =
"4294967295";
225 BEAST_EXPECT(obj.
object.has_value());
226 BEAST_EXPECT(obj.
object->isFieldPresent(sfNetworkID));
227 BEAST_EXPECT(obj.
object->getFieldU32(sfNetworkID) == 4294967295u);
235 BEAST_EXPECT(obj.
object.has_value());
236 BEAST_EXPECT(obj.
object->getFieldU32(sfNetworkID) == 0);
244 BEAST_EXPECT(!obj.
object.has_value());
250 j[sfNetworkID] =
"4294967296";
252 BEAST_EXPECT(!obj.
object.has_value());
260 BEAST_EXPECT(!obj.
object.has_value());
268 BEAST_EXPECT(!obj.
object.has_value());
278 j[sfIndexNext] =
"ffffffffffffffff";
280 BEAST_EXPECT(obj.
object.has_value());
281 BEAST_EXPECT(obj.
object->isFieldPresent(sfIndexNext));
283 obj.
object->getFieldU64(sfIndexNext) ==
284 18446744073709551615ull);
292 BEAST_EXPECT(obj.
object.has_value());
293 BEAST_EXPECT(obj.
object->getFieldU64(sfIndexNext) == 0ull);
301 BEAST_EXPECT(!obj.
object.has_value());
310 j[sfIndexNext] =
"10000000000000000";
312 BEAST_EXPECT(!obj.
object.has_value());
318 j[sfIndexNext] =
"0xabcdefabcdef";
320 BEAST_EXPECT(!obj.
object.has_value());
326 j[sfIndexNext] =
"abcdefga";
328 BEAST_EXPECT(!obj.
object.has_value());
336 BEAST_EXPECT(!obj.
object.has_value());
344 BEAST_EXPECT(!obj.
object.has_value());
354 j[sfEmailHash] =
"0123456789ABCDEF0123456789ABCDEF";
356 BEAST_EXPECT(obj.
object.has_value());
357 BEAST_EXPECT(obj.
object->isFieldPresent(sfEmailHash));
358 BEAST_EXPECT(obj.
object->getFieldH128(sfEmailHash).size() == 16);
383 j[sfEmailHash] =
"0123456789abcdef0123456789abcdef";
385 BEAST_EXPECT(obj.
object.has_value());
386 BEAST_EXPECT(obj.
object->isFieldPresent(sfEmailHash));
387 BEAST_EXPECT(obj.
object->getFieldH128(sfEmailHash).size() == 16);
395 BEAST_EXPECT(obj.
object.has_value());
396 BEAST_EXPECT(obj.
object->isFieldPresent(sfEmailHash));
397 auto const& h128 = obj.
object->getFieldH128(sfEmailHash);
398 BEAST_EXPECT(h128.size() == 16);
400 h128.begin(), h128.end(), [](
auto b) { return b == 0; });
401 BEAST_EXPECT(allZero);
407 j[sfEmailHash] =
"0123456789ABCDEF0123456789ABCDE";
409 BEAST_EXPECT(!obj.
object.has_value());
415 j[sfEmailHash] =
"nothexstring";
417 BEAST_EXPECT(!obj.
object.has_value());
423 j[sfEmailHash] =
"01234567";
425 BEAST_EXPECT(!obj.
object.has_value());
431 j[sfEmailHash] =
"0123456789ABCDEF0123456789ABCDEF00";
433 BEAST_EXPECT(!obj.
object.has_value());
441 BEAST_EXPECT(!obj.
object.has_value());
449 BEAST_EXPECT(!obj.
object.has_value());
459 j[sfTakerPaysCurrency] =
"0123456789ABCDEF0123456789ABCDEF01234567";
461 BEAST_EXPECT(obj.
object.has_value());
462 BEAST_EXPECT(obj.
object->isFieldPresent(sfTakerPaysCurrency));
464 obj.
object->getFieldH160(sfTakerPaysCurrency).size() == 20);
466 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF, 0x01, 0x23,
467 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF, 0x01, 0x23, 0x45, 0x67};
469 obj.
object->getFieldH160(sfTakerPaysCurrency) ==
475 j[sfTakerPaysCurrency] =
"0123456789abcdef0123456789abcdef01234567";
477 BEAST_EXPECT(obj.
object.has_value());
478 BEAST_EXPECT(obj.
object->isFieldPresent(sfTakerPaysCurrency));
480 obj.
object->getFieldH160(sfTakerPaysCurrency).size() == 20);
486 j[sfTakerPaysCurrency] =
"";
488 BEAST_EXPECT(obj.
object.has_value());
489 BEAST_EXPECT(obj.
object->isFieldPresent(sfTakerPaysCurrency));
490 auto const& h160 = obj.
object->getFieldH160(sfTakerPaysCurrency);
491 BEAST_EXPECT(h160.size() == 20);
493 h160.begin(), h160.end(), [](
auto b) { return b == 0; });
494 BEAST_EXPECT(allZero);
500 j[sfTakerPaysCurrency] =
"nothexstring";
502 BEAST_EXPECT(!obj.
object.has_value());
508 j[sfTakerPaysCurrency] =
"01234567";
510 BEAST_EXPECT(!obj.
object.has_value());
516 j[sfTakerPaysCurrency] =
517 "0123456789ABCDEF0123456789ABCDEF0123456789";
519 BEAST_EXPECT(!obj.
object.has_value());
527 BEAST_EXPECT(!obj.
object.has_value());
535 BEAST_EXPECT(!obj.
object.has_value());
545 j[sfMPTokenIssuanceID] =
546 "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF";
548 BEAST_EXPECT(obj.
object.has_value());
549 BEAST_EXPECT(obj.
object->isFieldPresent(sfMPTokenIssuanceID));
551 obj.
object->getFieldH192(sfMPTokenIssuanceID).size() == 24);
553 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
554 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
555 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
557 obj.
object->getFieldH192(sfMPTokenIssuanceID) ==
564 j[sfMPTokenIssuanceID] =
565 "ffffffffffffffffffffffffffffffffffffffffffffffff";
567 BEAST_EXPECT(obj.
object.has_value());
568 BEAST_EXPECT(obj.
object->isFieldPresent(sfMPTokenIssuanceID));
570 obj.
object->getFieldH192(sfMPTokenIssuanceID).size() == 24);
576 j[sfMPTokenIssuanceID] =
"";
578 BEAST_EXPECT(obj.
object.has_value());
579 BEAST_EXPECT(obj.
object->isFieldPresent(sfMPTokenIssuanceID));
580 auto const& h192 = obj.
object->getFieldH192(sfMPTokenIssuanceID);
581 BEAST_EXPECT(h192.size() == 24);
583 h192.begin(), h192.end(), [](
auto b) { return b == 0; });
584 BEAST_EXPECT(allZero);
590 j[sfMPTokenIssuanceID] =
591 "0123456789ABCDEF0123456789ABCDEF0123456789ABCDE";
593 BEAST_EXPECT(!obj.
object.has_value());
599 j[sfMPTokenIssuanceID] =
"nothexstring";
601 BEAST_EXPECT(!obj.
object.has_value());
607 j[sfMPTokenIssuanceID] =
"01234567";
609 BEAST_EXPECT(!obj.
object.has_value());
615 j[sfMPTokenIssuanceID] =
616 "0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF00";
618 BEAST_EXPECT(!obj.
object.has_value());
626 BEAST_EXPECT(!obj.
object.has_value());
634 BEAST_EXPECT(!obj.
object.has_value());
646 "0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCD"
649 BEAST_EXPECT(obj.
object.has_value());
650 BEAST_EXPECT(obj.
object->isFieldPresent(sfLedgerHash));
651 BEAST_EXPECT(obj.
object->getFieldH256(sfLedgerHash).size() == 32);
653 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF,
654 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF,
655 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF,
656 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF};
658 obj.
object->getFieldH256(sfLedgerHash) ==
uint256{expected});
664 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcd"
667 BEAST_EXPECT(obj.
object.has_value());
668 BEAST_EXPECT(obj.
object->isFieldPresent(sfLedgerHash));
669 BEAST_EXPECT(obj.
object->getFieldH256(sfLedgerHash).size() == 32);
675 j[sfLedgerHash] =
"";
677 BEAST_EXPECT(obj.
object.has_value());
678 BEAST_EXPECT(obj.
object->isFieldPresent(sfLedgerHash));
679 auto const& h256 = obj.
object->getFieldH256(sfLedgerHash);
680 BEAST_EXPECT(h256.size() == 32);
682 h256.begin(), h256.end(), [](
auto b) { return b == 0; });
683 BEAST_EXPECT(allZero);
690 "0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCD"
693 BEAST_EXPECT(!obj.
object.has_value());
699 j[sfLedgerHash] =
"nothexstring";
701 BEAST_EXPECT(!obj.
object.has_value());
707 j[sfLedgerHash] =
"01234567";
709 BEAST_EXPECT(!obj.
object.has_value());
716 "0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCD"
719 BEAST_EXPECT(!obj.
object.has_value());
727 BEAST_EXPECT(!obj.
object.has_value());
735 BEAST_EXPECT(!obj.
object.has_value());
746 j[sfPublicKey] =
"DEADBEEF";
748 BEAST_EXPECT(obj.
object.has_value());
749 BEAST_EXPECT(obj.
object->isFieldPresent(sfPublicKey));
750 auto const& blob = obj.
object->getFieldVL(sfPublicKey);
751 BEAST_EXPECT(blob.size() == 4);
752 BEAST_EXPECT(blob[0] == 0xDE);
753 BEAST_EXPECT(blob[1] == 0xAD);
754 BEAST_EXPECT(blob[2] == 0xBE);
755 BEAST_EXPECT(blob[3] == 0xEF);
763 BEAST_EXPECT(obj.
object.has_value());
764 BEAST_EXPECT(obj.
object->isFieldPresent(sfPublicKey));
765 auto const& blob = obj.
object->getFieldVL(sfPublicKey);
766 BEAST_EXPECT(blob.size() == 0);
772 j[sfPublicKey] =
"deadbeef";
774 BEAST_EXPECT(obj.
object.has_value());
775 BEAST_EXPECT(obj.
object->isFieldPresent(sfPublicKey));
776 auto const& blob = obj.
object->getFieldVL(sfPublicKey);
777 BEAST_EXPECT(blob.size() == 4);
778 BEAST_EXPECT(blob[0] == 0xDE);
779 BEAST_EXPECT(blob[1] == 0xAD);
780 BEAST_EXPECT(blob[2] == 0xBE);
781 BEAST_EXPECT(blob[3] == 0xEF);
787 j[sfPublicKey] =
"XYZ123";
789 BEAST_EXPECT(!obj.
object.has_value());
797 BEAST_EXPECT(!obj.
object.has_value());
805 BEAST_EXPECT(!obj.
object.has_value());
818 "0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCD"
821 "FEDCBA9876543210FEDCBA9876543210FEDCBA9876543210FEDCBA98765432"
825 BEAST_EXPECT(obj.
object.has_value());
826 BEAST_EXPECT(obj.
object->isFieldPresent(sfHashes));
827 auto const& vec = obj.
object->getFieldV256(sfHashes);
828 BEAST_EXPECT(vec.size() == 2);
829 BEAST_EXPECT(
to_string(vec[0]) == arr[0u].asString());
830 BEAST_EXPECT(
to_string(vec[1]) == arr[1u].asString());
838 BEAST_EXPECT(obj.
object.has_value());
839 BEAST_EXPECT(obj.
object->isFieldPresent(sfHashes));
840 auto const& vec = obj.
object->getFieldV256(sfHashes);
841 BEAST_EXPECT(vec.size() == 0);
848 arr.
append(
"nothexstring");
851 BEAST_EXPECT(!obj.
object.has_value());
858 arr.
append(
"0123456789ABCDEF");
861 BEAST_EXPECT(!obj.
object.has_value());
871 BEAST_EXPECT(!obj.
object.has_value());
877 j[sfHashes] =
"notanarray";
879 BEAST_EXPECT(!obj.
object.has_value());
887 objElem[
"foo"] =
"bar";
891 BEAST_EXPECT(!obj.
object.has_value());
902 j[sfAccount] =
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh";
904 BEAST_EXPECT(obj.
object.has_value());
905 BEAST_EXPECT(obj.
object->isFieldPresent(sfAccount));
906 auto const& acct = obj.
object->getAccountID(sfAccount);
907 BEAST_EXPECT(acct.size() == 20);
909 toBase58(acct) ==
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh");
915 j[sfAccount] =
"000102030405060708090A0B0C0D0E0F10111213";
917 BEAST_EXPECT(obj.
object.has_value());
918 BEAST_EXPECT(obj.
object->isFieldPresent(sfAccount));
919 auto const& acct = obj.
object->getAccountID(sfAccount);
920 BEAST_EXPECT(acct.size() == 20);
926 j[sfAccount] =
"notAValidBase58Account";
928 BEAST_EXPECT(!obj.
object.has_value());
934 j[sfAccount] =
"001122334455";
936 BEAST_EXPECT(!obj.
object.has_value());
942 j[sfAccount] =
"000102030405060708090A0B0C0D0E0F101112131415";
944 BEAST_EXPECT(!obj.
object.has_value());
950 j[sfAccount] =
"000102030405060708090A0B0C0D0E0F1011121G";
952 BEAST_EXPECT(!obj.
object.has_value());
960 BEAST_EXPECT(!obj.
object.has_value());
968 BEAST_EXPECT(!obj.
object.has_value());
976 BEAST_EXPECT(!obj.
object.has_value());
987 j[sfBaseAsset] =
"USD";
989 BEAST_EXPECT(obj.
object.has_value());
990 BEAST_EXPECT(obj.
object->isFieldPresent(sfBaseAsset));
991 auto const& curr = obj.
object->getFieldCurrency(sfBaseAsset);
992 BEAST_EXPECT(curr.currency().size() == 20);
998 j[sfBaseAsset] =
"EUR";
1000 BEAST_EXPECT(obj.
object.has_value());
1001 BEAST_EXPECT(obj.
object->isFieldPresent(sfBaseAsset));
1002 auto const& curr = obj.
object->getFieldCurrency(sfBaseAsset);
1003 BEAST_EXPECT(curr.currency().size() == 20);
1009 j[sfBaseAsset] =
"0123456789ABCDEF01230123456789ABCDEF0123";
1011 if (BEAST_EXPECT(obj.
object.has_value()))
1013 BEAST_EXPECT(obj.
object->isFieldPresent(sfBaseAsset));
1014 auto const& curr = obj.
object->getFieldCurrency(sfBaseAsset);
1015 BEAST_EXPECT(curr.currency().size() == 20);
1022 j[sfBaseAsset] =
"USDD";
1024 BEAST_EXPECT(!obj.
object.has_value());
1030 j[sfBaseAsset] =
"usd";
1032 BEAST_EXPECT(obj.
object.has_value());
1033 BEAST_EXPECT(obj.
object->isFieldPresent(sfBaseAsset));
1034 auto const& curr = obj.
object->getFieldCurrency(sfBaseAsset);
1035 BEAST_EXPECT(curr.currency().size() == 20);
1041 j[sfBaseAsset] =
"0123456789AB";
1043 BEAST_EXPECT(!obj.
object.has_value());
1049 j[sfBaseAsset] =
"0123456789ABCDEF0123456789";
1051 BEAST_EXPECT(!obj.
object.has_value());
1057 j[sfBaseAsset] =
"";
1059 BEAST_EXPECT(obj.
object.has_value());
1060 BEAST_EXPECT(obj.
object->isFieldPresent(sfBaseAsset));
1061 auto const& curr = obj.
object->getFieldCurrency(sfBaseAsset);
1062 BEAST_EXPECT(curr.currency().size() == 20);
1070 BEAST_EXPECT(!obj.
object.has_value());
1078 BEAST_EXPECT(!obj.
object.has_value());
1089 j[sfAmount] =
"100000000000000000";
1091 BEAST_EXPECT(obj.
object.has_value());
1092 BEAST_EXPECT(obj.
object->isFieldPresent(sfAmount));
1094 obj.
object->getFieldAmount(sfAmount) ==
1101 j[sfAmount] = 4294967295u;
1103 BEAST_EXPECT(obj.
object.has_value());
1104 BEAST_EXPECT(obj.
object->isFieldPresent(sfAmount));
1112 j[sfAmount] =
"123.45";
1114 BEAST_EXPECT(!obj.
object.has_value());
1122 BEAST_EXPECT(!obj.
object.has_value());
1128 j[sfAmount] =
"notanumber";
1130 BEAST_EXPECT(!obj.
object.has_value());
1138 BEAST_EXPECT(!obj.
object.has_value());
1151 elem[
"account"] =
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh";
1152 elem[
"currency"] =
"USD";
1153 elem[
"issuer"] =
"rPT1Sjq2YGrBMTttX4GZHjKu9dyfzbpAYe";
1157 j[sfPaths] = pathset;
1159 if (BEAST_EXPECT(obj.
object.has_value()))
1161 BEAST_EXPECT(obj.
object->isFieldPresent(sfPaths));
1162 auto const& ps = obj.
object->getFieldPathSet(sfPaths);
1163 BEAST_EXPECT(!ps.empty());
1164 BEAST_EXPECT(ps.size() == 1);
1165 BEAST_EXPECT(ps[0].size() == 1);
1167 ps[0][0].getAccountID() ==
1168 parseBase58<AccountID>(
1169 "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh"));
1170 BEAST_EXPECT(
to_string(ps[0][0].getCurrency()) ==
"USD");
1172 ps[0][0].getIssuerID() ==
1173 parseBase58<AccountID>(
1174 "rPT1Sjq2YGrBMTttX4GZHjKu9dyfzbpAYe"));
1183 elem[
"account"] =
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh";
1184 elem[
"currency"] =
"0123456789ABCDEF01230123456789ABCDEF0123";
1185 elem[
"issuer"] =
"rPT1Sjq2YGrBMTttX4GZHjKu9dyfzbpAYe";
1189 j[sfPaths] = pathset;
1191 BEAST_EXPECT(obj.
object.has_value());
1192 BEAST_EXPECT(obj.
object->isFieldPresent(sfPaths));
1193 auto const& ps = obj.
object->getFieldPathSet(sfPaths);
1194 BEAST_EXPECT(!ps.empty());
1200 j[sfPaths] =
"notanarray";
1202 BEAST_EXPECT(!obj.
object.has_value());
1209 pathset.
append(
"notanarray");
1210 j[sfPaths] = pathset;
1212 BEAST_EXPECT(!obj.
object.has_value());
1220 path.append(
"notanobject");
1223 j[sfPaths] = pathset;
1225 BEAST_EXPECT(!obj.
object.has_value());
1234 elem[
"foo"] =
"bar";
1238 j[sfPaths] = pathset;
1240 BEAST_EXPECT(!obj.
object.has_value());
1249 elem[
"account"] =
"notAValidBase58Account";
1253 j[sfPaths] = pathset;
1255 BEAST_EXPECT(!obj.
object.has_value());
1263 elem[
"account"] = 12345;
1267 j[sfPaths] = pathset;
1269 BEAST_EXPECT(!obj.
object.has_value());
1277 elem[
"currency"] = 12345;
1281 j[sfPaths] = pathset;
1283 BEAST_EXPECT(!obj.
object.has_value());
1291 elem[
"currency"] =
"notAValidCurrency";
1295 j[sfPaths] = pathset;
1297 BEAST_EXPECT(!obj.
object.has_value());
1305 elem[
"issuer"] = 12345;
1309 j[sfPaths] = pathset;
1311 BEAST_EXPECT(!obj.
object.has_value());
1319 elem[
"issuer"] =
"notAValidBase58Account";
1323 j[sfPaths] = pathset;
1325 BEAST_EXPECT(!obj.
object.has_value());
1337 issueJson[
"currency"] =
"USD";
1338 issueJson[
"issuer"] =
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh";
1339 j[sfAsset] = issueJson;
1344 BEAST_EXPECT(obj.
object->isFieldPresent(sfAsset));
1345 auto const& issueField = (*obj.
object)[sfAsset];
1346 auto const issue = issueField.value().get<
Issue>();
1347 BEAST_EXPECT(issue.currency.size() == 20);
1348 BEAST_EXPECT(
to_string(issue.currency) ==
"USD");
1349 BEAST_EXPECT(issue.account.size() == 20);
1352 parseBase58<AccountID>(
1353 "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh"));
1361 issueJson[
"currency"] =
"0123456789ABCDEF01230123456789ABCDEF0123";
1362 issueJson[
"issuer"] =
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh";
1363 j[sfAsset] = issueJson;
1365 if (BEAST_EXPECT(obj.
object.has_value()))
1367 BEAST_EXPECT(obj.
object->isFieldPresent(sfAsset));
1368 auto const& issueField = (*obj.
object)[sfAsset];
1369 auto const issue = issueField.value().get<
Issue>();
1370 BEAST_EXPECT(issue.currency.size() == 20);
1371 BEAST_EXPECT(issue.account.size() == 20);
1379 issueJson[
"mpt_issuance_id"] =
1380 "0000000000000000000000004D5054494431323334234234";
1381 j[sfAsset] = issueJson;
1383 if (BEAST_EXPECT(obj.
object.has_value()))
1385 BEAST_EXPECT(obj.
object->isFieldPresent(sfAsset));
1386 auto const& issueField = (*obj.
object)[sfAsset];
1387 auto const issue = issueField.value().get<
MPTIssue>();
1388 BEAST_EXPECT(issue.getMptID().size() == 24);
1396 issue[
"issuer"] =
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh";
1399 BEAST_EXPECT(!obj.
object.has_value());
1406 issue[
"currency"] =
"USD";
1409 BEAST_EXPECT(!obj.
object.has_value());
1416 issue[
"currency"] =
"USDD";
1417 issue[
"issuer"] =
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh";
1420 BEAST_EXPECT(!obj.
object.has_value());
1427 issue[
"currency"] =
"USD";
1428 issue[
"issuer"] =
"notAValidIssuer";
1431 BEAST_EXPECT(!obj.
object.has_value());
1439 issue[
"issuer"] =
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh";
1442 BEAST_EXPECT(!obj.
object.has_value());
1449 issue[
"currency"] =
"USD";
1453 BEAST_EXPECT(!obj.
object.has_value());
1459 j[sfAsset] =
"notanobject";
1461 BEAST_EXPECT(!obj.
object.has_value());
1474 issuingChainIssue[
"currency"] =
"USD";
1475 issuingChainIssue[
"issuer"] =
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh";
1477 lockingChainIssue[
"currency"] =
"EUR";
1478 lockingChainIssue[
"issuer"] =
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh";
1479 bridge[
"LockingChainIssue"] = lockingChainIssue;
1480 bridge[
"IssuingChainIssue"] = issuingChainIssue;
1481 bridge[
"LockingChainDoor"] =
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh";
1482 bridge[
"IssuingChainDoor"] =
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh";
1483 j[sfXChainBridge] = bridge;
1485 if (BEAST_EXPECT(obj.
object.has_value()))
1487 BEAST_EXPECT(obj.
object->isFieldPresent(sfXChainBridge));
1488 auto const& bridgeField = (*obj.
object)[sfXChainBridge];
1490 bridgeField->lockingChainIssue().currency.size() == 20);
1492 bridgeField->issuingChainIssue().currency.size() == 20);
1501 issuingChainIssue[
"currency"] =
1502 "0123456789ABCDEF01230123456789ABCDEF0123";
1503 issuingChainIssue[
"issuer"] =
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh";
1505 lockingChainIssue[
"currency"] =
1506 "0123456789ABCDEF01230123456789ABCDEF0123";
1507 lockingChainIssue[
"issuer"] =
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh";
1508 bridge[
"LockingChainIssue"] = lockingChainIssue;
1509 bridge[
"IssuingChainIssue"] = issuingChainIssue;
1510 bridge[
"LockingChainDoor"] =
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh";
1511 bridge[
"IssuingChainDoor"] =
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh";
1512 j[sfXChainBridge] = bridge;
1514 if (BEAST_EXPECT(obj.
object.has_value()))
1516 BEAST_EXPECT(obj.
object->isFieldPresent(sfXChainBridge));
1517 auto const& bridgeField = (*obj.
object)[sfXChainBridge];
1519 bridgeField->lockingChainIssue().currency.size() == 20);
1521 bridgeField->issuingChainIssue().currency.size() == 20);
1530 issuingChainIssue[
"currency"] =
"USD";
1531 issuingChainIssue[
"issuer"] =
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh";
1532 bridge[
"IssuingChainIssue"] = issuingChainIssue;
1533 bridge[
"LockingChainDoor"] =
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh";
1534 bridge[
"IssuingChainDoor"] =
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh";
1535 j[sfXChainBridge] = bridge;
1537 BEAST_EXPECT(!obj.
object.has_value());
1545 lockingChainIssue[
"currency"] =
"EUR";
1546 lockingChainIssue[
"issuer"] =
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh";
1547 bridge[
"LockingChainIssue"] = lockingChainIssue;
1548 bridge[
"LockingChainDoor"] =
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh";
1549 bridge[
"IssuingChainDoor"] =
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh";
1550 j[sfXChainBridge] = bridge;
1552 BEAST_EXPECT(!obj.
object.has_value());
1560 issuingChainIssue[
"currency"] =
"USD";
1561 issuingChainIssue[
"issuer"] =
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh";
1562 bridge[
"IssuingChainIssue"] = issuingChainIssue;
1564 lockingChainIssue[
"currency"] =
"EUR";
1565 lockingChainIssue[
"issuer"] =
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh";
1566 bridge[
"LockingChainIssue"] = lockingChainIssue;
1567 bridge[
"IssuingChainDoor"] =
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh";
1568 j[sfXChainBridge] = bridge;
1570 BEAST_EXPECT(!obj.
object.has_value());
1578 issuingChainIssue[
"currency"] =
"USD";
1579 issuingChainIssue[
"issuer"] =
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh";
1580 bridge[
"IssuingChainIssue"] = issuingChainIssue;
1582 lockingChainIssue[
"currency"] =
"EUR";
1583 lockingChainIssue[
"issuer"] =
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh";
1584 bridge[
"LockingChainIssue"] = lockingChainIssue;
1585 bridge[
"LockingChainDoor"] =
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh";
1586 j[sfXChainBridge] = bridge;
1588 BEAST_EXPECT(!obj.
object.has_value());
1595 bridge[
"LockingChainIssue"] =
"notanobject";
1596 bridge[
"IssuingChainIssue"] =
"notanobject";
1597 j[sfXChainBridge] = bridge;
1599 BEAST_EXPECT(!obj.
object.has_value());
1607 asset[
"issuer"] =
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh";
1609 lockingChainIssue[
"currency"] =
"EUR";
1610 lockingChainIssue[
"issuer"] =
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh";
1611 bridge[
"LockingChainIssue"] = lockingChainIssue;
1612 bridge[
"IssuingChainIssue"] = asset;
1613 j[sfXChainBridge] = bridge;
1615 BEAST_EXPECT(!obj.
object.has_value());
1623 asset[
"currency"] =
"USD";
1625 lockingChainIssue[
"currency"] =
"EUR";
1626 lockingChainIssue[
"issuer"] =
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh";
1627 bridge[
"LockingChainIssue"] = lockingChainIssue;
1628 bridge[
"IssuingChainIssue"] = asset;
1629 j[sfXChainBridge] = bridge;
1631 BEAST_EXPECT(!obj.
object.has_value());
1639 asset[
"currency"] =
"USD";
1640 asset[
"issuer"] =
"notAValidBase58Account";
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());
1654 j[sfXChainBridge] =
"notanobject";
1656 BEAST_EXPECT(!obj.
object.has_value());
1667 j[sfNumber] = 12345;
1669 BEAST_EXPECT(obj.
object.has_value());
1670 BEAST_EXPECT(obj.
object->isFieldPresent(sfNumber));
1672 obj.
object->getFieldNumber(sfNumber).value() ==
1679 j[sfNumber] = 12345u;
1681 BEAST_EXPECT(obj.
object.has_value());
1682 BEAST_EXPECT(obj.
object->isFieldPresent(sfNumber));
1684 obj.
object->getFieldNumber(sfNumber).value() ==
1691 j[sfNumber] =
"67890";
1693 BEAST_EXPECT(obj.
object.has_value());
1694 BEAST_EXPECT(obj.
object->isFieldPresent(sfNumber));
1696 obj.
object->getFieldNumber(sfNumber).value() ==
1705 BEAST_EXPECT(obj.
object.has_value());
1706 BEAST_EXPECT(obj.
object->isFieldPresent(sfNumber));
1708 obj.
object->getFieldNumber(sfNumber).value() ==
Number(-42, 0));
1714 j[sfNumber] =
"-123";
1716 BEAST_EXPECT(obj.
object.has_value());
1717 BEAST_EXPECT(obj.
object->isFieldPresent(sfNumber));
1719 obj.
object->getFieldNumber(sfNumber).value() ==
1726 j[sfNumber] =
"3.14159";
1728 if (BEAST_EXPECT(obj.
object.has_value()))
1730 BEAST_EXPECT(obj.
object->isFieldPresent(sfNumber));
1732 obj.
object->getFieldNumber(sfNumber).value() ==
1740 j[sfNumber] =
"notanumber";
1742 BEAST_EXPECT(!obj.
object.has_value());
1750 BEAST_EXPECT(!obj.
object.has_value());
1758 BEAST_EXPECT(!obj.
object.has_value());
1766 BEAST_EXPECT(!obj.
object.has_value());
1778 objVal[sfTransactionResult] = 1;
1779 j[sfTransactionMetaData] = objVal;
1781 BEAST_EXPECT(obj.
object.has_value());
1782 BEAST_EXPECT(obj.
object->isFieldPresent(sfTransactionMetaData));
1783 auto const& result =
1784 obj.
object->peekFieldObject(sfTransactionMetaData);
1785 BEAST_EXPECT(result.getFieldU8(sfTransactionResult) == 1);
1791 j[sfTransactionMetaData] =
"notanobject";
1793 BEAST_EXPECT(!obj.
object.has_value());
1801 j[sfTransactionMetaData] = arr;
1803 BEAST_EXPECT(!obj.
object.has_value());
1811 BEAST_EXPECT(!obj.
object.has_value());
1820 for (
int i = 0; i < 63; ++i)
1823 (*current)[sfTransactionMetaData] = next;
1824 current = &((*current)[sfTransactionMetaData]);
1826 (*current)[sfTransactionResult.getJsonName()] = 1;
1827 j[sfTransactionMetaData] = obj;
1829 BEAST_EXPECT(parsed.
object.has_value());
1830 BEAST_EXPECT(parsed.
object->isFieldPresent(sfTransactionMetaData));
1838 for (
int i = 0; i < 64; ++i)
1841 (*current)[sfTransactionMetaData] = next;
1842 current = &((*current)[sfTransactionMetaData]);
1844 (*current)[sfTransactionResult.getJsonName()] = 1;
1845 j[sfTransactionMetaData] = obj;
1847 BEAST_EXPECT(!parsed.
object.has_value());
1860 elem[sfTransactionResult] = 2;
1862 elem2[sfTransactionMetaData] = elem;
1864 j[sfSignerEntries] = arr;
1866 BEAST_EXPECT(obj.
object.has_value());
1867 BEAST_EXPECT(obj.
object->isFieldPresent(sfSignerEntries));
1868 auto const& result = obj.
object->getFieldArray(sfSignerEntries);
1869 if (BEAST_EXPECT(result.size() == 1))
1871 BEAST_EXPECT(result[0].getFName() == sfTransactionMetaData);
1872 BEAST_EXPECT(result[0].
getJson(0) == elem);
1880 arr.
append(
"notanobject");
1881 j[sfSignerEntries] = arr;
1883 BEAST_EXPECT(!obj.
object.has_value());
1891 elem[
"invalidField"] = 1;
1893 j[sfSignerEntries] = arr;
1895 BEAST_EXPECT(!obj.
object.has_value());
1903 elem[sfTransactionResult] = 2;
1904 elem[sfNetworkID] = 3;
1906 j[sfSignerEntries] = arr;
1908 BEAST_EXPECT(!obj.
object.has_value());
1914 j[sfSignerEntries] =
"notanarray";
1916 BEAST_EXPECT(!obj.
object.has_value());
1925 elem[sfTransactionResult] =
"notanint";
1927 j[sfSignerEntries] = arr;
1929 BEAST_EXPECT(!obj.
object.has_value());
1936 j[sfSignerEntries] = arr;
1938 BEAST_EXPECT(obj.
object.has_value());
1939 BEAST_EXPECT(obj.
object->isFieldPresent(sfSignerEntries));
1947 obj[0u][sfTransactionResult] = 1;
1948 j[sfSignerEntries] = obj;
1950 BEAST_EXPECT(!parsed.
object.has_value());
1971 "\"ModifiedNode\":{\"Sequence\":1}, "
1972 "\"DeletedNode\":{\"Sequence\":1}"
1980 BEAST_EXPECT(!parsed.
object);
1986 what.
find(
"First level children of `Template`") != 0);
1998 j[sfLedgerEntry] = 1;
2002 std::string const goodJson(R
"({"CloseResolution":19,"Method":250,)"
2003 R"("TransactionResult":"tecFROZEN"})");
2009 if (BEAST_EXPECT(parsed.
object))
2013 BEAST_EXPECT(serialized == goodJson);
2020 R
"({"CloseResolution":19,"Method":"250",)"
2021 R"("TransactionResult":"tecFROZEN"})");
2023 R
"({"CloseResolution":19,"Method":250,)"
2024 R"("TransactionResult":"tecFROZEN"})");
2033 if (BEAST_EXPECT(parsed.
object))
2037 BEAST_EXPECT(serialized == expectedJson);
2044 R
"({"CloseResolution":"19","Method":"250",)"
2045 R"("TransactionResult":"tecFROZEN"})");
2047 R
"({"CloseResolution":19,"Method":250,)"
2048 R"("TransactionResult":"tecFROZEN"})");
2057 if (BEAST_EXPECT(parsed.
object))
2061 BEAST_EXPECT(serialized == expectedJson);
2067 std::string const json(R
"({"CloseResolution":19,"Method":250,)"
2068 R"("TransactionResult":"terQUEUED"})");
2074 BEAST_EXPECT(!parsed.
object);
2075 BEAST_EXPECT(parsed.
error);
2076 BEAST_EXPECT(parsed.
error[jss::error] ==
"invalidParams");
2078 parsed.
error[jss::error_message] ==
2079 "Field 'test.TransactionResult' is out of range.");
2084 std::string const json(R
"({"CloseResolution":19,"Method":"pony",)"
2085 R"("TransactionResult":"tesSUCCESS"})");
2091 BEAST_EXPECT(!parsed.
object);
2092 BEAST_EXPECT(parsed.
error);
2093 BEAST_EXPECT(parsed.
error[jss::error] ==
"invalidParams");
2095 parsed.
error[jss::error_message] ==
2096 "Field 'test.Method' has bad type.");
2102 R
"({"CloseResolution":19,"Method":3294967296,)"
2103 R"("TransactionResult":"tesSUCCESS"})");
2109 BEAST_EXPECT(!parsed.
object);
2110 BEAST_EXPECT(parsed.
error);
2111 BEAST_EXPECT(parsed.
error[jss::error] ==
"invalidParams");
2113 parsed.
error[jss::error_message] ==
2114 "Field 'test.Method' is out of range.");
2119 std::string const json(R
"({"CloseResolution":-10,"Method":42,)"
2120 R"("TransactionResult":"tesSUCCESS"})");
2126 BEAST_EXPECT(!parsed.
object);
2127 BEAST_EXPECT(parsed.
error);
2128 BEAST_EXPECT(parsed.
error[jss::error] ==
"invalidParams");
2130 parsed.
error[jss::error_message] ==
2131 "Field 'test.CloseResolution' is out of range.");
2137 R
"({"CloseResolution":19,"Method":3.141592653,)"
2138 R"("TransactionResult":"tesSUCCESS"})");
2144 BEAST_EXPECT(!parsed.
object);
2145 BEAST_EXPECT(parsed.
error);
2146 BEAST_EXPECT(parsed.
error[jss::error] ==
"invalidParams");
2148 parsed.
error[jss::error_message] ==
2149 "Field 'test.Method' has bad type.");
2154 std::string const goodJson(R
"({"CloseResolution":19,"Method":250,)"
2155 R"("TransferFee":"65535"})");
2157 R
"({"CloseResolution":19,"Method":250,)"
2158 R"("TransferFee":65535})");
2164 if (BEAST_EXPECT(parsed.
object))
2168 BEAST_EXPECT(serialized == expectedJson);
2174 std::string const json(R
"({"CloseResolution":19,"Method":250,)"
2175 R"("TransferFee":"65536"})");
2181 BEAST_EXPECT(!parsed.
object);
2182 BEAST_EXPECT(parsed.
error);
2183 BEAST_EXPECT(parsed.
error[jss::error] ==
"invalidParams");
2185 parsed.
error[jss::error_message] ==
2186 "Field 'test.TransferFee' has invalid data.");
2191 std::string const json(R
"({"CloseResolution":19,"Method":250,)"
2192 R"("TransferFee":"Payment"})");
2198 BEAST_EXPECT(!parsed.
object);
2199 BEAST_EXPECT(parsed.
error);
2200 BEAST_EXPECT(parsed.
error[jss::error] ==
"invalidParams");
2202 parsed.
error[jss::error_message] ==
2203 "Field 'test.TransferFee' has invalid data.");
2208 std::string const json(R
"({"CloseResolution":19,"Method":250,)"
2209 R"("TransferFee":true})");
2215 BEAST_EXPECT(!parsed.
object);
2216 BEAST_EXPECT(parsed.
error);
2217 BEAST_EXPECT(parsed.
error[jss::error] ==
"invalidParams");
2219 parsed.
error[jss::error_message] ==
2220 "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.
std::string toStyledString() const
bool unexpected(Condition shouldBeFalse, String const &reason)
testcase_t testcase
Memberspace for declaring test cases.
A currency issued by an account.
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.
bool parseJSONString(std::string const &json, Json::Value &to)
void run() override
Runs the suite.
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.
std::string toBase58(AccountID const &v)
Convert AccountID to base58 checked string.
@ current
This was a new validation and was added.
std::string to_string(base_uint< Bits, Tag > const &a)
Json::Value getJson(LedgerFill const &fill)
Return a new Json::Value representing the ledger with given options.