aboutsummaryrefslogtreecommitdiffstats
path: root/library/cpp/protobuf/json/ut/proto2json_ut.cpp
diff options
context:
space:
mode:
authorsashashkov <sashashkov@yandex-team.com>2024-06-11 13:03:18 +0300
committersashashkov <sashashkov@yandex-team.com>2024-06-12 10:26:35 +0300
commit67e7cccc330744cdb98035e309f626c1f63afb84 (patch)
treef29f638710ae5223dbb7a56e427aea6c551bdff6 /library/cpp/protobuf/json/ut/proto2json_ut.cpp
parenta26a1f012a93e209458200c2ba8ae484a45a6c54 (diff)
downloadydb-67e7cccc330744cdb98035e309f626c1f63afb84.tar.gz
Implement number stringification for repeated fields as well
4ab5908e416439366466d984fc08db7254401884
Diffstat (limited to 'library/cpp/protobuf/json/ut/proto2json_ut.cpp')
-rw-r--r--library/cpp/protobuf/json/ut/proto2json_ut.cpp193
1 files changed, 193 insertions, 0 deletions
diff --git a/library/cpp/protobuf/json/ut/proto2json_ut.cpp b/library/cpp/protobuf/json/ut/proto2json_ut.cpp
index 9b74e73752..9e98ab8a06 100644
--- a/library/cpp/protobuf/json/ut/proto2json_ut.cpp
+++ b/library/cpp/protobuf/json/ut/proto2json_ut.cpp
@@ -1086,6 +1086,199 @@ Y_UNIT_TEST(TestStringifyNumbers) {
#undef TEST_SINGLE
} // TestStringifyNumbers
+Y_UNIT_TEST(TestStringifyNumbersRepeated) {
+#define TEST_SINGLE(flag, field, value) \
+ do { \
+ TFlatRepeated proto; \
+ proto.Add##field(value); \
+ \
+ TStringStream jsonStr; \
+ TProto2JsonConfig config; \
+ config.SetStringifyNumbers(flag); \
+ UNIT_ASSERT_NO_EXCEPTION(Proto2Json(proto, jsonStr, config)); \
+ UNIT_ASSERT_EQUAL(jsonStr.Str(), "{\"" #field "\":[" #value "]}"); \
+ } while (false)
+
+ TEST_SINGLE(TProto2JsonConfig::StringifyLongNumbersNever, SI64, 1);
+ TEST_SINGLE(TProto2JsonConfig::StringifyLongNumbersNever, SI64, 10000000000000000);
+
+ TEST_SINGLE(TProto2JsonConfig::StringifyLongNumbersForDouble, SI64, 1);
+ TEST_SINGLE(TProto2JsonConfig::StringifyLongNumbersForDouble, SI64, 10000000000000000);
+
+ TEST_SINGLE(TProto2JsonConfig::StringifyLongNumbersForFloat, SI64, 1);
+ TEST_SINGLE(TProto2JsonConfig::StringifyLongNumbersForFloat, SI64, 10000000000000000);
+
+ TEST_SINGLE(TProto2JsonConfig::StringifyInt64Always, UI64, 1);
+ TEST_SINGLE(TProto2JsonConfig::StringifyInt64Always, UI64, 10000000000000000);
+
+#undef TEST_SINGLE
+} // TestStringifyNumbersRepeated
+
+Y_UNIT_TEST(TestStringifyNumbersRepeatedStringification){
+#define TEST_SINGLE(flag, field, value, expectString) \
+ do { \
+ TFlatRepeated proto; \
+ proto.Add##field(value); \
+ \
+ TStringStream jsonStr; \
+ TProto2JsonConfig config; \
+ config.SetStringifyNumbersRepeated(flag); \
+ UNIT_ASSERT_NO_EXCEPTION(Proto2Json(proto, jsonStr, config)); \
+ if (expectString) { \
+ UNIT_ASSERT_EQUAL(jsonStr.Str(), "{\"" #field "\":[\"" #value "\"]}"); \
+ } else { \
+ UNIT_ASSERT_EQUAL(jsonStr.Str(), "{\"" #field "\":[" #value "]}"); \
+ } \
+ } while (false)
+
+ TEST_SINGLE(TProto2JsonConfig::StringifyLongNumbersNever, SI64, 1, false);
+ TEST_SINGLE(TProto2JsonConfig::StringifyLongNumbersNever, SI64, 1000000000, false);
+ TEST_SINGLE(TProto2JsonConfig::StringifyLongNumbersNever, SI64, 10000000000000000, false);
+ TEST_SINGLE(TProto2JsonConfig::StringifyLongNumbersNever, SI64, -1, false);
+ TEST_SINGLE(TProto2JsonConfig::StringifyLongNumbersNever, SI64, -1000000000, false);
+ TEST_SINGLE(TProto2JsonConfig::StringifyLongNumbersNever, SI64, -10000000000000000, false);
+
+ TEST_SINGLE(TProto2JsonConfig::StringifyLongNumbersForDouble, SI64, 1, false);
+ TEST_SINGLE(TProto2JsonConfig::StringifyLongNumbersForDouble, SI64, 1000000000, false);
+ TEST_SINGLE(TProto2JsonConfig::StringifyLongNumbersForDouble, SI64, 10000000000000000, true);
+ TEST_SINGLE(TProto2JsonConfig::StringifyLongNumbersForDouble, SI64, -1, false);
+ TEST_SINGLE(TProto2JsonConfig::StringifyLongNumbersForDouble, SI64, -1000000000, false);
+ TEST_SINGLE(TProto2JsonConfig::StringifyLongNumbersForDouble, SI64, -10000000000000000, true);
+
+ TEST_SINGLE(TProto2JsonConfig::StringifyLongNumbersForFloat, SI64, 1, false);
+ TEST_SINGLE(TProto2JsonConfig::StringifyLongNumbersForFloat, SI64, 1000000000, true);
+ TEST_SINGLE(TProto2JsonConfig::StringifyLongNumbersForFloat, SI64, 10000000000000000, true);
+ TEST_SINGLE(TProto2JsonConfig::StringifyLongNumbersForFloat, SI64, -1, false);
+ TEST_SINGLE(TProto2JsonConfig::StringifyLongNumbersForFloat, SI64, -1000000000, true);
+ TEST_SINGLE(TProto2JsonConfig::StringifyLongNumbersForFloat, SI64, -10000000000000000, true);
+
+
+ TEST_SINGLE(TProto2JsonConfig::StringifyInt64Always, UI64, 1, true);
+ TEST_SINGLE(TProto2JsonConfig::StringifyInt64Always, UI32, 1000000000, false);
+ TEST_SINGLE(TProto2JsonConfig::StringifyInt64Always, UI64, 10000000000000000, true);
+ TEST_SINGLE(TProto2JsonConfig::StringifyInt64Always, SI64, -1, true);
+ TEST_SINGLE(TProto2JsonConfig::StringifyInt64Always, SI32, -1000000000, false);
+ TEST_SINGLE(TProto2JsonConfig::StringifyInt64Always, SI64, -10000000000000000, true);
+
+#undef TEST_SINGLE
+} // TestStringifyNumbersRepeatedStringification
+
+Y_UNIT_TEST(TestStringifyNumbersRepeatedStringificationList){
+ using NJson::JSON_STRING;
+ using NJson::JSON_UINTEGER;
+ using NJson::JSON_INTEGER;
+
+ TFlatRepeated proto;
+ proto.AddUI64(1);
+ proto.AddUI64(1000000000);
+ proto.AddUI64(10000000000000000);
+ proto.AddSI64(1);
+ proto.AddSI64(1000000000);
+ proto.AddSI64(10000000000000000);
+ proto.AddSI64(-1);
+ proto.AddSI64(-1000000000);
+ proto.AddSI64(-10000000000000000);
+ proto.AddUI32(1);
+ proto.AddUI32(1000000000);
+ proto.AddSI32(-1);
+ proto.AddSI32(-1000000000);
+
+ TProto2JsonConfig config;
+ NJson::TJsonValue jsonValue;
+ THashMap<TString, NJson::TJsonValue> jsonMap;
+ {
+ jsonValue = NJson::TJsonValue{};
+ config.SetStringifyNumbersRepeated(TProto2JsonConfig::StringifyLongNumbersNever);
+
+ UNIT_ASSERT_NO_EXCEPTION(Proto2Json(proto, jsonValue, config));
+ jsonMap = jsonValue.GetMap();
+
+ UNIT_ASSERT_EQUAL(jsonMap.at("UI64")[0].GetType(), JSON_UINTEGER);
+ UNIT_ASSERT_EQUAL(jsonMap.at("UI64")[1].GetType(), JSON_UINTEGER);
+ UNIT_ASSERT_EQUAL(jsonMap.at("UI64")[2].GetType(), JSON_UINTEGER);
+
+ UNIT_ASSERT_EQUAL(jsonMap.at("SI64")[0].GetType(), JSON_INTEGER);
+ UNIT_ASSERT_EQUAL(jsonMap.at("SI64")[1].GetType(), JSON_INTEGER);
+ UNIT_ASSERT_EQUAL(jsonMap.at("SI64")[2].GetType(), JSON_INTEGER);
+ UNIT_ASSERT_EQUAL(jsonMap.at("SI64")[3].GetType(), JSON_INTEGER);
+ UNIT_ASSERT_EQUAL(jsonMap.at("SI64")[4].GetType(), JSON_INTEGER);
+ UNIT_ASSERT_EQUAL(jsonMap.at("SI64")[5].GetType(), JSON_INTEGER);
+ }
+ {
+ jsonValue = NJson::TJsonValue{};
+ config.SetStringifyNumbersRepeated(TProto2JsonConfig::StringifyLongNumbersForDouble);
+
+ UNIT_ASSERT_NO_EXCEPTION(Proto2Json(proto, jsonValue, config));
+ jsonMap = jsonValue.GetMap();
+
+ UNIT_ASSERT_EQUAL(jsonMap.at("UI64")[0].GetType(), JSON_UINTEGER);
+ UNIT_ASSERT_EQUAL(jsonMap.at("UI64")[1].GetType(), JSON_UINTEGER);
+ UNIT_ASSERT_EQUAL(jsonMap.at("UI64")[2].GetType(), JSON_STRING);
+
+ UNIT_ASSERT_EQUAL(jsonMap.at("SI64")[0].GetType(), JSON_INTEGER);
+ UNIT_ASSERT_EQUAL(jsonMap.at("SI64")[1].GetType(), JSON_INTEGER);
+ UNIT_ASSERT_EQUAL(jsonMap.at("SI64")[2].GetType(), JSON_STRING);
+ UNIT_ASSERT_EQUAL(jsonMap.at("SI64")[3].GetType(), JSON_INTEGER);
+ UNIT_ASSERT_EQUAL(jsonMap.at("SI64")[4].GetType(), JSON_INTEGER);
+ UNIT_ASSERT_EQUAL(jsonMap.at("SI64")[5].GetType(), JSON_STRING);
+
+ UNIT_ASSERT_EQUAL(jsonMap.at("SI32")[0].GetType(), JSON_INTEGER);
+ UNIT_ASSERT_EQUAL(jsonMap.at("SI32")[1].GetType(), JSON_INTEGER);
+
+ UNIT_ASSERT_EQUAL(jsonMap.at("UI32")[0].GetType(), JSON_UINTEGER);
+ UNIT_ASSERT_EQUAL(jsonMap.at("UI32")[1].GetType(), JSON_UINTEGER);
+ }
+ {
+ jsonValue = NJson::TJsonValue{};
+ config.SetStringifyNumbersRepeated(TProto2JsonConfig::StringifyLongNumbersForFloat);
+
+ UNIT_ASSERT_NO_EXCEPTION(Proto2Json(proto, jsonValue, config));
+ jsonMap = jsonValue.GetMap();
+
+ UNIT_ASSERT_EQUAL(jsonMap.at("UI64")[0].GetType(), JSON_UINTEGER);
+ UNIT_ASSERT_EQUAL(jsonMap.at("UI64")[1].GetType(), JSON_STRING);
+ UNIT_ASSERT_EQUAL(jsonMap.at("UI64")[2].GetType(), JSON_STRING);
+
+ UNIT_ASSERT_EQUAL(jsonMap.at("SI64")[0].GetType(), JSON_INTEGER);
+ UNIT_ASSERT_EQUAL(jsonMap.at("SI64")[1].GetType(), JSON_STRING);
+ UNIT_ASSERT_EQUAL(jsonMap.at("SI64")[2].GetType(), JSON_STRING);
+ UNIT_ASSERT_EQUAL(jsonMap.at("SI64")[3].GetType(), JSON_INTEGER);
+ UNIT_ASSERT_EQUAL(jsonMap.at("SI64")[4].GetType(), JSON_STRING);
+ UNIT_ASSERT_EQUAL(jsonMap.at("SI64")[5].GetType(), JSON_STRING);
+
+ UNIT_ASSERT_EQUAL(jsonMap.at("SI32")[0].GetType(), JSON_INTEGER);
+ UNIT_ASSERT_EQUAL(jsonMap.at("SI32")[1].GetType(), JSON_STRING);
+
+ UNIT_ASSERT_EQUAL(jsonMap.at("UI32")[0].GetType(), JSON_UINTEGER);
+ UNIT_ASSERT_EQUAL(jsonMap.at("UI32")[1].GetType(), JSON_STRING);
+ }
+ {
+ jsonValue = NJson::TJsonValue{};
+ config.SetStringifyNumbersRepeated(TProto2JsonConfig::StringifyInt64Always);
+
+ UNIT_ASSERT_NO_EXCEPTION(Proto2Json(proto, jsonValue, config));
+ jsonMap = jsonValue.GetMap();
+
+ UNIT_ASSERT_EQUAL(jsonMap.at("UI64")[0].GetType(), JSON_STRING);
+ UNIT_ASSERT_EQUAL(jsonMap.at("UI64")[1].GetType(), JSON_STRING);
+ UNIT_ASSERT_EQUAL(jsonMap.at("UI64")[2].GetType(), JSON_STRING);
+
+ UNIT_ASSERT_EQUAL(jsonMap.at("SI64")[0].GetType(), JSON_STRING);
+ UNIT_ASSERT_EQUAL(jsonMap.at("SI64")[1].GetType(), JSON_STRING);
+ UNIT_ASSERT_EQUAL(jsonMap.at("SI64")[2].GetType(), JSON_STRING);
+ UNIT_ASSERT_EQUAL(jsonMap.at("SI64")[3].GetType(), JSON_STRING);
+ UNIT_ASSERT_EQUAL(jsonMap.at("SI64")[4].GetType(), JSON_STRING);
+ UNIT_ASSERT_EQUAL(jsonMap.at("SI64")[5].GetType(), JSON_STRING);
+
+ UNIT_ASSERT_EQUAL(jsonMap.at("SI32")[0].GetType(), JSON_INTEGER);
+ UNIT_ASSERT_EQUAL(jsonMap.at("SI32")[1].GetType(), JSON_INTEGER);
+
+ UNIT_ASSERT_EQUAL(jsonMap.at("UI32")[0].GetType(), JSON_UINTEGER);
+ UNIT_ASSERT_EQUAL(jsonMap.at("UI32")[1].GetType(), JSON_UINTEGER);
+ }
+
+} // TestStringifyNumbersRepeatedStringificationList
+
Y_UNIT_TEST(TestExtension) {
TExtensionField proto;
proto.SetExtension(bar, 1);