search_metadata_unittest.cc 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  1. // Copyright (c) 2013 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "components/drive/chromeos/search_metadata.h"
  5. #include <stddef.h>
  6. #include <stdint.h>
  7. #include <memory>
  8. #include <vector>
  9. #include "base/i18n/string_search.h"
  10. #include "base/strings/utf_string_conversions.h"
  11. #include "testing/gtest/include/gtest/gtest.h"
  12. namespace drive {
  13. namespace internal {
  14. namespace {
  15. // A simple wrapper for testing FindAndHighlightWrapper(). It just converts the
  16. // query text parameter to FixedPatternStringSearchIgnoringCaseAndAccents.
  17. bool FindAndHighlightWrapper(
  18. const std::string& text,
  19. const std::string& query_text,
  20. std::string* highlighted_text) {
  21. std::vector<std::unique_ptr<
  22. base::i18n::FixedPatternStringSearchIgnoringCaseAndAccents>>
  23. queries;
  24. queries.push_back(std::make_unique<
  25. base::i18n::FixedPatternStringSearchIgnoringCaseAndAccents>(
  26. base::UTF8ToUTF16(query_text)));
  27. return FindAndHighlight(text, queries, highlighted_text);
  28. }
  29. } // namespace
  30. TEST(SearchMetadataSimpleTest, FindAndHighlight_ZeroMatches) {
  31. std::string highlighted_text;
  32. EXPECT_FALSE(FindAndHighlightWrapper("text", "query", &highlighted_text));
  33. }
  34. TEST(SearchMetadataSimpleTest, FindAndHighlight_EmptyText) {
  35. std::string highlighted_text;
  36. EXPECT_FALSE(FindAndHighlightWrapper("", "query", &highlighted_text));
  37. }
  38. TEST(SearchMetadataSimpleTest, FindAndHighlight_EmptyQuery) {
  39. std::vector<std::unique_ptr<
  40. base::i18n::FixedPatternStringSearchIgnoringCaseAndAccents>>
  41. queries;
  42. std::string highlighted_text;
  43. EXPECT_TRUE(FindAndHighlight("hello", queries, &highlighted_text));
  44. EXPECT_EQ("hello", highlighted_text);
  45. }
  46. TEST(SearchMetadataSimpleTest, FindAndHighlight_FullMatch) {
  47. std::string highlighted_text;
  48. EXPECT_TRUE(FindAndHighlightWrapper("hello", "hello", &highlighted_text));
  49. EXPECT_EQ("<b>hello</b>", highlighted_text);
  50. }
  51. TEST(SearchMetadataSimpleTest, FindAndHighlight_StartWith) {
  52. std::string highlighted_text;
  53. EXPECT_TRUE(FindAndHighlightWrapper("hello, world", "hello",
  54. &highlighted_text));
  55. EXPECT_EQ("<b>hello</b>, world", highlighted_text);
  56. }
  57. TEST(SearchMetadataSimpleTest, FindAndHighlight_EndWith) {
  58. std::string highlighted_text;
  59. EXPECT_TRUE(FindAndHighlightWrapper("hello, world", "world",
  60. &highlighted_text));
  61. EXPECT_EQ("hello, <b>world</b>", highlighted_text);
  62. }
  63. TEST(SearchMetadataSimpleTest, FindAndHighlight_InTheMiddle) {
  64. std::string highlighted_text;
  65. EXPECT_TRUE(FindAndHighlightWrapper("yo hello, world", "hello",
  66. &highlighted_text));
  67. EXPECT_EQ("yo <b>hello</b>, world", highlighted_text);
  68. }
  69. TEST(SearchMetadataSimpleTest, FindAndHighlight_MultipeMatches) {
  70. std::string highlighted_text;
  71. EXPECT_TRUE(FindAndHighlightWrapper("yoyoyoyoy", "yoy", &highlighted_text));
  72. // Only the first match is highlighted.
  73. EXPECT_EQ("<b>yoy</b>oyoyoy", highlighted_text);
  74. }
  75. TEST(SearchMetadataSimpleTest, FindAndHighlight_IgnoreCase) {
  76. std::string highlighted_text;
  77. EXPECT_TRUE(FindAndHighlightWrapper("HeLLo", "hello", &highlighted_text));
  78. EXPECT_EQ("<b>HeLLo</b>", highlighted_text);
  79. }
  80. TEST(SearchMetadataSimpleTest, FindAndHighlight_IgnoreCaseNonASCII) {
  81. std::string highlighted_text;
  82. // Case and accent ignorance in Greek. Find "socra" in "Socra'tes".
  83. EXPECT_TRUE(FindAndHighlightWrapper(
  84. "\xCE\xA3\xCF\x89\xCE\xBA\xCF\x81\xCE\xAC\xCF\x84\xCE\xB7\xCF\x82",
  85. "\xCF\x83\xCF\x89\xCE\xBA\xCF\x81\xCE\xB1", &highlighted_text));
  86. EXPECT_EQ(
  87. "<b>\xCE\xA3\xCF\x89\xCE\xBA\xCF\x81\xCE\xAC</b>\xCF\x84\xCE\xB7\xCF\x82",
  88. highlighted_text);
  89. // In Japanese characters.
  90. // Find Hiragana "pi" + "(small)ya" in Katakana "hi" + semi-voiced-mark + "ya"
  91. EXPECT_TRUE(FindAndHighlightWrapper(
  92. "\xE3\x81\xB2\xE3\x82\x9A\xE3\x82\x83\xE3\x83\xBC",
  93. "\xE3\x83\x94\xE3\x83\xA4",
  94. &highlighted_text));
  95. EXPECT_EQ(
  96. "<b>\xE3\x81\xB2\xE3\x82\x9A\xE3\x82\x83</b>\xE3\x83\xBC",
  97. highlighted_text);
  98. }
  99. TEST(SearchMetadataSimpleTest, MultiTextBySingleQuery) {
  100. std::vector<std::unique_ptr<
  101. base::i18n::FixedPatternStringSearchIgnoringCaseAndAccents>>
  102. queries;
  103. queries.push_back(std::make_unique<
  104. base::i18n::FixedPatternStringSearchIgnoringCaseAndAccents>(
  105. u"hello"));
  106. std::string highlighted_text;
  107. EXPECT_TRUE(FindAndHighlight("hello", queries, &highlighted_text));
  108. EXPECT_EQ("<b>hello</b>", highlighted_text);
  109. EXPECT_FALSE(FindAndHighlight("goodbye", queries, &highlighted_text));
  110. EXPECT_TRUE(FindAndHighlight("1hello2", queries, &highlighted_text));
  111. EXPECT_EQ("1<b>hello</b>2", highlighted_text);
  112. }
  113. TEST(SearchMetadataSimpleTest, FindAndHighlight_MetaChars) {
  114. std::string highlighted_text;
  115. EXPECT_TRUE(FindAndHighlightWrapper("<hello>", "hello", &highlighted_text));
  116. EXPECT_EQ("&lt;<b>hello</b>&gt;", highlighted_text);
  117. }
  118. TEST(SearchMetadataSimpleTest, FindAndHighlight_MoreMetaChars) {
  119. std::string highlighted_text;
  120. EXPECT_TRUE(FindAndHighlightWrapper("a&b&c&d", "b&c", &highlighted_text));
  121. EXPECT_EQ("a&amp;<b>b&amp;c</b>&amp;d", highlighted_text);
  122. }
  123. TEST(SearchMetadataSimpleTest, FindAndHighlight_SurrogatePair) {
  124. std::string highlighted_text;
  125. // \xF0\x9F\x98\x81 (U+1F601) is a surrogate pair for smile icon of emoji.
  126. EXPECT_TRUE(FindAndHighlightWrapper("hi\xF0\x9F\x98\x81hello",
  127. "i\xF0\x9F\x98\x81", &highlighted_text));
  128. EXPECT_EQ("h<b>i\xF0\x9F\x98\x81</b>hello", highlighted_text);
  129. }
  130. TEST(SearchMetadataSimpleTest, FindAndHighlight_MultipleQueries) {
  131. std::vector<std::unique_ptr<
  132. base::i18n::FixedPatternStringSearchIgnoringCaseAndAccents>>
  133. queries;
  134. queries.push_back(std::make_unique<
  135. base::i18n::FixedPatternStringSearchIgnoringCaseAndAccents>(
  136. u"hello"));
  137. queries.push_back(
  138. std::make_unique<
  139. base::i18n::FixedPatternStringSearchIgnoringCaseAndAccents>(u"good"));
  140. std::string highlighted_text;
  141. EXPECT_TRUE(
  142. FindAndHighlight("good morning, hello", queries, &highlighted_text));
  143. EXPECT_EQ("<b>good</b> morning, <b>hello</b>", highlighted_text);
  144. }
  145. TEST(SearchMetadataSimpleTest, FindAndHighlight_OverlappingHighlights) {
  146. std::vector<std::unique_ptr<
  147. base::i18n::FixedPatternStringSearchIgnoringCaseAndAccents>>
  148. queries;
  149. queries.push_back(std::make_unique<
  150. base::i18n::FixedPatternStringSearchIgnoringCaseAndAccents>(
  151. u"morning"));
  152. queries.push_back(
  153. std::make_unique<
  154. base::i18n::FixedPatternStringSearchIgnoringCaseAndAccents>(u"ing,"));
  155. std::string highlighted_text;
  156. EXPECT_TRUE(
  157. FindAndHighlight("good morning, hello", queries, &highlighted_text));
  158. EXPECT_EQ("good <b>morning,</b> hello", highlighted_text);
  159. }
  160. } // namespace internal
  161. } // namespace drive