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