diff options
author | sashashkov <sashashkov@yandex-team.com> | 2024-06-11 13:03:18 +0300 |
---|---|---|
committer | sashashkov <sashashkov@yandex-team.com> | 2024-06-12 10:26:35 +0300 |
commit | 67e7cccc330744cdb98035e309f626c1f63afb84 (patch) | |
tree | f29f638710ae5223dbb7a56e427aea6c551bdff6 /library/cpp/protobuf/json/ut/proto2json_ut.cpp | |
parent | a26a1f012a93e209458200c2ba8ae484a45a6c54 (diff) | |
download | ydb-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.cpp | 193 |
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); |