22#include <xrpl/beast/unit_test.h>
23#include <xrpl/protocol/jss.h>
32 testcase(
"Bad input to account_currencies");
34 using namespace test::jtx;
37 auto const alice = Account{
"alice"};
38 env.fund(XRP(10000), alice);
43 params[jss::account] = Account{
"bob"}.human();
44 params[jss::ledger_hash] = 1;
45 auto const result = env.rpc(
48 boost::lexical_cast<std::string>(params))[jss::result];
49 BEAST_EXPECT(result[jss::error] ==
"invalidParams");
50 BEAST_EXPECT(result[jss::error_message] ==
"ledgerHashNotString");
55 env.rpc(
"json",
"account_currencies",
"{}")[jss::result];
56 BEAST_EXPECT(result[jss::error] ==
"invalidParams");
58 result[jss::error_message] ==
"Missing field 'account'.");
63 auto testInvalidAccountParam = [&](
auto const& param) {
65 params[jss::account] = param;
70 BEAST_EXPECT(jrr[jss::error] ==
"invalidParams");
72 jrr[jss::error_message] ==
"Invalid field 'account'.");
75 testInvalidAccountParam(1);
76 testInvalidAccountParam(1.1);
77 testInvalidAccountParam(
true);
85 auto testInvalidIdentParam = [&](
auto const& param) {
87 params[jss::ident] = param;
92 BEAST_EXPECT(jrr[jss::error] ==
"invalidParams");
94 jrr[jss::error_message] ==
"Invalid field 'ident'.");
97 testInvalidIdentParam(1);
98 testInvalidIdentParam(1.1);
99 testInvalidIdentParam(
true);
107 params[jss::account] =
109 auto const result = env.rpc(
111 "account_currencies",
112 boost::lexical_cast<std::string>(params))[jss::result];
113 BEAST_EXPECT(result[jss::error] ==
"actMalformed");
114 BEAST_EXPECT(result[jss::error_message] ==
"Account malformed.");
120 params[jss::account] =
"Bob";
121 auto const result = env.rpc(
123 "account_currencies",
124 boost::lexical_cast<std::string>(params))[jss::result];
125 BEAST_EXPECT(result[jss::error] ==
"actMalformed");
126 BEAST_EXPECT(result[jss::error_message] ==
"Account malformed.");
131 params[jss::account] = Account{
"bob"}.human();
132 auto const result = env.rpc(
134 "account_currencies",
135 boost::lexical_cast<std::string>(params))[jss::result];
136 BEAST_EXPECT(result[jss::error] ==
"actNotFound");
137 BEAST_EXPECT(result[jss::error_message] ==
"Account not found.");
144 testcase(
"Basic request for account_currencies");
146 using namespace test::jtx;
149 auto const alice = Account{
"alice"};
150 auto const gw = Account{
"gateway"};
151 env.fund(XRP(10000), alice, gw);
152 char currencySuffix{
'A'};
155 auto gwc = gw[std::string(
"US") + currencySuffix++];
156 env(trust(alice, gwc(100)));
162 params[jss::account] = alice.human();
163 auto result = env.rpc(
165 "account_currencies",
166 boost::lexical_cast<std::string>(params))[jss::result];
172 bool stat = result.
isMember(fld) && result[fld].isArray() &&
173 result[fld].size() == expected.size();
174 for (
size_t i = 0; stat && i < expected.size(); ++i)
177 (
to_string(expected[i].value().currency) ==
178 result[fld][i].asString());
183 BEAST_EXPECT(arrayCheck(jss::receive_currencies, gwCurrencies));
184 BEAST_EXPECT(arrayCheck(jss::send_currencies, {}));
187 for (
auto const& c : gwCurrencies)
188 env(pay(gw, alice, c.value()(50)));
193 "account_currencies",
194 boost::lexical_cast<std::string>(params))[jss::result];
195 BEAST_EXPECT(arrayCheck(jss::receive_currencies, gwCurrencies));
196 BEAST_EXPECT(arrayCheck(jss::send_currencies, gwCurrencies));
201 result = env.rpc(
"account_lines", alice.human());
202 for (
auto const& l : result[jss::lines])
204 l[jss::freeze].asBool() == (l[jss::currency] ==
"USD"));
207 "account_currencies",
208 boost::lexical_cast<std::string>(params))[jss::result];
209 BEAST_EXPECT(arrayCheck(jss::receive_currencies, gwCurrencies));
210 BEAST_EXPECT(arrayCheck(jss::send_currencies, gwCurrencies));
215 env(pay(gw, alice, gw[
"USA"](50)));
219 "account_currencies",
220 boost::lexical_cast<std::string>(params))[jss::result];
221 decltype(gwCurrencies) gwCurrenciesNoUSA(
222 gwCurrencies.
begin() + 1, gwCurrencies.
end());
223 BEAST_EXPECT(arrayCheck(jss::receive_currencies, gwCurrenciesNoUSA));
224 BEAST_EXPECT(arrayCheck(jss::send_currencies, gwCurrencies));
228 env(trust(gw, alice[
"USA"](100)));
229 env(pay(alice, gw, alice[
"USA"](200)));
232 "account_currencies",
233 boost::lexical_cast<std::string>(params))[jss::result];
234 BEAST_EXPECT(arrayCheck(jss::receive_currencies, gwCurrencies));
235 BEAST_EXPECT(arrayCheck(jss::send_currencies, gwCurrenciesNoUSA));
247BEAST_DEFINE_TESTSUITE(AccountCurrencies, rpc,
ripple);
Lightweight wrapper to tag static string.
bool isMember(char const *key) const
Return true if the object has a member named key.
testcase_t testcase
Memberspace for declaring test cases.
void run() override
Runs the suite.
@ 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.
constexpr std::uint32_t tfClearFreeze
std::string to_string(base_uint< Bits, Tag > const &a)
constexpr std::uint32_t tfSetFreeze