1#include <gtest/gtest.h>
5#include <unordered_set>
9#include <userver/protobuf/json/convert.hpp>
10#include <userver/utest/assert_macros.hpp>
14USERVER_NAMESPACE_BEGIN
16namespace protobuf::json::tests {
18struct OneofFromJsonSuccessTestParam {
19 std::string input = {};
21 ParseOptions options = {};
24struct OneofFromJsonFailureTestParam {
25 std::string input = {};
26 ParseErrorCode expected_errc = {};
27 std::unordered_set<std::string> expected_path = {};
28 ParseOptions options = {};
31void PrintTo(
const OneofFromJsonSuccessTestParam& param, std::ostream* os) {
32 *os << fmt::format(
"{{ input = '{}' }}", param.input);
35void PrintTo(
const OneofFromJsonFailureTestParam& param, std::ostream* os) {
36 *os << fmt::format(
"{{ input = '{}' }}", param.input);
39class OneofFromJsonSuccessTest :
public ::testing::TestWithParam<OneofFromJsonSuccessTestParam> {};
40class OneofFromJsonFailureTest :
public ::testing::TestWithParam<OneofFromJsonFailureTestParam> {};
42INSTANTIATE_TEST_SUITE_P(
44 OneofFromJsonSuccessTest,
46 OneofFromJsonSuccessTestParam{R"({})", OneofMessageData{}},
47 OneofFromJsonSuccessTestParam{R"({"field1":10})", OneofMessageData{.field1 = 10}},
48 OneofFromJsonSuccessTestParam{R"({"field2":"hello"})", OneofMessageData{.field2 =
"hello"}}
52INSTANTIATE_TEST_SUITE_P(
54 OneofFromJsonFailureTest,
55 ::testing::Values(OneofFromJsonFailureTestParam{
56 R"({"field1":10,"field2":"hello"})",
57 ParseErrorCode::kMultipleOneofFields,
62TEST_P(OneofFromJsonSuccessTest, Test) {
63 const auto& param = GetParam();
65 proto_json::messages::OneofMessage message, expected_message, sample_message;
67 expected_message = PrepareTestData(param.expected_message);
69 UASSERT_NO_THROW((message = JsonToMessage<proto_json::messages::OneofMessage>(input, param.options)));
70 UASSERT_NO_THROW(InitSampleMessage(param.input, sample_message, param.options));
72 CheckMessageEqual(message, sample_message);
73 CheckMessageEqual(message, expected_message);
76TEST_P(OneofFromJsonFailureTest, Test) {
77 const auto& param = GetParam();
79 proto_json::messages::OneofMessage sample_message;
83 (
void)JsonToMessage<proto_json::messages::OneofMessage>(input, param.options);
84 ADD_FAILURE() <<
"exception should be thrown";
85 }
catch (
const ParseError& error) {
86 EXPECT_EQ(error.GetErrorInfo().GetCode(), param.expected_errc);
87 EXPECT_TRUE(param.expected_path.contains(error.GetErrorInfo().GetPath()));
89 ADD_FAILURE() <<
"unexpected exception type";
92 UEXPECT_THROW(InitSampleMessage(param.input, sample_message, param.options), SampleError);