diff options
author | Anton Samokhvalov <pg83@yandex.ru> | 2022-02-10 16:45:15 +0300 |
---|---|---|
committer | Daniil Cherednik <dcherednik@yandex-team.ru> | 2022-02-10 16:45:15 +0300 |
commit | 72cb13b4aff9bc9cf22e49251bc8fd143f82538f (patch) | |
tree | da2c34829458c7d4e74bdfbdf85dff449e9e7fb8 /library/cpp/protobuf/json/ut | |
parent | 778e51ba091dc39e7b7fcab2b9cf4dbedfb6f2b5 (diff) | |
download | ydb-72cb13b4aff9bc9cf22e49251bc8fd143f82538f.tar.gz |
Restoring authorship annotation for Anton Samokhvalov <pg83@yandex.ru>. Commit 1 of 2.
Diffstat (limited to 'library/cpp/protobuf/json/ut')
-rw-r--r-- | library/cpp/protobuf/json/ut/filter_ut.cpp | 112 | ||||
-rw-r--r-- | library/cpp/protobuf/json/ut/inline_ut.cpp | 158 | ||||
-rw-r--r-- | library/cpp/protobuf/json/ut/json.h | 72 | ||||
-rw-r--r-- | library/cpp/protobuf/json/ut/json2proto_ut.cpp | 1286 | ||||
-rw-r--r-- | library/cpp/protobuf/json/ut/proto.h | 92 | ||||
-rw-r--r-- | library/cpp/protobuf/json/ut/proto2json_ut.cpp | 1456 | ||||
-rw-r--r-- | library/cpp/protobuf/json/ut/string_transform_ut.cpp | 10 |
7 files changed, 1593 insertions, 1593 deletions
diff --git a/library/cpp/protobuf/json/ut/filter_ut.cpp b/library/cpp/protobuf/json/ut/filter_ut.cpp index 95c227666f..0e2c13649a 100644 --- a/library/cpp/protobuf/json/ut/filter_ut.cpp +++ b/library/cpp/protobuf/json/ut/filter_ut.cpp @@ -22,72 +22,72 @@ static NProtobufJsonUt::TFilterTest GetTestMsg() { Y_UNIT_TEST_SUITE(TProto2JsonFilterTest){ Y_UNIT_TEST(TestFilterPrinter){ NProtobufJsonUt::TFilterTest msg = GetTestMsg(); -{ - TString expected = R"({"OptFiltered":"1","NotFiltered":"23","RepFiltered":[45,67],)" - R"("Inner":{"Number":[100,200],"InnerFiltered":235}})"; - TString my = Proto2Json(msg); - UNIT_ASSERT_STRINGS_EQUAL(my, expected); -} - -{ - TString expected = R"({"NotFiltered":"23",)" - R"("Inner":{"Number":[100,200]}})"; - TString my = PrintWithFilter(msg, MakeFieldOptionFunctor(NProtobufJsonUt::filter_test, false)); - UNIT_ASSERT_STRINGS_EQUAL(my, expected); -} +{ + TString expected = R"({"OptFiltered":"1","NotFiltered":"23","RepFiltered":[45,67],)" + R"("Inner":{"Number":[100,200],"InnerFiltered":235}})"; + TString my = Proto2Json(msg); + UNIT_ASSERT_STRINGS_EQUAL(my, expected); +} -{ - TString expected = R"({"OptFiltered":"1","RepFiltered":[45,67]})"; - TString my = PrintWithFilter(msg, MakeFieldOptionFunctor(NProtobufJsonUt::filter_test)); - UNIT_ASSERT_STRINGS_EQUAL(my, expected); -} +{ + TString expected = R"({"NotFiltered":"23",)" + R"("Inner":{"Number":[100,200]}})"; + TString my = PrintWithFilter(msg, MakeFieldOptionFunctor(NProtobufJsonUt::filter_test, false)); + UNIT_ASSERT_STRINGS_EQUAL(my, expected); +} -{ - TString expected = R"({"OptFiltered":"1","NotFiltered":"23",)" - R"("Inner":{"Number":[100,200]}})"; - TString my; - PrintWithFilter(msg, MakeFieldOptionFunctor(NProtobufJsonUt::export_test), *CreateJsonMapOutput(my)); - UNIT_ASSERT_STRINGS_EQUAL(my, expected); -} - -{ - TString expected = R"({"NotFiltered":"23",)" - R"("Inner":{"Number":[100,200]}})"; - auto functor = [](const NProtoBuf::Message&, const NProtoBuf::FieldDescriptor* field) { - return field->name() == "NotFiltered" || field->name() == "Number" || field->name() == "Inner"; - }; - TString my = PrintWithFilter(msg, functor); - UNIT_ASSERT_STRINGS_EQUAL(my, expected); -} -} +{ + TString expected = R"({"OptFiltered":"1","RepFiltered":[45,67]})"; + TString my = PrintWithFilter(msg, MakeFieldOptionFunctor(NProtobufJsonUt::filter_test)); + UNIT_ASSERT_STRINGS_EQUAL(my, expected); +} +{ + TString expected = R"({"OptFiltered":"1","NotFiltered":"23",)" + R"("Inner":{"Number":[100,200]}})"; + TString my; + PrintWithFilter(msg, MakeFieldOptionFunctor(NProtobufJsonUt::export_test), *CreateJsonMapOutput(my)); + UNIT_ASSERT_STRINGS_EQUAL(my, expected); +} + +{ + TString expected = R"({"NotFiltered":"23",)" + R"("Inner":{"Number":[100,200]}})"; + auto functor = [](const NProtoBuf::Message&, const NProtoBuf::FieldDescriptor* field) { + return field->name() == "NotFiltered" || field->name() == "Number" || field->name() == "Inner"; + }; + TString my = PrintWithFilter(msg, functor); + UNIT_ASSERT_STRINGS_EQUAL(my, expected); +} +} + Y_UNIT_TEST(NoUnnecessaryCopyFunctor) { - size_t CopyCount = 0; - struct TFunctorMock { - TFunctorMock(size_t* copyCount) - : CopyCount(copyCount) + size_t CopyCount = 0; + struct TFunctorMock { + TFunctorMock(size_t* copyCount) + : CopyCount(copyCount) { - UNIT_ASSERT(*CopyCount <= 1); + UNIT_ASSERT(*CopyCount <= 1); } - TFunctorMock(const TFunctorMock& f) - : CopyCount(f.CopyCount) + TFunctorMock(const TFunctorMock& f) + : CopyCount(f.CopyCount) { - ++*CopyCount; + ++*CopyCount; } - TFunctorMock(TFunctorMock&& f) = default; + TFunctorMock(TFunctorMock&& f) = default; - bool operator()(const NProtoBuf::Message&, const NProtoBuf::FieldDescriptor*) const { - return false; - } + bool operator()(const NProtoBuf::Message&, const NProtoBuf::FieldDescriptor*) const { + return false; + } - size_t* CopyCount; - }; + size_t* CopyCount; + }; - TProto2JsonConfig cfg; - TFilteringPrinter<> printer(TFunctorMock(&CopyCount), cfg); - UNIT_ASSERT(CopyCount <= 1); -} -} -; + TProto2JsonConfig cfg; + TFilteringPrinter<> printer(TFunctorMock(&CopyCount), cfg); + UNIT_ASSERT(CopyCount <= 1); +} +} +; diff --git a/library/cpp/protobuf/json/ut/inline_ut.cpp b/library/cpp/protobuf/json/ut/inline_ut.cpp index c29ad32e7d..0960de3220 100644 --- a/library/cpp/protobuf/json/ut/inline_ut.cpp +++ b/library/cpp/protobuf/json/ut/inline_ut.cpp @@ -24,99 +24,99 @@ static NProtobufJsonUt::TInlineTest GetTestMsg() { Y_UNIT_TEST_SUITE(TProto2JsonInlineTest){ Y_UNIT_TEST(TestNormalPrint){ NProtobufJsonUt::TInlineTest msg = GetTestMsg(); -// normal print should output these fields as just string values -TString expRaw = R"({"OptJson":"{\"a\":1,\"b\":\"000\"}","NotJson":"12{}34","RepJson":["{}","[1,2]"],)" - R"("Inner":{"Number":[100,200],"InnerJson":"{\"xxx\":[]}"}})"; -TString myRaw; -Proto2Json(msg, myRaw); -UNIT_ASSERT_STRINGS_EQUAL(myRaw, expRaw); - -myRaw = PrintInlined(msg, [](const NProtoBuf::Message&, const NProtoBuf::FieldDescriptor*) { return false; }); -UNIT_ASSERT_STRINGS_EQUAL(myRaw, expRaw); // result is the same -} +// normal print should output these fields as just string values +TString expRaw = R"({"OptJson":"{\"a\":1,\"b\":\"000\"}","NotJson":"12{}34","RepJson":["{}","[1,2]"],)" + R"("Inner":{"Number":[100,200],"InnerJson":"{\"xxx\":[]}"}})"; +TString myRaw; +Proto2Json(msg, myRaw); +UNIT_ASSERT_STRINGS_EQUAL(myRaw, expRaw); + +myRaw = PrintInlined(msg, [](const NProtoBuf::Message&, const NProtoBuf::FieldDescriptor*) { return false; }); +UNIT_ASSERT_STRINGS_EQUAL(myRaw, expRaw); // result is the same +} Y_UNIT_TEST(TestInliningPrinter) { - NProtobufJsonUt::TInlineTest msg = GetTestMsg(); - // inlined print should output these fields as inlined json sub-objects - TString expInlined = R"({"OptJson":{"a":1,"b":"000"},"NotJson":"12{}34","RepJson":[{},[1,2]],)" - R"("Inner":{"Number":[100,200],"InnerJson":{"xxx":[]}}})"; - - { - TString myInlined = PrintInlined(msg, MakeFieldOptionFunctor(NProtobufJsonUt::inline_test)); - UNIT_ASSERT_STRINGS_EQUAL(myInlined, expInlined); + NProtobufJsonUt::TInlineTest msg = GetTestMsg(); + // inlined print should output these fields as inlined json sub-objects + TString expInlined = R"({"OptJson":{"a":1,"b":"000"},"NotJson":"12{}34","RepJson":[{},[1,2]],)" + R"("Inner":{"Number":[100,200],"InnerJson":{"xxx":[]}}})"; + + { + TString myInlined = PrintInlined(msg, MakeFieldOptionFunctor(NProtobufJsonUt::inline_test)); + UNIT_ASSERT_STRINGS_EQUAL(myInlined, expInlined); } - { - auto functor = [](const NProtoBuf::Message&, const NProtoBuf::FieldDescriptor* field) { - return field->name() == "OptJson" || field->name() == "RepJson" || field->name() == "InnerJson"; - }; - TString myInlined = PrintInlined(msg, functor); - UNIT_ASSERT_STRINGS_EQUAL(myInlined, expInlined); - } -} + { + auto functor = [](const NProtoBuf::Message&, const NProtoBuf::FieldDescriptor* field) { + return field->name() == "OptJson" || field->name() == "RepJson" || field->name() == "InnerJson"; + }; + TString myInlined = PrintInlined(msg, functor); + UNIT_ASSERT_STRINGS_EQUAL(myInlined, expInlined); + } +} Y_UNIT_TEST(TestNoValues) { - // no values - no printing - NProtobufJsonUt::TInlineTest msg; - msg.MutableInner()->AddNumber(100); - msg.MutableInner()->AddNumber(200); + // no values - no printing + NProtobufJsonUt::TInlineTest msg; + msg.MutableInner()->AddNumber(100); + msg.MutableInner()->AddNumber(200); - TString expInlined = R"({"Inner":{"Number":[100,200]}})"; + TString expInlined = R"({"Inner":{"Number":[100,200]}})"; - TString myInlined = PrintInlined(msg, MakeFieldOptionFunctor(NProtobufJsonUt::inline_test)); - UNIT_ASSERT_STRINGS_EQUAL(myInlined, expInlined); -} + TString myInlined = PrintInlined(msg, MakeFieldOptionFunctor(NProtobufJsonUt::inline_test)); + UNIT_ASSERT_STRINGS_EQUAL(myInlined, expInlined); +} Y_UNIT_TEST(TestMissingKeyModeNull) { - NProtobufJsonUt::TInlineTest msg; - msg.MutableInner()->AddNumber(100); - msg.MutableInner()->AddNumber(200); + NProtobufJsonUt::TInlineTest msg; + msg.MutableInner()->AddNumber(100); + msg.MutableInner()->AddNumber(200); - TString expInlined = R"({"OptJson":null,"NotJson":null,"RepJson":null,"Inner":{"Number":[100,200],"InnerJson":null}})"; + TString expInlined = R"({"OptJson":null,"NotJson":null,"RepJson":null,"Inner":{"Number":[100,200],"InnerJson":null}})"; - TProto2JsonConfig cfg; - cfg.SetMissingSingleKeyMode(TProto2JsonConfig::MissingKeyNull).SetMissingRepeatedKeyMode(TProto2JsonConfig::MissingKeyNull); - TString myInlined = PrintInlined(msg, MakeFieldOptionFunctor(NProtobufJsonUt::inline_test), cfg); - UNIT_ASSERT_STRINGS_EQUAL(myInlined, expInlined); -} + TProto2JsonConfig cfg; + cfg.SetMissingSingleKeyMode(TProto2JsonConfig::MissingKeyNull).SetMissingRepeatedKeyMode(TProto2JsonConfig::MissingKeyNull); + TString myInlined = PrintInlined(msg, MakeFieldOptionFunctor(NProtobufJsonUt::inline_test), cfg); + UNIT_ASSERT_STRINGS_EQUAL(myInlined, expInlined); +} Y_UNIT_TEST(TestMissingKeyModeDefault) { - NProtobufJsonUt::TInlineTestDefaultValues msg; + NProtobufJsonUt::TInlineTestDefaultValues msg; - TString expInlined = R"({"OptJson":{"default":1},"Number":0,"RepJson":[],"Inner":{"OptJson":{"default":2}}})"; + TString expInlined = R"({"OptJson":{"default":1},"Number":0,"RepJson":[],"Inner":{"OptJson":{"default":2}}})"; - TProto2JsonConfig cfg; - cfg.SetMissingSingleKeyMode(TProto2JsonConfig::MissingKeyDefault).SetMissingRepeatedKeyMode(TProto2JsonConfig::MissingKeyDefault); - TString myInlined = PrintInlined(msg, MakeFieldOptionFunctor(NProtobufJsonUt::inline_test), cfg); - UNIT_ASSERT_STRINGS_EQUAL(myInlined, expInlined); -} + TProto2JsonConfig cfg; + cfg.SetMissingSingleKeyMode(TProto2JsonConfig::MissingKeyDefault).SetMissingRepeatedKeyMode(TProto2JsonConfig::MissingKeyDefault); + TString myInlined = PrintInlined(msg, MakeFieldOptionFunctor(NProtobufJsonUt::inline_test), cfg); + UNIT_ASSERT_STRINGS_EQUAL(myInlined, expInlined); +} Y_UNIT_TEST(NoUnnecessaryCopyFunctor) { - size_t CopyCount = 0; - struct TFunctorMock { - TFunctorMock(size_t* copyCount) - : CopyCount(copyCount) - { - UNIT_ASSERT(*CopyCount <= 1); - } - - TFunctorMock(const TFunctorMock& f) - : CopyCount(f.CopyCount) - { - ++*CopyCount; - } - - TFunctorMock(TFunctorMock&& f) = default; - - bool operator()(const NProtoBuf::Message&, const NProtoBuf::FieldDescriptor*) const { - return false; - } - - size_t* CopyCount; - }; - - TProto2JsonConfig cfg; - TInliningPrinter<> printer(TFunctorMock(&CopyCount), cfg); - UNIT_ASSERT(CopyCount <= 1); -} -} -; + size_t CopyCount = 0; + struct TFunctorMock { + TFunctorMock(size_t* copyCount) + : CopyCount(copyCount) + { + UNIT_ASSERT(*CopyCount <= 1); + } + + TFunctorMock(const TFunctorMock& f) + : CopyCount(f.CopyCount) + { + ++*CopyCount; + } + + TFunctorMock(TFunctorMock&& f) = default; + + bool operator()(const NProtoBuf::Message&, const NProtoBuf::FieldDescriptor*) const { + return false; + } + + size_t* CopyCount; + }; + + TProto2JsonConfig cfg; + TInliningPrinter<> printer(TFunctorMock(&CopyCount), cfg); + UNIT_ASSERT(CopyCount <= 1); +} +} +; diff --git a/library/cpp/protobuf/json/ut/json.h b/library/cpp/protobuf/json/ut/json.h index c1f108e6e4..bdab69f4d4 100644 --- a/library/cpp/protobuf/json/ut/json.h +++ b/library/cpp/protobuf/json/ut/json.h @@ -12,58 +12,58 @@ #include <util/system/defaults.h> namespace NProtobufJsonTest { - inline NJson::TJsonValue - CreateFlatJson(const THashSet<TString>& skippedKeys = THashSet<TString>()) { - NJson::TJsonValue json; + inline NJson::TJsonValue + CreateFlatJson(const THashSet<TString>& skippedKeys = THashSet<TString>()) { + NJson::TJsonValue json; -#define DEFINE_FIELD(name, value) \ - if (skippedKeys.find(#name) == skippedKeys.end()) \ +#define DEFINE_FIELD(name, value) \ + if (skippedKeys.find(#name) == skippedKeys.end()) \ json.InsertValue(#name, value); #include "fields.incl" #undef DEFINE_FIELD - return json; - } - - inline NJson::TJsonValue - CreateRepeatedFlatJson(const THashSet<TString>& skippedKeys = THashSet<TString>()) { - NJson::TJsonValue json; - -#define DEFINE_REPEATED_FIELD(name, type, ...) \ - if (skippedKeys.find(#name) == skippedKeys.end()) { \ - type values[] = {__VA_ARGS__}; \ - NJson::TJsonValue array(NJson::JSON_ARRAY); \ - for (size_t i = 0, end = Y_ARRAY_SIZE(values); i < end; ++i) { \ - array.AppendValue(values[i]); \ - } \ - json.InsertValue(#name, array); \ + return json; + } + + inline NJson::TJsonValue + CreateRepeatedFlatJson(const THashSet<TString>& skippedKeys = THashSet<TString>()) { + NJson::TJsonValue json; + +#define DEFINE_REPEATED_FIELD(name, type, ...) \ + if (skippedKeys.find(#name) == skippedKeys.end()) { \ + type values[] = {__VA_ARGS__}; \ + NJson::TJsonValue array(NJson::JSON_ARRAY); \ + for (size_t i = 0, end = Y_ARRAY_SIZE(values); i < end; ++i) { \ + array.AppendValue(values[i]); \ + } \ + json.InsertValue(#name, array); \ } #include "repeated_fields.incl" #undef DEFINE_REPEATED_FIELD - return json; - } + return json; + } - inline NJson::TJsonValue - CreateCompositeJson(const THashSet<TString>& skippedKeys = THashSet<TString>()) { - const NJson::TJsonValue& part = CreateFlatJson(skippedKeys); - NJson::TJsonValue json; - json.InsertValue("Part", part); + inline NJson::TJsonValue + CreateCompositeJson(const THashSet<TString>& skippedKeys = THashSet<TString>()) { + const NJson::TJsonValue& part = CreateFlatJson(skippedKeys); + NJson::TJsonValue json; + json.InsertValue("Part", part); - return json; - } + return json; + } -#define UNIT_ASSERT_JSONS_EQUAL(lhs, rhs) \ - if (lhs != rhs) { \ +#define UNIT_ASSERT_JSONS_EQUAL(lhs, rhs) \ + if (lhs != rhs) { \ UNIT_ASSERT_STRINGS_EQUAL(lhs.GetStringRobust(), rhs.GetStringRobust()); \ } -#define UNIT_ASSERT_JSON_STRINGS_EQUAL(lhs, rhs) \ - if (lhs != rhs) { \ - NJson::TJsonValue _lhs_json, _rhs_json; \ +#define UNIT_ASSERT_JSON_STRINGS_EQUAL(lhs, rhs) \ + if (lhs != rhs) { \ + NJson::TJsonValue _lhs_json, _rhs_json; \ UNIT_ASSERT(NJson::ReadJsonTree(lhs, &_lhs_json)); \ UNIT_ASSERT(NJson::ReadJsonTree(rhs, &_rhs_json)); \ - UNIT_ASSERT_JSONS_EQUAL(_lhs_json, _rhs_json); \ + UNIT_ASSERT_JSONS_EQUAL(_lhs_json, _rhs_json); \ } -} +} diff --git a/library/cpp/protobuf/json/ut/json2proto_ut.cpp b/library/cpp/protobuf/json/ut/json2proto_ut.cpp index 0dfe57bc7a..c8fbcce65c 100644 --- a/library/cpp/protobuf/json/ut/json2proto_ut.cpp +++ b/library/cpp/protobuf/json/ut/json2proto_ut.cpp @@ -24,13 +24,13 @@ using namespace NProtobufJson; using namespace NProtobufJsonTest; namespace google { - namespace protobuf { - namespace internal { - void MapTestForceDeterministic() { - google::protobuf::io::CodedOutputStream::SetDefaultSerializationDeterministic(); - } - } - } // namespace protobuf + namespace protobuf { + namespace internal { + void MapTestForceDeterministic() { + google::protobuf::io::CodedOutputStream::SetDefaultSerializationDeterministic(); + } + } + } // namespace protobuf } namespace { @@ -72,331 +72,331 @@ namespace { Y_UNIT_TEST_SUITE(TJson2ProtoTest) { Y_UNIT_TEST(TestFlatOptional){ - {const NJson::TJsonValue& json = CreateFlatJson(); - TFlatOptional proto; - Json2Proto(json, proto); - TFlatOptional modelProto; - FillFlatProto(&modelProto); - UNIT_ASSERT_PROTOS_EQUAL(proto, modelProto); -} - - // Try to skip each field -#define DEFINE_FIELD(name, value) \ - { \ - THashSet<TString> skippedField; \ - skippedField.insert(#name); \ - const NJson::TJsonValue& json = CreateFlatJson(skippedField); \ - TFlatOptional proto; \ - Json2Proto(json, proto); \ - TFlatOptional modelProto; \ - FillFlatProto(&modelProto, skippedField); \ - UNIT_ASSERT_PROTOS_EQUAL(proto, modelProto); \ - } + {const NJson::TJsonValue& json = CreateFlatJson(); + TFlatOptional proto; + Json2Proto(json, proto); + TFlatOptional modelProto; + FillFlatProto(&modelProto); + UNIT_ASSERT_PROTOS_EQUAL(proto, modelProto); +} + + // Try to skip each field +#define DEFINE_FIELD(name, value) \ + { \ + THashSet<TString> skippedField; \ + skippedField.insert(#name); \ + const NJson::TJsonValue& json = CreateFlatJson(skippedField); \ + TFlatOptional proto; \ + Json2Proto(json, proto); \ + TFlatOptional modelProto; \ + FillFlatProto(&modelProto, skippedField); \ + UNIT_ASSERT_PROTOS_EQUAL(proto, modelProto); \ + } #include <library/cpp/protobuf/json/ut/fields.incl> #undef DEFINE_FIELD -} // TestFlatOptional +} // TestFlatOptional Y_UNIT_TEST(TestFlatRequired){ - {const NJson::TJsonValue& json = CreateFlatJson(); -TFlatRequired proto; -Json2Proto(json, proto); -TFlatRequired modelProto; -FillFlatProto(&modelProto); -UNIT_ASSERT_PROTOS_EQUAL(proto, modelProto); -} - -// Try to skip each field -#define DEFINE_FIELD(name, value) \ - { \ - THashSet<TString> skippedField; \ - skippedField.insert(#name); \ - const NJson::TJsonValue& json = CreateFlatJson(skippedField); \ - TFlatRequired proto; \ - UNIT_ASSERT_EXCEPTION(Json2Proto(json, proto), yexception); \ - } + {const NJson::TJsonValue& json = CreateFlatJson(); +TFlatRequired proto; +Json2Proto(json, proto); +TFlatRequired modelProto; +FillFlatProto(&modelProto); +UNIT_ASSERT_PROTOS_EQUAL(proto, modelProto); +} + +// Try to skip each field +#define DEFINE_FIELD(name, value) \ + { \ + THashSet<TString> skippedField; \ + skippedField.insert(#name); \ + const NJson::TJsonValue& json = CreateFlatJson(skippedField); \ + TFlatRequired proto; \ + UNIT_ASSERT_EXCEPTION(Json2Proto(json, proto), yexception); \ + } #include <library/cpp/protobuf/json/ut/fields.incl> #undef DEFINE_FIELD -} // TestFlatRequired +} // TestFlatRequired Y_UNIT_TEST(TestNameGenerator) { - TJson2ProtoConfig cfg; - cfg.SetNameGenerator([](const NProtoBuf::FieldDescriptor&) { return "42"; }); + TJson2ProtoConfig cfg; + cfg.SetNameGenerator([](const NProtoBuf::FieldDescriptor&) { return "42"; }); - TNameGeneratorType proto; + TNameGeneratorType proto; Json2Proto(TStringBuf(R"({"42":42})"), proto, cfg); - TNameGeneratorType expected; - expected.SetField(42); - - UNIT_ASSERT_PROTOS_EQUAL(expected, proto); -} + TNameGeneratorType expected; + expected.SetField(42); + UNIT_ASSERT_PROTOS_EQUAL(expected, proto); +} + Y_UNIT_TEST(TestFlatNoCheckRequired) { - { - const NJson::TJsonValue& json = CreateFlatJson(); - TFlatRequired proto; - Json2Proto(json, proto); - TFlatRequired modelProto; - FillFlatProto(&modelProto); - UNIT_ASSERT_PROTOS_EQUAL(proto, modelProto); + { + const NJson::TJsonValue& json = CreateFlatJson(); + TFlatRequired proto; + Json2Proto(json, proto); + TFlatRequired modelProto; + FillFlatProto(&modelProto); + UNIT_ASSERT_PROTOS_EQUAL(proto, modelProto); } - TJson2ProtoConfig cfg; - cfg.CheckRequiredFields = false; - - // Try to skip each field -#define DEFINE_FIELD(name, value) \ - { \ - THashSet<TString> skippedField; \ - skippedField.insert(#name); \ - const NJson::TJsonValue& json = CreateFlatJson(skippedField); \ - TFlatRequired proto; \ - UNIT_ASSERT_NO_EXCEPTION(Json2Proto(json, proto, cfg)); \ - } + TJson2ProtoConfig cfg; + cfg.CheckRequiredFields = false; + + // Try to skip each field +#define DEFINE_FIELD(name, value) \ + { \ + THashSet<TString> skippedField; \ + skippedField.insert(#name); \ + const NJson::TJsonValue& json = CreateFlatJson(skippedField); \ + TFlatRequired proto; \ + UNIT_ASSERT_NO_EXCEPTION(Json2Proto(json, proto, cfg)); \ + } #include <library/cpp/protobuf/json/ut/fields.incl> #undef DEFINE_FIELD -} // TestFlatNoCheckRequired +} // TestFlatNoCheckRequired Y_UNIT_TEST(TestFlatRepeated){ - {const NJson::TJsonValue& json = CreateRepeatedFlatJson(); -TFlatRepeated proto; -Json2Proto(json, proto); -TFlatRepeated modelProto; -FillRepeatedProto(&modelProto); -UNIT_ASSERT_PROTOS_EQUAL(proto, modelProto); -} - -// Try to skip each field -#define DEFINE_REPEATED_FIELD(name, ...) \ - { \ - THashSet<TString> skippedField; \ - skippedField.insert(#name); \ - const NJson::TJsonValue& json = CreateRepeatedFlatJson(skippedField); \ - TFlatRepeated proto; \ - Json2Proto(json, proto); \ - TFlatRepeated modelProto; \ - FillRepeatedProto(&modelProto, skippedField); \ - UNIT_ASSERT_PROTOS_EQUAL(proto, modelProto); \ - } + {const NJson::TJsonValue& json = CreateRepeatedFlatJson(); +TFlatRepeated proto; +Json2Proto(json, proto); +TFlatRepeated modelProto; +FillRepeatedProto(&modelProto); +UNIT_ASSERT_PROTOS_EQUAL(proto, modelProto); +} + +// Try to skip each field +#define DEFINE_REPEATED_FIELD(name, ...) \ + { \ + THashSet<TString> skippedField; \ + skippedField.insert(#name); \ + const NJson::TJsonValue& json = CreateRepeatedFlatJson(skippedField); \ + TFlatRepeated proto; \ + Json2Proto(json, proto); \ + TFlatRepeated modelProto; \ + FillRepeatedProto(&modelProto, skippedField); \ + UNIT_ASSERT_PROTOS_EQUAL(proto, modelProto); \ + } #include <library/cpp/protobuf/json/ut/repeated_fields.incl> #undef DEFINE_REPEATED_FIELD -} // TestFlatRepeated +} // TestFlatRepeated Y_UNIT_TEST(TestCompositeOptional){ - {const NJson::TJsonValue& json = CreateCompositeJson(); -TCompositeOptional proto; -Json2Proto(json, proto); -TCompositeOptional modelProto; -FillCompositeProto(&modelProto); -UNIT_ASSERT_PROTOS_EQUAL(proto, modelProto); -} - -// Try to skip each field -#define DEFINE_FIELD(name, value) \ - { \ - THashSet<TString> skippedField; \ - skippedField.insert(#name); \ - const NJson::TJsonValue& json = CreateCompositeJson(skippedField); \ - TCompositeOptional proto; \ - Json2Proto(json, proto); \ - TCompositeOptional modelProto; \ - FillCompositeProto(&modelProto, skippedField); \ - UNIT_ASSERT_PROTOS_EQUAL(proto, modelProto); \ - } + {const NJson::TJsonValue& json = CreateCompositeJson(); +TCompositeOptional proto; +Json2Proto(json, proto); +TCompositeOptional modelProto; +FillCompositeProto(&modelProto); +UNIT_ASSERT_PROTOS_EQUAL(proto, modelProto); +} + +// Try to skip each field +#define DEFINE_FIELD(name, value) \ + { \ + THashSet<TString> skippedField; \ + skippedField.insert(#name); \ + const NJson::TJsonValue& json = CreateCompositeJson(skippedField); \ + TCompositeOptional proto; \ + Json2Proto(json, proto); \ + TCompositeOptional modelProto; \ + FillCompositeProto(&modelProto, skippedField); \ + UNIT_ASSERT_PROTOS_EQUAL(proto, modelProto); \ + } #include <library/cpp/protobuf/json/ut/fields.incl> #undef DEFINE_FIELD -} // TestCompositeOptional +} // TestCompositeOptional Y_UNIT_TEST(TestCompositeOptionalStringBuf){ - {NJson::TJsonValue json = CreateCompositeJson(); -json["Part"]["Double"] = 42.5; -TCompositeOptional proto; -Json2Proto(JsonValueToString(json), proto); -TCompositeOptional modelProto; -FillCompositeProto(&modelProto); -modelProto.MutablePart()->SetDouble(42.5); -UNIT_ASSERT_PROTOS_EQUAL(proto, modelProto); -} - -// Try to skip each field -#define DEFINE_FIELD(name, value) \ - { \ - THashSet<TString> skippedField; \ - skippedField.insert(#name); \ - NJson::TJsonValue json = CreateCompositeJson(skippedField); \ - if (json["Part"].Has("Double")) { \ - json["Part"]["Double"] = 42.5; \ - } \ - TCompositeOptional proto; \ - Json2Proto(JsonValueToString(json), proto); \ - TCompositeOptional modelProto; \ - FillCompositeProto(&modelProto, skippedField); \ - if (modelProto.GetPart().HasDouble()) { \ - modelProto.MutablePart()->SetDouble(42.5); \ - } \ - UNIT_ASSERT_PROTOS_EQUAL(proto, modelProto); \ - } + {NJson::TJsonValue json = CreateCompositeJson(); +json["Part"]["Double"] = 42.5; +TCompositeOptional proto; +Json2Proto(JsonValueToString(json), proto); +TCompositeOptional modelProto; +FillCompositeProto(&modelProto); +modelProto.MutablePart()->SetDouble(42.5); +UNIT_ASSERT_PROTOS_EQUAL(proto, modelProto); +} + +// Try to skip each field +#define DEFINE_FIELD(name, value) \ + { \ + THashSet<TString> skippedField; \ + skippedField.insert(#name); \ + NJson::TJsonValue json = CreateCompositeJson(skippedField); \ + if (json["Part"].Has("Double")) { \ + json["Part"]["Double"] = 42.5; \ + } \ + TCompositeOptional proto; \ + Json2Proto(JsonValueToString(json), proto); \ + TCompositeOptional modelProto; \ + FillCompositeProto(&modelProto, skippedField); \ + if (modelProto.GetPart().HasDouble()) { \ + modelProto.MutablePart()->SetDouble(42.5); \ + } \ + UNIT_ASSERT_PROTOS_EQUAL(proto, modelProto); \ + } #include <library/cpp/protobuf/json/ut/fields.incl> #undef DEFINE_FIELD -} // TestCompositeOptionalStringBuf +} // TestCompositeOptionalStringBuf Y_UNIT_TEST(TestCompositeRequired) { - { - const NJson::TJsonValue& json = CreateCompositeJson(); - TCompositeRequired proto; - Json2Proto(json, proto); - TCompositeRequired modelProto; - FillCompositeProto(&modelProto); - UNIT_ASSERT_PROTOS_EQUAL(proto, modelProto); - } - - { - NJson::TJsonValue json; - TCompositeRequired proto; - UNIT_ASSERT_EXCEPTION(Json2Proto(json, proto), yexception); - } -} // TestCompositeRequired + { + const NJson::TJsonValue& json = CreateCompositeJson(); + TCompositeRequired proto; + Json2Proto(json, proto); + TCompositeRequired modelProto; + FillCompositeProto(&modelProto); + UNIT_ASSERT_PROTOS_EQUAL(proto, modelProto); + } + + { + NJson::TJsonValue json; + TCompositeRequired proto; + UNIT_ASSERT_EXCEPTION(Json2Proto(json, proto), yexception); + } +} // TestCompositeRequired Y_UNIT_TEST(TestCompositeRepeated) { - { - NJson::TJsonValue json; - NJson::TJsonValue array; - array.AppendValue(CreateFlatJson()); - json.InsertValue("Part", array); - - TCompositeRepeated proto; - Json2Proto(json, proto); - - TFlatOptional partModelProto; - FillFlatProto(&partModelProto); - TCompositeRepeated modelProto; - modelProto.AddPart()->CopyFrom(partModelProto); - - UNIT_ASSERT_PROTOS_EQUAL(proto, modelProto); - } - - { - // Array of messages with each field skipped - TCompositeRepeated modelProto; - NJson::TJsonValue array; - -#define DEFINE_REPEATED_FIELD(name, ...) \ - { \ - THashSet<TString> skippedField; \ - skippedField.insert(#name); \ - TFlatOptional partModelProto; \ - FillFlatProto(&partModelProto, skippedField); \ - modelProto.AddPart()->CopyFrom(partModelProto); \ - array.AppendValue(CreateFlatJson(skippedField)); \ - } + { + NJson::TJsonValue json; + NJson::TJsonValue array; + array.AppendValue(CreateFlatJson()); + json.InsertValue("Part", array); + + TCompositeRepeated proto; + Json2Proto(json, proto); + + TFlatOptional partModelProto; + FillFlatProto(&partModelProto); + TCompositeRepeated modelProto; + modelProto.AddPart()->CopyFrom(partModelProto); + + UNIT_ASSERT_PROTOS_EQUAL(proto, modelProto); + } + + { + // Array of messages with each field skipped + TCompositeRepeated modelProto; + NJson::TJsonValue array; + +#define DEFINE_REPEATED_FIELD(name, ...) \ + { \ + THashSet<TString> skippedField; \ + skippedField.insert(#name); \ + TFlatOptional partModelProto; \ + FillFlatProto(&partModelProto, skippedField); \ + modelProto.AddPart()->CopyFrom(partModelProto); \ + array.AppendValue(CreateFlatJson(skippedField)); \ + } #include <library/cpp/protobuf/json/ut/repeated_fields.incl> #undef DEFINE_REPEATED_FIELD - NJson::TJsonValue json; - json.InsertValue("Part", array); + NJson::TJsonValue json; + json.InsertValue("Part", array); - TCompositeRepeated proto; - Json2Proto(json, proto); + TCompositeRepeated proto; + Json2Proto(json, proto); - UNIT_ASSERT_PROTOS_EQUAL(proto, modelProto); - } -} // TestCompositeRepeated + UNIT_ASSERT_PROTOS_EQUAL(proto, modelProto); + } +} // TestCompositeRepeated Y_UNIT_TEST(TestInvalidEnum) { - { - NJson::TJsonValue json; - json.InsertValue("Enum", "E_100"); - TFlatOptional proto; - UNIT_ASSERT_EXCEPTION(Json2Proto(json, proto), yexception); - } - - { - NJson::TJsonValue json; - json.InsertValue("Enum", 100); - TFlatOptional proto; - UNIT_ASSERT_EXCEPTION(Json2Proto(json, proto), yexception); + { + NJson::TJsonValue json; + json.InsertValue("Enum", "E_100"); + TFlatOptional proto; + UNIT_ASSERT_EXCEPTION(Json2Proto(json, proto), yexception); + } + + { + NJson::TJsonValue json; + json.InsertValue("Enum", 100); + TFlatOptional proto; + UNIT_ASSERT_EXCEPTION(Json2Proto(json, proto), yexception); } -} +} Y_UNIT_TEST(TestFieldNameMode) { - // Original case 1 - { - TString modelStr(R"_({"String":"value"})_"); + // Original case 1 + { + TString modelStr(R"_({"String":"value"})_"); - TFlatOptional proto; - TJson2ProtoConfig config; + TFlatOptional proto; + TJson2ProtoConfig config; - UNIT_ASSERT_NO_EXCEPTION(proto = Json2Proto<TFlatOptional>(modelStr, config)); - UNIT_ASSERT(proto.GetString() == "value"); - } + UNIT_ASSERT_NO_EXCEPTION(proto = Json2Proto<TFlatOptional>(modelStr, config)); + UNIT_ASSERT(proto.GetString() == "value"); + } - // Original case 2 - { - TString modelStr(R"_({"String":"value"})_"); + // Original case 2 + { + TString modelStr(R"_({"String":"value"})_"); - TFlatOptional proto; - TJson2ProtoConfig config; - config.FieldNameMode = TJson2ProtoConfig::FieldNameOriginalCase; + TFlatOptional proto; + TJson2ProtoConfig config; + config.FieldNameMode = TJson2ProtoConfig::FieldNameOriginalCase; - UNIT_ASSERT_NO_EXCEPTION(proto = Json2Proto<TFlatOptional>(modelStr, config)); - UNIT_ASSERT(proto.GetString() == "value"); - } + UNIT_ASSERT_NO_EXCEPTION(proto = Json2Proto<TFlatOptional>(modelStr, config)); + UNIT_ASSERT(proto.GetString() == "value"); + } - // Lowercase - { - TString modelStr(R"_({"string":"value"})_"); + // Lowercase + { + TString modelStr(R"_({"string":"value"})_"); - TFlatOptional proto; - TJson2ProtoConfig config; - config.FieldNameMode = TJson2ProtoConfig::FieldNameLowerCase; + TFlatOptional proto; + TJson2ProtoConfig config; + config.FieldNameMode = TJson2ProtoConfig::FieldNameLowerCase; - UNIT_ASSERT_NO_EXCEPTION(proto = Json2Proto<TFlatOptional>(modelStr, config)); - UNIT_ASSERT(proto.GetString() == "value"); - } + UNIT_ASSERT_NO_EXCEPTION(proto = Json2Proto<TFlatOptional>(modelStr, config)); + UNIT_ASSERT(proto.GetString() == "value"); + } - // Uppercase - { - TString modelStr(R"_({"STRING":"value"})_"); + // Uppercase + { + TString modelStr(R"_({"STRING":"value"})_"); - TFlatOptional proto; - TJson2ProtoConfig config; - config.FieldNameMode = TJson2ProtoConfig::FieldNameUpperCase; + TFlatOptional proto; + TJson2ProtoConfig config; + config.FieldNameMode = TJson2ProtoConfig::FieldNameUpperCase; - UNIT_ASSERT_NO_EXCEPTION(proto = Json2Proto<TFlatOptional>(modelStr, config)); - UNIT_ASSERT(proto.GetString() == "value"); - } + UNIT_ASSERT_NO_EXCEPTION(proto = Json2Proto<TFlatOptional>(modelStr, config)); + UNIT_ASSERT(proto.GetString() == "value"); + } - // Camelcase - { - TString modelStr(R"_({"string":"value"})_"); + // Camelcase + { + TString modelStr(R"_({"string":"value"})_"); - TFlatOptional proto; - TJson2ProtoConfig config; - config.FieldNameMode = TJson2ProtoConfig::FieldNameCamelCase; + TFlatOptional proto; + TJson2ProtoConfig config; + config.FieldNameMode = TJson2ProtoConfig::FieldNameCamelCase; - UNIT_ASSERT_NO_EXCEPTION(proto = Json2Proto<TFlatOptional>(modelStr, config)); - UNIT_ASSERT(proto.GetString() == "value"); - } - { - TString modelStr(R"_({"oneString":"value"})_"); + UNIT_ASSERT_NO_EXCEPTION(proto = Json2Proto<TFlatOptional>(modelStr, config)); + UNIT_ASSERT(proto.GetString() == "value"); + } + { + TString modelStr(R"_({"oneString":"value"})_"); - TFlatOptional proto; - TJson2ProtoConfig config; - config.FieldNameMode = TJson2ProtoConfig::FieldNameCamelCase; + TFlatOptional proto; + TJson2ProtoConfig config; + config.FieldNameMode = TJson2ProtoConfig::FieldNameCamelCase; - UNIT_ASSERT_NO_EXCEPTION(proto = Json2Proto<TFlatOptional>(modelStr, config)); - UNIT_ASSERT(proto.GetOneString() == "value"); - } - { - TString modelStr(R"_({"oneTwoString":"value"})_"); + UNIT_ASSERT_NO_EXCEPTION(proto = Json2Proto<TFlatOptional>(modelStr, config)); + UNIT_ASSERT(proto.GetOneString() == "value"); + } + { + TString modelStr(R"_({"oneTwoString":"value"})_"); - TFlatOptional proto; - TJson2ProtoConfig config; - config.FieldNameMode = TJson2ProtoConfig::FieldNameCamelCase; + TFlatOptional proto; + TJson2ProtoConfig config; + config.FieldNameMode = TJson2ProtoConfig::FieldNameCamelCase; - UNIT_ASSERT_NO_EXCEPTION(proto = Json2Proto<TFlatOptional>(modelStr, config)); - UNIT_ASSERT(proto.GetOneTwoString() == "value"); - } + UNIT_ASSERT_NO_EXCEPTION(proto = Json2Proto<TFlatOptional>(modelStr, config)); + UNIT_ASSERT(proto.GetOneTwoString() == "value"); + } // snake_case { @@ -430,95 +430,95 @@ Y_UNIT_TEST(TestFieldNameMode) { UNIT_ASSERT(proto.GetOneTwoString() == "value"); } - // Original case, repeated - { - TString modelStr(R"_({"I32":[1,2]})_"); - - TFlatRepeated proto; - TJson2ProtoConfig config; - config.FieldNameMode = TJson2ProtoConfig::FieldNameOriginalCase; - - UNIT_ASSERT_NO_EXCEPTION(proto = Json2Proto<TFlatRepeated>(modelStr, config)); - UNIT_ASSERT(proto.I32Size() == 2); - UNIT_ASSERT(proto.GetI32(0) == 1); - UNIT_ASSERT(proto.GetI32(1) == 2); - } - - // Lower case, repeated - { - TString modelStr(R"_({"i32":[1,2]})_"); - - TFlatRepeated proto; - TJson2ProtoConfig config; - config.FieldNameMode = TJson2ProtoConfig::FieldNameLowerCase; - - UNIT_ASSERT_NO_EXCEPTION(proto = Json2Proto<TFlatRepeated>(modelStr, config)); - UNIT_ASSERT(proto.I32Size() == 2); - UNIT_ASSERT(proto.GetI32(0) == 1); - UNIT_ASSERT(proto.GetI32(1) == 2); - } - - // UseJsonName - { - // FIXME(CONTRIB-139): since protobuf 3.1, Def_upper json name is - // "DefUpper", but until kernel/ugc/schema and yweb/yasap/pdb are + // Original case, repeated + { + TString modelStr(R"_({"I32":[1,2]})_"); + + TFlatRepeated proto; + TJson2ProtoConfig config; + config.FieldNameMode = TJson2ProtoConfig::FieldNameOriginalCase; + + UNIT_ASSERT_NO_EXCEPTION(proto = Json2Proto<TFlatRepeated>(modelStr, config)); + UNIT_ASSERT(proto.I32Size() == 2); + UNIT_ASSERT(proto.GetI32(0) == 1); + UNIT_ASSERT(proto.GetI32(1) == 2); + } + + // Lower case, repeated + { + TString modelStr(R"_({"i32":[1,2]})_"); + + TFlatRepeated proto; + TJson2ProtoConfig config; + config.FieldNameMode = TJson2ProtoConfig::FieldNameLowerCase; + + UNIT_ASSERT_NO_EXCEPTION(proto = Json2Proto<TFlatRepeated>(modelStr, config)); + UNIT_ASSERT(proto.I32Size() == 2); + UNIT_ASSERT(proto.GetI32(0) == 1); + UNIT_ASSERT(proto.GetI32(1) == 2); + } + + // UseJsonName + { + // FIXME(CONTRIB-139): since protobuf 3.1, Def_upper json name is + // "DefUpper", but until kernel/ugc/schema and yweb/yasap/pdb are // updated, library/cpp/protobuf/json preserves compatibility with - // protobuf 3.0 by lowercasing default names, making it "defUpper". - TString modelStr(R"_({"My-Upper":1,"my-lower":2,"defUpper":3,"defLower":4})_"); - - TWithJsonName proto; - TJson2ProtoConfig config; - config.SetUseJsonName(true); - - UNIT_ASSERT_NO_EXCEPTION(proto = Json2Proto<TWithJsonName>(modelStr, config)); - UNIT_ASSERT_EQUAL(proto.Getmy_upper(), 1); - UNIT_ASSERT_EQUAL(proto.GetMy_lower(), 2); - UNIT_ASSERT_EQUAL(proto.GetDef_upper(), 3); - UNIT_ASSERT_EQUAL(proto.Getdef_lower(), 4); - } - - // FieldNameMode with UseJsonName - { - TJson2ProtoConfig config; - config.SetFieldNameMode(TJson2ProtoConfig::FieldNameLowerCase); - UNIT_ASSERT_EXCEPTION_CONTAINS( - config.SetUseJsonName(true), yexception, "mutually exclusive"); - } - { - TJson2ProtoConfig config; - config.SetUseJsonName(true); - UNIT_ASSERT_EXCEPTION_CONTAINS( - config.SetFieldNameMode(TJson2ProtoConfig::FieldNameLowerCase), yexception, "mutually exclusive"); - } -} // TestFieldNameMode - -class TStringTransform: public IStringTransform { -public: - int GetType() const override { - return 0; + // protobuf 3.0 by lowercasing default names, making it "defUpper". + TString modelStr(R"_({"My-Upper":1,"my-lower":2,"defUpper":3,"defLower":4})_"); + + TWithJsonName proto; + TJson2ProtoConfig config; + config.SetUseJsonName(true); + + UNIT_ASSERT_NO_EXCEPTION(proto = Json2Proto<TWithJsonName>(modelStr, config)); + UNIT_ASSERT_EQUAL(proto.Getmy_upper(), 1); + UNIT_ASSERT_EQUAL(proto.GetMy_lower(), 2); + UNIT_ASSERT_EQUAL(proto.GetDef_upper(), 3); + UNIT_ASSERT_EQUAL(proto.Getdef_lower(), 4); + } + + // FieldNameMode with UseJsonName + { + TJson2ProtoConfig config; + config.SetFieldNameMode(TJson2ProtoConfig::FieldNameLowerCase); + UNIT_ASSERT_EXCEPTION_CONTAINS( + config.SetUseJsonName(true), yexception, "mutually exclusive"); + } + { + TJson2ProtoConfig config; + config.SetUseJsonName(true); + UNIT_ASSERT_EXCEPTION_CONTAINS( + config.SetFieldNameMode(TJson2ProtoConfig::FieldNameLowerCase), yexception, "mutually exclusive"); + } +} // TestFieldNameMode + +class TStringTransform: public IStringTransform { +public: + int GetType() const override { + return 0; + } + void Transform(TString& str) const override { + str = "transformed_any"; + } +}; + +class TBytesTransform: public IStringTransform { +public: + int GetType() const override { + return 0; } - void Transform(TString& str) const override { - str = "transformed_any"; - } -}; - -class TBytesTransform: public IStringTransform { -public: - int GetType() const override { - return 0; - } - void Transform(TString&) const override { - } - void TransformBytes(TString& str) const override { - str = "transformed_bytes"; - } -}; + void Transform(TString&) const override { + } + void TransformBytes(TString& str) const override { + str = "transformed_bytes"; + } +}; Y_UNIT_TEST(TestInvalidJson) { - NJson::TJsonValue val{"bad value"}; - TFlatOptional proto; - UNIT_ASSERT_EXCEPTION(Json2Proto(val, proto), yexception); -} + NJson::TJsonValue val{"bad value"}; + TFlatOptional proto; + UNIT_ASSERT_EXCEPTION(Json2Proto(val, proto), yexception); +} Y_UNIT_TEST(TestInvalidRepeatedFieldWithMapAsObject) { TCompositeRepeated proto; @@ -528,149 +528,149 @@ Y_UNIT_TEST(TestInvalidRepeatedFieldWithMapAsObject) { } Y_UNIT_TEST(TestStringTransforms) { - // Check that strings and bytes are transformed - { - TString modelStr(R"_({"String":"value_str", "Bytes": "value_bytes"})_"); - - TFlatOptional proto; - TJson2ProtoConfig config; - config.AddStringTransform(new TStringTransform); - - UNIT_ASSERT_NO_EXCEPTION(proto = Json2Proto<TFlatOptional>(modelStr, config)); - UNIT_ASSERT(proto.GetString() == "transformed_any"); - UNIT_ASSERT(proto.GetBytes() == "transformed_any"); - } - - // Check that bytes are transformed, strings are left intact - { - TString modelStr(R"_({"String":"value_str", "Bytes": "value_bytes"})_"); - - TFlatOptional proto; - TJson2ProtoConfig config; - config.AddStringTransform(new TBytesTransform); - - UNIT_ASSERT_NO_EXCEPTION(proto = Json2Proto<TFlatOptional>(modelStr, config)); - UNIT_ASSERT(proto.GetString() == "value_str"); - UNIT_ASSERT(proto.GetBytes() == "transformed_bytes"); - } - - // Check that repeated bytes are transformed, repeated strings are left intact - { - TString modelStr(R"_({"String":["value_str", "str2"], "Bytes": ["value_bytes", "bytes2"]})_"); - - TFlatRepeated proto; - TJson2ProtoConfig config; - config.AddStringTransform(new TBytesTransform); - - UNIT_ASSERT_NO_EXCEPTION(proto = Json2Proto<TFlatRepeated>(modelStr, config)); - UNIT_ASSERT(proto.StringSize() == 2); - UNIT_ASSERT(proto.GetString(0) == "value_str"); - UNIT_ASSERT(proto.GetString(1) == "str2"); - UNIT_ASSERT(proto.BytesSize() == 2); - UNIT_ASSERT(proto.GetBytes(0) == "transformed_bytes"); - UNIT_ASSERT(proto.GetBytes(1) == "transformed_bytes"); - } - - // Check that bytes are transformed, strings are left intact in composed messages - { - TString modelStr(R"_({"Part": {"String":"value_str", "Bytes": "value_bytes"}})_"); - - TCompositeOptional proto; - TJson2ProtoConfig config; - config.AddStringTransform(new TBytesTransform); - - UNIT_ASSERT_NO_EXCEPTION(proto = Json2Proto<TCompositeOptional>(modelStr, config)); - UNIT_ASSERT(proto.GetPart().GetString() == "value_str"); - UNIT_ASSERT(proto.GetPart().GetBytes() == "transformed_bytes"); - } -} // TestStringTransforms - + // Check that strings and bytes are transformed + { + TString modelStr(R"_({"String":"value_str", "Bytes": "value_bytes"})_"); + + TFlatOptional proto; + TJson2ProtoConfig config; + config.AddStringTransform(new TStringTransform); + + UNIT_ASSERT_NO_EXCEPTION(proto = Json2Proto<TFlatOptional>(modelStr, config)); + UNIT_ASSERT(proto.GetString() == "transformed_any"); + UNIT_ASSERT(proto.GetBytes() == "transformed_any"); + } + + // Check that bytes are transformed, strings are left intact + { + TString modelStr(R"_({"String":"value_str", "Bytes": "value_bytes"})_"); + + TFlatOptional proto; + TJson2ProtoConfig config; + config.AddStringTransform(new TBytesTransform); + + UNIT_ASSERT_NO_EXCEPTION(proto = Json2Proto<TFlatOptional>(modelStr, config)); + UNIT_ASSERT(proto.GetString() == "value_str"); + UNIT_ASSERT(proto.GetBytes() == "transformed_bytes"); + } + + // Check that repeated bytes are transformed, repeated strings are left intact + { + TString modelStr(R"_({"String":["value_str", "str2"], "Bytes": ["value_bytes", "bytes2"]})_"); + + TFlatRepeated proto; + TJson2ProtoConfig config; + config.AddStringTransform(new TBytesTransform); + + UNIT_ASSERT_NO_EXCEPTION(proto = Json2Proto<TFlatRepeated>(modelStr, config)); + UNIT_ASSERT(proto.StringSize() == 2); + UNIT_ASSERT(proto.GetString(0) == "value_str"); + UNIT_ASSERT(proto.GetString(1) == "str2"); + UNIT_ASSERT(proto.BytesSize() == 2); + UNIT_ASSERT(proto.GetBytes(0) == "transformed_bytes"); + UNIT_ASSERT(proto.GetBytes(1) == "transformed_bytes"); + } + + // Check that bytes are transformed, strings are left intact in composed messages + { + TString modelStr(R"_({"Part": {"String":"value_str", "Bytes": "value_bytes"}})_"); + + TCompositeOptional proto; + TJson2ProtoConfig config; + config.AddStringTransform(new TBytesTransform); + + UNIT_ASSERT_NO_EXCEPTION(proto = Json2Proto<TCompositeOptional>(modelStr, config)); + UNIT_ASSERT(proto.GetPart().GetString() == "value_str"); + UNIT_ASSERT(proto.GetPart().GetBytes() == "transformed_bytes"); + } +} // TestStringTransforms + Y_UNIT_TEST(TestCastFromString) { - // single fields - { - NJson::TJsonValue json; + // single fields + { + NJson::TJsonValue json; #define DEFINE_FIELD(name, value) \ - json.InsertValue(#name, ConvertToString(value)); + json.InsertValue(#name, ConvertToString(value)); #include <library/cpp/protobuf/json/ut/fields.incl> #undef DEFINE_FIELD - TFlatOptional proto; - UNIT_ASSERT_EXCEPTION_CONTAINS(Json2Proto(json, proto), yexception, "Invalid type"); - - TJson2ProtoConfig config; - config.SetCastFromString(true); - Json2Proto(json, proto, config); - - TFlatOptional modelProto; - FillFlatProto(&modelProto); - UNIT_ASSERT_PROTOS_EQUAL(proto, modelProto); - } - - // repeated fields - { - NJson::TJsonValue json; -#define DEFINE_REPEATED_FIELD(name, type, ...) \ - { \ - type values[] = {__VA_ARGS__}; \ - NJson::TJsonValue array(NJson::JSON_ARRAY); \ - for (size_t i = 0, end = Y_ARRAY_SIZE(values); i < end; ++i) { \ - array.AppendValue(ConvertToString(values[i])); \ - } \ - json.InsertValue(#name, array); \ - } + TFlatOptional proto; + UNIT_ASSERT_EXCEPTION_CONTAINS(Json2Proto(json, proto), yexception, "Invalid type"); + + TJson2ProtoConfig config; + config.SetCastFromString(true); + Json2Proto(json, proto, config); + + TFlatOptional modelProto; + FillFlatProto(&modelProto); + UNIT_ASSERT_PROTOS_EQUAL(proto, modelProto); + } + + // repeated fields + { + NJson::TJsonValue json; +#define DEFINE_REPEATED_FIELD(name, type, ...) \ + { \ + type values[] = {__VA_ARGS__}; \ + NJson::TJsonValue array(NJson::JSON_ARRAY); \ + for (size_t i = 0, end = Y_ARRAY_SIZE(values); i < end; ++i) { \ + array.AppendValue(ConvertToString(values[i])); \ + } \ + json.InsertValue(#name, array); \ + } #include <library/cpp/protobuf/json/ut/repeated_fields.incl> #undef DEFINE_REPEATED_FIELD - TFlatRepeated proto; - UNIT_ASSERT_EXCEPTION_CONTAINS(Json2Proto(json, proto), yexception, "Invalid type"); + TFlatRepeated proto; + UNIT_ASSERT_EXCEPTION_CONTAINS(Json2Proto(json, proto), yexception, "Invalid type"); - TJson2ProtoConfig config; - config.SetCastFromString(true); - Json2Proto(json, proto, config); + TJson2ProtoConfig config; + config.SetCastFromString(true); + Json2Proto(json, proto, config); - TFlatRepeated modelProto; - FillRepeatedProto(&modelProto); - UNIT_ASSERT_PROTOS_EQUAL(proto, modelProto); - } -} // TestCastFromString + TFlatRepeated modelProto; + FillRepeatedProto(&modelProto); + UNIT_ASSERT_PROTOS_EQUAL(proto, modelProto); + } +} // TestCastFromString Y_UNIT_TEST(TestMap) { - TMapType modelProto; + TMapType modelProto; - auto& items = *modelProto.MutableItems(); - items["key1"] = "value1"; - items["key2"] = "value2"; - items["key3"] = "value3"; + auto& items = *modelProto.MutableItems(); + items["key1"] = "value1"; + items["key2"] = "value2"; + items["key3"] = "value3"; - TString modelStr(R"_({"Items":[{"key":"key3","value":"value3"},{"key":"key2","value":"value2"},{"key":"key1","value":"value1"}]})_"); + TString modelStr(R"_({"Items":[{"key":"key3","value":"value3"},{"key":"key2","value":"value2"},{"key":"key1","value":"value1"}]})_"); - TJson2ProtoConfig config; - TMapType proto; - UNIT_ASSERT_NO_EXCEPTION(proto = Json2Proto<TMapType>(modelStr, config)); + TJson2ProtoConfig config; + TMapType proto; + UNIT_ASSERT_NO_EXCEPTION(proto = Json2Proto<TMapType>(modelStr, config)); - UNIT_ASSERT_PROTOS_EQUAL(proto, modelProto); -} // TestMap + UNIT_ASSERT_PROTOS_EQUAL(proto, modelProto); +} // TestMap Y_UNIT_TEST(TestCastRobust) { - NJson::TJsonValue json; - json["I32"] = "5"; - json["Bool"] = 1; - json["String"] = 6; - json["Double"] = 8; - TFlatOptional proto; - UNIT_ASSERT_EXCEPTION_CONTAINS(Json2Proto(json, proto), yexception, "Invalid type"); - - TJson2ProtoConfig config; - config.SetCastRobust(true); - Json2Proto(json, proto, config); - - TFlatOptional expected; - expected.SetI32(5); - expected.SetBool(true); - expected.SetString("6"); - expected.SetDouble(8); - UNIT_ASSERT_PROTOS_EQUAL(proto, expected); -} + NJson::TJsonValue json; + json["I32"] = "5"; + json["Bool"] = 1; + json["String"] = 6; + json["Double"] = 8; + TFlatOptional proto; + UNIT_ASSERT_EXCEPTION_CONTAINS(Json2Proto(json, proto), yexception, "Invalid type"); + + TJson2ProtoConfig config; + config.SetCastRobust(true); + Json2Proto(json, proto, config); + + TFlatOptional expected; + expected.SetI32(5); + expected.SetBool(true); + expected.SetString("6"); + expected.SetDouble(8); + UNIT_ASSERT_PROTOS_EQUAL(proto, expected); +} Y_UNIT_TEST(TestVectorizeScalars) { NJson::TJsonValue json; @@ -742,165 +742,165 @@ Y_UNIT_TEST(TestValueVectorizer) { } Y_UNIT_TEST(TestMapAsObject) { - TMapType modelProto; + TMapType modelProto; - auto& items = *modelProto.MutableItems(); - items["key1"] = "value1"; - items["key2"] = "value2"; - items["key3"] = "value3"; + auto& items = *modelProto.MutableItems(); + items["key1"] = "value1"; + items["key2"] = "value2"; + items["key3"] = "value3"; - TString modelStr(R"_({"Items":{"key1":"value1","key2":"value2","key3":"value3"}})_"); + TString modelStr(R"_({"Items":{"key1":"value1","key2":"value2","key3":"value3"}})_"); - TJson2ProtoConfig config; - config.MapAsObject = true; - TMapType proto; - UNIT_ASSERT_NO_EXCEPTION(proto = Json2Proto<TMapType>(modelStr, config)); + TJson2ProtoConfig config; + config.MapAsObject = true; + TMapType proto; + UNIT_ASSERT_NO_EXCEPTION(proto = Json2Proto<TMapType>(modelStr, config)); - UNIT_ASSERT_PROTOS_EQUAL(proto, modelProto); -} // TestMapAsObject + UNIT_ASSERT_PROTOS_EQUAL(proto, modelProto); +} // TestMapAsObject Y_UNIT_TEST(TestComplexMapAsObject_I32) { - TestComplexMapAsObject( - [](TComplexMapType& proto) { - auto& items = *proto.MutableI32(); - items[1] = 1; - items[-2] = -2; - items[3] = 3; - }, - R"_({"I32":{"1":1,"-2":-2,"3":3}})_"); -} // TestComplexMapAsObject_I32 + TestComplexMapAsObject( + [](TComplexMapType& proto) { + auto& items = *proto.MutableI32(); + items[1] = 1; + items[-2] = -2; + items[3] = 3; + }, + R"_({"I32":{"1":1,"-2":-2,"3":3}})_"); +} // TestComplexMapAsObject_I32 Y_UNIT_TEST(TestComplexMapAsObject_I64) { - TestComplexMapAsObject( - [](TComplexMapType& proto) { - auto& items = *proto.MutableI64(); - items[2147483649L] = 2147483649L; - items[-2147483650L] = -2147483650L; - items[2147483651L] = 2147483651L; - }, - R"_({"I64":{"2147483649":2147483649,"-2147483650":-2147483650,"2147483651":2147483651}})_"); -} // TestComplexMapAsObject_I64 + TestComplexMapAsObject( + [](TComplexMapType& proto) { + auto& items = *proto.MutableI64(); + items[2147483649L] = 2147483649L; + items[-2147483650L] = -2147483650L; + items[2147483651L] = 2147483651L; + }, + R"_({"I64":{"2147483649":2147483649,"-2147483650":-2147483650,"2147483651":2147483651}})_"); +} // TestComplexMapAsObject_I64 Y_UNIT_TEST(TestComplexMapAsObject_UI32) { - TestComplexMapAsObject( - [](TComplexMapType& proto) { - auto& items = *proto.MutableUI32(); - items[1073741825U] = 1073741825U; - items[1073741826U] = 1073741826U; - items[1073741827U] = 1073741827U; - }, - R"_({"UI32":{"1073741825":1073741825,"1073741826":1073741826,"1073741827":1073741827}})_"); -} // TestComplexMapAsObject_UI32 + TestComplexMapAsObject( + [](TComplexMapType& proto) { + auto& items = *proto.MutableUI32(); + items[1073741825U] = 1073741825U; + items[1073741826U] = 1073741826U; + items[1073741827U] = 1073741827U; + }, + R"_({"UI32":{"1073741825":1073741825,"1073741826":1073741826,"1073741827":1073741827}})_"); +} // TestComplexMapAsObject_UI32 Y_UNIT_TEST(TestComplexMapAsObject_UI64) { - TestComplexMapAsObject( - [](TComplexMapType& proto) { - auto& items = *proto.MutableUI64(); - items[9223372036854775809UL] = 9223372036854775809UL; - items[9223372036854775810UL] = 9223372036854775810UL; - items[9223372036854775811UL] = 9223372036854775811UL; - }, - R"_({"UI64":{"9223372036854775809":9223372036854775809,"9223372036854775810":9223372036854775810,"9223372036854775811":9223372036854775811}})_"); -} // TestComplexMapAsObject_UI64 + TestComplexMapAsObject( + [](TComplexMapType& proto) { + auto& items = *proto.MutableUI64(); + items[9223372036854775809UL] = 9223372036854775809UL; + items[9223372036854775810UL] = 9223372036854775810UL; + items[9223372036854775811UL] = 9223372036854775811UL; + }, + R"_({"UI64":{"9223372036854775809":9223372036854775809,"9223372036854775810":9223372036854775810,"9223372036854775811":9223372036854775811}})_"); +} // TestComplexMapAsObject_UI64 Y_UNIT_TEST(TestComplexMapAsObject_SI32) { - TestComplexMapAsObject( - [](TComplexMapType& proto) { - auto& items = *proto.MutableSI32(); - items[1] = 1; - items[-2] = -2; - items[3] = 3; - }, - R"_({"SI32":{"1":1,"-2":-2,"3":3}})_"); -} // TestComplexMapAsObject_SI32 + TestComplexMapAsObject( + [](TComplexMapType& proto) { + auto& items = *proto.MutableSI32(); + items[1] = 1; + items[-2] = -2; + items[3] = 3; + }, + R"_({"SI32":{"1":1,"-2":-2,"3":3}})_"); +} // TestComplexMapAsObject_SI32 Y_UNIT_TEST(TestComplexMapAsObject_SI64) { - TestComplexMapAsObject( - [](TComplexMapType& proto) { - auto& items = *proto.MutableSI64(); - items[2147483649L] = 2147483649L; - items[-2147483650L] = -2147483650L; - items[2147483651L] = 2147483651L; - }, - R"_({"SI64":{"2147483649":2147483649,"-2147483650":-2147483650,"2147483651":2147483651}})_"); -} // TestComplexMapAsObject_SI64 + TestComplexMapAsObject( + [](TComplexMapType& proto) { + auto& items = *proto.MutableSI64(); + items[2147483649L] = 2147483649L; + items[-2147483650L] = -2147483650L; + items[2147483651L] = 2147483651L; + }, + R"_({"SI64":{"2147483649":2147483649,"-2147483650":-2147483650,"2147483651":2147483651}})_"); +} // TestComplexMapAsObject_SI64 Y_UNIT_TEST(TestComplexMapAsObject_FI32) { - TestComplexMapAsObject( - [](TComplexMapType& proto) { - auto& items = *proto.MutableFI32(); - items[1073741825U] = 1073741825U; - items[1073741826U] = 1073741826U; - items[1073741827U] = 1073741827U; - }, - R"_({"FI32":{"1073741825":1073741825,"1073741826":1073741826,"1073741827":1073741827}})_"); -} // TestComplexMapAsObject_FI32 + TestComplexMapAsObject( + [](TComplexMapType& proto) { + auto& items = *proto.MutableFI32(); + items[1073741825U] = 1073741825U; + items[1073741826U] = 1073741826U; + items[1073741827U] = 1073741827U; + }, + R"_({"FI32":{"1073741825":1073741825,"1073741826":1073741826,"1073741827":1073741827}})_"); +} // TestComplexMapAsObject_FI32 Y_UNIT_TEST(TestComplexMapAsObject_FI64) { - TestComplexMapAsObject( - [](TComplexMapType& proto) { - auto& items = *proto.MutableFI64(); - items[9223372036854775809UL] = 9223372036854775809UL; - items[9223372036854775810UL] = 9223372036854775810UL; - items[9223372036854775811UL] = 9223372036854775811UL; - }, - R"_({"FI64":{"9223372036854775809":9223372036854775809,"9223372036854775810":9223372036854775810,"9223372036854775811":9223372036854775811}})_"); -} // TestComplexMapAsObject_FI64 + TestComplexMapAsObject( + [](TComplexMapType& proto) { + auto& items = *proto.MutableFI64(); + items[9223372036854775809UL] = 9223372036854775809UL; + items[9223372036854775810UL] = 9223372036854775810UL; + items[9223372036854775811UL] = 9223372036854775811UL; + }, + R"_({"FI64":{"9223372036854775809":9223372036854775809,"9223372036854775810":9223372036854775810,"9223372036854775811":9223372036854775811}})_"); +} // TestComplexMapAsObject_FI64 Y_UNIT_TEST(TestComplexMapAsObject_SFI32) { - TestComplexMapAsObject( - [](TComplexMapType& proto) { - auto& items = *proto.MutableSFI32(); - items[1] = 1; - items[-2] = -2; - items[3] = 3; - }, - R"_({"SFI32":{"1":1,"-2":-2,"3":3}})_"); -} // TestComplexMapAsObject_SFI32 + TestComplexMapAsObject( + [](TComplexMapType& proto) { + auto& items = *proto.MutableSFI32(); + items[1] = 1; + items[-2] = -2; + items[3] = 3; + }, + R"_({"SFI32":{"1":1,"-2":-2,"3":3}})_"); +} // TestComplexMapAsObject_SFI32 Y_UNIT_TEST(TestComplexMapAsObject_SFI64) { - TestComplexMapAsObject( - [](TComplexMapType& proto) { - auto& items = *proto.MutableSFI64(); - items[2147483649L] = 2147483649L; - items[-2147483650L] = -2147483650L; - items[2147483651L] = 2147483651L; - }, - R"_({"SFI64":{"2147483649":2147483649,"-2147483650":-2147483650,"2147483651":2147483651}})_"); -} // TestComplexMapAsObject_SFI64 + TestComplexMapAsObject( + [](TComplexMapType& proto) { + auto& items = *proto.MutableSFI64(); + items[2147483649L] = 2147483649L; + items[-2147483650L] = -2147483650L; + items[2147483651L] = 2147483651L; + }, + R"_({"SFI64":{"2147483649":2147483649,"-2147483650":-2147483650,"2147483651":2147483651}})_"); +} // TestComplexMapAsObject_SFI64 Y_UNIT_TEST(TestComplexMapAsObject_Bool) { - TestComplexMapAsObject( - [](TComplexMapType& proto) { - auto& items = *proto.MutableBool(); - items[true] = true; - items[false] = false; - }, - R"_({"Bool":{"true":true,"false":false}})_"); -} // TestComplexMapAsObject_Bool + TestComplexMapAsObject( + [](TComplexMapType& proto) { + auto& items = *proto.MutableBool(); + items[true] = true; + items[false] = false; + }, + R"_({"Bool":{"true":true,"false":false}})_"); +} // TestComplexMapAsObject_Bool Y_UNIT_TEST(TestComplexMapAsObject_String) { - TestComplexMapAsObject( - [](TComplexMapType& proto) { - auto& items = *proto.MutableString(); - items["key1"] = "value1"; - items["key2"] = "value2"; - items["key3"] = "value3"; + TestComplexMapAsObject( + [](TComplexMapType& proto) { + auto& items = *proto.MutableString(); + items["key1"] = "value1"; + items["key2"] = "value2"; + items["key3"] = "value3"; items[""] = "value4"; - }, + }, R"_({"String":{"key1":"value1","key2":"value2","key3":"value3","":"value4"}})_"); -} // TestComplexMapAsObject_String +} // TestComplexMapAsObject_String Y_UNIT_TEST(TestComplexMapAsObject_Enum) { - TestComplexMapAsObject( - [](TComplexMapType& proto) { - auto& items = *proto.MutableEnum(); - items["key1"] = EEnum::E_1; - items["key2"] = EEnum::E_2; - items["key3"] = EEnum::E_3; - }, - R"_({"Enum":{"key1":1,"key2":2,"key3":3}})_"); -} // TestComplexMapAsObject_Enum + TestComplexMapAsObject( + [](TComplexMapType& proto) { + auto& items = *proto.MutableEnum(); + items["key1"] = EEnum::E_1; + items["key2"] = EEnum::E_2; + items["key3"] = EEnum::E_3; + }, + R"_({"Enum":{"key1":1,"key2":2,"key3":3}})_"); +} // TestComplexMapAsObject_Enum Y_UNIT_TEST(TestComplexMapAsObject_EnumString) { TestComplexMapAsObject( @@ -944,49 +944,49 @@ Y_UNIT_TEST(TestComplexMapAsObject_EnumStringSnakeCaseInsensitive) { } // TestComplexMapAsObject_EnumStringCaseInsensetive Y_UNIT_TEST(TestComplexMapAsObject_Float) { - TestComplexMapAsObject( - [](TComplexMapType& proto) { - auto& items = *proto.MutableFloat(); - items["key1"] = 0.1f; - items["key2"] = 0.2f; - items["key3"] = 0.3f; - }, - R"_({"Float":{"key1":0.1,"key2":0.2,"key3":0.3}})_"); -} // TestComplexMapAsObject_Float + TestComplexMapAsObject( + [](TComplexMapType& proto) { + auto& items = *proto.MutableFloat(); + items["key1"] = 0.1f; + items["key2"] = 0.2f; + items["key3"] = 0.3f; + }, + R"_({"Float":{"key1":0.1,"key2":0.2,"key3":0.3}})_"); +} // TestComplexMapAsObject_Float Y_UNIT_TEST(TestComplexMapAsObject_Double) { - TestComplexMapAsObject( - [](TComplexMapType& proto) { - auto& items = *proto.MutableDouble(); - items["key1"] = 0.1L; - items["key2"] = 0.2L; - items["key3"] = 0.3L; - }, - R"_({"Double":{"key1":0.1,"key2":0.2,"key3":0.3}})_"); -} // TestComplexMapAsObject_Double + TestComplexMapAsObject( + [](TComplexMapType& proto) { + auto& items = *proto.MutableDouble(); + items["key1"] = 0.1L; + items["key2"] = 0.2L; + items["key3"] = 0.3L; + }, + R"_({"Double":{"key1":0.1,"key2":0.2,"key3":0.3}})_"); +} // TestComplexMapAsObject_Double Y_UNIT_TEST(TestComplexMapAsObject_Nested) { - TestComplexMapAsObject( - [](TComplexMapType& proto) { - TComplexMapType inner; - auto& innerItems = *inner.MutableString(); - innerItems["key"] = "value"; - auto& items = *proto.MutableNested(); - items["key1"] = inner; - items["key2"] = inner; - items["key3"] = inner; - }, - R"_({"Nested":{"key1":{"String":{"key":"value"}},"key2":{"String":{"key":"value"}},"key3":{"String":{"key":"value"}}}})_"); -} // TestComplexMapAsObject_Nested + TestComplexMapAsObject( + [](TComplexMapType& proto) { + TComplexMapType inner; + auto& innerItems = *inner.MutableString(); + innerItems["key"] = "value"; + auto& items = *proto.MutableNested(); + items["key1"] = inner; + items["key2"] = inner; + items["key3"] = inner; + }, + R"_({"Nested":{"key1":{"String":{"key":"value"}},"key2":{"String":{"key":"value"}},"key3":{"String":{"key":"value"}}}})_"); +} // TestComplexMapAsObject_Nested Y_UNIT_TEST(TestMapAsObjectConfigNotSet) { - TString modelStr(R"_({"Items":{"key":"value"}})_"); + TString modelStr(R"_({"Items":{"key":"value"}})_"); - TJson2ProtoConfig config; - UNIT_ASSERT_EXCEPTION_CONTAINS( - Json2Proto<TMapType>(modelStr, config), yexception, + TJson2ProtoConfig config; + UNIT_ASSERT_EXCEPTION_CONTAINS( + Json2Proto<TMapType>(modelStr, config), yexception, "Map as object representation is not allowed"); -} // TestMapAsObjectNotSet +} // TestMapAsObjectNotSet Y_UNIT_TEST(TestMergeFlatOptional) { const NJson::TJsonValue& json = CreateFlatJson(); diff --git a/library/cpp/protobuf/json/ut/proto.h b/library/cpp/protobuf/json/ut/proto.h index 8183bfc8e1..b9dec411bd 100644 --- a/library/cpp/protobuf/json/ut/proto.h +++ b/library/cpp/protobuf/json/ut/proto.h @@ -6,57 +6,57 @@ #include <util/system/defaults.h> namespace NProtobufJsonTest { - template <typename TProto> - inline void - FillFlatProto(TProto* proto, - const THashSet<TString>& skippedFields = THashSet<TString>()) { -#define DEFINE_FIELD(name, value) \ - if (skippedFields.find(#name) == skippedFields.end()) \ - proto->Set##name(value); + template <typename TProto> + inline void + FillFlatProto(TProto* proto, + const THashSet<TString>& skippedFields = THashSet<TString>()) { +#define DEFINE_FIELD(name, value) \ + if (skippedFields.find(#name) == skippedFields.end()) \ + proto->Set##name(value); #include <library/cpp/protobuf/json/ut/fields.incl> #undef DEFINE_FIELD - } - - template <typename TRepeatedField, typename TValue> - inline void - AddValue(TRepeatedField* field, TValue value) { - field->Add(value); - } - - inline void - AddValue(google::protobuf::RepeatedPtrField<TString>* field, const TString& value) { - *(field->Add()) = value; - } - - inline void - FillRepeatedProto(TFlatRepeated* proto, - const THashSet<TString>& skippedFields = THashSet<TString>()) { -#define DEFINE_REPEATED_FIELD(name, type, ...) \ - if (skippedFields.find(#name) == skippedFields.end()) { \ - type values[] = {__VA_ARGS__}; \ - for (size_t i = 0, end = Y_ARRAY_SIZE(values); i < end; ++i) { \ - AddValue(proto->Mutable##name(), values[i]); \ - } \ + } + + template <typename TRepeatedField, typename TValue> + inline void + AddValue(TRepeatedField* field, TValue value) { + field->Add(value); + } + + inline void + AddValue(google::protobuf::RepeatedPtrField<TString>* field, const TString& value) { + *(field->Add()) = value; + } + + inline void + FillRepeatedProto(TFlatRepeated* proto, + const THashSet<TString>& skippedFields = THashSet<TString>()) { +#define DEFINE_REPEATED_FIELD(name, type, ...) \ + if (skippedFields.find(#name) == skippedFields.end()) { \ + type values[] = {__VA_ARGS__}; \ + for (size_t i = 0, end = Y_ARRAY_SIZE(values); i < end; ++i) { \ + AddValue(proto->Mutable##name(), values[i]); \ + } \ } #include <library/cpp/protobuf/json/ut/repeated_fields.incl> #undef DEFINE_REPEATED_FIELD - } - - template <typename TProto> - inline void - FillCompositeProto(TProto* proto, const THashSet<TString>& skippedFields = THashSet<TString>()) { - FillFlatProto(proto->MutablePart(), skippedFields); - } - -#define UNIT_ASSERT_PROTOS_EQUAL(lhs, rhs) \ - do { \ - if (lhs.SerializeAsString() != rhs.SerializeAsString()) { \ - Cerr << ">>>>>>>>>> lhs != rhs:" << Endl; \ - Cerr << lhs.DebugString() << Endl; \ - Cerr << rhs.DebugString() << Endl; \ - UNIT_ASSERT_STRINGS_EQUAL(lhs.DebugString(), rhs.DebugString()); \ + } + + template <typename TProto> + inline void + FillCompositeProto(TProto* proto, const THashSet<TString>& skippedFields = THashSet<TString>()) { + FillFlatProto(proto->MutablePart(), skippedFields); + } + +#define UNIT_ASSERT_PROTOS_EQUAL(lhs, rhs) \ + do { \ + if (lhs.SerializeAsString() != rhs.SerializeAsString()) { \ + Cerr << ">>>>>>>>>> lhs != rhs:" << Endl; \ + Cerr << lhs.DebugString() << Endl; \ + Cerr << rhs.DebugString() << Endl; \ + UNIT_ASSERT_STRINGS_EQUAL(lhs.DebugString(), rhs.DebugString()); \ UNIT_ASSERT_STRINGS_EQUAL(lhs.SerializeAsString(), rhs.SerializeAsString()); \ - } \ + } \ } while (false); -} +} diff --git a/library/cpp/protobuf/json/ut/proto2json_ut.cpp b/library/cpp/protobuf/json/ut/proto2json_ut.cpp index 07e52d7f2f..124ac163cd 100644 --- a/library/cpp/protobuf/json/ut/proto2json_ut.cpp +++ b/library/cpp/protobuf/json/ut/proto2json_ut.cpp @@ -33,43 +33,43 @@ Y_UNIT_TEST_SUITE(TProto2JsonFlatTest) { TProto2JsonConfig cfg; cfg.SetMissingSingleKeyMode(TProto2JsonConfig::MissingKeyDefault); UNIT_ASSERT_NO_EXCEPTION(Proto2Json(proto, json, cfg)); -#define DEFINE_FIELD(name, value) \ - { \ - auto descr = proto.GetMetadata().descriptor->FindFieldByName(#name); \ - UNIT_ASSERT(descr); \ - UNIT_ASSERT(json.Has(#name)); \ - switch (descr->cpp_type()) { \ - case FieldDescriptor::CPPTYPE_INT32: \ - UNIT_ASSERT(descr->default_value_int32() == json[#name].GetIntegerRobust()); \ - break; \ - case FieldDescriptor::CPPTYPE_INT64: \ - UNIT_ASSERT(descr->default_value_int64() == json[#name].GetIntegerRobust()); \ - break; \ - case FieldDescriptor::CPPTYPE_UINT32: \ - UNIT_ASSERT(descr->default_value_uint32() == json[#name].GetUIntegerRobust()); \ - break; \ - case FieldDescriptor::CPPTYPE_UINT64: \ - UNIT_ASSERT(descr->default_value_uint32() == json[#name].GetUIntegerRobust()); \ - break; \ - case FieldDescriptor::CPPTYPE_DOUBLE: \ - UNIT_ASSERT(descr->default_value_double() == json[#name].GetDoubleRobust()); \ - break; \ - case FieldDescriptor::CPPTYPE_FLOAT: \ - UNIT_ASSERT(descr->default_value_float() == json[#name].GetDoubleRobust()); \ - break; \ - case FieldDescriptor::CPPTYPE_BOOL: \ - UNIT_ASSERT(descr->default_value_bool() == json[#name].GetBooleanRobust()); \ - break; \ - case FieldDescriptor::CPPTYPE_ENUM: \ - UNIT_ASSERT(descr->default_value_enum()->number() == json[#name].GetIntegerRobust()); \ - break; \ - case FieldDescriptor::CPPTYPE_STRING: \ - UNIT_ASSERT(descr->default_value_string() == json[#name].GetStringRobust()); \ - break; \ - default: \ - break; \ - } \ - } +#define DEFINE_FIELD(name, value) \ + { \ + auto descr = proto.GetMetadata().descriptor->FindFieldByName(#name); \ + UNIT_ASSERT(descr); \ + UNIT_ASSERT(json.Has(#name)); \ + switch (descr->cpp_type()) { \ + case FieldDescriptor::CPPTYPE_INT32: \ + UNIT_ASSERT(descr->default_value_int32() == json[#name].GetIntegerRobust()); \ + break; \ + case FieldDescriptor::CPPTYPE_INT64: \ + UNIT_ASSERT(descr->default_value_int64() == json[#name].GetIntegerRobust()); \ + break; \ + case FieldDescriptor::CPPTYPE_UINT32: \ + UNIT_ASSERT(descr->default_value_uint32() == json[#name].GetUIntegerRobust()); \ + break; \ + case FieldDescriptor::CPPTYPE_UINT64: \ + UNIT_ASSERT(descr->default_value_uint32() == json[#name].GetUIntegerRobust()); \ + break; \ + case FieldDescriptor::CPPTYPE_DOUBLE: \ + UNIT_ASSERT(descr->default_value_double() == json[#name].GetDoubleRobust()); \ + break; \ + case FieldDescriptor::CPPTYPE_FLOAT: \ + UNIT_ASSERT(descr->default_value_float() == json[#name].GetDoubleRobust()); \ + break; \ + case FieldDescriptor::CPPTYPE_BOOL: \ + UNIT_ASSERT(descr->default_value_bool() == json[#name].GetBooleanRobust()); \ + break; \ + case FieldDescriptor::CPPTYPE_ENUM: \ + UNIT_ASSERT(descr->default_value_enum()->number() == json[#name].GetIntegerRobust()); \ + break; \ + case FieldDescriptor::CPPTYPE_STRING: \ + UNIT_ASSERT(descr->default_value_string() == json[#name].GetStringRobust()); \ + break; \ + default: \ + break; \ + } \ + } #include <library/cpp/protobuf/json/ut/fields.incl> #undef DEFINE_FIELD } @@ -79,7 +79,7 @@ Y_UNIT_TEST_SUITE(TProto2JsonFlatTest) { proto.SetField(42); TProto2JsonConfig cfg; - cfg.SetNameGenerator([](const NProtoBuf::FieldDescriptor&) { return "42"; }); + cfg.SetNameGenerator([](const NProtoBuf::FieldDescriptor&) { return "42"; }); TStringStream str; Proto2Json(proto, str, cfg); @@ -92,7 +92,7 @@ Y_UNIT_TEST_SUITE(TProto2JsonFlatTest) { proto.SetEnum(TEnumValueGeneratorType::ENUM_42); TProto2JsonConfig cfg; - cfg.SetEnumValueGenerator([](const NProtoBuf::EnumValueDescriptor&) { return "42"; }); + cfg.SetEnumValueGenerator([](const NProtoBuf::EnumValueDescriptor&) { return "42"; }); TStringStream str; Proto2Json(proto, str, cfg); @@ -101,370 +101,370 @@ Y_UNIT_TEST_SUITE(TProto2JsonFlatTest) { } Y_UNIT_TEST(TestFlatOptional){ - {TFlatOptional proto; - FillFlatProto(&proto); - const NJson::TJsonValue& modelJson = CreateFlatJson(); - { - NJson::TJsonValue json; - UNIT_ASSERT_NO_EXCEPTION(Proto2Json(proto, json)); - UNIT_ASSERT_JSONS_EQUAL(json, modelJson); - } - - { - TStringStream jsonStream; - NJson::TJsonValue json; - UNIT_ASSERT_NO_EXCEPTION(Proto2Json(proto, jsonStream)); - UNIT_ASSERT(ReadJsonTree(&jsonStream, &json)); - UNIT_ASSERT_JSONS_EQUAL(json, modelJson); - } // streamed -} - - // Try to skip each field -#define DEFINE_FIELD(name, value) \ - { \ - THashSet<TString> skippedField; \ - skippedField.insert(#name); \ - TFlatOptional proto; \ - FillFlatProto(&proto, skippedField); \ - const NJson::TJsonValue& modelJson = CreateFlatJson(skippedField); \ - NJson::TJsonValue json; \ - UNIT_ASSERT_NO_EXCEPTION(Proto2Json(proto, json)); \ - UNIT_ASSERT_JSONS_EQUAL(json, modelJson); \ - { \ - TStringStream jsonStream; \ - UNIT_ASSERT_NO_EXCEPTION(Proto2Json(proto, jsonStream)); \ - UNIT_ASSERT(ReadJsonTree(&jsonStream, &json)); \ - UNIT_ASSERT_JSONS_EQUAL(json, modelJson); \ - } \ - } + {TFlatOptional proto; + FillFlatProto(&proto); + const NJson::TJsonValue& modelJson = CreateFlatJson(); + { + NJson::TJsonValue json; + UNIT_ASSERT_NO_EXCEPTION(Proto2Json(proto, json)); + UNIT_ASSERT_JSONS_EQUAL(json, modelJson); + } + + { + TStringStream jsonStream; + NJson::TJsonValue json; + UNIT_ASSERT_NO_EXCEPTION(Proto2Json(proto, jsonStream)); + UNIT_ASSERT(ReadJsonTree(&jsonStream, &json)); + UNIT_ASSERT_JSONS_EQUAL(json, modelJson); + } // streamed +} + + // Try to skip each field +#define DEFINE_FIELD(name, value) \ + { \ + THashSet<TString> skippedField; \ + skippedField.insert(#name); \ + TFlatOptional proto; \ + FillFlatProto(&proto, skippedField); \ + const NJson::TJsonValue& modelJson = CreateFlatJson(skippedField); \ + NJson::TJsonValue json; \ + UNIT_ASSERT_NO_EXCEPTION(Proto2Json(proto, json)); \ + UNIT_ASSERT_JSONS_EQUAL(json, modelJson); \ + { \ + TStringStream jsonStream; \ + UNIT_ASSERT_NO_EXCEPTION(Proto2Json(proto, jsonStream)); \ + UNIT_ASSERT(ReadJsonTree(&jsonStream, &json)); \ + UNIT_ASSERT_JSONS_EQUAL(json, modelJson); \ + } \ + } #include <library/cpp/protobuf/json/ut/fields.incl> #undef DEFINE_FIELD -} // TestFlatOptional +} // TestFlatOptional Y_UNIT_TEST(TestFlatRequired){ - {TFlatRequired proto; -FillFlatProto(&proto); -const NJson::TJsonValue& modelJson = CreateFlatJson(); -{ - NJson::TJsonValue json; - UNIT_ASSERT_NO_EXCEPTION(Proto2Json(proto, json)); - UNIT_ASSERT_JSONS_EQUAL(json, modelJson); -} - -{ - TStringStream jsonStream; - NJson::TJsonValue json; - UNIT_ASSERT_NO_EXCEPTION(Proto2Json(proto, jsonStream)); - UNIT_ASSERT(ReadJsonTree(&jsonStream, &json)); - UNIT_ASSERT_JSONS_EQUAL(json, modelJson); -} // streamed -} - -// Try to skip each field -#define DEFINE_FIELD(name, value) \ - { \ - THashSet<TString> skippedField; \ - skippedField.insert(#name); \ - TFlatRequired proto; \ - FillFlatProto(&proto, skippedField); \ - const NJson::TJsonValue& modelJson = CreateFlatJson(skippedField); \ - NJson::TJsonValue json; \ - UNIT_ASSERT_NO_EXCEPTION(Proto2Json(proto, json)); \ - UNIT_ASSERT_JSONS_EQUAL(json, modelJson); \ - { \ - TStringStream jsonStream; \ - UNIT_ASSERT_NO_EXCEPTION(Proto2Json(proto, jsonStream)); \ - UNIT_ASSERT(ReadJsonTree(&jsonStream, &json)); \ - UNIT_ASSERT_JSONS_EQUAL(json, modelJson); \ - } \ - } + {TFlatRequired proto; +FillFlatProto(&proto); +const NJson::TJsonValue& modelJson = CreateFlatJson(); +{ + NJson::TJsonValue json; + UNIT_ASSERT_NO_EXCEPTION(Proto2Json(proto, json)); + UNIT_ASSERT_JSONS_EQUAL(json, modelJson); +} + +{ + TStringStream jsonStream; + NJson::TJsonValue json; + UNIT_ASSERT_NO_EXCEPTION(Proto2Json(proto, jsonStream)); + UNIT_ASSERT(ReadJsonTree(&jsonStream, &json)); + UNIT_ASSERT_JSONS_EQUAL(json, modelJson); +} // streamed +} + +// Try to skip each field +#define DEFINE_FIELD(name, value) \ + { \ + THashSet<TString> skippedField; \ + skippedField.insert(#name); \ + TFlatRequired proto; \ + FillFlatProto(&proto, skippedField); \ + const NJson::TJsonValue& modelJson = CreateFlatJson(skippedField); \ + NJson::TJsonValue json; \ + UNIT_ASSERT_NO_EXCEPTION(Proto2Json(proto, json)); \ + UNIT_ASSERT_JSONS_EQUAL(json, modelJson); \ + { \ + TStringStream jsonStream; \ + UNIT_ASSERT_NO_EXCEPTION(Proto2Json(proto, jsonStream)); \ + UNIT_ASSERT(ReadJsonTree(&jsonStream, &json)); \ + UNIT_ASSERT_JSONS_EQUAL(json, modelJson); \ + } \ + } #include <library/cpp/protobuf/json/ut/fields.incl> #undef DEFINE_FIELD -} // TestFlatRequired +} // TestFlatRequired Y_UNIT_TEST(TestFlatRepeated) { - { - TFlatRepeated proto; - FillRepeatedProto(&proto); - const NJson::TJsonValue& modelJson = CreateRepeatedFlatJson(); + { + TFlatRepeated proto; + FillRepeatedProto(&proto); + const NJson::TJsonValue& modelJson = CreateRepeatedFlatJson(); { - NJson::TJsonValue json; - UNIT_ASSERT_NO_EXCEPTION(Proto2Json(proto, json)); - UNIT_ASSERT_JSONS_EQUAL(json, modelJson); + NJson::TJsonValue json; + UNIT_ASSERT_NO_EXCEPTION(Proto2Json(proto, json)); + UNIT_ASSERT_JSONS_EQUAL(json, modelJson); } - { - TStringStream jsonStream; - NJson::TJsonValue json; - UNIT_ASSERT_NO_EXCEPTION(Proto2Json(proto, jsonStream)); - UNIT_ASSERT(ReadJsonTree(&jsonStream, &json)); - UNIT_ASSERT_JSONS_EQUAL(json, modelJson); - } // streamed - } - - TProto2JsonConfig config; - config.SetMissingRepeatedKeyMode(TProto2JsonConfig::MissingKeySkip); - - // Try to skip each field -#define DEFINE_REPEATED_FIELD(name, ...) \ - { \ - THashSet<TString> skippedField; \ - skippedField.insert(#name); \ - TFlatRepeated proto; \ - FillRepeatedProto(&proto, skippedField); \ - const NJson::TJsonValue& modelJson = CreateRepeatedFlatJson(skippedField); \ - NJson::TJsonValue json; \ - UNIT_ASSERT_NO_EXCEPTION(Proto2Json(proto, json, config)); \ - UNIT_ASSERT_JSONS_EQUAL(json, modelJson); \ - { \ - TStringStream jsonStream; \ - UNIT_ASSERT_NO_EXCEPTION(Proto2Json(proto, jsonStream, config)); \ - UNIT_ASSERT(ReadJsonTree(&jsonStream, &json)); \ - UNIT_ASSERT_JSONS_EQUAL(json, modelJson); \ - } \ - } + { + TStringStream jsonStream; + NJson::TJsonValue json; + UNIT_ASSERT_NO_EXCEPTION(Proto2Json(proto, jsonStream)); + UNIT_ASSERT(ReadJsonTree(&jsonStream, &json)); + UNIT_ASSERT_JSONS_EQUAL(json, modelJson); + } // streamed + } + + TProto2JsonConfig config; + config.SetMissingRepeatedKeyMode(TProto2JsonConfig::MissingKeySkip); + + // Try to skip each field +#define DEFINE_REPEATED_FIELD(name, ...) \ + { \ + THashSet<TString> skippedField; \ + skippedField.insert(#name); \ + TFlatRepeated proto; \ + FillRepeatedProto(&proto, skippedField); \ + const NJson::TJsonValue& modelJson = CreateRepeatedFlatJson(skippedField); \ + NJson::TJsonValue json; \ + UNIT_ASSERT_NO_EXCEPTION(Proto2Json(proto, json, config)); \ + UNIT_ASSERT_JSONS_EQUAL(json, modelJson); \ + { \ + TStringStream jsonStream; \ + UNIT_ASSERT_NO_EXCEPTION(Proto2Json(proto, jsonStream, config)); \ + UNIT_ASSERT(ReadJsonTree(&jsonStream, &json)); \ + UNIT_ASSERT_JSONS_EQUAL(json, modelJson); \ + } \ + } #include <library/cpp/protobuf/json/ut/repeated_fields.incl> #undef DEFINE_REPEATED_FIELD -} // TestFlatRepeated +} // TestFlatRepeated Y_UNIT_TEST(TestCompositeOptional){ - {TCompositeOptional proto; -FillCompositeProto(&proto); -const NJson::TJsonValue& modelJson = CreateCompositeJson(); -{ - NJson::TJsonValue json; - UNIT_ASSERT_NO_EXCEPTION(Proto2Json(proto, json)); - UNIT_ASSERT_JSONS_EQUAL(json, modelJson); -} - -{ - TStringStream jsonStream; - NJson::TJsonValue json; - UNIT_ASSERT_NO_EXCEPTION(Proto2Json(proto, jsonStream)); - UNIT_ASSERT(ReadJsonTree(&jsonStream, &json)); - UNIT_ASSERT_JSONS_EQUAL(json, modelJson); -} // streamed -} - -// Try to skip each field -#define DEFINE_FIELD(name, value) \ - { \ - THashSet<TString> skippedField; \ - skippedField.insert(#name); \ - TCompositeOptional proto; \ - FillCompositeProto(&proto, skippedField); \ - const NJson::TJsonValue& modelJson = CreateCompositeJson(skippedField); \ - NJson::TJsonValue json; \ - UNIT_ASSERT_NO_EXCEPTION(Proto2Json(proto, json)); \ - UNIT_ASSERT_JSONS_EQUAL(json, modelJson); \ - { \ - TStringStream jsonStream; \ - UNIT_ASSERT_NO_EXCEPTION(Proto2Json(proto, jsonStream)); \ - UNIT_ASSERT(ReadJsonTree(&jsonStream, &json)); \ - UNIT_ASSERT_JSONS_EQUAL(json, modelJson); \ - } \ - } + {TCompositeOptional proto; +FillCompositeProto(&proto); +const NJson::TJsonValue& modelJson = CreateCompositeJson(); +{ + NJson::TJsonValue json; + UNIT_ASSERT_NO_EXCEPTION(Proto2Json(proto, json)); + UNIT_ASSERT_JSONS_EQUAL(json, modelJson); +} + +{ + TStringStream jsonStream; + NJson::TJsonValue json; + UNIT_ASSERT_NO_EXCEPTION(Proto2Json(proto, jsonStream)); + UNIT_ASSERT(ReadJsonTree(&jsonStream, &json)); + UNIT_ASSERT_JSONS_EQUAL(json, modelJson); +} // streamed +} + +// Try to skip each field +#define DEFINE_FIELD(name, value) \ + { \ + THashSet<TString> skippedField; \ + skippedField.insert(#name); \ + TCompositeOptional proto; \ + FillCompositeProto(&proto, skippedField); \ + const NJson::TJsonValue& modelJson = CreateCompositeJson(skippedField); \ + NJson::TJsonValue json; \ + UNIT_ASSERT_NO_EXCEPTION(Proto2Json(proto, json)); \ + UNIT_ASSERT_JSONS_EQUAL(json, modelJson); \ + { \ + TStringStream jsonStream; \ + UNIT_ASSERT_NO_EXCEPTION(Proto2Json(proto, jsonStream)); \ + UNIT_ASSERT(ReadJsonTree(&jsonStream, &json)); \ + UNIT_ASSERT_JSONS_EQUAL(json, modelJson); \ + } \ + } #include <library/cpp/protobuf/json/ut/fields.incl> #undef DEFINE_FIELD -} // TestCompositeOptional +} // TestCompositeOptional Y_UNIT_TEST(TestCompositeRequired){ - {TCompositeRequired proto; -FillCompositeProto(&proto); -const NJson::TJsonValue& modelJson = CreateCompositeJson(); -{ - NJson::TJsonValue json; - UNIT_ASSERT_NO_EXCEPTION(Proto2Json(proto, json)); - UNIT_ASSERT_JSONS_EQUAL(json, modelJson); -} - -{ - TStringStream jsonStream; - NJson::TJsonValue json; - UNIT_ASSERT_NO_EXCEPTION(Proto2Json(proto, jsonStream)); - UNIT_ASSERT(ReadJsonTree(&jsonStream, &json)); - UNIT_ASSERT_JSONS_EQUAL(json, modelJson); -} // streamed -} - -// Try to skip each field -#define DEFINE_FIELD(name, value) \ - { \ - THashSet<TString> skippedField; \ - skippedField.insert(#name); \ - TCompositeRequired proto; \ - FillCompositeProto(&proto, skippedField); \ - const NJson::TJsonValue& modelJson = CreateCompositeJson(skippedField); \ - NJson::TJsonValue json; \ - UNIT_ASSERT_NO_EXCEPTION(Proto2Json(proto, json)); \ - UNIT_ASSERT_JSONS_EQUAL(json, modelJson); \ - { \ - TStringStream jsonStream; \ - UNIT_ASSERT_NO_EXCEPTION(Proto2Json(proto, jsonStream)); \ - UNIT_ASSERT(ReadJsonTree(&jsonStream, &json)); \ - UNIT_ASSERT_JSONS_EQUAL(json, modelJson); \ - } \ - } + {TCompositeRequired proto; +FillCompositeProto(&proto); +const NJson::TJsonValue& modelJson = CreateCompositeJson(); +{ + NJson::TJsonValue json; + UNIT_ASSERT_NO_EXCEPTION(Proto2Json(proto, json)); + UNIT_ASSERT_JSONS_EQUAL(json, modelJson); +} + +{ + TStringStream jsonStream; + NJson::TJsonValue json; + UNIT_ASSERT_NO_EXCEPTION(Proto2Json(proto, jsonStream)); + UNIT_ASSERT(ReadJsonTree(&jsonStream, &json)); + UNIT_ASSERT_JSONS_EQUAL(json, modelJson); +} // streamed +} + +// Try to skip each field +#define DEFINE_FIELD(name, value) \ + { \ + THashSet<TString> skippedField; \ + skippedField.insert(#name); \ + TCompositeRequired proto; \ + FillCompositeProto(&proto, skippedField); \ + const NJson::TJsonValue& modelJson = CreateCompositeJson(skippedField); \ + NJson::TJsonValue json; \ + UNIT_ASSERT_NO_EXCEPTION(Proto2Json(proto, json)); \ + UNIT_ASSERT_JSONS_EQUAL(json, modelJson); \ + { \ + TStringStream jsonStream; \ + UNIT_ASSERT_NO_EXCEPTION(Proto2Json(proto, jsonStream)); \ + UNIT_ASSERT(ReadJsonTree(&jsonStream, &json)); \ + UNIT_ASSERT_JSONS_EQUAL(json, modelJson); \ + } \ + } #include <library/cpp/protobuf/json/ut/fields.incl> #undef DEFINE_FIELD -} // TestCompositeRequired +} // TestCompositeRequired Y_UNIT_TEST(TestCompositeRepeated) { - { - TFlatOptional partProto; - FillFlatProto(&partProto); - TCompositeRepeated proto; - proto.AddPart()->CopyFrom(partProto); - - NJson::TJsonValue modelJson; - NJson::TJsonValue modelArray; - modelArray.AppendValue(CreateFlatJson()); - modelJson.InsertValue("Part", modelArray); + { + TFlatOptional partProto; + FillFlatProto(&partProto); + TCompositeRepeated proto; + proto.AddPart()->CopyFrom(partProto); + + NJson::TJsonValue modelJson; + NJson::TJsonValue modelArray; + modelArray.AppendValue(CreateFlatJson()); + modelJson.InsertValue("Part", modelArray); { - NJson::TJsonValue json; - UNIT_ASSERT_NO_EXCEPTION(Proto2Json(proto, json)); - UNIT_ASSERT_JSONS_EQUAL(json, modelJson); + NJson::TJsonValue json; + UNIT_ASSERT_NO_EXCEPTION(Proto2Json(proto, json)); + UNIT_ASSERT_JSONS_EQUAL(json, modelJson); } { - TStringStream jsonStream; - NJson::TJsonValue json; - UNIT_ASSERT_NO_EXCEPTION(Proto2Json(proto, jsonStream)); - UNIT_ASSERT(ReadJsonTree(&jsonStream, &json)); - UNIT_ASSERT_JSONS_EQUAL(json, modelJson); - } // streamed - } - - { - // Array of messages with each field skipped - TCompositeRepeated proto; - NJson::TJsonValue modelArray; - -#define DEFINE_REPEATED_FIELD(name, ...) \ - { \ - THashSet<TString> skippedField; \ - skippedField.insert(#name); \ - TFlatOptional partProto; \ - FillFlatProto(&partProto, skippedField); \ - proto.AddPart()->CopyFrom(partProto); \ - modelArray.AppendValue(CreateFlatJson(skippedField)); \ - } + TStringStream jsonStream; + NJson::TJsonValue json; + UNIT_ASSERT_NO_EXCEPTION(Proto2Json(proto, jsonStream)); + UNIT_ASSERT(ReadJsonTree(&jsonStream, &json)); + UNIT_ASSERT_JSONS_EQUAL(json, modelJson); + } // streamed + } + + { + // Array of messages with each field skipped + TCompositeRepeated proto; + NJson::TJsonValue modelArray; + +#define DEFINE_REPEATED_FIELD(name, ...) \ + { \ + THashSet<TString> skippedField; \ + skippedField.insert(#name); \ + TFlatOptional partProto; \ + FillFlatProto(&partProto, skippedField); \ + proto.AddPart()->CopyFrom(partProto); \ + modelArray.AppendValue(CreateFlatJson(skippedField)); \ + } #include <library/cpp/protobuf/json/ut/repeated_fields.incl> #undef DEFINE_REPEATED_FIELD - NJson::TJsonValue modelJson; - modelJson.InsertValue("Part", modelArray); + NJson::TJsonValue modelJson; + modelJson.InsertValue("Part", modelArray); { NJson::TJsonValue json; - UNIT_ASSERT_NO_EXCEPTION(Proto2Json(proto, json)); + UNIT_ASSERT_NO_EXCEPTION(Proto2Json(proto, json)); UNIT_ASSERT_JSONS_EQUAL(json, modelJson); } { - TStringStream jsonStream; + TStringStream jsonStream; NJson::TJsonValue json; - UNIT_ASSERT_NO_EXCEPTION(Proto2Json(proto, jsonStream)); - UNIT_ASSERT(ReadJsonTree(&jsonStream, &json)); + UNIT_ASSERT_NO_EXCEPTION(Proto2Json(proto, jsonStream)); + UNIT_ASSERT(ReadJsonTree(&jsonStream, &json)); UNIT_ASSERT_JSONS_EQUAL(json, modelJson); - } // streamed - } -} // TestCompositeRepeated + } // streamed + } +} // TestCompositeRepeated Y_UNIT_TEST(TestEnumConfig) { - { - TFlatOptional proto; - proto.SetEnum(E_1); - NJson::TJsonValue modelJson; - modelJson.InsertValue("Enum", 1); - NJson::TJsonValue json; - TProto2JsonConfig config; - config.EnumMode = TProto2JsonConfig::EnumNumber; - - UNIT_ASSERT_NO_EXCEPTION(Proto2Json(proto, json, config)); - UNIT_ASSERT_JSONS_EQUAL(json, modelJson); - } - - { - TFlatOptional proto; - proto.SetEnum(E_1); - NJson::TJsonValue modelJson; - modelJson.InsertValue("Enum", "E_1"); - NJson::TJsonValue json; - TProto2JsonConfig config; - config.EnumMode = TProto2JsonConfig::EnumName; - - UNIT_ASSERT_NO_EXCEPTION(Proto2Json(proto, json, config)); - UNIT_ASSERT_JSONS_EQUAL(json, modelJson); - } - - { - TFlatOptional proto; - proto.SetEnum(E_1); - NJson::TJsonValue modelJson; - modelJson.InsertValue("Enum", "NProtobufJsonTest.E_1"); - NJson::TJsonValue json; - TProto2JsonConfig config; - config.EnumMode = TProto2JsonConfig::EnumFullName; - - UNIT_ASSERT_NO_EXCEPTION(Proto2Json(proto, json, config)); - UNIT_ASSERT_JSONS_EQUAL(json, modelJson); - } - - { - TFlatOptional proto; - proto.SetEnum(E_1); - NJson::TJsonValue modelJson; - modelJson.InsertValue("Enum", "e_1"); - NJson::TJsonValue json; - TProto2JsonConfig config; - config.EnumMode = TProto2JsonConfig::EnumNameLowerCase; - - UNIT_ASSERT_NO_EXCEPTION(Proto2Json(proto, json, config)); - UNIT_ASSERT_JSONS_EQUAL(json, modelJson); - } - - { - TFlatOptional proto; - proto.SetEnum(E_1); - NJson::TJsonValue modelJson; - modelJson.InsertValue("Enum", "nprotobufjsontest.e_1"); - NJson::TJsonValue json; - TProto2JsonConfig config; - config.EnumMode = TProto2JsonConfig::EnumFullNameLowerCase; - - UNIT_ASSERT_NO_EXCEPTION(Proto2Json(proto, json, config)); - UNIT_ASSERT_JSONS_EQUAL(json, modelJson); - } -} // TestEnumConfig - + { + TFlatOptional proto; + proto.SetEnum(E_1); + NJson::TJsonValue modelJson; + modelJson.InsertValue("Enum", 1); + NJson::TJsonValue json; + TProto2JsonConfig config; + config.EnumMode = TProto2JsonConfig::EnumNumber; + + UNIT_ASSERT_NO_EXCEPTION(Proto2Json(proto, json, config)); + UNIT_ASSERT_JSONS_EQUAL(json, modelJson); + } + + { + TFlatOptional proto; + proto.SetEnum(E_1); + NJson::TJsonValue modelJson; + modelJson.InsertValue("Enum", "E_1"); + NJson::TJsonValue json; + TProto2JsonConfig config; + config.EnumMode = TProto2JsonConfig::EnumName; + + UNIT_ASSERT_NO_EXCEPTION(Proto2Json(proto, json, config)); + UNIT_ASSERT_JSONS_EQUAL(json, modelJson); + } + + { + TFlatOptional proto; + proto.SetEnum(E_1); + NJson::TJsonValue modelJson; + modelJson.InsertValue("Enum", "NProtobufJsonTest.E_1"); + NJson::TJsonValue json; + TProto2JsonConfig config; + config.EnumMode = TProto2JsonConfig::EnumFullName; + + UNIT_ASSERT_NO_EXCEPTION(Proto2Json(proto, json, config)); + UNIT_ASSERT_JSONS_EQUAL(json, modelJson); + } + + { + TFlatOptional proto; + proto.SetEnum(E_1); + NJson::TJsonValue modelJson; + modelJson.InsertValue("Enum", "e_1"); + NJson::TJsonValue json; + TProto2JsonConfig config; + config.EnumMode = TProto2JsonConfig::EnumNameLowerCase; + + UNIT_ASSERT_NO_EXCEPTION(Proto2Json(proto, json, config)); + UNIT_ASSERT_JSONS_EQUAL(json, modelJson); + } + + { + TFlatOptional proto; + proto.SetEnum(E_1); + NJson::TJsonValue modelJson; + modelJson.InsertValue("Enum", "nprotobufjsontest.e_1"); + NJson::TJsonValue json; + TProto2JsonConfig config; + config.EnumMode = TProto2JsonConfig::EnumFullNameLowerCase; + + UNIT_ASSERT_NO_EXCEPTION(Proto2Json(proto, json, config)); + UNIT_ASSERT_JSONS_EQUAL(json, modelJson); + } +} // TestEnumConfig + Y_UNIT_TEST(TestMissingSingleKeyConfig) { - { - TFlatOptional proto; - NJson::TJsonValue modelJson(NJson::JSON_MAP); - NJson::TJsonValue json; - TProto2JsonConfig config; - config.MissingSingleKeyMode = TProto2JsonConfig::MissingKeySkip; - - UNIT_ASSERT_NO_EXCEPTION(Proto2Json(proto, json, config)); - UNIT_ASSERT_JSONS_EQUAL(json, modelJson); - } - - { - NJson::TJsonValue modelJson; -#define DEFINE_FIELD(name, value) \ - modelJson.InsertValue(#name, NJson::TJsonValue(NJson::JSON_NULL)); + { + TFlatOptional proto; + NJson::TJsonValue modelJson(NJson::JSON_MAP); + NJson::TJsonValue json; + TProto2JsonConfig config; + config.MissingSingleKeyMode = TProto2JsonConfig::MissingKeySkip; + + UNIT_ASSERT_NO_EXCEPTION(Proto2Json(proto, json, config)); + UNIT_ASSERT_JSONS_EQUAL(json, modelJson); + } + + { + NJson::TJsonValue modelJson; +#define DEFINE_FIELD(name, value) \ + modelJson.InsertValue(#name, NJson::TJsonValue(NJson::JSON_NULL)); #include <library/cpp/protobuf/json/ut/fields.incl> #undef DEFINE_FIELD - TFlatOptional proto; - NJson::TJsonValue json; - TProto2JsonConfig config; - config.MissingSingleKeyMode = TProto2JsonConfig::MissingKeyNull; + TFlatOptional proto; + NJson::TJsonValue json; + TProto2JsonConfig config; + config.MissingSingleKeyMode = TProto2JsonConfig::MissingKeyNull; - UNIT_ASSERT_NO_EXCEPTION(Proto2Json(proto, json, config)); - UNIT_ASSERT_JSONS_EQUAL(json, modelJson); - } + UNIT_ASSERT_NO_EXCEPTION(Proto2Json(proto, json, config)); + UNIT_ASSERT_JSONS_EQUAL(json, modelJson); + } { // Test MissingKeyExplicitDefaultThrowRequired for non explicit default values. TFlatOptional proto; @@ -511,46 +511,46 @@ Y_UNIT_TEST(TestMissingSingleKeyConfig) { UNIT_ASSERT_NO_EXCEPTION(Proto2Json(proto, json, config)); UNIT_ASSERT_JSONS_EQUAL(json, modelJson); } -} // TestMissingSingleKeyConfig +} // TestMissingSingleKeyConfig Y_UNIT_TEST(TestMissingRepeatedKeyNoConfig) { - { - TFlatRepeated proto; - NJson::TJsonValue modelJson(NJson::JSON_MAP); - NJson::TJsonValue json; + { + TFlatRepeated proto; + NJson::TJsonValue modelJson(NJson::JSON_MAP); + NJson::TJsonValue json; - UNIT_ASSERT_NO_EXCEPTION(Proto2Json(proto, json)); - UNIT_ASSERT_JSONS_EQUAL(json, modelJson); - } -} // TestMissingRepeatedKeyNoConfig + UNIT_ASSERT_NO_EXCEPTION(Proto2Json(proto, json)); + UNIT_ASSERT_JSONS_EQUAL(json, modelJson); + } +} // TestMissingRepeatedKeyNoConfig Y_UNIT_TEST(TestMissingRepeatedKeyConfig) { - { - TFlatRepeated proto; - NJson::TJsonValue modelJson(NJson::JSON_MAP); - NJson::TJsonValue json; - TProto2JsonConfig config; - config.MissingRepeatedKeyMode = TProto2JsonConfig::MissingKeySkip; - - UNIT_ASSERT_NO_EXCEPTION(Proto2Json(proto, json, config)); - UNIT_ASSERT_JSONS_EQUAL(json, modelJson); - } - - { - NJson::TJsonValue modelJson; -#define DEFINE_FIELD(name, value) \ - modelJson.InsertValue(#name, NJson::TJsonValue(NJson::JSON_NULL)); + { + TFlatRepeated proto; + NJson::TJsonValue modelJson(NJson::JSON_MAP); + NJson::TJsonValue json; + TProto2JsonConfig config; + config.MissingRepeatedKeyMode = TProto2JsonConfig::MissingKeySkip; + + UNIT_ASSERT_NO_EXCEPTION(Proto2Json(proto, json, config)); + UNIT_ASSERT_JSONS_EQUAL(json, modelJson); + } + + { + NJson::TJsonValue modelJson; +#define DEFINE_FIELD(name, value) \ + modelJson.InsertValue(#name, NJson::TJsonValue(NJson::JSON_NULL)); #include <library/cpp/protobuf/json/ut/fields.incl> #undef DEFINE_FIELD - TFlatRepeated proto; - NJson::TJsonValue json; - TProto2JsonConfig config; - config.MissingRepeatedKeyMode = TProto2JsonConfig::MissingKeyNull; + TFlatRepeated proto; + NJson::TJsonValue json; + TProto2JsonConfig config; + config.MissingRepeatedKeyMode = TProto2JsonConfig::MissingKeyNull; - UNIT_ASSERT_NO_EXCEPTION(Proto2Json(proto, json, config)); - UNIT_ASSERT_JSONS_EQUAL(json, modelJson); - } + UNIT_ASSERT_NO_EXCEPTION(Proto2Json(proto, json, config)); + UNIT_ASSERT_JSONS_EQUAL(json, modelJson); + } { TFlatRepeated proto; NJson::TJsonValue modelJson(NJson::JSON_MAP); @@ -562,199 +562,199 @@ Y_UNIT_TEST(TestMissingRepeatedKeyConfig) { UNIT_ASSERT_NO_EXCEPTION(Proto2Json(proto, json, config)); UNIT_ASSERT_JSONS_EQUAL(json, modelJson); } -} // TestMissingRepeatedKeyConfig +} // TestMissingRepeatedKeyConfig Y_UNIT_TEST(TestEscaping) { - // No escape - { - TString modelStr(R"_({"String":"value\""})_"); - - TFlatOptional proto; - proto.SetString(R"_(value")_"); - TStringStream jsonStr; - - UNIT_ASSERT_NO_EXCEPTION(Proto2Json(proto, jsonStr)); - UNIT_ASSERT_JSON_STRINGS_EQUAL(jsonStr.Str(), modelStr); - } - - // TEscapeJTransform - { - TString modelStr(R"_({"String":"value\""})_"); - - TFlatOptional proto; - proto.SetString(R"_(value")_"); - TProto2JsonConfig config; - config.StringTransforms.push_back(new TEscapeJTransform<false, true>()); - TStringStream jsonStr; - - UNIT_ASSERT_NO_EXCEPTION(Proto2Json(proto, jsonStr, config)); - UNIT_ASSERT_JSON_STRINGS_EQUAL(modelStr, jsonStr.Str()); - } - - // TCEscapeTransform - { - TString modelStr(R"_({"String":"value\""})_"); - - TFlatOptional proto; - proto.SetString(R"_(value")_"); - TProto2JsonConfig config; - config.StringTransforms.push_back(new TCEscapeTransform()); - TStringStream jsonStr; - - UNIT_ASSERT_NO_EXCEPTION(Proto2Json(proto, jsonStr, config)); - UNIT_ASSERT_JSON_STRINGS_EQUAL(jsonStr.Str(), modelStr); - } - - // TSafeUtf8CEscapeTransform - { - TString modelStr(R"_({"String":"value\""})_"); - - TFlatOptional proto; - proto.SetString(R"_(value")_"); - TProto2JsonConfig config; - config.StringTransforms.push_back(new TSafeUtf8CEscapeTransform()); - TStringStream jsonStr; - - UNIT_ASSERT_NO_EXCEPTION(Proto2Json(proto, jsonStr, config)); - UNIT_ASSERT_JSON_STRINGS_EQUAL(jsonStr.Str(), modelStr); - } -} // TestEscaping - -class TBytesTransform: public IStringTransform { -public: - int GetType() const override { - return 0; - } - void Transform(TString&) const override { - } - void TransformBytes(TString& str) const override { - str = "bytes"; - } -}; + // No escape + { + TString modelStr(R"_({"String":"value\""})_"); + + TFlatOptional proto; + proto.SetString(R"_(value")_"); + TStringStream jsonStr; + + UNIT_ASSERT_NO_EXCEPTION(Proto2Json(proto, jsonStr)); + UNIT_ASSERT_JSON_STRINGS_EQUAL(jsonStr.Str(), modelStr); + } + + // TEscapeJTransform + { + TString modelStr(R"_({"String":"value\""})_"); + + TFlatOptional proto; + proto.SetString(R"_(value")_"); + TProto2JsonConfig config; + config.StringTransforms.push_back(new TEscapeJTransform<false, true>()); + TStringStream jsonStr; + + UNIT_ASSERT_NO_EXCEPTION(Proto2Json(proto, jsonStr, config)); + UNIT_ASSERT_JSON_STRINGS_EQUAL(modelStr, jsonStr.Str()); + } + + // TCEscapeTransform + { + TString modelStr(R"_({"String":"value\""})_"); + + TFlatOptional proto; + proto.SetString(R"_(value")_"); + TProto2JsonConfig config; + config.StringTransforms.push_back(new TCEscapeTransform()); + TStringStream jsonStr; + + UNIT_ASSERT_NO_EXCEPTION(Proto2Json(proto, jsonStr, config)); + UNIT_ASSERT_JSON_STRINGS_EQUAL(jsonStr.Str(), modelStr); + } + + // TSafeUtf8CEscapeTransform + { + TString modelStr(R"_({"String":"value\""})_"); + + TFlatOptional proto; + proto.SetString(R"_(value")_"); + TProto2JsonConfig config; + config.StringTransforms.push_back(new TSafeUtf8CEscapeTransform()); + TStringStream jsonStr; + + UNIT_ASSERT_NO_EXCEPTION(Proto2Json(proto, jsonStr, config)); + UNIT_ASSERT_JSON_STRINGS_EQUAL(jsonStr.Str(), modelStr); + } +} // TestEscaping + +class TBytesTransform: public IStringTransform { +public: + int GetType() const override { + return 0; + } + void Transform(TString&) const override { + } + void TransformBytes(TString& str) const override { + str = "bytes"; + } +}; Y_UNIT_TEST(TestBytesTransform) { - // Test that string field is not changed - { - TString modelStr(R"_({"String":"value"})_"); + // Test that string field is not changed + { + TString modelStr(R"_({"String":"value"})_"); - TFlatOptional proto; - proto.SetString(R"_(value)_"); - TProto2JsonConfig config; - config.StringTransforms.push_back(new TBytesTransform()); - TStringStream jsonStr; + TFlatOptional proto; + proto.SetString(R"_(value)_"); + TProto2JsonConfig config; + config.StringTransforms.push_back(new TBytesTransform()); + TStringStream jsonStr; - UNIT_ASSERT_NO_EXCEPTION(Proto2Json(proto, jsonStr, config)); - UNIT_ASSERT_JSON_STRINGS_EQUAL(jsonStr.Str(), modelStr); - } + UNIT_ASSERT_NO_EXCEPTION(Proto2Json(proto, jsonStr, config)); + UNIT_ASSERT_JSON_STRINGS_EQUAL(jsonStr.Str(), modelStr); + } - // Test that bytes field is changed - { - TString modelStr(R"_({"Bytes":"bytes"})_"); + // Test that bytes field is changed + { + TString modelStr(R"_({"Bytes":"bytes"})_"); - TFlatOptional proto; - proto.SetBytes(R"_(value)_"); - TProto2JsonConfig config; - config.StringTransforms.push_back(new TBytesTransform()); - TStringStream jsonStr; + TFlatOptional proto; + proto.SetBytes(R"_(value)_"); + TProto2JsonConfig config; + config.StringTransforms.push_back(new TBytesTransform()); + TStringStream jsonStr; - UNIT_ASSERT_NO_EXCEPTION(Proto2Json(proto, jsonStr, config)); - UNIT_ASSERT_JSON_STRINGS_EQUAL(jsonStr.Str(), modelStr); + UNIT_ASSERT_NO_EXCEPTION(Proto2Json(proto, jsonStr, config)); + UNIT_ASSERT_JSON_STRINGS_EQUAL(jsonStr.Str(), modelStr); } -} +} Y_UNIT_TEST(TestFieldNameMode) { - // Original case 1 - { - TString modelStr(R"_({"String":"value"})_"); - - TFlatOptional proto; - proto.SetString("value"); - TStringStream jsonStr; - TProto2JsonConfig config; - - UNIT_ASSERT_NO_EXCEPTION(Proto2Json(proto, jsonStr, config)); - UNIT_ASSERT_JSON_STRINGS_EQUAL(jsonStr.Str(), modelStr); - } - - // Original case 2 - { - TString modelStr(R"_({"String":"value"})_"); - - TFlatOptional proto; - proto.SetString("value"); - TStringStream jsonStr; - TProto2JsonConfig config; - config.FieldNameMode = TProto2JsonConfig::FieldNameOriginalCase; - - UNIT_ASSERT_NO_EXCEPTION(Proto2Json(proto, jsonStr, config)); - UNIT_ASSERT_JSON_STRINGS_EQUAL(jsonStr.Str(), modelStr); - } - - // Lowercase - { - TString modelStr(R"_({"string":"value"})_"); - - TFlatOptional proto; - proto.SetString("value"); - TStringStream jsonStr; - TProto2JsonConfig config; - config.FieldNameMode = TProto2JsonConfig::FieldNameLowerCase; - - UNIT_ASSERT_NO_EXCEPTION(Proto2Json(proto, jsonStr, config)); - UNIT_ASSERT_JSON_STRINGS_EQUAL(jsonStr.Str(), modelStr); - } - - // Uppercase - { - TString modelStr(R"_({"STRING":"value"})_"); - - TFlatOptional proto; - proto.SetString("value"); - TStringStream jsonStr; - TProto2JsonConfig config; - config.FieldNameMode = TProto2JsonConfig::FieldNameUpperCase; - - UNIT_ASSERT_NO_EXCEPTION(Proto2Json(proto, jsonStr, config)); - UNIT_ASSERT_JSON_STRINGS_EQUAL(jsonStr.Str(), modelStr); - } - - // Camelcase - { - TString modelStr(R"_({"string":"value"})_"); - - TFlatOptional proto; - proto.SetString("value"); - TStringStream jsonStr; - TProto2JsonConfig config; - config.FieldNameMode = TProto2JsonConfig::FieldNameCamelCase; - - UNIT_ASSERT_NO_EXCEPTION(Proto2Json(proto, jsonStr, config)); - UNIT_ASSERT_JSON_STRINGS_EQUAL(jsonStr.Str(), modelStr); - } - { - TString modelStr(R"_({"oneString":"value"})_"); - - TFlatOptional proto; - proto.SetOneString("value"); - TStringStream jsonStr; - TProto2JsonConfig config; - config.FieldNameMode = TProto2JsonConfig::FieldNameCamelCase; - - UNIT_ASSERT_NO_EXCEPTION(Proto2Json(proto, jsonStr, config)); - UNIT_ASSERT_JSON_STRINGS_EQUAL(jsonStr.Str(), modelStr); - } - { - TString modelStr(R"_({"oneTwoString":"value"})_"); - - TFlatOptional proto; - proto.SetOneTwoString("value"); - TStringStream jsonStr; - TProto2JsonConfig config; - config.FieldNameMode = TProto2JsonConfig::FieldNameCamelCase; - - UNIT_ASSERT_NO_EXCEPTION(Proto2Json(proto, jsonStr, config)); - UNIT_ASSERT_JSON_STRINGS_EQUAL(jsonStr.Str(), modelStr); - } + // Original case 1 + { + TString modelStr(R"_({"String":"value"})_"); + + TFlatOptional proto; + proto.SetString("value"); + TStringStream jsonStr; + TProto2JsonConfig config; + + UNIT_ASSERT_NO_EXCEPTION(Proto2Json(proto, jsonStr, config)); + UNIT_ASSERT_JSON_STRINGS_EQUAL(jsonStr.Str(), modelStr); + } + + // Original case 2 + { + TString modelStr(R"_({"String":"value"})_"); + + TFlatOptional proto; + proto.SetString("value"); + TStringStream jsonStr; + TProto2JsonConfig config; + config.FieldNameMode = TProto2JsonConfig::FieldNameOriginalCase; + + UNIT_ASSERT_NO_EXCEPTION(Proto2Json(proto, jsonStr, config)); + UNIT_ASSERT_JSON_STRINGS_EQUAL(jsonStr.Str(), modelStr); + } + + // Lowercase + { + TString modelStr(R"_({"string":"value"})_"); + + TFlatOptional proto; + proto.SetString("value"); + TStringStream jsonStr; + TProto2JsonConfig config; + config.FieldNameMode = TProto2JsonConfig::FieldNameLowerCase; + + UNIT_ASSERT_NO_EXCEPTION(Proto2Json(proto, jsonStr, config)); + UNIT_ASSERT_JSON_STRINGS_EQUAL(jsonStr.Str(), modelStr); + } + + // Uppercase + { + TString modelStr(R"_({"STRING":"value"})_"); + + TFlatOptional proto; + proto.SetString("value"); + TStringStream jsonStr; + TProto2JsonConfig config; + config.FieldNameMode = TProto2JsonConfig::FieldNameUpperCase; + + UNIT_ASSERT_NO_EXCEPTION(Proto2Json(proto, jsonStr, config)); + UNIT_ASSERT_JSON_STRINGS_EQUAL(jsonStr.Str(), modelStr); + } + + // Camelcase + { + TString modelStr(R"_({"string":"value"})_"); + + TFlatOptional proto; + proto.SetString("value"); + TStringStream jsonStr; + TProto2JsonConfig config; + config.FieldNameMode = TProto2JsonConfig::FieldNameCamelCase; + + UNIT_ASSERT_NO_EXCEPTION(Proto2Json(proto, jsonStr, config)); + UNIT_ASSERT_JSON_STRINGS_EQUAL(jsonStr.Str(), modelStr); + } + { + TString modelStr(R"_({"oneString":"value"})_"); + + TFlatOptional proto; + proto.SetOneString("value"); + TStringStream jsonStr; + TProto2JsonConfig config; + config.FieldNameMode = TProto2JsonConfig::FieldNameCamelCase; + + UNIT_ASSERT_NO_EXCEPTION(Proto2Json(proto, jsonStr, config)); + UNIT_ASSERT_JSON_STRINGS_EQUAL(jsonStr.Str(), modelStr); + } + { + TString modelStr(R"_({"oneTwoString":"value"})_"); + + TFlatOptional proto; + proto.SetOneTwoString("value"); + TStringStream jsonStr; + TProto2JsonConfig config; + config.FieldNameMode = TProto2JsonConfig::FieldNameCamelCase; + + UNIT_ASSERT_NO_EXCEPTION(Proto2Json(proto, jsonStr, config)); + UNIT_ASSERT_JSON_STRINGS_EQUAL(jsonStr.Str(), modelStr); + } // snake_case { @@ -822,189 +822,189 @@ Y_UNIT_TEST(TestFieldNameMode) { UNIT_ASSERT_JSON_STRINGS_EQUAL(jsonStr.Str(), modelStr); } - // Original case, repeated - { - TString modelStr(R"_({"I32":[1,2]})_"); - - TFlatRepeated proto; - proto.AddI32(1); - proto.AddI32(2); - TStringStream jsonStr; - TProto2JsonConfig config; - config.FieldNameMode = TProto2JsonConfig::FieldNameOriginalCase; - - UNIT_ASSERT_NO_EXCEPTION(Proto2Json(proto, jsonStr, config)); - UNIT_ASSERT_JSON_STRINGS_EQUAL(jsonStr.Str(), modelStr); - } - - // Lower case, repeated - { - TString modelStr(R"_({"i32":[1,2]})_"); - - TFlatRepeated proto; - proto.AddI32(1); - proto.AddI32(2); - TStringStream jsonStr; - TProto2JsonConfig config; - config.FieldNameMode = TProto2JsonConfig::FieldNameLowerCase; - - UNIT_ASSERT_NO_EXCEPTION(Proto2Json(proto, jsonStr, config)); - UNIT_ASSERT_JSON_STRINGS_EQUAL(jsonStr.Str(), modelStr); - } - - // UseJsonName - { - // FIXME(CONTRIB-139): see the comment about UseJsonName in json2proto_ut.cpp: - // Def_upper json name should be "DefUpper". - TString modelStr(R"_({"My-Upper":1,"my-lower":2,"defUpper":3,"defLower":4})_"); - - TWithJsonName proto; - proto.Setmy_upper(1); - proto.SetMy_lower(2); - proto.SetDef_upper(3); - proto.Setdef_lower(4); - TStringStream jsonStr; - TProto2JsonConfig config; - config.SetUseJsonName(true); - - UNIT_ASSERT_NO_EXCEPTION(Proto2Json(proto, jsonStr, config)); - UNIT_ASSERT_STRINGS_EQUAL(jsonStr.Str(), modelStr); - } - - // FieldNameMode with UseJsonName - { - TProto2JsonConfig config; - config.SetFieldNameMode(TProto2JsonConfig::FieldNameLowerCase); - UNIT_ASSERT_EXCEPTION_CONTAINS( - config.SetUseJsonName(true), yexception, "mutually exclusive"); - } - { - TProto2JsonConfig config; - config.SetUseJsonName(true); - UNIT_ASSERT_EXCEPTION_CONTAINS( - config.SetFieldNameMode(TProto2JsonConfig::FieldNameLowerCase), yexception, "mutually exclusive"); - } - - /// TODO: test missing keys -} // TestFieldNameMode + // Original case, repeated + { + TString modelStr(R"_({"I32":[1,2]})_"); + + TFlatRepeated proto; + proto.AddI32(1); + proto.AddI32(2); + TStringStream jsonStr; + TProto2JsonConfig config; + config.FieldNameMode = TProto2JsonConfig::FieldNameOriginalCase; + + UNIT_ASSERT_NO_EXCEPTION(Proto2Json(proto, jsonStr, config)); + UNIT_ASSERT_JSON_STRINGS_EQUAL(jsonStr.Str(), modelStr); + } + + // Lower case, repeated + { + TString modelStr(R"_({"i32":[1,2]})_"); + + TFlatRepeated proto; + proto.AddI32(1); + proto.AddI32(2); + TStringStream jsonStr; + TProto2JsonConfig config; + config.FieldNameMode = TProto2JsonConfig::FieldNameLowerCase; + + UNIT_ASSERT_NO_EXCEPTION(Proto2Json(proto, jsonStr, config)); + UNIT_ASSERT_JSON_STRINGS_EQUAL(jsonStr.Str(), modelStr); + } + + // UseJsonName + { + // FIXME(CONTRIB-139): see the comment about UseJsonName in json2proto_ut.cpp: + // Def_upper json name should be "DefUpper". + TString modelStr(R"_({"My-Upper":1,"my-lower":2,"defUpper":3,"defLower":4})_"); + + TWithJsonName proto; + proto.Setmy_upper(1); + proto.SetMy_lower(2); + proto.SetDef_upper(3); + proto.Setdef_lower(4); + TStringStream jsonStr; + TProto2JsonConfig config; + config.SetUseJsonName(true); + + UNIT_ASSERT_NO_EXCEPTION(Proto2Json(proto, jsonStr, config)); + UNIT_ASSERT_STRINGS_EQUAL(jsonStr.Str(), modelStr); + } + + // FieldNameMode with UseJsonName + { + TProto2JsonConfig config; + config.SetFieldNameMode(TProto2JsonConfig::FieldNameLowerCase); + UNIT_ASSERT_EXCEPTION_CONTAINS( + config.SetUseJsonName(true), yexception, "mutually exclusive"); + } + { + TProto2JsonConfig config; + config.SetUseJsonName(true); + UNIT_ASSERT_EXCEPTION_CONTAINS( + config.SetFieldNameMode(TProto2JsonConfig::FieldNameLowerCase), yexception, "mutually exclusive"); + } + + /// TODO: test missing keys +} // TestFieldNameMode Y_UNIT_TEST(TestNan) { - TFlatOptional proto; - proto.SetDouble(std::numeric_limits<double>::quiet_NaN()); + TFlatOptional proto; + proto.SetDouble(std::numeric_limits<double>::quiet_NaN()); - UNIT_ASSERT_EXCEPTION(Proto2Json(proto, TProto2JsonConfig()), yexception); -} // TestNan + UNIT_ASSERT_EXCEPTION(Proto2Json(proto, TProto2JsonConfig()), yexception); +} // TestNan Y_UNIT_TEST(TestInf) { - TFlatOptional proto; - proto.SetFloat(std::numeric_limits<float>::infinity()); + TFlatOptional proto; + proto.SetFloat(std::numeric_limits<float>::infinity()); - UNIT_ASSERT_EXCEPTION(Proto2Json(proto, TProto2JsonConfig()), yexception); -} // TestInf + UNIT_ASSERT_EXCEPTION(Proto2Json(proto, TProto2JsonConfig()), yexception); +} // TestInf Y_UNIT_TEST(TestMap) { - TMapType proto; - - auto& items = *proto.MutableItems(); - items["key1"] = "value1"; - items["key2"] = "value2"; - items["key3"] = "value3"; - - TString modelStr(R"_({"Items":[{"key":"key3","value":"value3"},{"key":"key2","value":"value2"},{"key":"key1","value":"value1"}]})_"); - - TStringStream jsonStr; - TProto2JsonConfig config; - UNIT_ASSERT_NO_EXCEPTION(Proto2Json(proto, jsonStr, config)); - - NJson::TJsonValue jsonValue, modelValue; - NJson::TJsonValue::TArray jsonItems, modelItems; - UNIT_ASSERT(NJson::ReadJsonTree(jsonStr.Str(), &jsonValue)); - UNIT_ASSERT(NJson::ReadJsonTree(modelStr, &modelValue)); - UNIT_ASSERT(jsonValue.Has("Items")); - jsonValue["Items"].GetArray(&jsonItems); - modelValue["Items"].GetArray(&modelItems); - auto itemKey = [](const NJson::TJsonValue& v) { - return v["key"].GetString(); - }; - SortBy(jsonItems, itemKey); - SortBy(modelItems, itemKey); - UNIT_ASSERT_EQUAL(jsonItems, modelItems); -} // TestMap + TMapType proto; + + auto& items = *proto.MutableItems(); + items["key1"] = "value1"; + items["key2"] = "value2"; + items["key3"] = "value3"; + + TString modelStr(R"_({"Items":[{"key":"key3","value":"value3"},{"key":"key2","value":"value2"},{"key":"key1","value":"value1"}]})_"); + + TStringStream jsonStr; + TProto2JsonConfig config; + UNIT_ASSERT_NO_EXCEPTION(Proto2Json(proto, jsonStr, config)); + + NJson::TJsonValue jsonValue, modelValue; + NJson::TJsonValue::TArray jsonItems, modelItems; + UNIT_ASSERT(NJson::ReadJsonTree(jsonStr.Str(), &jsonValue)); + UNIT_ASSERT(NJson::ReadJsonTree(modelStr, &modelValue)); + UNIT_ASSERT(jsonValue.Has("Items")); + jsonValue["Items"].GetArray(&jsonItems); + modelValue["Items"].GetArray(&modelItems); + auto itemKey = [](const NJson::TJsonValue& v) { + return v["key"].GetString(); + }; + SortBy(jsonItems, itemKey); + SortBy(modelItems, itemKey); + UNIT_ASSERT_EQUAL(jsonItems, modelItems); +} // TestMap Y_UNIT_TEST(TestMapAsObject) { - TMapType proto; + TMapType proto; - auto& items = *proto.MutableItems(); - items["key1"] = "value1"; - items["key2"] = "value2"; - items["key3"] = "value3"; + auto& items = *proto.MutableItems(); + items["key1"] = "value1"; + items["key2"] = "value2"; + items["key3"] = "value3"; - TString modelStr(R"_({"Items":{"key3":"value3","key2":"value2","key1":"value1"}})_"); + TString modelStr(R"_({"Items":{"key3":"value3","key2":"value2","key1":"value1"}})_"); - TStringStream jsonStr; - TProto2JsonConfig config; - config.MapAsObject = true; - UNIT_ASSERT_NO_EXCEPTION(Proto2Json(proto, jsonStr, config)); + TStringStream jsonStr; + TProto2JsonConfig config; + config.MapAsObject = true; + UNIT_ASSERT_NO_EXCEPTION(Proto2Json(proto, jsonStr, config)); - UNIT_ASSERT_JSON_STRINGS_EQUAL(jsonStr.Str(), modelStr); -} // TestMapAsObject + UNIT_ASSERT_JSON_STRINGS_EQUAL(jsonStr.Str(), modelStr); +} // TestMapAsObject Y_UNIT_TEST(TestMapWTF) { - TMapType proto; + TMapType proto; - auto& items = *proto.MutableItems(); - items["key1"] = "value1"; - items["key2"] = "value2"; - items["key3"] = "value3"; + auto& items = *proto.MutableItems(); + items["key1"] = "value1"; + items["key2"] = "value2"; + items["key3"] = "value3"; - TString modelStr(R"_({"Items":{"key3":"value3","key2":"value2","key1":"value1"}})_"); + TString modelStr(R"_({"Items":{"key3":"value3","key2":"value2","key1":"value1"}})_"); - TStringStream jsonStr; - UNIT_ASSERT_NO_EXCEPTION(Proto2Json(proto, jsonStr)); + TStringStream jsonStr; + UNIT_ASSERT_NO_EXCEPTION(Proto2Json(proto, jsonStr)); - UNIT_ASSERT_JSON_STRINGS_EQUAL(jsonStr.Str(), modelStr); -} // TestMapWTF + UNIT_ASSERT_JSON_STRINGS_EQUAL(jsonStr.Str(), modelStr); +} // TestMapWTF Y_UNIT_TEST(TestStringifyLongNumbers) { -#define TEST_SINGLE(flag, value, expectString) \ - do { \ - TFlatOptional proto; \ - proto.SetSI64(value); \ - \ - TStringStream jsonStr; \ - TProto2JsonConfig config; \ - config.SetStringifyLongNumbers(flag); \ - UNIT_ASSERT_NO_EXCEPTION(Proto2Json(proto, jsonStr, config)); \ - if (expectString) { \ - UNIT_ASSERT_EQUAL(jsonStr.Str(), "{\"SI64\":\"" #value "\"}"); \ - } else { \ - UNIT_ASSERT_EQUAL(jsonStr.Str(), "{\"SI64\":" #value "}"); \ - } \ - } while (false) - - TEST_SINGLE(TProto2JsonConfig::StringifyLongNumbersNever, 1, false); - TEST_SINGLE(TProto2JsonConfig::StringifyLongNumbersNever, 1000000000, false); - TEST_SINGLE(TProto2JsonConfig::StringifyLongNumbersNever, 10000000000000000, false); - TEST_SINGLE(TProto2JsonConfig::StringifyLongNumbersNever, -1, false); - TEST_SINGLE(TProto2JsonConfig::StringifyLongNumbersNever, -1000000000, false); - TEST_SINGLE(TProto2JsonConfig::StringifyLongNumbersNever, -10000000000000000, false); - - TEST_SINGLE(TProto2JsonConfig::StringifyLongNumbersForDouble, 1, false); - TEST_SINGLE(TProto2JsonConfig::StringifyLongNumbersForDouble, 1000000000, false); - TEST_SINGLE(TProto2JsonConfig::StringifyLongNumbersForDouble, 10000000000000000, true); - TEST_SINGLE(TProto2JsonConfig::StringifyLongNumbersForDouble, -1, false); - TEST_SINGLE(TProto2JsonConfig::StringifyLongNumbersForDouble, -1000000000, false); - TEST_SINGLE(TProto2JsonConfig::StringifyLongNumbersForDouble, -10000000000000000, true); - - TEST_SINGLE(TProto2JsonConfig::StringifyLongNumbersForFloat, 1, false); - TEST_SINGLE(TProto2JsonConfig::StringifyLongNumbersForFloat, 1000000000, true); - TEST_SINGLE(TProto2JsonConfig::StringifyLongNumbersForFloat, 10000000000000000, true); - TEST_SINGLE(TProto2JsonConfig::StringifyLongNumbersForFloat, -1, false); - TEST_SINGLE(TProto2JsonConfig::StringifyLongNumbersForFloat, -1000000000, true); - TEST_SINGLE(TProto2JsonConfig::StringifyLongNumbersForFloat, -10000000000000000, true); +#define TEST_SINGLE(flag, value, expectString) \ + do { \ + TFlatOptional proto; \ + proto.SetSI64(value); \ + \ + TStringStream jsonStr; \ + TProto2JsonConfig config; \ + config.SetStringifyLongNumbers(flag); \ + UNIT_ASSERT_NO_EXCEPTION(Proto2Json(proto, jsonStr, config)); \ + if (expectString) { \ + UNIT_ASSERT_EQUAL(jsonStr.Str(), "{\"SI64\":\"" #value "\"}"); \ + } else { \ + UNIT_ASSERT_EQUAL(jsonStr.Str(), "{\"SI64\":" #value "}"); \ + } \ + } while (false) + + TEST_SINGLE(TProto2JsonConfig::StringifyLongNumbersNever, 1, false); + TEST_SINGLE(TProto2JsonConfig::StringifyLongNumbersNever, 1000000000, false); + TEST_SINGLE(TProto2JsonConfig::StringifyLongNumbersNever, 10000000000000000, false); + TEST_SINGLE(TProto2JsonConfig::StringifyLongNumbersNever, -1, false); + TEST_SINGLE(TProto2JsonConfig::StringifyLongNumbersNever, -1000000000, false); + TEST_SINGLE(TProto2JsonConfig::StringifyLongNumbersNever, -10000000000000000, false); + + TEST_SINGLE(TProto2JsonConfig::StringifyLongNumbersForDouble, 1, false); + TEST_SINGLE(TProto2JsonConfig::StringifyLongNumbersForDouble, 1000000000, false); + TEST_SINGLE(TProto2JsonConfig::StringifyLongNumbersForDouble, 10000000000000000, true); + TEST_SINGLE(TProto2JsonConfig::StringifyLongNumbersForDouble, -1, false); + TEST_SINGLE(TProto2JsonConfig::StringifyLongNumbersForDouble, -1000000000, false); + TEST_SINGLE(TProto2JsonConfig::StringifyLongNumbersForDouble, -10000000000000000, true); + + TEST_SINGLE(TProto2JsonConfig::StringifyLongNumbersForFloat, 1, false); + TEST_SINGLE(TProto2JsonConfig::StringifyLongNumbersForFloat, 1000000000, true); + TEST_SINGLE(TProto2JsonConfig::StringifyLongNumbersForFloat, 10000000000000000, true); + TEST_SINGLE(TProto2JsonConfig::StringifyLongNumbersForFloat, -1, false); + TEST_SINGLE(TProto2JsonConfig::StringifyLongNumbersForFloat, -1000000000, true); + TEST_SINGLE(TProto2JsonConfig::StringifyLongNumbersForFloat, -10000000000000000, true); #undef TEST_SINGLE -} // TestStringifyLongNumbers +} // TestStringifyLongNumbers Y_UNIT_TEST(TestExtension) { TExtensionField proto; diff --git a/library/cpp/protobuf/json/ut/string_transform_ut.cpp b/library/cpp/protobuf/json/ut/string_transform_ut.cpp index a31dabcb0f..90debecd66 100644 --- a/library/cpp/protobuf/json/ut/string_transform_ut.cpp +++ b/library/cpp/protobuf/json/ut/string_transform_ut.cpp @@ -40,7 +40,7 @@ Y_UNIT_TEST_SUITE(TDoubleEscapeTransform) { Y_UNIT_TEST_SUITE(TDoubleUnescapeTransform) { Y_UNIT_TEST(TestEmptyString) { - const NProtobufJson::IStringTransform& transform = NProtobufJson::TDoubleUnescapeTransform(); + const NProtobufJson::IStringTransform& transform = NProtobufJson::TDoubleUnescapeTransform(); TString s; s = ""; transform.Transform(s); @@ -48,7 +48,7 @@ Y_UNIT_TEST_SUITE(TDoubleUnescapeTransform) { } Y_UNIT_TEST(TestAlphabeticString) { - const NProtobufJson::IStringTransform& transform = NProtobufJson::TDoubleUnescapeTransform(); + const NProtobufJson::IStringTransform& transform = NProtobufJson::TDoubleUnescapeTransform(); TString s; s = "abacaba"; transform.Transform(s); @@ -57,7 +57,7 @@ Y_UNIT_TEST_SUITE(TDoubleUnescapeTransform) { } Y_UNIT_TEST(TestRussianSymbols) { - const NProtobufJson::IStringTransform& transform = NProtobufJson::TDoubleUnescapeTransform(); + const NProtobufJson::IStringTransform& transform = NProtobufJson::TDoubleUnescapeTransform(); TString s; s = "\\\\321\\\\202\\\\320\\\\265\\\\321\\\\201\\\\321\\\\202"; transform.Transform(s); @@ -65,7 +65,7 @@ Y_UNIT_TEST_SUITE(TDoubleUnescapeTransform) { } Y_UNIT_TEST(TestEscapeSpecialSymbols) { - const NProtobufJson::IStringTransform& transform = NProtobufJson::TDoubleUnescapeTransform(); + const NProtobufJson::IStringTransform& transform = NProtobufJson::TDoubleUnescapeTransform(); TString s; s = "aba\\\\\\\\ca\\\\\\\"ba"; transform.Transform(s); @@ -73,7 +73,7 @@ Y_UNIT_TEST_SUITE(TDoubleUnescapeTransform) { } Y_UNIT_TEST(TestEscapeSpecialSymbolsDifficultCases) { - const NProtobufJson::IStringTransform& transform = NProtobufJson::TDoubleUnescapeTransform(); + const NProtobufJson::IStringTransform& transform = NProtobufJson::TDoubleUnescapeTransform(); TString s; s = "\\\\\\\\\\\\\\\\"; transform.Transform(s); |