21#include <xrpl/protocol/jss.h>
45 auto const USD_gw = gw[
"USD"];
47 auto const USD_bob = bob[
"USD"];
49 env.fund(
XRP(10000), gw, bob);
50 env.trust(USD_gw(1000), bob);
55 env(
pay(gw, bob, USD_gw(10)));
56 unsigned const offer_count = 12u;
57 for (
auto i = 0u; i < offer_count; i++)
60 jvo[sfExpiration.fieldName] = 10000000u;
66 env.rpc(
"account_offers", bob.
human())[jss::result][jss::offers];
73 jvParams[jss::account] = bob.
human();
74 jvParams[jss::limit] = 1u;
75 auto const jrr_l = env.rpc(
77 auto const& jro_l = jrr_l[jss::offers];
87 std::string(
"Sequential - ") + (asAdmin ?
"admin" :
"non-admin"));
92 auto const USD_gw = gw[
"USD"];
94 auto const USD_bob = bob[
"USD"];
96 env.fund(
XRP(10000), gw, bob);
97 env.trust(USD_gw(1000), bob);
102 env(
pay(gw, bob, USD_gw(10)));
104 env(
offer(bob,
XRP(100), USD_bob(1)));
105 env(
offer(bob,
XRP(200), USD_gw(2)));
106 env(
offer(bob,
XRP(30), USD_gw(6)));
109 auto const jroOuter =
110 env.rpc(
"account_offers", bob.
human())[jss::result][jss::offers];
117 BEAST_EXPECT(jroOuter[0u][jss::quality] ==
"100000000");
118 BEAST_EXPECT(jroOuter[0u][jss::taker_gets][jss::currency] ==
"USD");
120 jroOuter[0u][jss::taker_gets][jss::issuer] == gw.
human());
121 BEAST_EXPECT(jroOuter[0u][jss::taker_gets][jss::value] ==
"2");
122 BEAST_EXPECT(jroOuter[0u][jss::taker_pays] ==
"200000000");
124 BEAST_EXPECT(jroOuter[1u][jss::quality] ==
"100000000");
125 BEAST_EXPECT(jroOuter[1u][jss::taker_gets][jss::currency] ==
"USD");
127 jroOuter[1u][jss::taker_gets][jss::issuer] == bob.
human());
128 BEAST_EXPECT(jroOuter[1u][jss::taker_gets][jss::value] ==
"1");
129 BEAST_EXPECT(jroOuter[1u][jss::taker_pays] ==
"100000000");
131 BEAST_EXPECT(jroOuter[2u][jss::quality] ==
"5000000");
132 BEAST_EXPECT(jroOuter[2u][jss::taker_gets][jss::currency] ==
"USD");
134 jroOuter[2u][jss::taker_gets][jss::issuer] == gw.
human());
135 BEAST_EXPECT(jroOuter[2u][jss::taker_gets][jss::value] ==
"6");
136 BEAST_EXPECT(jroOuter[2u][jss::taker_pays] ==
"30000000");
142 jvParams[jss::account] = bob.
human();
143 jvParams[jss::limit] = 1u;
144 auto const jrr_l_1 = env.rpc(
148 auto const& jro_l_1 = jrr_l_1[jss::offers];
157 : (!jrr_l_1.isMember(jss::marker)));
160 BEAST_EXPECT(jroOuter[0u] == jro_l_1[0u]);
163 jvParams[jss::marker] = jrr_l_1[jss::marker];
164 auto const jrr_l_2 = env.rpc(
168 auto const& jro_l_2 = jrr_l_2[jss::offers];
171 BEAST_EXPECT(jroOuter[1u] == jro_l_2[0u]);
174 jvParams[jss::marker] = jrr_l_2[jss::marker];
175 jvParams[jss::limit] = 10u;
176 auto const jrr_l_3 = env.rpc(
180 auto const& jro_l_3 = jrr_l_3[jss::offers];
181 BEAST_EXPECT(!jrr_l_3.isMember(jss::marker));
183 BEAST_EXPECT(jroOuter[2u] == jro_l_3[0u]);
187 BEAST_EXPECT(jroOuter == jro_l_1);
199 jvParams[jss::account] = bob.
human();
200 jvParams[jss::limit] = 0u;
201 auto const jrr = env.rpc(
205 auto const& jro = jrr[jss::offers];
209 BEAST_EXPECT(jrr.isMember(jss::error_message));
215 BEAST_EXPECT(!jrr.isMember(jss::marker));
228 auto const USD_gw = gw[
"USD"];
230 auto const USD_bob = bob[
"USD"];
233 env.
trust(USD_gw(1000), bob);
237 auto const jrr = env.
rpc(
"account_offers");
238 BEAST_EXPECT(jrr[jss::error] ==
"badSyntax");
239 BEAST_EXPECT(jrr[jss::status] ==
"error");
240 BEAST_EXPECT(jrr[jss::error_message] ==
"Syntax error.");
245 auto testInvalidAccountParam = [&](
auto const& param) {
247 params[jss::account] = param;
249 "json",
"account_offers",
to_string(params))[jss::result];
250 BEAST_EXPECT(jrr[jss::error] ==
"invalidParams");
252 jrr[jss::error_message] ==
"Invalid field 'account'.");
255 testInvalidAccountParam(1);
256 testInvalidAccountParam(1.1);
257 testInvalidAccountParam(
true);
266 jvParams[jss::account] =
"";
267 auto const jrr = env.
rpc(
271 BEAST_EXPECT(jrr[jss::error] ==
"actMalformed");
272 BEAST_EXPECT(jrr[jss::status] ==
"error");
273 BEAST_EXPECT(jrr[jss::error_message] ==
"Account malformed.");
278 auto const jrr = env.
rpc(
279 "account_offers",
Account(
"bogus").human())[jss::result];
280 BEAST_EXPECT(jrr[jss::error] ==
"actNotFound");
281 BEAST_EXPECT(jrr[jss::status] ==
"error");
282 BEAST_EXPECT(jrr[jss::error_message] ==
"Account not found.");
288 jvParams[jss::account] = bob.
human();
289 jvParams[jss::limit] =
"0";
290 auto const jrr = env.
rpc(
294 BEAST_EXPECT(jrr[jss::error] ==
"invalidParams");
295 BEAST_EXPECT(jrr[jss::status] ==
"error");
297 jrr[jss::error_message] ==
298 "Invalid field 'limit', not unsigned integer.");
304 jvParams[jss::account] = bob.
human();
305 jvParams[jss::marker] =
"NOT_A_MARKER";
306 auto const jrr = env.
rpc(
310 BEAST_EXPECT(jrr[jss::error] ==
"invalidParams");
311 BEAST_EXPECT(jrr[jss::status] ==
"error");
313 jrr[jss::error_message] ==
"Invalid field 'marker'.",
314 jrr.toStyledString());
320 jvParams[jss::account] = bob.
human();
321 jvParams[jss::marker] = 1;
322 auto const jrr = env.
rpc(
326 BEAST_EXPECT(jrr[jss::error] ==
"invalidParams");
327 BEAST_EXPECT(jrr[jss::status] ==
"error");
329 jrr[jss::error_message] ==
330 "Invalid field 'marker', not string.");
336 jvParams[jss::account] = bob.
human();
337 jvParams[jss::ledger_index] = 10u;
338 auto const jrr = env.
rpc(
342 BEAST_EXPECT(jrr[jss::error] ==
"lgrNotFound");
343 BEAST_EXPECT(jrr[jss::status] ==
"error");
344 BEAST_EXPECT(jrr[jss::error_message] ==
"ledgerNotFound");
std::string toStyledString() const
std::string asString() const
Returns the unquoted string value.
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.
void testNonAdminMinLimit()
static bool checkMarker(Json::Value const &val)
void testSequential(bool asAdmin)
Immutable cryptographic account descriptor.
std::string const & human() const
Returns the human readable public key.
A transaction testing environment.
void trust(STAmount const &amount, Account const &account)
Establish trust lines.
Json::Value rpc(unsigned apiVersion, std::unordered_map< std::string, std::string > const &headers, std::string const &cmd, Args &&... args)
Execute an RPC command.
void fund(bool setDefaultRipple, STAmount const &amount, Account const &account)
Set the expected result code for a JTx The test will fail if the code doesn't match.
@ arrayValue
array value (ordered list)
@ objectValue
object value (collection of name/value pairs).
bool checkArraySize(Json::Value const &val, unsigned int size)
std::unique_ptr< Config > no_admin(std::unique_ptr< Config >)
adjust config so no admin ports are enabled
Json::Value pay(AccountID const &account, AccountID const &to, AnyAmount amount)
Create a payment.
std::unique_ptr< Config > envconfig()
creates and initializes a default configuration for jtx::Env
Json::Value offer(Account const &account, STAmount const &takerPays, STAmount const &takerGets, std::uint32_t flags)
Create an offer.
XRP_t const XRP
Converts to XRP Issue or STAmount.
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
std::string to_string(base_uint< Bits, Tag > const &a)