21#include <xrpl/beast/unit_test.h>
22#include <xrpl/protocol/jss.h>
31 testcase(
"Bad input to account_currencies");
33 using namespace test::jtx;
36 auto const alice = Account{
"alice"};
37 env.fund(XRP(10000), alice);
42 params[jss::account] = Account{
"bob"}.human();
43 params[jss::ledger_hash] = 1;
44 auto const result = env.rpc(
47 boost::lexical_cast<std::string>(params))[jss::result];
48 BEAST_EXPECT(result[jss::error] ==
"invalidParams");
49 BEAST_EXPECT(result[jss::error_message] ==
"ledgerHashNotString");
54 env.rpc(
"json",
"account_currencies",
"{}")[jss::result];
55 BEAST_EXPECT(result[jss::error] ==
"invalidParams");
57 result[jss::error_message] ==
"Missing field 'account'.");
62 auto testInvalidAccountParam = [&](
auto const& param) {
64 params[jss::account] = param;
69 BEAST_EXPECT(jrr[jss::error] ==
"invalidParams");
71 jrr[jss::error_message] ==
"Invalid field 'account'.");
74 testInvalidAccountParam(1);
75 testInvalidAccountParam(1.1);
76 testInvalidAccountParam(
true);
84 auto testInvalidIdentParam = [&](
auto const& param) {
86 params[jss::ident] = param;
91 BEAST_EXPECT(jrr[jss::error] ==
"invalidParams");
93 jrr[jss::error_message] ==
"Invalid field 'ident'.");
96 testInvalidIdentParam(1);
97 testInvalidIdentParam(1.1);
98 testInvalidIdentParam(
true);
106 params[jss::account] =
108 auto const result = env.rpc(
110 "account_currencies",
111 boost::lexical_cast<std::string>(params))[jss::result];
112 BEAST_EXPECT(result[jss::error] ==
"actMalformed");
113 BEAST_EXPECT(result[jss::error_message] ==
"Account malformed.");
119 params[jss::account] =
"Bob";
120 auto const result = env.rpc(
122 "account_currencies",
123 boost::lexical_cast<std::string>(params))[jss::result];
124 BEAST_EXPECT(result[jss::error] ==
"actMalformed");
125 BEAST_EXPECT(result[jss::error_message] ==
"Account malformed.");
130 params[jss::account] = Account{
"bob"}.human();
131 auto const result = env.rpc(
133 "account_currencies",
134 boost::lexical_cast<std::string>(params))[jss::result];
135 BEAST_EXPECT(result[jss::error] ==
"actNotFound");
136 BEAST_EXPECT(result[jss::error_message] ==
"Account not found.");
143 testcase(
"Basic request for account_currencies");
145 using namespace test::jtx;
148 auto const alice = Account{
"alice"};
149 auto const gw = Account{
"gateway"};
150 env.fund(XRP(10000), alice, gw);
151 char currencySuffix{
'A'};
154 auto gwc = gw[std::string(
"US") + currencySuffix++];
155 env(trust(alice, gwc(100)));
161 params[jss::account] = alice.human();
162 auto result = env.rpc(
164 "account_currencies",
165 boost::lexical_cast<std::string>(params))[jss::result];
171 bool stat = result.
isMember(fld) && result[fld].isArray() &&
172 result[fld].size() == expected.size();
173 for (
size_t i = 0; stat && i < expected.size(); ++i)
176 (
to_string(expected[i].value().currency) ==
177 result[fld][i].asString());
182 BEAST_EXPECT(arrayCheck(jss::receive_currencies, gwCurrencies));
183 BEAST_EXPECT(arrayCheck(jss::send_currencies, {}));
186 for (
auto const& c : gwCurrencies)
187 env(pay(gw, alice, c.value()(50)));
192 "account_currencies",
193 boost::lexical_cast<std::string>(params))[jss::result];
194 BEAST_EXPECT(arrayCheck(jss::receive_currencies, gwCurrencies));
195 BEAST_EXPECT(arrayCheck(jss::send_currencies, gwCurrencies));
200 result = env.rpc(
"account_lines", alice.human());
201 for (
auto const& l : result[jss::lines])
203 l[jss::freeze].asBool() == (l[jss::currency] ==
"USD"));
206 "account_currencies",
207 boost::lexical_cast<std::string>(params))[jss::result];
208 BEAST_EXPECT(arrayCheck(jss::receive_currencies, gwCurrencies));
209 BEAST_EXPECT(arrayCheck(jss::send_currencies, gwCurrencies));
214 env(pay(gw, alice, gw[
"USA"](50)));
218 "account_currencies",
219 boost::lexical_cast<std::string>(params))[jss::result];
220 decltype(gwCurrencies) gwCurrenciesNoUSA(
221 gwCurrencies.
begin() + 1, gwCurrencies.
end());
222 BEAST_EXPECT(arrayCheck(jss::receive_currencies, gwCurrenciesNoUSA));
223 BEAST_EXPECT(arrayCheck(jss::send_currencies, gwCurrencies));
227 env(trust(gw, alice[
"USA"](100)));
228 env(pay(alice, gw, alice[
"USA"](200)));
231 "account_currencies",
232 boost::lexical_cast<std::string>(params))[jss::result];
233 BEAST_EXPECT(arrayCheck(jss::receive_currencies, gwCurrencies));
234 BEAST_EXPECT(arrayCheck(jss::send_currencies, gwCurrenciesNoUSA));
246BEAST_DEFINE_TESTSUITE(AccountCurrencies, rpc,
ripple);
Lightweight wrapper to tag static string.
bool isMember(const char *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