42 auto const baseFee = env.
current()->fees().base;
45 BEAST_EXPECT(ret[jss::error_message].asString() ==
"Missing field 'base_asset'.");
49 BEAST_EXPECT(ret[jss::error_message].asString() ==
"Missing field 'quote_asset'.");
65 "012345678901234567890123456789012345678",
66 "012345678901234567890123456789012345678G"};
67 for (
auto const& v : invalidAsset)
70 BEAST_EXPECT(ret[jss::error].asString() ==
"invalidParams");
72 BEAST_EXPECT(ret[jss::error].asString() ==
"invalidParams");
74 BEAST_EXPECT(ret[jss::error].asString() ==
"invalidParams");
79 BEAST_EXPECT(ret[jss::error_message].asString() ==
"Missing field 'oracles'.");
83 BEAST_EXPECT(ret[jss::error].asString() ==
"oracleMalformed");
87 BEAST_EXPECT(ret[jss::error].asString() ==
"objectNotFound");
92 BEAST_EXPECT(ret[jss::error].asString() ==
"objectNotFound");
95 for (
auto const& v : invalidDocument)
100 BEAST_EXPECT(ret[jss::error].asString() ==
"invalidParams");
104 BEAST_EXPECT(ret[jss::error].asString() ==
"oracleMalformed");
108 BEAST_EXPECT(ret[jss::error].asString() ==
"objectNotFound");
111 BEAST_EXPECT(ret[jss::error].asString() ==
"oracleMalformed");
118 .series = {{
"XRP",
"EUR", 740, 1}},
119 .fee =
static_cast<int>(baseFee.drops())});
121 BEAST_EXPECT(ret[jss::error].asString() ==
"objectNotFound");
125 for (
auto const& v : invalidTrim)
129 BEAST_EXPECT(ret[jss::error].asString() ==
"invalidParams");
134 for (
auto const& v : invalidTime)
137 env,
"XRP",
"USD", {{{owner,
oracle.documentID()}}}, std::nullopt, v);
138 BEAST_EXPECT(ret[jss::error].asString() ==
"invalidParams");
145 auto const baseFee =
static_cast<int>(env.
current()->fees().base.drops());
148 for (
int i = 0; i < 201; ++i)
152 Oracle const oracle(env, {.owner = owner, .documentID = i, .fee = baseFee});
156 BEAST_EXPECT(ret[jss::error].asString() ==
"oracleMalformed");
166 auto prep = [&](
Env& env,
auto& oracles) {
168 for (
int i = 0; i < 10; ++i)
170 auto const baseFee =
static_cast<int>(env.
current()->fees().base.drops());
178 .series = {{
"XRP",
"USD", 740 + i, 1}, {
"XRP",
"EUR", 740, 1}},
180 oracles.emplace_back(owner,
oracle.documentID());
188 for (
auto const& feats : {all - featureSingleAssetVault - featureLendingProtocol, all})
198 Env env(*
this, feats);
203 BEAST_EXPECT(ret[jss::entire_set][jss::mean] ==
"74.45");
204 BEAST_EXPECT(ret[jss::entire_set][jss::size].
asUInt() == 10);
207 ret[jss::entire_set][jss::standard_deviation] ==
"0.3027650354097491666",
208 ret[jss::entire_set][jss::standard_deviation].asString());
209 BEAST_EXPECT(ret[jss::median] ==
"74.45");
210 BEAST_EXPECT(ret[jss::time] == 946694900);
222 BEAST_EXPECT(ret[jss::entire_set][jss::mean] ==
"74.45");
223 BEAST_EXPECT(ret[jss::entire_set][jss::size].
asUInt() == 10);
226 ret[jss::entire_set][jss::standard_deviation] ==
"0.3027650354097491666",
227 ret[jss::entire_set][jss::standard_deviation].asString());
228 BEAST_EXPECT(ret[jss::median] ==
"74.45");
229 BEAST_EXPECT(ret[jss::trimmed_set][jss::mean] ==
"74.45");
230 BEAST_EXPECT(ret[jss::trimmed_set][jss::size].
asUInt() == 6);
233 ret[jss::trimmed_set][jss::standard_deviation] ==
"0.1870828693386970693",
234 ret[jss::trimmed_set][jss::standard_deviation].asString());
235 BEAST_EXPECT(ret[jss::time] == 946694900);
242 auto const baseFee =
static_cast<int>(env.
current()->fees().base.drops());
246 for (
int i = 0; i < 3; ++i)
250 {.owner = oracles[i].first,
252 .documentID =
asUInt(*oracles[i].second),
257 oracle.set(
UpdateArg{.series = {{
"XRP",
"EUR", 740, 1}}, .fee = baseFee});
258 oracle.set(
UpdateArg{.series = {{
"XRP",
"EUR", 740, 1}}, .fee = baseFee});
259 oracle.set(
UpdateArg{.series = {{
"XRP",
"EUR", 740, 1}}, .fee = baseFee});
261 for (
int i = 3; i < 6; ++i)
265 {.owner = oracles[i].first,
267 .documentID =
asUInt(*oracles[i].second),
272 oracle.set(
UpdateArg{.series = {{
"XRP",
"EUR", 740, 1}}, .fee = baseFee});
273 oracle.set(
UpdateArg{.series = {{
"XRP",
"EUR", 740, 1}}, .fee = baseFee});
278 BEAST_EXPECT(ret[jss::entire_set][jss::mean] ==
"74.6");
279 BEAST_EXPECT(ret[jss::entire_set][jss::size].
asUInt() == 7);
282 ret[jss::entire_set][jss::standard_deviation] ==
"0.2160246899469286744",
283 ret[jss::entire_set][jss::standard_deviation].asString());
284 BEAST_EXPECT(ret[jss::median] ==
"74.6");
285 BEAST_EXPECT(ret[jss::trimmed_set][jss::mean] ==
"74.6");
286 BEAST_EXPECT(ret[jss::trimmed_set][jss::size].
asUInt() == 5);
289 ret[jss::trimmed_set][jss::standard_deviation] ==
"0.1581138830084189666",
290 ret[jss::trimmed_set][jss::standard_deviation].asString());
291 BEAST_EXPECT(ret[jss::time] == 946694900);
297 auto const baseFee =
static_cast<int>(env.
current()->fees().base.drops());
301 for (
auto& oracleData : oracles)
305 {.owner = oracleData.first,
307 .documentID =
asUInt(*oracleData.second),
312 oracle.set(
UpdateArg{.series = {{
"XRP",
"USD", 740, 1}}, .fee = baseFee});
317 BEAST_EXPECT(ret[jss::entire_set][jss::mean] ==
"74");
318 BEAST_EXPECT(ret[jss::entire_set][jss::size].
asUInt() == 8);
319 BEAST_EXPECT(ret[jss::entire_set][jss::standard_deviation] ==
"0");
320 BEAST_EXPECT(ret[jss::median] ==
"74");
321 BEAST_EXPECT(ret[jss::time] == 946695000);
330 auto const baseFee =
static_cast<int>(env.
current()->fees().base.drops());
332 Account const owner1{
"owner1"};
333 Account const owner2{
"owner2"};
337 env, {.owner = owner1, .series = {{
"XRP",
"USD", 740, 1}}, .fee = baseFee});
339 env, {.owner = owner2, .series = {{
"XRP",
"USD", 840, 1}}, .fee = baseFee});
343 {owner1, oracle1.documentID()}, {owner2, oracle2.documentID()}};
348 {owner1, oracle1.documentID()},
349 {owner1, oracle1.documentID()},
350 {owner2, oracle2.documentID()}};
356 retSingle[jss::entire_set][jss::size] == retDup[jss::entire_set][jss::size]);
357 BEAST_EXPECT(retDup[jss::entire_set][jss::size].
asUInt() == 2);
359 retSingle[jss::entire_set][jss::mean] == retDup[jss::entire_set][jss::mean]);
361 retSingle[jss::entire_set][jss::standard_deviation] ==
362 retDup[jss::entire_set][jss::standard_deviation]);
363 BEAST_EXPECT(retSingle[jss::median] == retDup[jss::median]);