TestDeprecatedString.cpp 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314
  1. /*
  2. * Copyright (c) 2018-2020, Andreas Kling <kling@serenityos.org>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #include <LibTest/TestCase.h>
  7. #include <AK/DeprecatedFlyString.h>
  8. #include <AK/DeprecatedString.h>
  9. #include <AK/StringBuilder.h>
  10. #include <AK/Vector.h>
  11. #include <cstring>
  12. TEST_CASE(construct_empty)
  13. {
  14. EXPECT(DeprecatedString().is_empty());
  15. EXPECT(DeprecatedString().characters() != nullptr);
  16. EXPECT(DeprecatedString("").is_empty());
  17. EXPECT(DeprecatedString("").characters() != nullptr);
  18. EXPECT(DeprecatedString("").impl() == DeprecatedString::empty().impl());
  19. }
  20. TEST_CASE(construct_contents)
  21. {
  22. DeprecatedString test_string = "ABCDEF";
  23. EXPECT(!test_string.is_empty());
  24. EXPECT_EQ(test_string.length(), 6u);
  25. EXPECT_EQ(test_string.length(), strlen(test_string.characters()));
  26. EXPECT(test_string.characters() != nullptr);
  27. EXPECT(!strcmp(test_string.characters(), "ABCDEF"));
  28. EXPECT(test_string == "ABCDEF");
  29. EXPECT(test_string != "ABCDE");
  30. EXPECT(test_string != "ABCDEFG");
  31. }
  32. TEST_CASE(equal)
  33. {
  34. EXPECT_EQ(DeprecatedString::empty(), DeprecatedString {});
  35. }
  36. TEST_CASE(compare)
  37. {
  38. EXPECT("a"sv < DeprecatedString("b"));
  39. EXPECT(!("a"sv > DeprecatedString("b")));
  40. EXPECT("b"sv > DeprecatedString("a"));
  41. EXPECT(!("b"sv < DeprecatedString("b")));
  42. EXPECT("a"sv >= DeprecatedString("a"));
  43. EXPECT(!("a"sv >= DeprecatedString("b")));
  44. EXPECT("a"sv <= DeprecatedString("a"));
  45. EXPECT(!("b"sv <= DeprecatedString("a")));
  46. EXPECT(DeprecatedString("a") > DeprecatedString());
  47. EXPECT(!(DeprecatedString() > DeprecatedString("a")));
  48. EXPECT(DeprecatedString() < DeprecatedString("a"));
  49. EXPECT(!(DeprecatedString("a") < DeprecatedString()));
  50. EXPECT(DeprecatedString("a") >= DeprecatedString());
  51. EXPECT(!(DeprecatedString() >= DeprecatedString("a")));
  52. EXPECT(DeprecatedString() <= DeprecatedString("a"));
  53. EXPECT(!(DeprecatedString("a") <= DeprecatedString()));
  54. EXPECT(!(DeprecatedString() > DeprecatedString()));
  55. EXPECT(!(DeprecatedString() < DeprecatedString()));
  56. EXPECT(DeprecatedString() >= DeprecatedString());
  57. EXPECT(DeprecatedString() <= DeprecatedString());
  58. }
  59. TEST_CASE(index_access)
  60. {
  61. DeprecatedString test_string = "ABCDEF";
  62. EXPECT_EQ(test_string[0], 'A');
  63. EXPECT_EQ(test_string[1], 'B');
  64. }
  65. TEST_CASE(starts_with)
  66. {
  67. DeprecatedString test_string = "ABCDEF";
  68. EXPECT(test_string.starts_with("AB"sv));
  69. EXPECT(test_string.starts_with('A'));
  70. EXPECT(!test_string.starts_with('B'));
  71. EXPECT(test_string.starts_with("ABCDEF"sv));
  72. EXPECT(!test_string.starts_with("DEF"sv));
  73. EXPECT(test_string.starts_with("abc"sv, CaseSensitivity::CaseInsensitive));
  74. EXPECT(!test_string.starts_with("abc"sv, CaseSensitivity::CaseSensitive));
  75. }
  76. TEST_CASE(ends_with)
  77. {
  78. DeprecatedString test_string = "ABCDEF";
  79. EXPECT(test_string.ends_with("EF"sv));
  80. EXPECT(test_string.ends_with('F'));
  81. EXPECT(!test_string.ends_with('E'));
  82. EXPECT(test_string.ends_with("ABCDEF"sv));
  83. EXPECT(!test_string.ends_with("ABC"sv));
  84. EXPECT(test_string.ends_with("def"sv, CaseSensitivity::CaseInsensitive));
  85. EXPECT(!test_string.ends_with("def"sv, CaseSensitivity::CaseSensitive));
  86. }
  87. TEST_CASE(copy_string)
  88. {
  89. DeprecatedString test_string = "ABCDEF";
  90. auto test_string_copy = test_string;
  91. EXPECT_EQ(test_string, test_string_copy);
  92. EXPECT_EQ(test_string.characters(), test_string_copy.characters());
  93. }
  94. TEST_CASE(move_string)
  95. {
  96. DeprecatedString test_string = "ABCDEF";
  97. auto test_string_copy = test_string;
  98. auto test_string_move = move(test_string_copy);
  99. EXPECT_EQ(test_string, test_string_move);
  100. EXPECT(test_string_copy.is_empty());
  101. }
  102. TEST_CASE(repeated)
  103. {
  104. EXPECT_EQ(DeprecatedString::repeated('x', 0), "");
  105. EXPECT_EQ(DeprecatedString::repeated('x', 1), "x");
  106. EXPECT_EQ(DeprecatedString::repeated('x', 2), "xx");
  107. }
  108. TEST_CASE(to_int)
  109. {
  110. EXPECT_EQ(DeprecatedString("123").to_int().value(), 123);
  111. EXPECT_EQ(DeprecatedString("-123").to_int().value(), -123);
  112. }
  113. TEST_CASE(to_lowercase)
  114. {
  115. EXPECT(DeprecatedString("ABC").to_lowercase() == "abc");
  116. }
  117. TEST_CASE(to_uppercase)
  118. {
  119. EXPECT(DeprecatedString("AbC").to_uppercase() == "ABC");
  120. }
  121. TEST_CASE(flystring)
  122. {
  123. {
  124. DeprecatedFlyString a("foo");
  125. DeprecatedFlyString b("foo");
  126. EXPECT_EQ(a.impl(), b.impl());
  127. }
  128. {
  129. DeprecatedString a = "foo";
  130. DeprecatedFlyString b = a;
  131. StringBuilder builder;
  132. builder.append('f');
  133. builder.append("oo"sv);
  134. DeprecatedFlyString c = builder.to_deprecated_string();
  135. EXPECT_EQ(a.impl(), b.impl());
  136. EXPECT_EQ(a.impl(), c.impl());
  137. }
  138. }
  139. TEST_CASE(replace)
  140. {
  141. DeprecatedString test_string = "Well, hello Friends!";
  142. test_string = test_string.replace("Friends"sv, "Testers"sv, ReplaceMode::FirstOnly);
  143. EXPECT(test_string == "Well, hello Testers!");
  144. test_string = test_string.replace("ell"sv, "e're"sv, ReplaceMode::All);
  145. EXPECT(test_string == "We're, he'reo Testers!");
  146. test_string = test_string.replace("!"sv, " :^)"sv, ReplaceMode::FirstOnly);
  147. EXPECT(test_string == "We're, he'reo Testers :^)");
  148. test_string = DeprecatedString("111._.111._.111");
  149. test_string = test_string.replace("111"sv, "|||"sv, ReplaceMode::All);
  150. EXPECT(test_string == "|||._.|||._.|||");
  151. test_string = test_string.replace("|||"sv, "111"sv, ReplaceMode::FirstOnly);
  152. EXPECT(test_string == "111._.|||._.|||");
  153. }
  154. TEST_CASE(count)
  155. {
  156. DeprecatedString test_string = "Well, hello Friends!";
  157. u32 count = test_string.count("Friends"sv);
  158. EXPECT(count == 1);
  159. count = test_string.count("ell"sv);
  160. EXPECT(count == 2);
  161. count = test_string.count("!"sv);
  162. EXPECT(count == 1);
  163. test_string = DeprecatedString("111._.111._.111");
  164. count = test_string.count("111"sv);
  165. EXPECT(count == 3);
  166. count = test_string.count("._."sv);
  167. EXPECT(count == 2);
  168. }
  169. TEST_CASE(substring)
  170. {
  171. DeprecatedString test = "abcdef";
  172. EXPECT_EQ(test.substring(0, 6), test);
  173. EXPECT_EQ(test.substring(0, 3), "abc");
  174. EXPECT_EQ(test.substring(3, 3), "def");
  175. EXPECT_EQ(test.substring(3, 0), "");
  176. EXPECT_EQ(test.substring(6, 0), "");
  177. }
  178. TEST_CASE(split)
  179. {
  180. DeprecatedString test = "foo bar baz";
  181. auto parts = test.split(' ');
  182. EXPECT_EQ(parts.size(), 3u);
  183. EXPECT_EQ(parts[0], "foo");
  184. EXPECT_EQ(parts[1], "bar");
  185. EXPECT_EQ(parts[2], "baz");
  186. EXPECT_EQ(parts[0].characters()[3], '\0');
  187. EXPECT_EQ(parts[1].characters()[3], '\0');
  188. EXPECT_EQ(parts[2].characters()[3], '\0');
  189. test = "a b";
  190. parts = test.split(' ');
  191. EXPECT_EQ(parts.size(), 2u);
  192. EXPECT_EQ(parts[0], "a");
  193. EXPECT_EQ(parts[1], "b");
  194. parts = test.split(' ', SplitBehavior::KeepEmpty);
  195. EXPECT_EQ(parts.size(), 5u);
  196. EXPECT_EQ(parts[0], "a");
  197. EXPECT_EQ(parts[1], "");
  198. EXPECT_EQ(parts[2], "");
  199. EXPECT_EQ(parts[3], "");
  200. EXPECT_EQ(parts[4], "b");
  201. test = "axxbx";
  202. EXPECT_EQ(test.split('x').size(), 2u);
  203. EXPECT_EQ(test.split('x', SplitBehavior::KeepEmpty).size(), 4u);
  204. EXPECT_EQ(test.split_view('x').size(), 2u);
  205. EXPECT_EQ(test.split_view('x', SplitBehavior::KeepEmpty).size(), 4u);
  206. }
  207. TEST_CASE(builder_zero_initial_capacity)
  208. {
  209. StringBuilder builder(0);
  210. builder.append(""sv);
  211. auto built = builder.to_deprecated_string();
  212. EXPECT_EQ(built.length(), 0u);
  213. }
  214. TEST_CASE(find)
  215. {
  216. DeprecatedString a = "foobarbar";
  217. EXPECT_EQ(a.find("bar"sv), Optional<size_t> { 3 });
  218. EXPECT_EQ(a.find("baz"sv), Optional<size_t> {});
  219. EXPECT_EQ(a.find("bar"sv, 4), Optional<size_t> { 6 });
  220. EXPECT_EQ(a.find("bar"sv, 9), Optional<size_t> {});
  221. EXPECT_EQ(a.find('f'), Optional<size_t> { 0 });
  222. EXPECT_EQ(a.find('x'), Optional<size_t> {});
  223. EXPECT_EQ(a.find('f', 1), Optional<size_t> {});
  224. EXPECT_EQ(a.find('b'), Optional<size_t> { 3 });
  225. EXPECT_EQ(a.find('b', 4), Optional<size_t> { 6 });
  226. EXPECT_EQ(a.find('b', 9), Optional<size_t> {});
  227. }
  228. TEST_CASE(find_with_empty_needle)
  229. {
  230. DeprecatedString string = "";
  231. EXPECT_EQ(string.find(""sv), 0u);
  232. EXPECT_EQ(string.find_all(""sv), (Vector<size_t> { 0u }));
  233. string = "abc";
  234. EXPECT_EQ(string.find(""sv), 0u);
  235. EXPECT_EQ(string.find_all(""sv), (Vector<size_t> { 0u, 1u, 2u, 3u }));
  236. }
  237. TEST_CASE(bijective_base)
  238. {
  239. EXPECT_EQ(DeprecatedString::bijective_base_from(0), "A");
  240. EXPECT_EQ(DeprecatedString::bijective_base_from(25), "Z");
  241. EXPECT_EQ(DeprecatedString::bijective_base_from(26), "AA");
  242. EXPECT_EQ(DeprecatedString::bijective_base_from(52), "BA");
  243. EXPECT_EQ(DeprecatedString::bijective_base_from(701), "ZZ");
  244. EXPECT_EQ(DeprecatedString::bijective_base_from(702), "AAA");
  245. EXPECT_EQ(DeprecatedString::bijective_base_from(730), "ABC");
  246. EXPECT_EQ(DeprecatedString::bijective_base_from(18277), "ZZZ");
  247. }
  248. TEST_CASE(roman_numerals)
  249. {
  250. auto zero = DeprecatedString::roman_number_from(0);
  251. EXPECT_EQ(zero, "");
  252. auto one = DeprecatedString::roman_number_from(1);
  253. EXPECT_EQ(one, "I");
  254. auto nine = DeprecatedString::roman_number_from(9);
  255. EXPECT_EQ(nine, "IX");
  256. auto fourty_eight = DeprecatedString::roman_number_from(48);
  257. EXPECT_EQ(fourty_eight, "XLVIII");
  258. auto one_thousand_nine_hundred_ninety_eight = DeprecatedString::roman_number_from(1998);
  259. EXPECT_EQ(one_thousand_nine_hundred_ninety_eight, "MCMXCVIII");
  260. auto four_thousand = DeprecatedString::roman_number_from(4000);
  261. EXPECT_EQ(four_thousand, "4000");
  262. }