1 //===-- StringListTest.cpp ---------------------------------------*- C++ -*-===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 10 #include "lldb/Utility/StringList.h" 11 #include "lldb/Utility/StreamString.h" 12 #include "gtest/gtest.h" 13 14 using namespace lldb_private; 15 16 TEST(StringListTest, DefaultConstructor) { 17 StringList s; 18 EXPECT_EQ(0U, s.GetSize()); 19 } 20 21 TEST(StringListTest, Assignment) { 22 StringList orig; 23 orig.AppendString("foo"); 24 orig.AppendString("bar"); 25 26 StringList s = orig; 27 28 ASSERT_EQ(2U, s.GetSize()); 29 EXPECT_STREQ("foo", s.GetStringAtIndex(0)); 30 EXPECT_STREQ("bar", s.GetStringAtIndex(1)); 31 32 ASSERT_EQ(2U, orig.GetSize()); 33 EXPECT_STREQ("foo", orig.GetStringAtIndex(0)); 34 EXPECT_STREQ("bar", orig.GetStringAtIndex(1)); 35 } 36 37 TEST(StringListTest, AppendStringStdString) { 38 StringList s; 39 s.AppendString("foo"); 40 ASSERT_EQ(1U, s.GetSize()); 41 EXPECT_STREQ("foo", s.GetStringAtIndex(0)); 42 43 s.AppendString("bar"); 44 ASSERT_EQ(2U, s.GetSize()); 45 EXPECT_STREQ("foo", s.GetStringAtIndex(0)); 46 EXPECT_STREQ("bar", s.GetStringAtIndex(1)); 47 } 48 49 TEST(StringListTest, AppendStringCString) { 50 StringList s; 51 s.AppendString("foo", strlen("foo")); 52 ASSERT_EQ(1U, s.GetSize()); 53 EXPECT_STREQ("foo", s.GetStringAtIndex(0)); 54 55 s.AppendString("bar", strlen("bar")); 56 ASSERT_EQ(2U, s.GetSize()); 57 EXPECT_STREQ("foo", s.GetStringAtIndex(0)); 58 EXPECT_STREQ("bar", s.GetStringAtIndex(1)); 59 } 60 61 TEST(StringListTest, AppendStringMove) { 62 StringList s; 63 std::string foo = "foo"; 64 std::string bar = "bar"; 65 66 s.AppendString(std::move(foo)); 67 ASSERT_EQ(1U, s.GetSize()); 68 EXPECT_STREQ("foo", s.GetStringAtIndex(0)); 69 70 s.AppendString(std::move(bar)); 71 ASSERT_EQ(2U, s.GetSize()); 72 EXPECT_STREQ("foo", s.GetStringAtIndex(0)); 73 EXPECT_STREQ("bar", s.GetStringAtIndex(1)); 74 } 75 76 TEST(StringListTest, ShiftStdString) { 77 StringList s; 78 std::string foo = "foo"; 79 std::string bar = "bar"; 80 81 s << foo; 82 ASSERT_EQ(1U, s.GetSize()); 83 EXPECT_STREQ("foo", s.GetStringAtIndex(0)); 84 85 s << bar; 86 ASSERT_EQ(2U, s.GetSize()); 87 EXPECT_STREQ("foo", s.GetStringAtIndex(0)); 88 EXPECT_STREQ("bar", s.GetStringAtIndex(1)); 89 } 90 91 TEST(StringListTest, ShiftCString) { 92 StringList s; 93 s << "foo"; 94 ASSERT_EQ(1U, s.GetSize()); 95 EXPECT_STREQ("foo", s.GetStringAtIndex(0)); 96 97 s << "bar"; 98 ASSERT_EQ(2U, s.GetSize()); 99 EXPECT_STREQ("foo", s.GetStringAtIndex(0)); 100 EXPECT_STREQ("bar", s.GetStringAtIndex(1)); 101 } 102 103 TEST(StringListTest, ShiftMove) { 104 StringList s; 105 std::string foo = "foo"; 106 std::string bar = "bar"; 107 108 s << std::move(foo); 109 ASSERT_EQ(1U, s.GetSize()); 110 EXPECT_STREQ("foo", s.GetStringAtIndex(0)); 111 112 s << std::move(bar); 113 ASSERT_EQ(2U, s.GetSize()); 114 EXPECT_STREQ("foo", s.GetStringAtIndex(0)); 115 EXPECT_STREQ("bar", s.GetStringAtIndex(1)); 116 } 117 118 TEST(StringListTest, AppendListCStringArrayEmpty) { 119 StringList s; 120 s.AppendList(nullptr, 0); 121 EXPECT_EQ(0U, s.GetSize()); 122 } 123 124 TEST(StringListTest, AppendListCStringArray) { 125 StringList s; 126 const char *items[3] = {"foo", "", "bar"}; 127 s.AppendList(items, 3); 128 129 EXPECT_EQ(3U, s.GetSize()); 130 EXPECT_STREQ("foo", s.GetStringAtIndex(0)); 131 EXPECT_STREQ("", s.GetStringAtIndex(1)); 132 EXPECT_STREQ("bar", s.GetStringAtIndex(2)); 133 } 134 135 TEST(StringListTest, AppendList) { 136 StringList other; 137 other.AppendString("foo"); 138 other.AppendString(""); 139 other.AppendString("bar"); 140 141 StringList empty; 142 143 StringList s; 144 s.AppendList(other); 145 146 EXPECT_EQ(3U, s.GetSize()); 147 EXPECT_STREQ("foo", s.GetStringAtIndex(0)); 148 EXPECT_STREQ("", s.GetStringAtIndex(1)); 149 EXPECT_STREQ("bar", s.GetStringAtIndex(2)); 150 151 EXPECT_EQ(3U, other.GetSize()); 152 EXPECT_STREQ("foo", other.GetStringAtIndex(0)); 153 EXPECT_STREQ("", other.GetStringAtIndex(1)); 154 EXPECT_STREQ("bar", other.GetStringAtIndex(2)); 155 156 s.AppendList(empty); 157 s.AppendList(other); 158 EXPECT_EQ(6U, s.GetSize()); 159 EXPECT_STREQ("foo", s.GetStringAtIndex(0)); 160 EXPECT_STREQ("", s.GetStringAtIndex(1)); 161 EXPECT_STREQ("bar", s.GetStringAtIndex(2)); 162 EXPECT_STREQ("foo", s.GetStringAtIndex(3)); 163 EXPECT_STREQ("", s.GetStringAtIndex(4)); 164 EXPECT_STREQ("bar", s.GetStringAtIndex(5)); 165 166 EXPECT_EQ(3U, other.GetSize()); 167 EXPECT_STREQ("foo", other.GetStringAtIndex(0)); 168 EXPECT_STREQ("", other.GetStringAtIndex(1)); 169 EXPECT_STREQ("bar", other.GetStringAtIndex(2)); 170 } 171 172 TEST(StringListTest, GetSize) { 173 StringList s; 174 s.AppendString("foo"); 175 EXPECT_EQ(1U, s.GetSize()); 176 177 s.AppendString("foo"); 178 EXPECT_EQ(2U, s.GetSize()); 179 180 s.AppendString("foobar"); 181 EXPECT_EQ(3U, s.GetSize()); 182 } 183 184 TEST(StringListTest, SetSize) { 185 StringList s; 186 s.SetSize(3); 187 EXPECT_EQ(3U, s.GetSize()); 188 EXPECT_STREQ("", s.GetStringAtIndex(0)); 189 EXPECT_STREQ("", s.GetStringAtIndex(1)); 190 EXPECT_STREQ("", s.GetStringAtIndex(2)); 191 } 192 193 TEST(StringListTest, SplitIntoLines) { 194 StringList s; 195 s.SplitIntoLines("\nfoo\nbar\n\n"); 196 EXPECT_EQ(4U, s.GetSize()); 197 EXPECT_STREQ("", s.GetStringAtIndex(0)); 198 EXPECT_STREQ("foo", s.GetStringAtIndex(1)); 199 EXPECT_STREQ("bar", s.GetStringAtIndex(2)); 200 EXPECT_STREQ("", s.GetStringAtIndex(3)); 201 } 202 203 TEST(StringListTest, SplitIntoLinesSingleTrailingCR) { 204 StringList s; 205 s.SplitIntoLines("\r"); 206 EXPECT_EQ(1U, s.GetSize()); 207 EXPECT_STREQ("", s.GetStringAtIndex(0)); 208 } 209 210 TEST(StringListTest, SplitIntoLinesEmpty) { 211 StringList s; 212 s.SplitIntoLines(""); 213 EXPECT_EQ(0U, s.GetSize()); 214 } 215 216 TEST(StringListTest, LongestCommonPrefixEmpty) { 217 StringList s; 218 std::string prefix = "this should be cleared"; 219 s.LongestCommonPrefix(prefix); 220 EXPECT_EQ("", prefix); 221 } 222 223 TEST(StringListTest, LongestCommonPrefix) { 224 StringList s; 225 s.AppendString("foo"); 226 s.AppendString("foobar"); 227 s.AppendString("foo"); 228 s.AppendString("foozar"); 229 230 std::string prefix = "this should be cleared"; 231 s.LongestCommonPrefix(prefix); 232 EXPECT_EQ("foo", prefix); 233 } 234 235 TEST(StringListTest, LongestCommonPrefixSingleElement) { 236 StringList s; 237 s.AppendString("foo"); 238 239 std::string prefix = "this should be cleared"; 240 s.LongestCommonPrefix(prefix); 241 EXPECT_EQ("foo", prefix); 242 } 243 244 TEST(StringListTest, LongestCommonPrefixDuplicateElement) { 245 StringList s; 246 s.AppendString("foo"); 247 s.AppendString("foo"); 248 249 std::string prefix = "this should be cleared"; 250 s.LongestCommonPrefix(prefix); 251 EXPECT_EQ("foo", prefix); 252 } 253 254 TEST(StringListTest, LongestCommonPrefixNoPrefix) { 255 StringList s; 256 s.AppendString("foo"); 257 s.AppendString("1foobar"); 258 s.AppendString("2foo"); 259 s.AppendString("3foozar"); 260 261 std::string prefix = "this should be cleared"; 262 s.LongestCommonPrefix(prefix); 263 EXPECT_EQ("", prefix); 264 } 265 266 TEST(StringListTest, Clear) { 267 StringList s; 268 s.Clear(); 269 EXPECT_EQ(0U, s.GetSize()); 270 271 s.AppendString("foo"); 272 s.Clear(); 273 EXPECT_EQ(0U, s.GetSize()); 274 275 s.AppendString("foo"); 276 s.AppendString("foo"); 277 s.Clear(); 278 EXPECT_EQ(0U, s.GetSize()); 279 } 280 281 TEST(StringListTest, PopBack) { 282 StringList s; 283 s.AppendString("foo"); 284 s.AppendString("bar"); 285 s.AppendString("boo"); 286 287 s.PopBack(); 288 EXPECT_EQ(2U, s.GetSize()); 289 EXPECT_STREQ("foo", s.GetStringAtIndex(0)); 290 EXPECT_STREQ("bar", s.GetStringAtIndex(1)); 291 292 s.PopBack(); 293 EXPECT_EQ(1U, s.GetSize()); 294 EXPECT_STREQ("foo", s.GetStringAtIndex(0)); 295 296 s.PopBack(); 297 EXPECT_EQ(0U, s.GetSize()); 298 } 299 300 TEST(StringListTest, RemoveBlankLines) { 301 StringList s; 302 303 // Nothing to remove yet. 304 s.RemoveBlankLines(); 305 EXPECT_EQ(0U, s.GetSize()); 306 307 // Add some lines. 308 s.AppendString(""); 309 s.AppendString(""); 310 s.AppendString("\t"); 311 s.AppendString(""); 312 s.AppendString(" "); 313 s.AppendString(""); 314 s.AppendString(""); 315 s.AppendString("f"); 316 s.AppendString(""); 317 s.AppendString(""); 318 319 // And remove all the empty ones again. 320 s.RemoveBlankLines(); 321 322 EXPECT_EQ(3U, s.GetSize()); 323 EXPECT_STREQ("\t", s.GetStringAtIndex(0)); 324 EXPECT_STREQ(" ", s.GetStringAtIndex(1)); 325 EXPECT_STREQ("f", s.GetStringAtIndex(2)); 326 } 327 328 TEST(StringListTest, InsertStringAtIndexStart) { 329 StringList s; 330 331 s.InsertStringAtIndex(0, "bar"); 332 EXPECT_EQ(1U, s.GetSize()); 333 EXPECT_STREQ("bar", s.GetStringAtIndex(0)); 334 335 s.InsertStringAtIndex(0, "foo"); 336 EXPECT_EQ(2U, s.GetSize()); 337 EXPECT_STREQ("foo", s.GetStringAtIndex(0)); 338 EXPECT_STREQ("bar", s.GetStringAtIndex(1)); 339 } 340 341 TEST(StringListTest, InsertStringAtIndexEnd) { 342 StringList s; 343 344 s.InsertStringAtIndex(0, "foo"); 345 EXPECT_EQ(1U, s.GetSize()); 346 EXPECT_STREQ("foo", s.GetStringAtIndex(0)); 347 348 s.InsertStringAtIndex(1, "bar"); 349 EXPECT_EQ(2U, s.GetSize()); 350 EXPECT_STREQ("foo", s.GetStringAtIndex(0)); 351 EXPECT_STREQ("bar", s.GetStringAtIndex(1)); 352 } 353 354 TEST(StringListTest, InsertStringAtIndexOutOfBounds) { 355 StringList s; 356 357 s.InsertStringAtIndex(1, "foo"); 358 EXPECT_EQ(1U, s.GetSize()); 359 EXPECT_STREQ("foo", s.GetStringAtIndex(0)); 360 361 // FIXME: Inserting at an OOB index will always just append to the list. This 362 // seems not very intuitive. 363 s.InsertStringAtIndex(3, "bar"); 364 EXPECT_EQ(2U, s.GetSize()); 365 EXPECT_STREQ("foo", s.GetStringAtIndex(0)); 366 EXPECT_STREQ("bar", s.GetStringAtIndex(1)); 367 } 368 369 TEST(StringListTest, InsertStringAtIndexStdString) { 370 StringList s; 371 372 std::string foo = "foo"; 373 s.InsertStringAtIndex(0, foo); 374 EXPECT_EQ(1U, s.GetSize()); 375 EXPECT_STREQ("foo", s.GetStringAtIndex(0)); 376 } 377 378 TEST(StringListTest, InsertStringAtIndexMove) { 379 StringList s; 380 381 std::string foo = "foo"; 382 s.InsertStringAtIndex(0, std::move(foo)); 383 EXPECT_EQ(1U, s.GetSize()); 384 EXPECT_STREQ("foo", s.GetStringAtIndex(0)); 385 } 386 387 TEST(StringListTest, CopyListEmpty) { 388 StringList s; 389 390 EXPECT_EQ("", s.CopyList()); 391 EXPECT_EQ("", s.CopyList("+")); 392 } 393 394 TEST(StringListTest, CopyListSingle) { 395 StringList s; 396 s.AppendString("ab"); 397 398 EXPECT_EQ("ab", s.CopyList()); 399 EXPECT_EQ("-ab", s.CopyList("-")); 400 } 401 402 TEST(StringListTest, CopyList) { 403 StringList s; 404 s.AppendString("ab"); 405 s.AppendString("cd"); 406 407 EXPECT_EQ("ab\ncd", s.CopyList()); 408 EXPECT_EQ("-ab\n-cd", s.CopyList("-")); 409 } 410 411 TEST(StringListTest, Join) { 412 StringList s; 413 s.AppendString("ab"); 414 s.AppendString("cd"); 415 416 StreamString ss; 417 s.Join(" ", ss); 418 419 EXPECT_EQ("ab cd", ss.GetString()); 420 } 421 422 TEST(StringListTest, JoinEmpty) { 423 StringList s; 424 425 StreamString ss; 426 s.Join(" ", ss); 427 428 EXPECT_EQ("", ss.GetString()); 429 } 430 431 TEST(StringListTest, JoinSingle) { 432 StringList s; 433 s.AppendString("foo"); 434 435 StreamString ss; 436 s.Join(" ", ss); 437 438 EXPECT_EQ("foo", ss.GetString()); 439 } 440 441 TEST(StringListTest, JoinThree) { 442 StringList s; 443 s.AppendString("1"); 444 s.AppendString("2"); 445 s.AppendString("3"); 446 447 StreamString ss; 448 s.Join(" ", ss); 449 450 EXPECT_EQ("1 2 3", ss.GetString()); 451 } 452 453 TEST(StringListTest, JoinNonSpace) { 454 StringList s; 455 s.AppendString("1"); 456 s.AppendString("2"); 457 s.AppendString("3"); 458 459 StreamString ss; 460 s.Join(".", ss); 461 462 EXPECT_EQ("1.2.3", ss.GetString()); 463 } 464 465 TEST(StringListTest, JoinMultiCharSeparator) { 466 StringList s; 467 s.AppendString("1"); 468 s.AppendString("2"); 469 s.AppendString("3"); 470 471 StreamString ss; 472 s.Join("--", ss); 473 474 EXPECT_EQ("1--2--3", ss.GetString()); 475 } 476 477 TEST(StringListTest, GetMaxStringLengthEqualSize) { 478 StringList s; 479 s.AppendString("123"); 480 s.AppendString("123"); 481 EXPECT_EQ(3U, s.GetMaxStringLength()); 482 } 483 484 TEST(StringListTest, GetMaxStringLengthIncreasingSize) { 485 StringList s; 486 s.AppendString("123"); 487 s.AppendString("1234"); 488 EXPECT_EQ(4U, s.GetMaxStringLength()); 489 } 490 491 TEST(StringListTest, GetMaxStringLengthDecreasingSize) { 492 StringList s; 493 s.AppendString("1234"); 494 s.AppendString("123"); 495 EXPECT_EQ(4U, s.GetMaxStringLength()); 496 } 497 498 TEST(StringListTest, GetMaxStringLengthMixed) { 499 StringList s; 500 s.AppendString("123"); 501 s.AppendString("1"); 502 s.AppendString("123"); 503 s.AppendString("1234"); 504 s.AppendString("123"); 505 s.AppendString("1"); 506 EXPECT_EQ(4U, s.GetMaxStringLength()); 507 } 508 509 TEST(StringListTest, GetMaxStringLengthEmpty) { 510 StringList s; 511 EXPECT_EQ(0U, s.GetMaxStringLength()); 512 } 513