TestStringUtils.cpp 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320
  1. /*
  2. * Copyright (c) 2020, Fei Wu <f.eiwu@yahoo.com>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #include <LibTest/TestCase.h>
  7. #include <AK/StringUtils.h>
  8. TEST_CASE(matches_null)
  9. {
  10. EXPECT(AK::StringUtils::matches(StringView(), StringView()));
  11. EXPECT(!AK::StringUtils::matches(StringView(), ""));
  12. EXPECT(!AK::StringUtils::matches(StringView(), "*"));
  13. EXPECT(!AK::StringUtils::matches(StringView(), "?"));
  14. EXPECT(!AK::StringUtils::matches(StringView(), "a"));
  15. EXPECT(!AK::StringUtils::matches("", StringView()));
  16. EXPECT(!AK::StringUtils::matches("a", StringView()));
  17. }
  18. TEST_CASE(matches_empty)
  19. {
  20. EXPECT(AK::StringUtils::matches("", ""));
  21. EXPECT(AK::StringUtils::matches("", "*"));
  22. EXPECT(!AK::StringUtils::matches("", "?"));
  23. EXPECT(!AK::StringUtils::matches("", "a"));
  24. EXPECT(!AK::StringUtils::matches("a", ""));
  25. }
  26. TEST_CASE(matches_case_sensitive)
  27. {
  28. EXPECT(AK::StringUtils::matches("a", "a", CaseSensitivity::CaseSensitive));
  29. EXPECT(!AK::StringUtils::matches("a", "A", CaseSensitivity::CaseSensitive));
  30. EXPECT(!AK::StringUtils::matches("A", "a", CaseSensitivity::CaseSensitive));
  31. }
  32. TEST_CASE(matches_case_insensitive)
  33. {
  34. EXPECT(!AK::StringUtils::matches("aa", "a"));
  35. EXPECT(AK::StringUtils::matches("aa", "*"));
  36. EXPECT(!AK::StringUtils::matches("cb", "?a"));
  37. EXPECT(AK::StringUtils::matches("adceb", "a*b"));
  38. EXPECT(!AK::StringUtils::matches("acdcb", "a*c?b"));
  39. }
  40. TEST_CASE(matches_with_positions)
  41. {
  42. Vector<AK::MaskSpan> spans;
  43. EXPECT(AK::StringUtils::matches("abbb", "a*", CaseSensitivity::CaseSensitive, &spans));
  44. EXPECT(spans == Vector<AK::MaskSpan>({ { 1, 3 } }));
  45. spans.clear();
  46. EXPECT(AK::StringUtils::matches("abbb", "?*", CaseSensitivity::CaseSensitive, &spans));
  47. EXPECT_EQ(spans, Vector<AK::MaskSpan>({ { 0, 1 }, { 1, 3 } }));
  48. spans.clear();
  49. EXPECT(AK::StringUtils::matches("acdcxb", "a*c?b", CaseSensitivity::CaseSensitive, &spans));
  50. EXPECT_EQ(spans, Vector<AK::MaskSpan>({ { 1, 2 }, { 4, 1 } }));
  51. spans.clear();
  52. EXPECT(AK::StringUtils::matches("aaaa", "A*", CaseSensitivity::CaseInsensitive, &spans));
  53. EXPECT_EQ(spans, Vector<AK::MaskSpan>({ { 1, 3 } }));
  54. }
  55. // #4607
  56. TEST_CASE(matches_trailing)
  57. {
  58. EXPECT(AK::StringUtils::matches("ab", "ab*"));
  59. EXPECT(AK::StringUtils::matches("ab", "ab****"));
  60. EXPECT(AK::StringUtils::matches("ab", "*ab****"));
  61. }
  62. TEST_CASE(convert_to_int)
  63. {
  64. auto value = AK::StringUtils::convert_to_int(StringView());
  65. EXPECT(!value.has_value());
  66. value = AK::StringUtils::convert_to_int("");
  67. EXPECT(!value.has_value());
  68. value = AK::StringUtils::convert_to_int("a");
  69. EXPECT(!value.has_value());
  70. value = AK::StringUtils::convert_to_int("+");
  71. EXPECT(!value.has_value());
  72. value = AK::StringUtils::convert_to_int("-");
  73. EXPECT(!value.has_value());
  74. auto actual = AK::StringUtils::convert_to_int("0");
  75. EXPECT_EQ(actual.has_value(), true);
  76. EXPECT_EQ(actual.value(), 0);
  77. actual = AK::StringUtils::convert_to_int("1");
  78. EXPECT_EQ(actual.has_value(), true);
  79. EXPECT_EQ(actual.value(), 1);
  80. actual = AK::StringUtils::convert_to_int("+1");
  81. EXPECT_EQ(actual.has_value(), true);
  82. EXPECT_EQ(actual.value(), 1);
  83. actual = AK::StringUtils::convert_to_int("-1");
  84. EXPECT_EQ(actual.has_value(), true);
  85. EXPECT_EQ(actual.value(), -1);
  86. actual = AK::StringUtils::convert_to_int("01");
  87. EXPECT_EQ(actual.has_value(), true);
  88. EXPECT_EQ(actual.value(), 1);
  89. actual = AK::StringUtils::convert_to_int("12345");
  90. EXPECT_EQ(actual.has_value(), true);
  91. EXPECT_EQ(actual.value(), 12345);
  92. actual = AK::StringUtils::convert_to_int("-12345");
  93. EXPECT_EQ(actual.has_value(), true);
  94. EXPECT_EQ(actual.value(), -12345);
  95. actual = AK::StringUtils::convert_to_int(" \t-12345 \n\n");
  96. EXPECT_EQ(actual.has_value(), true);
  97. EXPECT_EQ(actual.value(), -12345);
  98. auto actual_i8 = AK::StringUtils::convert_to_int<i8>("-1");
  99. EXPECT(actual_i8.has_value());
  100. EXPECT_EQ(actual_i8.value(), -1);
  101. EXPECT_EQ(sizeof(actual_i8.value()), (size_t)1);
  102. actual_i8 = AK::StringUtils::convert_to_int<i8>("128");
  103. EXPECT(!actual_i8.has_value());
  104. auto actual_i16 = AK::StringUtils::convert_to_int<i16>("-1");
  105. EXPECT(actual_i16.has_value());
  106. EXPECT_EQ(actual_i16.value(), -1);
  107. EXPECT_EQ(sizeof(actual_i16.value()), (size_t)2);
  108. actual_i16 = AK::StringUtils::convert_to_int<i16>("32768");
  109. EXPECT(!actual_i16.has_value());
  110. auto actual_i32 = AK::StringUtils::convert_to_int<i32>("-1");
  111. EXPECT(actual_i32.has_value());
  112. EXPECT_EQ(actual_i32.value(), -1);
  113. EXPECT_EQ(sizeof(actual_i32.value()), (size_t)4);
  114. actual_i32 = AK::StringUtils::convert_to_int<i32>("2147483648");
  115. EXPECT(!actual_i32.has_value());
  116. auto actual_i64 = AK::StringUtils::convert_to_int<i64>("-1");
  117. EXPECT(actual_i64.has_value());
  118. EXPECT_EQ(actual_i64.value(), -1);
  119. EXPECT_EQ(sizeof(actual_i64.value()), (size_t)8);
  120. actual_i64 = AK::StringUtils::convert_to_int<i64>("9223372036854775808");
  121. EXPECT(!actual_i64.has_value());
  122. }
  123. TEST_CASE(convert_to_uint)
  124. {
  125. auto value = AK::StringUtils::convert_to_uint(StringView());
  126. EXPECT(!value.has_value());
  127. value = AK::StringUtils::convert_to_uint("");
  128. EXPECT(!value.has_value());
  129. value = AK::StringUtils::convert_to_uint("a");
  130. EXPECT(!value.has_value());
  131. value = AK::StringUtils::convert_to_uint("+");
  132. EXPECT(!value.has_value());
  133. value = AK::StringUtils::convert_to_uint("-");
  134. EXPECT(!value.has_value());
  135. value = AK::StringUtils::convert_to_uint("+1");
  136. EXPECT(!value.has_value());
  137. value = AK::StringUtils::convert_to_uint("-1");
  138. EXPECT(!value.has_value());
  139. auto actual = AK::StringUtils::convert_to_uint("0");
  140. EXPECT_EQ(actual.has_value(), true);
  141. EXPECT_EQ(actual.value(), 0u);
  142. actual = AK::StringUtils::convert_to_uint("1");
  143. EXPECT_EQ(actual.has_value(), true);
  144. EXPECT_EQ(actual.value(), 1u);
  145. actual = AK::StringUtils::convert_to_uint("01");
  146. EXPECT_EQ(actual.has_value(), true);
  147. EXPECT_EQ(actual.value(), 1u);
  148. actual = AK::StringUtils::convert_to_uint("12345");
  149. EXPECT_EQ(actual.has_value(), true);
  150. EXPECT_EQ(actual.value(), 12345u);
  151. actual = AK::StringUtils::convert_to_uint(" \t12345 \n\n");
  152. EXPECT_EQ(actual.has_value(), true);
  153. EXPECT_EQ(actual.value(), 12345u);
  154. auto actual_u8 = AK::StringUtils::convert_to_uint<u8>("255");
  155. EXPECT(actual_u8.has_value());
  156. EXPECT_EQ(actual_u8.value(), 255u);
  157. EXPECT_EQ(sizeof(actual_u8.value()), (size_t)1);
  158. actual_u8 = AK::StringUtils::convert_to_uint<u8>("256");
  159. EXPECT(!actual_u8.has_value());
  160. auto actual_u16 = AK::StringUtils::convert_to_uint<u16>("65535");
  161. EXPECT(actual_u16.has_value());
  162. EXPECT_EQ(actual_u16.value(), 65535u);
  163. EXPECT_EQ(sizeof(actual_u16.value()), (size_t)2);
  164. actual_u16 = AK::StringUtils::convert_to_uint<u16>("65536");
  165. EXPECT(!actual_u16.has_value());
  166. auto actual_u32 = AK::StringUtils::convert_to_uint<u32>("4294967295");
  167. EXPECT(actual_u32.has_value());
  168. EXPECT_EQ(actual_u32.value(), 4294967295ul);
  169. EXPECT_EQ(sizeof(actual_u32.value()), (size_t)4);
  170. actual_u32 = AK::StringUtils::convert_to_uint<u32>("4294967296");
  171. EXPECT(!actual_u32.has_value());
  172. auto actual_u64 = AK::StringUtils::convert_to_uint<u64>("18446744073709551615");
  173. EXPECT(actual_u64.has_value());
  174. EXPECT_EQ(actual_u64.value(), 18446744073709551615ull);
  175. EXPECT_EQ(sizeof(actual_u64.value()), (size_t)8);
  176. actual_u64 = AK::StringUtils::convert_to_uint<u64>("18446744073709551616");
  177. EXPECT(!actual_u64.has_value());
  178. }
  179. TEST_CASE(ends_with)
  180. {
  181. String test_string = "ABCDEF";
  182. EXPECT(AK::StringUtils::ends_with(test_string, "DEF", CaseSensitivity::CaseSensitive));
  183. EXPECT(AK::StringUtils::ends_with(test_string, "ABCDEF", CaseSensitivity::CaseSensitive));
  184. EXPECT(!AK::StringUtils::ends_with(test_string, "ABCDE", CaseSensitivity::CaseSensitive));
  185. EXPECT(!AK::StringUtils::ends_with(test_string, "ABCDEFG", CaseSensitivity::CaseSensitive));
  186. EXPECT(AK::StringUtils::ends_with(test_string, "def", CaseSensitivity::CaseInsensitive));
  187. EXPECT(!AK::StringUtils::ends_with(test_string, "def", CaseSensitivity::CaseSensitive));
  188. }
  189. TEST_CASE(starts_with)
  190. {
  191. String test_string = "ABCDEF";
  192. EXPECT(AK::StringUtils::starts_with(test_string, "ABC", CaseSensitivity::CaseSensitive));
  193. EXPECT(AK::StringUtils::starts_with(test_string, "ABCDEF", CaseSensitivity::CaseSensitive));
  194. EXPECT(!AK::StringUtils::starts_with(test_string, "BCDEF", CaseSensitivity::CaseSensitive));
  195. EXPECT(!AK::StringUtils::starts_with(test_string, "ABCDEFG", CaseSensitivity::CaseSensitive));
  196. EXPECT(AK::StringUtils::starts_with(test_string, "abc", CaseSensitivity::CaseInsensitive));
  197. EXPECT(!AK::StringUtils::starts_with(test_string, "abc", CaseSensitivity::CaseSensitive));
  198. }
  199. TEST_CASE(contains)
  200. {
  201. String test_string = "ABCDEFABCXYZ";
  202. EXPECT(AK::StringUtils::contains(test_string, "ABC", CaseSensitivity::CaseSensitive));
  203. EXPECT(AK::StringUtils::contains(test_string, "ABC", CaseSensitivity::CaseInsensitive));
  204. EXPECT(AK::StringUtils::contains(test_string, "AbC", CaseSensitivity::CaseInsensitive));
  205. EXPECT(AK::StringUtils::contains(test_string, "BCX", CaseSensitivity::CaseSensitive));
  206. EXPECT(AK::StringUtils::contains(test_string, "BCX", CaseSensitivity::CaseInsensitive));
  207. EXPECT(AK::StringUtils::contains(test_string, "BcX", CaseSensitivity::CaseInsensitive));
  208. EXPECT(!AK::StringUtils::contains(test_string, "xyz", CaseSensitivity::CaseSensitive));
  209. EXPECT(AK::StringUtils::contains(test_string, "xyz", CaseSensitivity::CaseInsensitive));
  210. EXPECT(!AK::StringUtils::contains(test_string, "EFG", CaseSensitivity::CaseSensitive));
  211. EXPECT(!AK::StringUtils::contains(test_string, "EfG", CaseSensitivity::CaseInsensitive));
  212. EXPECT(AK::StringUtils::contains(test_string, "", CaseSensitivity::CaseSensitive));
  213. EXPECT(AK::StringUtils::contains(test_string, "", CaseSensitivity::CaseInsensitive));
  214. EXPECT(!AK::StringUtils::contains("", test_string, CaseSensitivity::CaseSensitive));
  215. EXPECT(!AK::StringUtils::contains("", test_string, CaseSensitivity::CaseInsensitive));
  216. EXPECT(!AK::StringUtils::contains(test_string, "L", CaseSensitivity::CaseSensitive));
  217. EXPECT(!AK::StringUtils::contains(test_string, "L", CaseSensitivity::CaseInsensitive));
  218. }
  219. TEST_CASE(is_whitespace)
  220. {
  221. EXPECT(AK::StringUtils::is_whitespace(""));
  222. EXPECT(AK::StringUtils::is_whitespace(" "));
  223. EXPECT(AK::StringUtils::is_whitespace(" \t"));
  224. EXPECT(AK::StringUtils::is_whitespace(" \t\n"));
  225. EXPECT(AK::StringUtils::is_whitespace(" \t\n\r\v"));
  226. EXPECT(!AK::StringUtils::is_whitespace(" a "));
  227. EXPECT(!AK::StringUtils::is_whitespace("a\t"));
  228. }
  229. TEST_CASE(find)
  230. {
  231. String test_string = "1234567";
  232. EXPECT_EQ(AK::StringUtils::find(test_string, "1").value_or(1), 0u);
  233. EXPECT_EQ(AK::StringUtils::find(test_string, "2").value_or(2), 1u);
  234. EXPECT_EQ(AK::StringUtils::find(test_string, "3").value_or(3), 2u);
  235. EXPECT_EQ(AK::StringUtils::find(test_string, "4").value_or(4), 3u);
  236. EXPECT_EQ(AK::StringUtils::find(test_string, "5").value_or(5), 4u);
  237. EXPECT_EQ(AK::StringUtils::find(test_string, "34").value_or(3), 2u);
  238. EXPECT_EQ(AK::StringUtils::find(test_string, "78").has_value(), false);
  239. }
  240. TEST_CASE(to_snakecase)
  241. {
  242. EXPECT_EQ(AK::StringUtils::to_snakecase("foobar"), "foobar");
  243. EXPECT_EQ(AK::StringUtils::to_snakecase("Foobar"), "foobar");
  244. EXPECT_EQ(AK::StringUtils::to_snakecase("FOOBAR"), "foobar");
  245. EXPECT_EQ(AK::StringUtils::to_snakecase("fooBar"), "foo_bar");
  246. EXPECT_EQ(AK::StringUtils::to_snakecase("FooBar"), "foo_bar");
  247. EXPECT_EQ(AK::StringUtils::to_snakecase("fooBAR"), "foo_bar");
  248. EXPECT_EQ(AK::StringUtils::to_snakecase("FOOBar"), "foo_bar");
  249. EXPECT_EQ(AK::StringUtils::to_snakecase("foo_bar"), "foo_bar");
  250. EXPECT_EQ(AK::StringUtils::to_snakecase("FBar"), "f_bar");
  251. EXPECT_EQ(AK::StringUtils::to_snakecase("FooB"), "foo_b");
  252. }
  253. TEST_CASE(to_titlecase)
  254. {
  255. EXPECT_EQ(AK::StringUtils::to_titlecase(""sv), ""sv);
  256. EXPECT_EQ(AK::StringUtils::to_titlecase("f"sv), "F"sv);
  257. EXPECT_EQ(AK::StringUtils::to_titlecase("foobar"sv), "Foobar"sv);
  258. EXPECT_EQ(AK::StringUtils::to_titlecase("Foobar"sv), "Foobar"sv);
  259. EXPECT_EQ(AK::StringUtils::to_titlecase("FOOBAR"sv), "Foobar"sv);
  260. EXPECT_EQ(AK::StringUtils::to_titlecase("foo bar"sv), "Foo Bar"sv);
  261. EXPECT_EQ(AK::StringUtils::to_titlecase("foo bAR"sv), "Foo Bar"sv);
  262. EXPECT_EQ(AK::StringUtils::to_titlecase("foo bar"sv), "Foo Bar"sv);
  263. EXPECT_EQ(AK::StringUtils::to_titlecase("foo bar"sv), "Foo Bar"sv);
  264. EXPECT_EQ(AK::StringUtils::to_titlecase(" foo bar "sv), " Foo Bar "sv);
  265. }