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());
31 BEAST_EXPECT(obj.
object->isFieldPresent(sfCloseResolution));
33 BEAST_EXPECT(obj.
object->getFieldU8(sfCloseResolution) == 255);
39 j[sfCloseResolution] = 255u;
41 BEAST_EXPECT(obj.
object.has_value());
43 BEAST_EXPECT(obj.
object->isFieldPresent(sfCloseResolution));
45 BEAST_EXPECT(obj.
object->getFieldU8(sfCloseResolution) == 255);
51 j[sfCloseResolution] =
"255";
53 BEAST_EXPECT(obj.
object.has_value());
55 BEAST_EXPECT(obj.
object->isFieldPresent(sfCloseResolution));
57 BEAST_EXPECT(obj.
object->getFieldU8(sfCloseResolution) == 255);
63 j[sfCloseResolution] = 0;
65 BEAST_EXPECT(obj.
object.has_value());
67 BEAST_EXPECT(obj.
object->getFieldU8(sfCloseResolution) == 0);
73 j[sfCloseResolution] = -1;
75 BEAST_EXPECT(!obj.
object.has_value());
81 j[sfCloseResolution] = 256;
83 BEAST_EXPECT(!obj.
object.has_value());
91 BEAST_EXPECT(!obj.
object.has_value());
99 BEAST_EXPECT(!obj.
object.has_value());
110 j[sfLedgerEntryType] = 65535;
112 BEAST_EXPECT(obj.
object.has_value());
114 BEAST_EXPECT(obj.
object->isFieldPresent(sfLedgerEntryType));
116 BEAST_EXPECT(obj.
object->getFieldU16(sfLedgerEntryType) == 65535);
122 j[sfLedgerEntryType] = 65535u;
124 BEAST_EXPECT(obj.
object.has_value());
126 BEAST_EXPECT(obj.
object->isFieldPresent(sfLedgerEntryType));
128 BEAST_EXPECT(obj.
object->getFieldU16(sfLedgerEntryType) == 65535);
134 j[sfLedgerEntryType] =
"65535";
136 BEAST_EXPECT(obj.
object.has_value());
138 BEAST_EXPECT(obj.
object->isFieldPresent(sfLedgerEntryType));
140 BEAST_EXPECT(obj.
object->getFieldU16(sfLedgerEntryType) == 65535);
146 j[sfLedgerEntryType] = 0;
148 BEAST_EXPECT(obj.
object.has_value());
150 BEAST_EXPECT(obj.
object->getFieldU16(sfLedgerEntryType) == 0);
156 j[sfLedgerEntryType] = -1;
158 BEAST_EXPECT(!obj.
object.has_value());
164 j[sfLedgerEntryType] = 65536;
166 BEAST_EXPECT(!obj.
object.has_value());
172 j[sfLedgerEntryType] =
"65536";
174 BEAST_EXPECT(!obj.
object.has_value());
182 BEAST_EXPECT(!obj.
object.has_value());
190 BEAST_EXPECT(!obj.
object.has_value());
196 j[sfTransferFee] =
"Payment";
198 BEAST_EXPECT(!obj.
object.has_value());
208 j[sfNetworkID] = 4294967295u;
210 BEAST_EXPECT(obj.
object.has_value());
212 BEAST_EXPECT(obj.
object->isFieldPresent(sfNetworkID));
214 BEAST_EXPECT(obj.
object->getFieldU32(sfNetworkID) == 4294967295u);
220 j[sfNetworkID] =
"4294967295";
222 BEAST_EXPECT(obj.
object.has_value());
224 BEAST_EXPECT(obj.
object->isFieldPresent(sfNetworkID));
226 BEAST_EXPECT(obj.
object->getFieldU32(sfNetworkID) == 4294967295u);
234 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());
282 BEAST_EXPECT(obj.
object->isFieldPresent(sfIndexNext));
284 BEAST_EXPECT(obj.
object->getFieldU64(sfIndexNext) == 18446744073709551615ull);
292 BEAST_EXPECT(obj.
object.has_value());
294 BEAST_EXPECT(obj.
object->getFieldU64(sfIndexNext) == 0ull);
302 BEAST_EXPECT(!obj.
object.has_value());
311 j[sfIndexNext] =
"10000000000000000";
313 BEAST_EXPECT(!obj.
object.has_value());
319 j[sfIndexNext] =
"0xabcdefabcdef";
321 BEAST_EXPECT(!obj.
object.has_value());
327 j[sfIndexNext] =
"abcdefga";
329 BEAST_EXPECT(!obj.
object.has_value());
337 BEAST_EXPECT(!obj.
object.has_value());
345 BEAST_EXPECT(!obj.
object.has_value());
355 j[sfEmailHash] =
"0123456789ABCDEF0123456789ABCDEF";
357 BEAST_EXPECT(obj.
object.has_value());
359 BEAST_EXPECT(obj.
object->isFieldPresent(sfEmailHash));
361 BEAST_EXPECT(obj.
object->getFieldH128(sfEmailHash).size() == 16);
380 BEAST_EXPECT(obj.
object->getFieldH128(sfEmailHash) ==
uint128{expected});
386 j[sfEmailHash] =
"0123456789abcdef0123456789abcdef";
388 BEAST_EXPECT(obj.
object.has_value());
390 BEAST_EXPECT(obj.
object->isFieldPresent(sfEmailHash));
392 BEAST_EXPECT(obj.
object->getFieldH128(sfEmailHash).size() == 16);
400 BEAST_EXPECT(obj.
object.has_value());
402 BEAST_EXPECT(obj.
object->isFieldPresent(sfEmailHash));
404 auto const& h128 = obj.
object->getFieldH128(sfEmailHash);
405 BEAST_EXPECT(h128.size() == 16);
407 std::all_of(h128.begin(), h128.end(), [](
auto b) { return b == 0; });
408 BEAST_EXPECT(allZero);
414 j[sfEmailHash] =
"0123456789ABCDEF0123456789ABCDE";
416 BEAST_EXPECT(!obj.
object.has_value());
422 j[sfEmailHash] =
"nothexstring";
424 BEAST_EXPECT(!obj.
object.has_value());
430 j[sfEmailHash] =
"01234567";
432 BEAST_EXPECT(!obj.
object.has_value());
438 j[sfEmailHash] =
"0123456789ABCDEF0123456789ABCDEF00";
440 BEAST_EXPECT(!obj.
object.has_value());
448 BEAST_EXPECT(!obj.
object.has_value());
456 BEAST_EXPECT(!obj.
object.has_value());
466 j[sfTakerPaysCurrency] =
"0123456789ABCDEF0123456789ABCDEF01234567";
468 BEAST_EXPECT(obj.
object.has_value());
470 BEAST_EXPECT(obj.
object->isFieldPresent(sfTakerPaysCurrency));
472 BEAST_EXPECT(obj.
object->getFieldH160(sfTakerPaysCurrency).size() == 20);
474 0xEF, 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB,
475 0xCD, 0xEF, 0x01, 0x23, 0x45, 0x67};
477 BEAST_EXPECT(obj.
object->getFieldH160(sfTakerPaysCurrency) ==
uint160{expected});
482 j[sfTakerPaysCurrency] =
"0123456789abcdef0123456789abcdef01234567";
484 BEAST_EXPECT(obj.
object.has_value());
486 BEAST_EXPECT(obj.
object->isFieldPresent(sfTakerPaysCurrency));
488 BEAST_EXPECT(obj.
object->getFieldH160(sfTakerPaysCurrency).size() == 20);
494 j[sfTakerPaysCurrency] =
"";
496 BEAST_EXPECT(obj.
object.has_value());
498 BEAST_EXPECT(obj.
object->isFieldPresent(sfTakerPaysCurrency));
500 auto const& h160 = obj.
object->getFieldH160(sfTakerPaysCurrency);
501 BEAST_EXPECT(h160.size() == 20);
503 std::all_of(h160.begin(), h160.end(), [](
auto b) { return b == 0; });
504 BEAST_EXPECT(allZero);
510 j[sfTakerPaysCurrency] =
"nothexstring";
512 BEAST_EXPECT(!obj.
object.has_value());
518 j[sfTakerPaysCurrency] =
"01234567";
520 BEAST_EXPECT(!obj.
object.has_value());
526 j[sfTakerPaysCurrency] =
"0123456789ABCDEF0123456789ABCDEF0123456789";
528 BEAST_EXPECT(!obj.
object.has_value());
536 BEAST_EXPECT(!obj.
object.has_value());
544 BEAST_EXPECT(!obj.
object.has_value());
554 j[sfMPTokenIssuanceID] =
"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF";
556 BEAST_EXPECT(obj.
object.has_value());
558 BEAST_EXPECT(obj.
object->isFieldPresent(sfMPTokenIssuanceID));
560 BEAST_EXPECT(obj.
object->getFieldH192(sfMPTokenIssuanceID).size() == 24);
562 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
563 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
565 BEAST_EXPECT(obj.
object->getFieldH192(sfMPTokenIssuanceID) ==
uint192{expected});
571 j[sfMPTokenIssuanceID] =
"ffffffffffffffffffffffffffffffffffffffffffffffff";
573 BEAST_EXPECT(obj.
object.has_value());
575 BEAST_EXPECT(obj.
object->isFieldPresent(sfMPTokenIssuanceID));
577 BEAST_EXPECT(obj.
object->getFieldH192(sfMPTokenIssuanceID).size() == 24);
583 j[sfMPTokenIssuanceID] =
"";
585 BEAST_EXPECT(obj.
object.has_value());
587 BEAST_EXPECT(obj.
object->isFieldPresent(sfMPTokenIssuanceID));
589 auto const& h192 = obj.
object->getFieldH192(sfMPTokenIssuanceID);
590 BEAST_EXPECT(h192.size() == 24);
592 std::all_of(h192.begin(), h192.end(), [](
auto b) { return b == 0; });
593 BEAST_EXPECT(allZero);
599 j[sfMPTokenIssuanceID] =
"0123456789ABCDEF0123456789ABCDEF0123456789ABCDE";
601 BEAST_EXPECT(!obj.
object.has_value());
607 j[sfMPTokenIssuanceID] =
"nothexstring";
609 BEAST_EXPECT(!obj.
object.has_value());
615 j[sfMPTokenIssuanceID] =
"01234567";
617 BEAST_EXPECT(!obj.
object.has_value());
623 j[sfMPTokenIssuanceID] =
"0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF00";
625 BEAST_EXPECT(!obj.
object.has_value());
633 BEAST_EXPECT(!obj.
object.has_value());
641 BEAST_EXPECT(!obj.
object.has_value());
653 "0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCD"
656 BEAST_EXPECT(obj.
object.has_value());
658 BEAST_EXPECT(obj.
object->isFieldPresent(sfLedgerHash));
660 BEAST_EXPECT(obj.
object->getFieldH256(sfLedgerHash).size() == 32);
662 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF, 0x01, 0x23, 0x45,
663 0x67, 0x89, 0xAB, 0xCD, 0xEF, 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB,
664 0xCD, 0xEF, 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF};
666 BEAST_EXPECT(obj.
object->getFieldH256(sfLedgerHash) ==
uint256{expected});
672 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcd"
675 BEAST_EXPECT(obj.
object.has_value());
677 BEAST_EXPECT(obj.
object->isFieldPresent(sfLedgerHash));
679 BEAST_EXPECT(obj.
object->getFieldH256(sfLedgerHash).size() == 32);
685 j[sfLedgerHash] =
"";
687 BEAST_EXPECT(obj.
object.has_value());
689 BEAST_EXPECT(obj.
object->isFieldPresent(sfLedgerHash));
691 auto const& h256 = obj.
object->getFieldH256(sfLedgerHash);
692 BEAST_EXPECT(h256.size() == 32);
694 std::all_of(h256.begin(), h256.end(), [](
auto b) { return b == 0; });
695 BEAST_EXPECT(allZero);
702 "0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCD"
705 BEAST_EXPECT(!obj.
object.has_value());
711 j[sfLedgerHash] =
"nothexstring";
713 BEAST_EXPECT(!obj.
object.has_value());
719 j[sfLedgerHash] =
"01234567";
721 BEAST_EXPECT(!obj.
object.has_value());
728 "0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCD"
731 BEAST_EXPECT(!obj.
object.has_value());
739 BEAST_EXPECT(!obj.
object.has_value());
747 BEAST_EXPECT(!obj.
object.has_value());
757 int const minInt32 = -2147483648;
758 j[sfLoanScale] = minInt32;
760 BEAST_EXPECT(obj.
object.has_value());
762 if (BEAST_EXPECT(obj.
object->isFieldPresent(sfLoanScale)))
765 BEAST_EXPECT(obj.
object->getFieldI32(sfLoanScale) == minInt32);
772 int const maxInt32 = 2147483647;
773 j[sfLoanScale] = maxInt32;
775 BEAST_EXPECT(obj.
object.has_value());
777 if (BEAST_EXPECT(obj.
object->isFieldPresent(sfLoanScale)))
780 BEAST_EXPECT(obj.
object->getFieldI32(sfLoanScale) == maxInt32);
787 unsigned int const maxUInt32 = 2147483647u;
788 j[sfLoanScale] = maxUInt32;
790 BEAST_EXPECT(obj.
object.has_value());
792 if (BEAST_EXPECT(obj.
object->isFieldPresent(sfLoanScale)))
796 obj.
object->getFieldI32(sfLoanScale) ==
static_cast<int32_t
>(maxUInt32));
803 j[sfLoanScale] =
"2147483647";
805 BEAST_EXPECT(obj.
object.has_value());
807 if (BEAST_EXPECT(obj.
object->isFieldPresent(sfLoanScale)))
810 BEAST_EXPECT(obj.
object->getFieldI32(sfLoanScale) == 2147483647u);
817 int const value = -2147483648;
820 BEAST_EXPECT(obj.
object.has_value());
822 if (BEAST_EXPECT(obj.
object->isFieldPresent(sfLoanScale)))
825 BEAST_EXPECT(obj.
object->getFieldI32(sfLoanScale) == value);
832 j[sfLoanScale] =
"-2147483649";
834 BEAST_EXPECT(!obj.
object.has_value());
840 j[sfLoanScale] = 2147483648u;
842 BEAST_EXPECT(!obj.
object.has_value());
848 j[sfLoanScale] =
"2147483648";
850 BEAST_EXPECT(!obj.
object.has_value());
858 BEAST_EXPECT(!obj.
object.has_value());
866 BEAST_EXPECT(!obj.
object.has_value());
877 j[sfPublicKey] =
"DEADBEEF";
879 BEAST_EXPECT(obj.
object.has_value());
881 BEAST_EXPECT(obj.
object->isFieldPresent(sfPublicKey));
883 obj.
object->getFieldVL(sfPublicKey);
884 BEAST_EXPECT(blob.size() == 4);
885 BEAST_EXPECT(blob[0] == 0xDE);
886 BEAST_EXPECT(blob[1] == 0xAD);
887 BEAST_EXPECT(blob[2] == 0xBE);
888 BEAST_EXPECT(blob[3] == 0xEF);
896 BEAST_EXPECT(obj.
object.has_value());
898 BEAST_EXPECT(obj.
object->isFieldPresent(sfPublicKey));
900 obj.
object->getFieldVL(sfPublicKey);
901 BEAST_EXPECT(blob.empty());
907 j[sfPublicKey] =
"deadbeef";
909 BEAST_EXPECT(obj.
object.has_value());
911 BEAST_EXPECT(obj.
object->isFieldPresent(sfPublicKey));
913 obj.
object->getFieldVL(sfPublicKey);
914 BEAST_EXPECT(blob.size() == 4);
915 BEAST_EXPECT(blob[0] == 0xDE);
916 BEAST_EXPECT(blob[1] == 0xAD);
917 BEAST_EXPECT(blob[2] == 0xBE);
918 BEAST_EXPECT(blob[3] == 0xEF);
924 j[sfPublicKey] =
"XYZ123";
926 BEAST_EXPECT(!obj.
object.has_value());
934 BEAST_EXPECT(!obj.
object.has_value());
942 BEAST_EXPECT(!obj.
object.has_value());
955 "0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCD"
958 "FEDCBA9876543210FEDCBA9876543210FEDCBA9876543210FEDCBA98765432"
962 BEAST_EXPECT(obj.
object.has_value());
964 BEAST_EXPECT(obj.
object->isFieldPresent(sfHashes));
966 obj.
object->getFieldV256(sfHashes);
967 BEAST_EXPECT(vec.size() == 2);
968 BEAST_EXPECT(
to_string(vec[0]) == arr[0u].asString());
969 BEAST_EXPECT(
to_string(vec[1]) == arr[1u].asString());
977 BEAST_EXPECT(obj.
object.has_value());
979 BEAST_EXPECT(obj.
object->isFieldPresent(sfHashes));
981 obj.
object->getFieldV256(sfHashes);
982 BEAST_EXPECT(vec.empty());
989 arr.
append(
"nothexstring");
992 BEAST_EXPECT(!obj.
object.has_value());
999 arr.
append(
"0123456789ABCDEF");
1002 BEAST_EXPECT(!obj.
object.has_value());
1012 BEAST_EXPECT(!obj.
object.has_value());
1018 j[sfHashes] =
"notanarray";
1020 BEAST_EXPECT(!obj.
object.has_value());
1028 objElem[
"foo"] =
"bar";
1032 BEAST_EXPECT(!obj.
object.has_value());
1043 j[sfAccount] =
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh";
1045 BEAST_EXPECT(obj.
object.has_value());
1047 BEAST_EXPECT(obj.
object->isFieldPresent(sfAccount));
1049 obj.
object->getAccountID(sfAccount);
1050 BEAST_EXPECT(acct.size() == 20);
1051 BEAST_EXPECT(
toBase58(acct) ==
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh");
1057 j[sfAccount] =
"000102030405060708090A0B0C0D0E0F10111213";
1059 BEAST_EXPECT(obj.
object.has_value());
1061 BEAST_EXPECT(obj.
object->isFieldPresent(sfAccount));
1063 obj.
object->getAccountID(sfAccount);
1064 BEAST_EXPECT(acct.size() == 20);
1070 j[sfAccount] =
"notAValidBase58Account";
1072 BEAST_EXPECT(!obj.
object.has_value());
1078 j[sfAccount] =
"001122334455";
1080 BEAST_EXPECT(!obj.
object.has_value());
1086 j[sfAccount] =
"000102030405060708090A0B0C0D0E0F101112131415";
1088 BEAST_EXPECT(!obj.
object.has_value());
1094 j[sfAccount] =
"000102030405060708090A0B0C0D0E0F1011121G";
1096 BEAST_EXPECT(!obj.
object.has_value());
1104 BEAST_EXPECT(!obj.
object.has_value());
1112 BEAST_EXPECT(!obj.
object.has_value());
1120 BEAST_EXPECT(!obj.
object.has_value());
1131 j[sfBaseAsset] =
"USD";
1133 BEAST_EXPECT(obj.
object.has_value());
1135 BEAST_EXPECT(obj.
object->isFieldPresent(sfBaseAsset));
1137 auto const& curr = obj.
object->getFieldCurrency(sfBaseAsset);
1138 BEAST_EXPECT(curr.currency().size() == 20);
1144 j[sfBaseAsset] =
"EUR";
1146 BEAST_EXPECT(obj.
object.has_value());
1148 BEAST_EXPECT(obj.
object->isFieldPresent(sfBaseAsset));
1150 auto const& curr = obj.
object->getFieldCurrency(sfBaseAsset);
1151 BEAST_EXPECT(curr.currency().size() == 20);
1157 j[sfBaseAsset] =
"0123456789ABCDEF01230123456789ABCDEF0123";
1161 BEAST_EXPECT(obj.
object->isFieldPresent(sfBaseAsset));
1162 auto const& curr = obj.
object->getFieldCurrency(sfBaseAsset);
1163 BEAST_EXPECT(curr.currency().size() == 20);
1170 j[sfBaseAsset] =
"USDD";
1172 BEAST_EXPECT(!obj.
object.has_value());
1178 j[sfBaseAsset] =
"usd";
1180 BEAST_EXPECT(obj.
object.has_value());
1182 BEAST_EXPECT(obj.
object->isFieldPresent(sfBaseAsset));
1184 auto const& curr = obj.
object->getFieldCurrency(sfBaseAsset);
1185 BEAST_EXPECT(curr.currency().size() == 20);
1191 j[sfBaseAsset] =
"0123456789AB";
1193 BEAST_EXPECT(!obj.
object.has_value());
1199 j[sfBaseAsset] =
"0123456789ABCDEF0123456789";
1201 BEAST_EXPECT(!obj.
object.has_value());
1207 j[sfBaseAsset] =
"";
1209 BEAST_EXPECT(obj.
object.has_value());
1211 BEAST_EXPECT(obj.
object->isFieldPresent(sfBaseAsset));
1213 auto const& curr = obj.
object->getFieldCurrency(sfBaseAsset);
1214 BEAST_EXPECT(curr.currency().size() == 20);
1222 BEAST_EXPECT(!obj.
object.has_value());
1230 BEAST_EXPECT(!obj.
object.has_value());
1241 j[sfAmount] =
"100000000000000000";
1243 BEAST_EXPECT(obj.
object.has_value());
1245 BEAST_EXPECT(obj.
object->isFieldPresent(sfAmount));
1247 BEAST_EXPECT(obj.
object->getFieldAmount(sfAmount) ==
STAmount(100000000000000000ull));
1253 j[sfAmount] = 4294967295u;
1255 BEAST_EXPECT(obj.
object.has_value());
1257 BEAST_EXPECT(obj.
object->isFieldPresent(sfAmount));
1259 BEAST_EXPECT(obj.
object->getFieldAmount(sfAmount) ==
STAmount(4294967295u));
1265 j[sfAmount] =
"123.45";
1267 BEAST_EXPECT(!obj.
object.has_value());
1275 BEAST_EXPECT(!obj.
object.has_value());
1281 j[sfAmount] =
"notanumber";
1283 BEAST_EXPECT(!obj.
object.has_value());
1291 BEAST_EXPECT(!obj.
object.has_value());
1304 elem[
"account"] =
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh";
1305 elem[
"currency"] =
"USD";
1306 elem[
"issuer"] =
"rPT1Sjq2YGrBMTttX4GZHjKu9dyfzbpAYe";
1310 j[sfPaths] = pathset;
1312 if (BEAST_EXPECT(obj.
object.has_value()))
1315 BEAST_EXPECT(obj.
object->isFieldPresent(sfPaths));
1317 auto const& ps = obj.
object->getFieldPathSet(sfPaths);
1318 BEAST_EXPECT(!ps.empty());
1319 BEAST_EXPECT(ps.size() == 1);
1320 BEAST_EXPECT(ps[0].size() == 1);
1322 ps[0][0].getAccountID() ==
1323 parseBase58<AccountID>(
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh"));
1324 BEAST_EXPECT(
to_string(ps[0][0].getCurrency()) ==
"USD");
1326 ps[0][0].getIssuerID() ==
1327 parseBase58<AccountID>(
"rPT1Sjq2YGrBMTttX4GZHjKu9dyfzbpAYe"));
1336 elem[
"account"] =
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh";
1337 elem[
"currency"] =
"0123456789ABCDEF01230123456789ABCDEF0123";
1338 elem[
"issuer"] =
"rPT1Sjq2YGrBMTttX4GZHjKu9dyfzbpAYe";
1342 j[sfPaths] = pathset;
1344 BEAST_EXPECT(obj.
object.has_value());
1346 obj.
object->isFieldPresent(sfPaths));
1348 obj.
object->getFieldPathSet(sfPaths);
1349 BEAST_EXPECT(!ps.empty());
1355 j[sfPaths] =
"notanarray";
1357 BEAST_EXPECT(!obj.
object.has_value());
1364 pathset.
append(
"notanarray");
1365 j[sfPaths] = pathset;
1367 BEAST_EXPECT(!obj.
object.has_value());
1375 path.
append(
"notanobject");
1378 j[sfPaths] = pathset;
1380 BEAST_EXPECT(!obj.
object.has_value());
1389 elem[
"foo"] =
"bar";
1393 j[sfPaths] = pathset;
1395 BEAST_EXPECT(!obj.
object.has_value());
1404 elem[
"account"] =
"notAValidBase58Account";
1408 j[sfPaths] = pathset;
1410 BEAST_EXPECT(!obj.
object.has_value());
1418 elem[
"account"] = 12345;
1422 j[sfPaths] = pathset;
1424 BEAST_EXPECT(!obj.
object.has_value());
1432 elem[
"currency"] = 12345;
1436 j[sfPaths] = pathset;
1438 BEAST_EXPECT(!obj.
object.has_value());
1446 elem[
"currency"] =
"notAValidCurrency";
1450 j[sfPaths] = pathset;
1452 BEAST_EXPECT(!obj.
object.has_value());
1460 elem[
"issuer"] = 12345;
1464 j[sfPaths] = pathset;
1466 BEAST_EXPECT(!obj.
object.has_value());
1474 elem[
"issuer"] =
"notAValidBase58Account";
1478 j[sfPaths] = pathset;
1480 BEAST_EXPECT(!obj.
object.has_value());
1492 issueJson[
"currency"] =
"USD";
1493 issueJson[
"issuer"] =
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh";
1494 j[sfAsset] = issueJson;
1496 if (BEAST_EXPECT(obj.
object.has_value()))
1499 BEAST_EXPECT(obj.
object->isFieldPresent(sfAsset));
1500 auto const& issueField =
1502 auto const issue = issueField.value().get<
Issue>();
1503 BEAST_EXPECT(issue.currency.size() == 20);
1504 BEAST_EXPECT(
to_string(issue.currency) ==
"USD");
1505 BEAST_EXPECT(issue.account.size() == 20);
1507 issue.account == parseBase58<AccountID>(
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh"));
1515 issueJson[
"currency"] =
"0123456789ABCDEF01230123456789ABCDEF0123";
1516 issueJson[
"issuer"] =
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh";
1517 j[sfAsset] = issueJson;
1521 BEAST_EXPECT(obj.
object->isFieldPresent(sfAsset));
1522 auto const& issueField = (*obj.
object)[sfAsset];
1523 auto const issue = issueField.value().get<
Issue>();
1524 BEAST_EXPECT(issue.currency.size() == 20);
1525 BEAST_EXPECT(issue.account.size() == 20);
1533 issueJson[
"mpt_issuance_id"] =
"0000000000000000000000004D5054494431323334234234";
1534 j[sfAsset] = issueJson;
1538 BEAST_EXPECT(obj.
object->isFieldPresent(sfAsset));
1539 auto const& issueField = (*obj.
object)[sfAsset];
1540 auto const issue = issueField.value().get<
MPTIssue>();
1541 BEAST_EXPECT(issue.getMptID().size() == 24);
1549 issue[
"issuer"] =
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh";
1552 BEAST_EXPECT(!obj.
object.has_value());
1559 issue[
"currency"] =
"USD";
1562 BEAST_EXPECT(!obj.
object.has_value());
1569 issue[
"currency"] =
"USDD";
1570 issue[
"issuer"] =
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh";
1573 BEAST_EXPECT(!obj.
object.has_value());
1580 issue[
"currency"] =
"USD";
1581 issue[
"issuer"] =
"notAValidIssuer";
1584 BEAST_EXPECT(!obj.
object.has_value());
1592 issue[
"issuer"] =
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh";
1595 BEAST_EXPECT(!obj.
object.has_value());
1602 issue[
"currency"] =
"USD";
1606 BEAST_EXPECT(!obj.
object.has_value());
1612 j[sfAsset] =
"notanobject";
1614 BEAST_EXPECT(!obj.
object.has_value());
1627 issuingChainIssue[
"currency"] =
"USD";
1628 issuingChainIssue[
"issuer"] =
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh";
1630 lockingChainIssue[
"currency"] =
"EUR";
1631 lockingChainIssue[
"issuer"] =
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh";
1632 bridge[
"LockingChainIssue"] = lockingChainIssue;
1633 bridge[
"IssuingChainIssue"] = issuingChainIssue;
1634 bridge[
"LockingChainDoor"] =
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh";
1635 bridge[
"IssuingChainDoor"] =
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh";
1636 j[sfXChainBridge] = bridge;
1640 BEAST_EXPECT(obj.
object->isFieldPresent(sfXChainBridge));
1641 auto const& bridgeField = (*obj.
object)[sfXChainBridge];
1642 BEAST_EXPECT(bridgeField->lockingChainIssue().currency.size() == 20);
1643 BEAST_EXPECT(bridgeField->issuingChainIssue().currency.size() == 20);
1652 issuingChainIssue[
"currency"] =
"0123456789ABCDEF01230123456789ABCDEF0123";
1653 issuingChainIssue[
"issuer"] =
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh";
1655 lockingChainIssue[
"currency"] =
"0123456789ABCDEF01230123456789ABCDEF0123";
1656 lockingChainIssue[
"issuer"] =
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh";
1657 bridge[
"LockingChainIssue"] = lockingChainIssue;
1658 bridge[
"IssuingChainIssue"] = issuingChainIssue;
1659 bridge[
"LockingChainDoor"] =
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh";
1660 bridge[
"IssuingChainDoor"] =
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh";
1661 j[sfXChainBridge] = bridge;
1665 BEAST_EXPECT(obj.
object->isFieldPresent(sfXChainBridge));
1666 auto const& bridgeField = (*obj.
object)[sfXChainBridge];
1667 BEAST_EXPECT(bridgeField->lockingChainIssue().currency.size() == 20);
1668 BEAST_EXPECT(bridgeField->issuingChainIssue().currency.size() == 20);
1677 issuingChainIssue[
"currency"] =
"USD";
1678 issuingChainIssue[
"issuer"] =
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh";
1679 bridge[
"IssuingChainIssue"] = issuingChainIssue;
1680 bridge[
"LockingChainDoor"] =
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh";
1681 bridge[
"IssuingChainDoor"] =
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh";
1682 j[sfXChainBridge] = bridge;
1684 BEAST_EXPECT(!obj.
object.has_value());
1692 lockingChainIssue[
"currency"] =
"EUR";
1693 lockingChainIssue[
"issuer"] =
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh";
1694 bridge[
"LockingChainIssue"] = lockingChainIssue;
1695 bridge[
"LockingChainDoor"] =
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh";
1696 bridge[
"IssuingChainDoor"] =
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh";
1697 j[sfXChainBridge] = bridge;
1699 BEAST_EXPECT(!obj.
object.has_value());
1707 issuingChainIssue[
"currency"] =
"USD";
1708 issuingChainIssue[
"issuer"] =
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh";
1709 bridge[
"IssuingChainIssue"] = issuingChainIssue;
1711 lockingChainIssue[
"currency"] =
"EUR";
1712 lockingChainIssue[
"issuer"] =
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh";
1713 bridge[
"LockingChainIssue"] = lockingChainIssue;
1714 bridge[
"IssuingChainDoor"] =
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh";
1715 j[sfXChainBridge] = bridge;
1717 BEAST_EXPECT(!obj.
object.has_value());
1725 issuingChainIssue[
"currency"] =
"USD";
1726 issuingChainIssue[
"issuer"] =
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh";
1727 bridge[
"IssuingChainIssue"] = issuingChainIssue;
1729 lockingChainIssue[
"currency"] =
"EUR";
1730 lockingChainIssue[
"issuer"] =
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh";
1731 bridge[
"LockingChainIssue"] = lockingChainIssue;
1732 bridge[
"LockingChainDoor"] =
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh";
1733 j[sfXChainBridge] = bridge;
1735 BEAST_EXPECT(!obj.
object.has_value());
1742 bridge[
"LockingChainIssue"] =
"notanobject";
1743 bridge[
"IssuingChainIssue"] =
"notanobject";
1744 j[sfXChainBridge] = bridge;
1746 BEAST_EXPECT(!obj.
object.has_value());
1754 asset[
"issuer"] =
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh";
1756 lockingChainIssue[
"currency"] =
"EUR";
1757 lockingChainIssue[
"issuer"] =
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh";
1758 bridge[
"LockingChainIssue"] = lockingChainIssue;
1759 bridge[
"IssuingChainIssue"] = asset;
1760 j[sfXChainBridge] = bridge;
1762 BEAST_EXPECT(!obj.
object.has_value());
1770 asset[
"currency"] =
"USD";
1772 lockingChainIssue[
"currency"] =
"EUR";
1773 lockingChainIssue[
"issuer"] =
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh";
1774 bridge[
"LockingChainIssue"] = lockingChainIssue;
1775 bridge[
"IssuingChainIssue"] = asset;
1776 j[sfXChainBridge] = bridge;
1778 BEAST_EXPECT(!obj.
object.has_value());
1786 asset[
"currency"] =
"USD";
1787 asset[
"issuer"] =
"notAValidBase58Account";
1789 lockingChainIssue[
"currency"] =
"EUR";
1790 lockingChainIssue[
"issuer"] =
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh";
1791 bridge[
"LockingChainIssue"] = lockingChainIssue;
1792 bridge[
"IssuingChainIssue"] = asset;
1793 j[sfXChainBridge] = bridge;
1795 BEAST_EXPECT(!obj.
object.has_value());
1801 j[sfXChainBridge] =
"notanobject";
1803 BEAST_EXPECT(!obj.
object.has_value());
1814 j[sfNumber] = 12345;
1816 BEAST_EXPECT(obj.
object.has_value());
1818 BEAST_EXPECT(obj.
object->isFieldPresent(sfNumber));
1820 BEAST_EXPECT(obj.
object->getFieldNumber(sfNumber).value() ==
Number(12345, 0));
1826 j[sfNumber] = 12345u;
1828 BEAST_EXPECT(obj.
object.has_value());
1830 BEAST_EXPECT(obj.
object->isFieldPresent(sfNumber));
1832 BEAST_EXPECT(obj.
object->getFieldNumber(sfNumber).value() ==
Number(12345, 0));
1838 j[sfNumber] =
"67890";
1840 BEAST_EXPECT(obj.
object.has_value());
1842 BEAST_EXPECT(obj.
object->isFieldPresent(sfNumber));
1844 BEAST_EXPECT(obj.
object->getFieldNumber(sfNumber).value() ==
Number(67890, 0));
1852 BEAST_EXPECT(obj.
object.has_value());
1854 BEAST_EXPECT(obj.
object->isFieldPresent(sfNumber));
1856 BEAST_EXPECT(obj.
object->getFieldNumber(sfNumber).value() ==
Number(-42, 0));
1862 j[sfNumber] =
"-123";
1864 BEAST_EXPECT(obj.
object.has_value());
1866 BEAST_EXPECT(obj.
object->isFieldPresent(sfNumber));
1868 BEAST_EXPECT(obj.
object->getFieldNumber(sfNumber).value() ==
Number(-123, 0));
1874 j[sfNumber] =
"3.14159";
1878 BEAST_EXPECT(obj.
object->isFieldPresent(sfNumber));
1879 BEAST_EXPECT(obj.
object->getFieldNumber(sfNumber).value() ==
Number(314159, -5));
1886 j[sfNumber] =
"notanumber";
1888 BEAST_EXPECT(!obj.
object.has_value());
1896 BEAST_EXPECT(!obj.
object.has_value());
1904 BEAST_EXPECT(!obj.
object.has_value());
1912 BEAST_EXPECT(!obj.
object.has_value());
1924 objVal[sfTransactionResult] = 1;
1925 j[sfTransactionMetaData] = objVal;
1927 BEAST_EXPECT(obj.
object.has_value());
1929 BEAST_EXPECT(obj.
object->isFieldPresent(sfTransactionMetaData));
1931 auto const& result = obj.
object->peekFieldObject(sfTransactionMetaData);
1932 BEAST_EXPECT(result.getFieldU8(sfTransactionResult) == 1);
1938 j[sfTransactionMetaData] =
"notanobject";
1940 BEAST_EXPECT(!obj.
object.has_value());
1948 j[sfTransactionMetaData] = arr;
1950 BEAST_EXPECT(!obj.
object.has_value());
1958 BEAST_EXPECT(!obj.
object.has_value());
1967 for (
int i = 0; i < 63; ++i)
1970 (*current)[sfTransactionMetaData] = next;
1971 current = &((*current)[sfTransactionMetaData]);
1973 (*current)[sfTransactionResult.getJsonName()] = 1;
1974 j[sfTransactionMetaData] = obj;
1976 BEAST_EXPECT(parsed.
object.has_value());
1978 BEAST_EXPECT(parsed.
object->isFieldPresent(sfTransactionMetaData));
1986 for (
int i = 0; i < 64; ++i)
1989 (*current)[sfTransactionMetaData] = next;
1990 current = &((*current)[sfTransactionMetaData]);
1992 (*current)[sfTransactionResult.getJsonName()] = 1;
1993 j[sfTransactionMetaData] = obj;
1995 BEAST_EXPECT(!parsed.
object.has_value());
2008 elem[sfTransactionResult] = 2;
2010 elem2[sfTransactionMetaData] = elem;
2012 j[sfSignerEntries] = arr;
2014 BEAST_EXPECT(obj.
object.has_value());
2016 BEAST_EXPECT(obj.
object->isFieldPresent(sfSignerEntries));
2018 auto const& result = obj.
object->getFieldArray(sfSignerEntries);
2019 if (BEAST_EXPECT(result.size() == 1))
2021 BEAST_EXPECT(result[0].getFName() == sfTransactionMetaData);
2022 BEAST_EXPECT(result[0].
getJson(0) == elem);
2030 arr.
append(
"notanobject");
2031 j[sfSignerEntries] = arr;
2033 BEAST_EXPECT(!obj.
object.has_value());
2041 elem[
"invalidField"] = 1;
2043 j[sfSignerEntries] = arr;
2045 BEAST_EXPECT(!obj.
object.has_value());
2053 elem[sfTransactionResult] = 2;
2054 elem[sfNetworkID] = 3;
2056 j[sfSignerEntries] = arr;
2058 BEAST_EXPECT(!obj.
object.has_value());
2064 j[sfSignerEntries] =
"notanarray";
2066 BEAST_EXPECT(!obj.
object.has_value());
2075 elem[sfTransactionResult] =
"notanint";
2077 j[sfSignerEntries] = arr;
2079 BEAST_EXPECT(!obj.
object.has_value());
2086 j[sfSignerEntries] = arr;
2088 BEAST_EXPECT(obj.
object.has_value());
2090 BEAST_EXPECT(obj.
object->isFieldPresent(sfSignerEntries));
2098 obj[0u][sfTransactionResult] = 1;
2099 j[sfSignerEntries] = obj;
2101 BEAST_EXPECT(!parsed.
object.has_value());
2122 "\"ModifiedNode\":{\"Sequence\":1}, "
2123 "\"DeletedNode\":{\"Sequence\":1}"
2131 BEAST_EXPECT(!parsed.
object);
2136 unexpected(what.
find(
"First level children of `Template`") != 0);
2148 j[sfLedgerEntry] = 1;
2153 R
"({"CloseResolution":19,"Method":250,)"
2154 R"("TransactionResult":"tecFROZEN"})");
2160 if (BEAST_EXPECT(parsed.
object))
2165 BEAST_EXPECT(serialized == goodJson);
2172 R
"({"CloseResolution":19,"Method":"250",)"
2173 R"("TransactionResult":"tecFROZEN"})");
2175 R
"({"CloseResolution":19,"Method":250,)"
2176 R"("TransactionResult":"tecFROZEN"})");
2185 if (BEAST_EXPECT(parsed.
object))
2190 BEAST_EXPECT(serialized == expectedJson);
2197 R
"({"CloseResolution":"19","Method":"250",)"
2198 R"("TransactionResult":"tecFROZEN"})");
2200 R
"({"CloseResolution":19,"Method":250,)"
2201 R"("TransactionResult":"tecFROZEN"})");
2210 if (BEAST_EXPECT(parsed.
object))
2215 BEAST_EXPECT(serialized == expectedJson);
2222 R
"({"CloseResolution":19,"Method":250,)"
2223 R"("TransactionResult":"terQUEUED"})");
2229 BEAST_EXPECT(!parsed.
object);
2230 BEAST_EXPECT(parsed.
error);
2231 BEAST_EXPECT(parsed.
error[jss::error] ==
"invalidParams");
2233 parsed.
error[jss::error_message] ==
2234 "Field 'test.TransactionResult' is out of range.");
2240 R
"({"CloseResolution":19,"Method":"pony",)"
2241 R"("TransactionResult":"tesSUCCESS"})");
2247 BEAST_EXPECT(!parsed.
object);
2248 BEAST_EXPECT(parsed.
error);
2249 BEAST_EXPECT(parsed.
error[jss::error] ==
"invalidParams");
2251 parsed.
error[jss::error_message] ==
"Field 'test.Method' has bad type.");
2257 R
"({"CloseResolution":19,"Method":3294967296,)"
2258 R"("TransactionResult":"tesSUCCESS"})");
2264 BEAST_EXPECT(!parsed.
object);
2265 BEAST_EXPECT(parsed.
error);
2266 BEAST_EXPECT(parsed.
error[jss::error] ==
"invalidParams");
2268 parsed.
error[jss::error_message] ==
"Field 'test.Method' is out of range.");
2274 R
"({"CloseResolution":-10,"Method":42,)"
2275 R"("TransactionResult":"tesSUCCESS"})");
2281 BEAST_EXPECT(!parsed.
object);
2282 BEAST_EXPECT(parsed.
error);
2283 BEAST_EXPECT(parsed.
error[jss::error] ==
"invalidParams");
2285 parsed.
error[jss::error_message] ==
2286 "Field 'test.CloseResolution' is out of range.");
2292 R
"({"CloseResolution":19,"Method":3.141592653,)"
2293 R"("TransactionResult":"tesSUCCESS"})");
2299 BEAST_EXPECT(!parsed.
object);
2300 BEAST_EXPECT(parsed.
error);
2301 BEAST_EXPECT(parsed.
error[jss::error] ==
"invalidParams");
2303 parsed.
error[jss::error_message] ==
"Field 'test.Method' has bad type.");
2309 R
"({"CloseResolution":19,"Method":250,)"
2310 R"("TransferFee":"65535"})");
2312 R
"({"CloseResolution":19,"Method":250,)"
2313 R"("TransferFee":65535})");
2319 if (BEAST_EXPECT(parsed.
object))
2324 BEAST_EXPECT(serialized == expectedJson);
2331 R
"({"CloseResolution":19,"Method":250,)"
2332 R"("TransferFee":"65536"})");
2338 BEAST_EXPECT(!parsed.
object);
2339 BEAST_EXPECT(parsed.
error);
2340 BEAST_EXPECT(parsed.
error[jss::error] ==
"invalidParams");
2342 parsed.
error[jss::error_message] ==
2343 "Field 'test.TransferFee' has invalid data.");
2349 R
"({"CloseResolution":19,"Method":250,)"
2350 R"("TransferFee":"Payment"})");
2356 BEAST_EXPECT(!parsed.
object);
2357 BEAST_EXPECT(parsed.
error);
2358 BEAST_EXPECT(parsed.
error[jss::error] ==
"invalidParams");
2360 parsed.
error[jss::error_message] ==
2361 "Field 'test.TransferFee' has invalid data.");
2367 R
"({"CloseResolution":19,"Method":250,)"
2368 R"("TransferFee":true})");
2374 BEAST_EXPECT(!parsed.
object);
2375 BEAST_EXPECT(parsed.
error);
2376 BEAST_EXPECT(parsed.
error[jss::error] ==
"invalidParams");
2378 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.
static 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.