userver: /data/code/userver/libraries/proto-structs/tests/json_to_struct_test.cpp Source File
Loading...
Searching...
No Matches
json_to_struct_test.cpp
1#include <gtest/gtest.h>
2
3#include <userver/proto-structs/json.hpp>
4#include <userver/utest/assert_macros.hpp>
5
6#include "messages.pb.h"
7#include "structs.hpp"
8
9USERVER_NAMESPACE_BEGIN
10
11namespace proto_structs::tests {
12
13TEST(JsonToStruct, JsonValue) {
14 messages::Scalar expected;
15 expected.set_f1(true);
16 expected.set_f2(std::numeric_limits<int32_t>::min());
17 expected.set_f3(std::numeric_limits<uint32_t>::max());
18 expected.set_f4(std::numeric_limits<int64_t>::min());
19 expected.set_f5(std::numeric_limits<uint64_t>::max());
20 expected.set_f6(static_cast<float>(1.5));
21 expected.set_f7(-2.5);
22 expected.set_f8("test1");
23 expected.set_f9("test2");
24 expected.set_f10(messages::TestEnum::TEST_ENUM_VALUE1);
25 expected.set_f11(987);
26
27 auto builder = formats::json::ValueBuilder{formats::common::Type::kObject};
28 builder["f1"] = true;
29 builder["f2"] = std::numeric_limits<int32_t>::min();
30 builder["f3"] = std::numeric_limits<uint32_t>::max();
31 // 64 bits are too large for JSON numbers, so we convert to string
32 builder["f4"] = std::to_string(std::numeric_limits<int64_t>::min());
33 builder["f5"] = std::to_string(std::numeric_limits<uint64_t>::max());
34 builder["f6"] = static_cast<float>(1.5);
35 builder["f7"] = -2.5;
36 builder["f8"] = "test1";
37 builder["f9"] = "dGVzdDI="; // base64 encoded "test2"
38 builder["f10"] = "TEST_ENUM_VALUE1";
39 builder["f11"] = 987;
40
41 structs::Scalar result;
42 UASSERT_NO_THROW(result = JsonToStruct<structs::Scalar>(builder.ExtractValue(), {}));
43 structs::CheckScalarEqual(result, expected);
44}
45
46TEST(JsonToStruct, JsonString) {
47 messages::Scalar expected;
48 expected.set_f1(true);
49 expected.set_f2(std::numeric_limits<int32_t>::min());
50 expected.set_f3(std::numeric_limits<uint32_t>::max());
51 expected.set_f4(std::numeric_limits<int64_t>::min());
52 expected.set_f5(std::numeric_limits<uint64_t>::max());
53 expected.set_f6(static_cast<float>(1.5));
54 expected.set_f7(-2.5);
55 expected.set_f8("test1");
56 expected.set_f9("test2");
57 expected.set_f10(messages::TestEnum::TEST_ENUM_VALUE1);
58 expected.set_f11(987);
59
60 auto builder = formats::json::ValueBuilder{formats::common::Type::kObject};
61 builder["f1"] = true;
62 builder["f2"] = std::numeric_limits<int32_t>::min();
63 builder["f3"] = std::numeric_limits<uint32_t>::max();
64 // 64 bits are too large for JSON numbers, so we convert to string
65 builder["f4"] = std::to_string(std::numeric_limits<int64_t>::min());
66 builder["f5"] = std::to_string(std::numeric_limits<uint64_t>::max());
67 builder["f6"] = static_cast<float>(1.5);
68 builder["f7"] = -2.5;
69 builder["f8"] = "test1";
70 builder["f9"] = "dGVzdDI="; // base64 encoded "test2"
71 builder["f10"] = "TEST_ENUM_VALUE1";
72 builder["f11"] = 987;
73 const auto json_string = formats::json::ToString(builder.ExtractValue());
74
75 structs::Scalar result;
76 UASSERT_NO_THROW(result = JsonStringToStruct<structs::Scalar>(json_string, {}));
77 structs::CheckScalarEqual(result, expected);
78}
79
80} // namespace proto_structs::tests
81
82USERVER_NAMESPACE_END