20 #include <ripple/beast/unit_test.h>
21 #include <ripple/protocol/ErrorCodes.h>
22 #include <ripple/protocol/TxFlags.h>
23 #include <ripple/protocol/jss.h>
36 testcase(
"acccount_lines");
38 using namespace test::jtx;
42 auto const lines = env.rpc(
"json",
"account_lines",
"{ }");
44 lines[jss::result][jss::error_message] ==
49 auto const lines = env.rpc(
53 R"("n9MJkEKHDhy5eTLuHUQeAAjo382frHNbFK4C8hcwN4nwM2SrLdBj"})");
55 lines[jss::result][jss::error_message] ==
58 Account const alice{
"alice"};
61 auto const lines = env.rpc(
64 R
"({"account": ")" + alice.human() + R"("})");
66 lines[jss::result][jss::error_message] ==
69 env.fund(XRP(10000), alice);
71 LedgerInfo const ledger3Info = env.closed()->info();
72 BEAST_EXPECT(ledger3Info.
seq == 3);
76 auto const lines = env.rpc(
79 R
"({"account": ")" + alice.human() + R"("})");
80 BEAST_EXPECT(lines[jss::result][jss::lines].isArray());
81 BEAST_EXPECT(lines[jss::result][jss::lines].size() == 0);
85 auto const lines = env.rpc(
88 R
"({"account": ")" + alice.human() +
90 R"("ledger_index": "nonsense"})");
92 lines[jss::result][jss::error_message] ==
93 "ledgerIndexMalformed");
97 auto const lines = env.rpc(
100 R
"({"account": ")" + alice.human() +
102 R"("ledger_index": 50000})");
104 lines[jss::result][jss::error_message] == "ledgerNotFound");
107 Account
const gw1{
"gw1"};
108 env.fund(XRP(10000), gw1);
111 for (
char c = 0; c <= (
'Z' -
'A'); ++c)
115 gw1[
std::string(
"YA") +
static_cast<char>(
'A' + c)]);
116 IOU
const& gw1Currency = gw1Currencies.
back();
119 env(trust(alice, gw1Currency(100 + c)));
120 env(pay(gw1, alice, gw1Currency(50 + c)));
123 LedgerInfo const ledger4Info = env.closed()->info();
124 BEAST_EXPECT(ledger4Info.
seq == 4);
128 Account
const gw2{
"gw2"};
129 env.fund(XRP(10000), gw2);
136 for (
char c = 0; c <= (
'Z' -
'A'); ++c)
140 gw2[
std::string(
"ZA") +
static_cast<char>(
'A' + c)]);
141 IOU
const& gw2Currency = gw2Currencies.
back();
144 env(trust(alice, gw2Currency(200 + c)));
145 env(trust(gw2, gw2Currency(0), alice,
tfSetfAuth));
147 env(pay(gw2, alice, gw2Currency(100 + c)));
154 LedgerInfo const ledger58Info = env.closed()->info();
155 BEAST_EXPECT(ledger58Info.
seq == 58);
158 auto testAccountLinesHistory = [
this, &env](
159 Account
const& account,
163 auto const linesSeq = env.rpc(
166 R
"({"account": ")" + account.human() +
168 R"("ledger_index": )" +
170 BEAST_EXPECT(linesSeq[jss::result][jss::lines].isArray());
171 BEAST_EXPECT(linesSeq[jss::result][jss::lines].size() == count);
174 auto const linesHash = env.rpc(
177 R
"({"account": ")" + account.human() +
179 R"("ledger_hash": ")" +
181 BEAST_EXPECT(linesHash[jss::result][jss::lines].isArray());
182 BEAST_EXPECT(linesHash[jss::result][jss::lines].size() == count);
186 testAccountLinesHistory(alice, ledger3Info, 0);
189 testAccountLinesHistory(alice, ledger4Info, 26);
192 testAccountLinesHistory(alice, ledger58Info, 52);
197 auto const lines = env.rpc(
200 R
"({"account": ")" + alice.human() +
202 R"("ledger_hash": ")" +
205 R"("ledger_index": )" +
207 BEAST_EXPECT(lines[jss::result][jss::lines].isArray());
208 BEAST_EXPECT(lines[jss::result][jss::lines].size() == 26);
212 auto const lines = env.rpc(
215 R
"({"account": ")" + alice.human() + R"("})");
216 BEAST_EXPECT(lines[jss::result][jss::lines].isArray());
217 BEAST_EXPECT(lines[jss::result][jss::lines].size() == 52);
221 auto const lines = env.rpc(
224 R
"({"account": ")" + alice.human() +
227 gw1.human() + R"("})");
228 BEAST_EXPECT(lines[jss::result][jss::lines].isArray());
229 BEAST_EXPECT(lines[jss::result][jss::lines].size() == 26);
233 auto const lines = env.rpc(
236 R
"({"account": ")" + alice.human() +
239 R"("n9MJkEKHDhy5eTLuHUQeAAjo382frHNbFK4C8hcwN4nwM2SrLdBj"})");
241 lines[jss::result][jss::error_message] ==
246 auto const lines = env.rpc(
249 R
"({"account": ")" + alice.human() +
253 lines[jss::result][jss::error_message] ==
258 auto const linesA = env.rpc(
261 R
"({"account": ")" + alice.human() +
264 BEAST_EXPECT(linesA[jss::result][jss::lines].isArray());
265 BEAST_EXPECT(linesA[jss::result][jss::lines].size() == 1);
268 auto marker = linesA[jss::result][jss::marker].asString();
269 auto const linesB = env.rpc(
272 R
"({"account": ")" + alice.human() +
276 BEAST_EXPECT(linesB[jss::result][jss::lines].isArray());
277 BEAST_EXPECT(linesB[jss::result][jss::lines].size() == 51);
280 auto const linesC = env.rpc(
283 R
"({"account": ")" + alice.human() +
288 BEAST_EXPECT(linesC[jss::result][jss::lines].isArray());
289 BEAST_EXPECT(linesC[jss::result][jss::lines].size() == 3);
292 marker[5] = marker[5] ==
'7' ?
'8' :
'7';
293 auto const linesD = env.rpc(
296 R
"({"account": ")" + alice.human() +
301 linesD[jss::result][jss::error_message] ==
306 auto const lines = env.rpc(
309 R
"({"account": ")" + alice.human() +
311 R"("marker": true})");
313 lines[jss::result][jss::error_message] ==
318 auto const lines = env.rpc(
321 R
"({"account": ")" + alice.human() +
325 gw2.human() + R"("})");
326 auto const& line = lines[jss::result][jss::lines][0u];
327 BEAST_EXPECT(line[jss::freeze].asBool() ==
true);
328 BEAST_EXPECT(line[jss::no_ripple].asBool() ==
true);
329 BEAST_EXPECT(line[jss::peer_authorized].asBool() ==
true);
333 auto const linesA = env.rpc(
336 R
"({"account": ")" + gw2.human() +
340 alice.human() + R"("})");
341 auto const& lineA = linesA[jss::result][jss::lines][0u];
342 BEAST_EXPECT(lineA[jss::freeze_peer].asBool() ==
true);
343 BEAST_EXPECT(lineA[jss::no_ripple_peer].asBool() ==
true);
344 BEAST_EXPECT(lineA[jss::authorized].asBool() ==
true);
347 BEAST_EXPECT(linesA[jss::result].isMember(jss::marker));
348 auto const marker = linesA[jss::result][jss::marker].asString();
349 auto const linesB = env.rpc(
352 R
"({"account": ")" + gw2.human() +
359 alice.human() + R"("})");
360 BEAST_EXPECT(linesB[jss::result][jss::lines].isArray());
361 BEAST_EXPECT(linesB[jss::result][jss::lines].size() == 25);
362 BEAST_EXPECT(!linesB[jss::result].isMember(jss::marker));
367 testAccountLineDelete()
369 testcase(
"Entry pointed to by marker is removed");
370 using namespace test::jtx;
384 Account
const alice{
"alice"};
385 Account
const becky{
"becky"};
386 Account
const cheri{
"cheri"};
387 Account
const gw1{
"gw1"};
388 Account
const gw2{
"gw2"};
389 env.fund(
XRP(10000), alice, becky, cheri, gw1, gw2);
392 auto const USD = gw1[
"USD"];
393 auto const EUR = gw2[
"EUR"];
394 env(
trust(alice, USD(200)));
395 env(
trust(becky, EUR(200)));
396 env(
trust(cheri, EUR(200)));
400 env(
pay(gw2, becky, EUR(100)));
404 env(
offer(alice, EUR(100),
XRP(100)));
408 env(
offer(becky,
XRP(100), EUR(100)));
412 auto const linesBeg = env.rpc(
415 R
"({"account": ")" + alice.human() +
419 linesBeg[jss::result][jss::lines][0u][jss::currency] == "USD");
420 BEAST_EXPECT(linesBeg[jss::result].isMember(jss::marker));
423 env(
pay(alice, cheri, EUR(100)));
428 auto const linesEnd = env.rpc(
431 R
"({"account": ")" + alice.human() +
434 linesBeg[jss::result][jss::marker].asString() + R"("})");
436 linesEnd[jss::result][jss::error_message] ==
444 testcase(
"V2: acccount_lines");
446 using namespace test::jtx;
450 auto const lines = env.rpc(
453 R
"("method" : "account_lines",)"
454 R"("jsonrpc" : "2.0",)"
455 R"("ripplerpc" : "2.0")"
458 lines.isMember(jss::jsonrpc) && lines[jss::jsonrpc] ==
"2.0");
460 lines.isMember(jss::ripplerpc) &&
461 lines[jss::ripplerpc] ==
"2.0");
465 auto const lines = env.rpc(
468 R
"("method" : "account_lines",)"
469 R"("jsonrpc" : "2.0",)"
470 R"("ripplerpc" : "2.0",)"
474 lines[jss::error][jss::message] ==
477 lines.isMember(jss::jsonrpc) && lines[jss::jsonrpc] ==
"2.0");
479 lines.isMember(jss::ripplerpc) &&
480 lines[jss::ripplerpc] ==
"2.0");
481 BEAST_EXPECT(
lines.isMember(jss::id) && lines[jss::id] == 5);
485 auto const lines = env.rpc(
488 R
"("method" : "account_lines",)"
489 R"("jsonrpc" : "2.0",)"
490 R"("ripplerpc" : "2.0",)"
494 R"("n9MJkEKHDhy5eTLuHUQeAAjo382frHNbFK4C8hcwN4nwM2SrLdBj"}})");
496 lines[jss::error][jss::message] ==
499 lines.isMember(jss::jsonrpc) && lines[jss::jsonrpc] == "2.0");
501 lines.isMember(jss::ripplerpc) &&
502 lines[jss::ripplerpc] ==
"2.0");
503 BEAST_EXPECT(
lines.isMember(jss::id) && lines[jss::id] == 5);
505 Account
const alice{
"alice"};
508 auto const lines = env.rpc(
511 R
"("method" : "account_lines",)"
512 R"("jsonrpc" : "2.0",)"
513 R"("ripplerpc" : "2.0",)"
517 alice.human() + R"("}})");
519 lines[jss::error][jss::message] ==
522 lines.isMember(jss::jsonrpc) && lines[jss::jsonrpc] == "2.0");
524 lines.isMember(jss::ripplerpc) &&
525 lines[jss::ripplerpc] ==
"2.0");
526 BEAST_EXPECT(
lines.isMember(jss::id) && lines[jss::id] == 5);
528 env.fund(
XRP(10000), alice);
530 LedgerInfo
const ledger3Info = env.closed()->info();
531 BEAST_EXPECT(ledger3Info.seq == 3);
535 auto const lines = env.rpc(
538 R
"("method" : "account_lines",)"
539 R"("jsonrpc" : "2.0",)"
540 R"("ripplerpc" : "2.0",)"
544 alice.human() + R"("}})");
545 BEAST_EXPECT(lines[jss::result][jss::lines].isArray());
546 BEAST_EXPECT(lines[jss::result][jss::lines].size() == 0);
548 lines.isMember(jss::jsonrpc) && lines[jss::jsonrpc] == "2.0");
550 lines.isMember(jss::ripplerpc) &&
551 lines[jss::ripplerpc] ==
"2.0");
552 BEAST_EXPECT(
lines.isMember(jss::id) && lines[jss::id] == 5);
556 auto const lines = env.rpc(
559 R
"("method" : "account_lines",)"
560 R"("jsonrpc" : "2.0",)"
561 R"("ripplerpc" : "2.0",)"
567 R"("ledger_index": "nonsense"}})");
569 lines[jss::error][jss::message] == "ledgerIndexMalformed");
571 lines.isMember(jss::jsonrpc) && lines[jss::jsonrpc] ==
"2.0");
573 lines.isMember(jss::ripplerpc) &&
574 lines[jss::ripplerpc] ==
"2.0");
575 BEAST_EXPECT(
lines.isMember(jss::id) && lines[jss::id] == 5);
579 auto const lines = env.rpc(
582 R
"("method" : "account_lines",)"
583 R"("jsonrpc" : "2.0",)"
584 R"("ripplerpc" : "2.0",)"
590 R"("ledger_index": 50000}})");
591 BEAST_EXPECT(lines[jss::error][jss::message] == "ledgerNotFound");
593 lines.isMember(jss::jsonrpc) && lines[jss::jsonrpc] ==
"2.0");
595 lines.isMember(jss::ripplerpc) &&
596 lines[jss::ripplerpc] ==
"2.0");
597 BEAST_EXPECT(
lines.isMember(jss::id) && lines[jss::id] == 5);
600 Account
const gw1{
"gw1"};
601 env.fund(
XRP(10000), gw1);
604 for (
char c = 0; c <= (
'Z' -
'A'); ++c)
608 gw1[
std::string(
"YA") +
static_cast<char>(
'A' + c)]);
609 IOU
const& gw1Currency = gw1Currencies.
back();
612 env(
trust(alice, gw1Currency(100 + c)));
613 env(
pay(gw1, alice, gw1Currency(50 + c)));
616 LedgerInfo
const ledger4Info = env.closed()->info();
617 BEAST_EXPECT(ledger4Info.seq == 4);
621 Account
const gw2{
"gw2"};
622 env.fund(
XRP(10000), gw2);
629 for (
char c = 0; c <= (
'Z' -
'A'); ++c)
633 gw2[
std::string(
"ZA") +
static_cast<char>(
'A' + c)]);
634 IOU
const& gw2Currency = gw2Currencies.
back();
637 env(
trust(alice, gw2Currency(200 + c)));
640 env(
pay(gw2, alice, gw2Currency(100 + c)));
647 LedgerInfo
const ledger58Info = env.closed()->info();
648 BEAST_EXPECT(ledger58Info.seq == 58);
651 auto testAccountLinesHistory = [
this, &env](
652 Account
const& account,
653 LedgerInfo
const& info,
656 auto const linesSeq = env.rpc(
659 R
"("method" : "account_lines",)"
660 R"("jsonrpc" : "2.0",)"
661 R"("ripplerpc" : "2.0",)"
667 R"("ledger_index": )" +
669 BEAST_EXPECT(linesSeq[jss::result][jss::lines].isArray());
670 BEAST_EXPECT(linesSeq[jss::result][jss::lines].
size() == count);
672 linesSeq.isMember(jss::jsonrpc) &&
673 linesSeq[jss::jsonrpc] ==
"2.0");
675 linesSeq.isMember(jss::ripplerpc) &&
676 linesSeq[jss::ripplerpc] ==
"2.0");
677 BEAST_EXPECT(linesSeq.isMember(jss::id) && linesSeq[jss::id] == 5);
680 auto const linesHash = env.rpc(
683 R
"("method" : "account_lines",)"
684 R"("jsonrpc" : "2.0",)"
685 R"("ripplerpc" : "2.0",)"
691 R"("ledger_hash": ")" +
693 BEAST_EXPECT(linesHash[jss::result][jss::lines].isArray());
694 BEAST_EXPECT(linesHash[jss::result][jss::lines].size() == count);
696 linesHash.isMember(jss::jsonrpc) &&
697 linesHash[jss::jsonrpc] == "2.0");
699 linesHash.isMember(jss::ripplerpc) &&
700 linesHash[jss::ripplerpc] ==
"2.0");
702 linesHash.isMember(jss::id) && linesHash[jss::id] == 5);
706 testAccountLinesHistory(alice, ledger3Info, 0);
709 testAccountLinesHistory(alice, ledger4Info, 26);
712 testAccountLinesHistory(alice, ledger58Info, 52);
717 auto const lines = env.rpc(
720 R
"("method" : "account_lines",)"
721 R"("jsonrpc" : "2.0",)"
722 R"("ripplerpc" : "2.0",)"
728 R"("ledger_hash": ")" +
731 R"("ledger_index": )" +
733 BEAST_EXPECT(lines[jss::result][jss::lines].isArray());
734 BEAST_EXPECT(lines[jss::result][jss::lines].
size() == 26);
736 lines.isMember(jss::jsonrpc) && lines[jss::jsonrpc] ==
"2.0");
738 lines.isMember(jss::ripplerpc) &&
739 lines[jss::ripplerpc] ==
"2.0");
740 BEAST_EXPECT(
lines.isMember(jss::id) && lines[jss::id] == 5);
744 auto const lines = env.rpc(
747 R
"("method" : "account_lines",)"
748 R"("jsonrpc" : "2.0",)"
749 R"("ripplerpc" : "2.0",)"
753 alice.human() + R"("}})");
754 BEAST_EXPECT(lines[jss::result][jss::lines].isArray());
755 BEAST_EXPECT(lines[jss::result][jss::lines].size() == 52);
757 lines.isMember(jss::jsonrpc) && lines[jss::jsonrpc] == "2.0");
759 lines.isMember(jss::ripplerpc) &&
760 lines[jss::ripplerpc] ==
"2.0");
761 BEAST_EXPECT(
lines.isMember(jss::id) && lines[jss::id] == 5);
765 auto const lines = env.rpc(
768 R
"("method" : "account_lines",)"
769 R"("jsonrpc" : "2.0",)"
770 R"("ripplerpc" : "2.0",)"
777 gw1.human() + R"("}})");
778 BEAST_EXPECT(lines[jss::result][jss::lines].isArray());
779 BEAST_EXPECT(lines[jss::result][jss::lines].size() == 26);
781 lines.isMember(jss::jsonrpc) && lines[jss::jsonrpc] == "2.0");
783 lines.isMember(jss::ripplerpc) &&
784 lines[jss::ripplerpc] ==
"2.0");
785 BEAST_EXPECT(
lines.isMember(jss::id) && lines[jss::id] == 5);
789 auto const lines = env.rpc(
792 R
"("method" : "account_lines",)"
793 R"("jsonrpc" : "2.0",)"
794 R"("ripplerpc" : "2.0",)"
801 R"("n9MJkEKHDhy5eTLuHUQeAAjo382frHNbFK4C8hcwN4nwM2SrLdBj"}})");
803 lines[jss::error][jss::message] ==
806 lines.isMember(jss::jsonrpc) && lines[jss::jsonrpc] == "2.0");
808 lines.isMember(jss::ripplerpc) &&
809 lines[jss::ripplerpc] ==
"2.0");
810 BEAST_EXPECT(
lines.isMember(jss::id) && lines[jss::id] == 5);
814 auto const lines = env.rpc(
817 R
"("method" : "account_lines",)"
818 R"("jsonrpc" : "2.0",)"
819 R"("ripplerpc" : "2.0",)"
827 lines[jss::error][jss::message] ==
830 lines.isMember(jss::jsonrpc) && lines[jss::jsonrpc] ==
"2.0");
832 lines.isMember(jss::ripplerpc) &&
833 lines[jss::ripplerpc] ==
"2.0");
834 BEAST_EXPECT(
lines.isMember(jss::id) && lines[jss::id] == 5);
838 auto const linesA = env.rpc(
841 R
"("method" : "account_lines",)"
842 R"("jsonrpc" : "2.0",)"
843 R"("ripplerpc" : "2.0",)"
850 BEAST_EXPECT(linesA[jss::result][jss::lines].isArray());
851 BEAST_EXPECT(linesA[jss::result][jss::lines].size() == 1);
853 linesA.isMember(jss::jsonrpc) && linesA[jss::jsonrpc] == "2.0");
855 linesA.isMember(jss::ripplerpc) &&
856 linesA[jss::ripplerpc] ==
"2.0");
857 BEAST_EXPECT(linesA.isMember(jss::id) && linesA[jss::id] == 5);
860 auto marker = linesA[jss::result][jss::marker].asString();
861 auto const linesB = env.rpc(
864 R
"("method" : "account_lines",)"
865 R"("jsonrpc" : "2.0",)"
866 R"("ripplerpc" : "2.0",)"
874 BEAST_EXPECT(linesB[jss::result][jss::lines].isArray());
875 BEAST_EXPECT(linesB[jss::result][jss::lines].size() == 51);
877 linesB.isMember(jss::jsonrpc) && linesB[jss::jsonrpc] == "2.0");
879 linesB.isMember(jss::ripplerpc) &&
880 linesB[jss::ripplerpc] ==
"2.0");
881 BEAST_EXPECT(linesB.isMember(jss::id) && linesB[jss::id] == 5);
884 auto const linesC = env.rpc(
887 R
"("method" : "account_lines",)"
888 R"("jsonrpc" : "2.0",)"
889 R"("ripplerpc" : "2.0",)"
898 BEAST_EXPECT(linesC[jss::result][jss::lines].isArray());
899 BEAST_EXPECT(linesC[jss::result][jss::lines].size() == 3);
901 linesC.isMember(jss::jsonrpc) && linesC[jss::jsonrpc] == "2.0");
903 linesC.isMember(jss::ripplerpc) &&
904 linesC[jss::ripplerpc] ==
"2.0");
905 BEAST_EXPECT(linesC.isMember(jss::id) && linesC[jss::id] == 5);
908 marker[5] = marker[5] ==
'7' ?
'8' :
'7';
909 auto const linesD = env.rpc(
912 R
"("method" : "account_lines",)"
913 R"("jsonrpc" : "2.0",)"
914 R"("ripplerpc" : "2.0",)"
923 linesD[jss::error][jss::message] ==
926 linesD.isMember(jss::jsonrpc) && linesD[jss::jsonrpc] == "2.0");
928 linesD.isMember(jss::ripplerpc) &&
929 linesD[jss::ripplerpc] ==
"2.0");
930 BEAST_EXPECT(linesD.isMember(jss::id) && linesD[jss::id] == 5);
934 auto const lines = env.rpc(
937 R
"("method" : "account_lines",)"
938 R"("jsonrpc" : "2.0",)"
939 R"("ripplerpc" : "2.0",)"
945 R"("marker": true}})");
947 lines[jss::error][jss::message] ==
950 lines.isMember(jss::jsonrpc) && lines[jss::jsonrpc] ==
"2.0");
952 lines.isMember(jss::ripplerpc) &&
953 lines[jss::ripplerpc] ==
"2.0");
954 BEAST_EXPECT(
lines.isMember(jss::id) && lines[jss::id] == 5);
958 auto const lines = env.rpc(
961 R
"("method" : "account_lines",)"
962 R"("jsonrpc" : "2.0",)"
963 R"("ripplerpc" : "2.0",)"
971 gw2.human() + R"("}})");
972 auto const&
line =
lines[jss::result][jss::lines][0u];
973 BEAST_EXPECT(line[jss::freeze].asBool() ==
true);
974 BEAST_EXPECT(line[jss::no_ripple].asBool() ==
true);
975 BEAST_EXPECT(line[jss::peer_authorized].asBool() ==
true);
977 lines.isMember(jss::jsonrpc) && lines[jss::jsonrpc] ==
"2.0");
979 lines.isMember(jss::ripplerpc) &&
980 lines[jss::ripplerpc] ==
"2.0");
981 BEAST_EXPECT(
lines.isMember(jss::id) && lines[jss::id] == 5);
985 auto const linesA = env.rpc(
988 R
"("method" : "account_lines",)"
989 R"("jsonrpc" : "2.0",)"
990 R"("ripplerpc" : "2.0",)"
998 alice.human() + R"("}})");
999 auto const& lineA = linesA[jss::result][jss::lines][0u];
1000 BEAST_EXPECT(lineA[jss::freeze_peer].asBool() ==
true);
1001 BEAST_EXPECT(lineA[jss::no_ripple_peer].asBool() ==
true);
1002 BEAST_EXPECT(lineA[jss::authorized].asBool() ==
true);
1004 linesA.isMember(jss::jsonrpc) && linesA[jss::jsonrpc] ==
"2.0");
1006 linesA.isMember(jss::ripplerpc) &&
1007 linesA[jss::ripplerpc] ==
"2.0");
1008 BEAST_EXPECT(linesA.isMember(jss::id) && linesA[jss::id] == 5);
1011 BEAST_EXPECT(linesA[jss::result].isMember(jss::marker));
1012 auto const marker = linesA[jss::result][jss::marker].asString();
1013 auto const linesB = env.rpc(
1016 R
"("method" : "account_lines",)"
1017 R"("jsonrpc" : "2.0",)"
1018 R"("ripplerpc" : "2.0",)"
1021 R"({"account": ")" +
1029 alice.human() + R"("}})");
1030 BEAST_EXPECT(linesB[jss::result][jss::lines].isArray());
1031 BEAST_EXPECT(linesB[jss::result][jss::lines].size() == 25);
1032 BEAST_EXPECT(!linesB[jss::result].isMember(jss::marker));
1034 linesB.isMember(jss::jsonrpc) && linesB[jss::jsonrpc] == "2.0");
1036 linesB.isMember(jss::ripplerpc) &&
1037 linesB[jss::ripplerpc] ==
"2.0");
1038 BEAST_EXPECT(linesB.isMember(jss::id) && linesB[jss::id] == 5);
1044 testAccountLineDelete2()
1046 testcase(
"V2: account_lines with removed marker");
1048 using namespace test::jtx;
1062 Account
const alice{
"alice"};
1063 Account
const becky{
"becky"};
1064 Account
const cheri{
"cheri"};
1065 Account
const gw1{
"gw1"};
1066 Account
const gw2{
"gw2"};
1067 env.fund(
XRP(10000), alice, becky, cheri, gw1, gw2);
1070 auto const USD = gw1[
"USD"];
1071 auto const EUR = gw2[
"EUR"];
1072 env(
trust(alice, USD(200)));
1073 env(
trust(becky, EUR(200)));
1074 env(
trust(cheri, EUR(200)));
1078 env(
pay(gw2, becky, EUR(100)));
1082 env(
offer(alice, EUR(100),
XRP(100)));
1086 env(
offer(becky,
XRP(100), EUR(100)));
1090 auto const linesBeg = env.rpc(
1093 R
"("method" : "account_lines",)"
1094 R"("jsonrpc" : "2.0",)"
1095 R"("ripplerpc" : "2.0",)"
1098 R"({"account": ")" +
1103 linesBeg[jss::result][jss::lines][0u][jss::currency] == "USD");
1104 BEAST_EXPECT(linesBeg[jss::result].isMember(jss::marker));
1106 linesBeg.isMember(jss::jsonrpc) && linesBeg[jss::jsonrpc] ==
"2.0");
1108 linesBeg.isMember(jss::ripplerpc) &&
1109 linesBeg[jss::ripplerpc] ==
"2.0");
1110 BEAST_EXPECT(linesBeg.isMember(jss::id) && linesBeg[jss::id] == 5);
1113 env(
pay(alice, cheri, EUR(100)));
1118 auto const linesEnd = env.rpc(
1121 R
"("method" : "account_lines",)"
1122 R"("jsonrpc" : "2.0",)"
1123 R"("ripplerpc" : "2.0",)"
1126 R"({"account": ")" +
1130 linesBeg[jss::result][jss::marker].asString() + R"("}})");
1132 linesEnd[jss::error][jss::message] ==
1135 linesEnd.isMember(jss::jsonrpc) && linesEnd[jss::jsonrpc] == "2.0");
1137 linesEnd.isMember(jss::ripplerpc) &&
1138 linesEnd[jss::ripplerpc] ==
"2.0");
1139 BEAST_EXPECT(linesEnd.isMember(jss::id) && linesEnd[jss::id] == 5);
1146 testAccountLineDelete();
1147 testAccountLines2();
1148 testAccountLineDelete2();