51 auto params = makeParams();
52 ObjectView
const root{params};
54 auto const str =
root.child(
"str");
55 EXPECT_TRUE(str.present());
56 EXPECT_EQ(str.key(),
"str");
57 EXPECT_TRUE(str.isString());
58 EXPECT_EQ(str.asString(),
"hello");
60 EXPECT_FALSE(str.isBool());
61 EXPECT_FALSE(str.isInt64());
62 EXPECT_FALSE(str.isObject());
63 EXPECT_FALSE(str.isArray());
66 auto const num =
root.child(
"num");
67 EXPECT_TRUE(num.isInt64());
68 EXPECT_EQ(num.asInt64(), 42);
69 EXPECT_TRUE(num.isUint32());
70 EXPECT_EQ(num.asUint32(), 42U);
74 auto const big =
root.child(
"big");
75 EXPECT_TRUE(big.isInt64());
76 EXPECT_EQ(big.asInt64(), 3000000000LL);
77 EXPECT_TRUE(big.isUint32());
78 EXPECT_EQ(big.asUint32(), 3000000000U);
80 auto const neg =
root.child(
"neg");
81 EXPECT_TRUE(neg.isInt64());
82 EXPECT_EQ(neg.asInt64(), -7);
83 EXPECT_FALSE(neg.isUint32());
86 auto const real =
root.child(
"real");
87 EXPECT_TRUE(real.isDouble());
88 EXPECT_EQ(real.asDouble(), 1.5);
89 EXPECT_TRUE(real.is<
double>());
90 EXPECT_FALSE(real.isInt64());
92 auto const flag =
root.child(
"flag");
93 EXPECT_TRUE(flag.isBool());
94 EXPECT_TRUE(flag.asBool());
95 EXPECT_TRUE(flag.is<
bool>());
98 EXPECT_FALSE(flag.isInt64());
99 EXPECT_FALSE(flag.isUint32());
102 auto const nothing =
root.child(
"nothing");
103 EXPECT_TRUE(nothing.present());
104 EXPECT_FALSE(nothing.isString());
105 EXPECT_FALSE(nothing.isInt64());
106 EXPECT_FALSE(nothing.isBool());
107 EXPECT_FALSE(nothing.isDouble());
108 EXPECT_FALSE(nothing.isObject());
109 EXPECT_FALSE(nothing.isArray());
111 auto const obj =
root.child(
"obj");
112 EXPECT_TRUE(obj.isObject());
113 EXPECT_TRUE(obj.is<::rpc::spec::JsonObject>());
114 EXPECT_EQ(obj.objectSize(), 1U);
115 EXPECT_EQ(obj.arraySize(), 0U);
117 auto const arr =
root.child(
"arr");
118 EXPECT_TRUE(arr.isArray());
119 EXPECT_TRUE(arr.is<::rpc::spec::JsonArray>());
120 EXPECT_EQ(arr.arraySize(), 2U);
121 EXPECT_EQ(arr.objectSize(), 0U);
126 auto params = makeParams();
127 ObjectView
const root{params};
131 auto const missing =
root.child(
"nope");
132 EXPECT_FALSE(missing.present());
133 EXPECT_EQ(missing.key(),
"nope");
134 EXPECT_FALSE(missing.isString());
135 EXPECT_FALSE(missing.isInt64());
136 EXPECT_FALSE(missing.isUint32());
137 EXPECT_FALSE(missing.isBool());
138 EXPECT_FALSE(missing.isDouble());
139 EXPECT_FALSE(missing.isObject());
140 EXPECT_FALSE(missing.isArray());
141 EXPECT_EQ(missing.arraySize(), 0U);
142 EXPECT_EQ(missing.objectSize(), 0U);
144 EXPECT_FALSE(missing.is<::rpc::spec::JsonObject>());
147 EXPECT_FALSE(missing.child(
"deeper").present());
148 EXPECT_FALSE(missing.element(0).present());
151 EXPECT_FALSE(
root.child(
"str").child(
"inner").present());
152 EXPECT_FALSE(
root.child(
"str").element(0).present());
155TEST(JsonView, field_navigation)
157 auto params = makeParams();
158 ObjectView
const root{params};
160 auto const inner =
root.child(
"obj").child(
"inner");
161 EXPECT_TRUE(inner.present());
162 EXPECT_EQ(inner.asString(),
"deep");
163 EXPECT_EQ(inner.key(),
"inner");
166 auto const first =
root.child(
"arr").element(0);
167 EXPECT_TRUE(first.present());
168 EXPECT_EQ(first.asString(),
"a");
169 EXPECT_EQ(first.key(),
"arr");
170 EXPECT_EQ(
root.child(
"arr").element(1).asString(),
"b");
171 EXPECT_FALSE(
root.child(
"arr").element(2).present());
200TEST(JsonView, field_set_spans_both_32_bit_types)
202 auto params = makeParams();
203 ObjectView
root{params};
208 auto const big =
root.child(
"num");
209 EXPECT_TRUE(big.isUint32());
210 EXPECT_EQ(big.asUint32(), 3000000000U);
211 EXPECT_EQ(big.asInt64(), 3000000000LL);
214 auto const negative =
root.child(
"neg");
215 EXPECT_TRUE(negative.isInt64());
216 EXPECT_EQ(negative.asInt64(), -2000000000LL);
217 EXPECT_FALSE(negative.isUint32());
277TEST(SpecBridge, shared_spec_parses_json_value)
280 params[
"ledger_index"] = 42U;
281 params[
"binary"] =
true;
282 params[
"transactions"] =
true;
284 auto const input = ::rpc::spec::handlers::ledger::kSpec.parse(params, 2);
285 ASSERT_TRUE(input.has_value());
287 EXPECT_TRUE(input->binary);
288 EXPECT_TRUE(input->transactions);
289 EXPECT_FALSE(input->expand);
291 EXPECT_EQ(std::get<std::uint32_t>(input->ledger.value), 42U);
328TEST(SpecBridge, inject_spec_warnings)
331 ::rpc::getWarningInfo(::rpc::WarningCode::WarnRpcDeprecated).message};
335 rpc::injectSpecWarnings(out, {});
336 EXPECT_FALSE(out.
isMember(jss::warnings));
340 rpc::injectSpecWarnings(
344 .code = ::rpc::WarningCode::WarnRpcDeprecated,
346 .message =
"Field 'type' is deprecated.",
350 ASSERT_TRUE(out[jss::warnings].isArray());
351 ASSERT_EQ(out[jss::warnings].size(), 1U);
354 out[jss::warnings][0u][jss::message], kDeprecatedBase +
" Field 'type' is deprecated.");
359 rpc::injectSpecWarnings(
363 .code = ::rpc::WarningCode::WarnRpcDeprecated,
365 .message =
"Field 'type' is deprecated.",
368 .code = ::rpc::WarningCode::WarnRpcDeprecated,
370 .message =
"Field 'ledger' is deprecated.",
374 ASSERT_EQ(out[jss::warnings].size(), 1U);
376 out[jss::warnings][0u][jss::message],
377 kDeprecatedBase +
" Field 'type' is deprecated. Field 'ledger' is deprecated.");
382 rpc::injectSpecWarnings(
386 .code = ::rpc::WarningCode::WarnRpcDeprecated,
388 .message =
"Field 'type' is deprecated.",
390 {.code = ::rpc::WarningCode::WarnRpcOutdated, .field =
"", .message =
""},
393 ASSERT_EQ(out[jss::warnings].size(), 2U);
395 out[jss::warnings][0u][jss::id].asInt(),
396 static_cast<int>(::rpc::WarningCode::WarnRpcOutdated));
398 out[jss::warnings][0u][jss::message],
399 std::string{::rpc::getWarningInfo(::rpc::WarningCode::WarnRpcOutdated).message});
408 out[jss::warnings] = existing;
410 rpc::injectSpecWarnings(
414 .code = ::rpc::WarningCode::WarnRpcDeprecated,
416 .message =
"Field 'type' is deprecated.",
420 ASSERT_EQ(out[jss::warnings].size(), 2U);