diff --git a/search/search_quality/assessment_tool/assessment_tool.cpp b/search/search_quality/assessment_tool/assessment_tool.cpp index 2df013d370..5ce4631871 100644 --- a/search/search_quality/assessment_tool/assessment_tool.cpp +++ b/search/search_quality/assessment_tool/assessment_tool.cpp @@ -17,6 +17,7 @@ DEFINE_string(data_path, "", "Path to data directory"); int main(int argc, char ** argv) { search::ChangeMaxNumberOfOpenFiles(search::kMaxOpenFiles); + search::CheckLocale(); google::SetUsageMessage("Features collector tool."); google::ParseCommandLineFlags(&argc, &argv, true); diff --git a/search/search_quality/features_collector_tool/features_collector_tool.cpp b/search/search_quality/features_collector_tool/features_collector_tool.cpp index 5d306931f4..43d3053f68 100644 --- a/search/search_quality/features_collector_tool/features_collector_tool.cpp +++ b/search/search_quality/features_collector_tool/features_collector_tool.cpp @@ -106,6 +106,7 @@ void DisplayStats(ostream & os, vector const & samples, vector co int main(int argc, char * argv[]) { ChangeMaxNumberOfOpenFiles(kMaxOpenFiles); + CheckLocale(); google::SetUsageMessage("Features collector tool."); google::ParseCommandLineFlags(&argc, &argv, true); diff --git a/search/search_quality/helpers.cpp b/search/search_quality/helpers.cpp index 433bf4fb1c..dc9c76e392 100644 --- a/search/search_quality/helpers.cpp +++ b/search/search_quality/helpers.cpp @@ -1,7 +1,12 @@ #include "search/search_quality/helpers.hpp" +#include "base/assert.hpp" +#include "base/string_utils.hpp" + #include "std/target_os.hpp" +#include + #include using namespace std; @@ -26,6 +31,38 @@ void ChangeMaxNumberOfOpenFiles(size_t n) setrlimit(RLIMIT_NOFILE, &rlp); #endif } + +void CheckLocale() +{ + string const kJson = "{\"coord\":123.456}"; + string const kErrorMsg = "Bad locale. Consider setting LC_ALL=C"; + + double coord; + { + base::Json root(kJson.c_str()); + FromJSONObject(root.get(), "coord", coord); + } + + string line; + { + auto root = base::NewJSONObject(); + ToJSONObject(*root, "coord", coord); + + unique_ptr buffer( + json_dumps(root.get(), JSON_COMPACT | JSON_ENSURE_ASCII)); + + line.append(buffer.get()); + } + + CHECK_EQUAL(line, kJson, (kErrorMsg)); + + { + string const kTest = "123.456"; + double value; + VERIFY(strings::to_double(kTest, value), (kTest)); + CHECK_EQUAL(strings::to_string(value), kTest, (kErrorMsg)); + } +} } // namespace search namespace m2 @@ -93,7 +130,7 @@ void ToJSONObject(json_t & root, char const * field, PointD const & point) json_object_set_new(&root, field, json.release()); } -bool FromJSONObjectOptional(json_t * root, std::string const & field, PointD & point) +bool FromJSONObjectOptional(json_t * root, string const & field, PointD & point) { return FromJSONObjectOptional(root, field.c_str(), point); } diff --git a/search/search_quality/helpers.hpp b/search/search_quality/helpers.hpp index 6ea9eb9e76..9fb2707f98 100644 --- a/search/search_quality/helpers.hpp +++ b/search/search_quality/helpers.hpp @@ -13,6 +13,8 @@ namespace search size_t constexpr kMaxOpenFiles = 4000; void ChangeMaxNumberOfOpenFiles(size_t n); + +void CheckLocale(); } // namespace search namespace m2 diff --git a/search/search_quality/search_quality_tool/search_quality_tool.cpp b/search/search_quality/search_quality_tool/search_quality_tool.cpp index 823046329b..0fde17fc1f 100644 --- a/search/search_quality/search_quality_tool/search_quality_tool.cpp +++ b/search/search_quality/search_quality_tool/search_quality_tool.cpp @@ -351,6 +351,7 @@ void CheckCompleteness(string const & path, m2::RectD const & viewport, DataSour int main(int argc, char * argv[]) { ChangeMaxNumberOfOpenFiles(kMaxOpenFiles); + CheckLocale(); ios_base::sync_with_stdio(false); Platform & platform = GetPlatform();