diff --git a/indexer/indexer_tests/search_string_utils_test.cpp b/indexer/indexer_tests/search_string_utils_test.cpp index 21a4f0c0ac..f84ff8f33b 100644 --- a/indexer/indexer_tests/search_string_utils_test.cpp +++ b/indexer/indexer_tests/search_string_utils_test.cpp @@ -39,3 +39,16 @@ UNIT_TEST(NormalizeAndSimplifyStringWithOurTambourines) for (size_t i = 0; i < ARRAY_SIZE(arr); i += 2) TEST_EQUAL(arr[i + 1], strings::ToUtf8(search::NormalizeAndSimplifyString(arr[i])), (i)); } + +UNIT_TEST(Contains) +{ + constexpr char const * kTestStr = "ØøÆ挜 Ўвага!"; + TEST(search::ContainsNormalized(kTestStr, ""), ()); + TEST(!search::ContainsNormalized("", "z"), ()); + TEST(search::ContainsNormalized(kTestStr, "ooae"), ()); + TEST(search::ContainsNormalized(kTestStr, " у"), ()); + TEST(search::ContainsNormalized(kTestStr, "Ў"), ()); + TEST(search::ContainsNormalized(kTestStr, "ўв"), ()); + TEST(!search::ContainsNormalized(kTestStr, "ага! "), ()); + TEST(!search::ContainsNormalized(kTestStr, "z"), ()); +} diff --git a/indexer/search_string_utils.cpp b/indexer/search_string_utils.cpp index f955c1fb79..1839e90dd2 100644 --- a/indexer/search_string_utils.cpp +++ b/indexer/search_string_utils.cpp @@ -112,3 +112,10 @@ bool search::IsStreetSynonym(strings::UniString const & s) make_transform_iterator(affics + ARRAY_SIZE(affics), &search::NormalizeAndSimplifyString)); return kSynonyms.count(s) != 0; } + +bool search::ContainsNormalized(string const & str, string const & substr) +{ + strings::UniString const ustr = search::NormalizeAndSimplifyString(str); + strings::UniString const usubstr = search::NormalizeAndSimplifyString(substr); + return std::search(ustr.begin(), ustr.end(), usubstr.begin(), usubstr.end()) != ustr.end(); +} diff --git a/indexer/search_string_utils.hpp b/indexer/search_string_utils.hpp index 5abf4c19c9..afa4459f7a 100644 --- a/indexer/search_string_utils.hpp +++ b/indexer/search_string_utils.hpp @@ -114,4 +114,8 @@ void GetStreetName(strings::SimpleTokenizer iter, string & streetName); void GetStreetNameAsKey(string const & name, string & res); bool IsStreetSynonym(strings::UniString const & s); + +/// Normalizes both str and substr, and then returns true if substr is found in str. +/// Used in native platform code for search in localized strings (cuisines, categories, strings etc.). +bool ContainsNormalized(string const & str, string const & substr); } // namespace search