1 //===- llvm/unittest/ADT/StringRefTest.cpp - StringRef unit tests ---------===// 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 "llvm/ADT/StringRef.h" 11 #include "llvm/ADT/Hashing.h" 12 #include "llvm/ADT/STLExtras.h" 13 #include "llvm/ADT/SmallVector.h" 14 #include "llvm/ADT/StringExtras.h" 15 #include "llvm/Support/Allocator.h" 16 #include "llvm/Support/raw_ostream.h" 17 #include "gtest/gtest.h" 18 using namespace llvm; 19 20 namespace llvm { 21 22 std::ostream &operator<<(std::ostream &OS, const StringRef &S) { 23 OS << S.str(); 24 return OS; 25 } 26 27 std::ostream &operator<<(std::ostream &OS, 28 const std::pair<StringRef, StringRef> &P) { 29 OS << "(" << P.first << ", " << P.second << ")"; 30 return OS; 31 } 32 33 } 34 35 namespace { 36 TEST(StringRefTest, Construction) { 37 EXPECT_EQ("", StringRef()); 38 EXPECT_EQ("hello", StringRef("hello")); 39 EXPECT_EQ("hello", StringRef("hello world", 5)); 40 EXPECT_EQ("hello", StringRef(std::string("hello"))); 41 } 42 43 TEST(StringRefTest, Iteration) { 44 StringRef S("hello"); 45 const char *p = "hello"; 46 for (const char *it = S.begin(), *ie = S.end(); it != ie; ++it, ++p) 47 EXPECT_EQ(*it, *p); 48 } 49 50 TEST(StringRefTest, StringOps) { 51 const char *p = "hello"; 52 EXPECT_EQ(p, StringRef(p, 0).data()); 53 EXPECT_TRUE(StringRef().empty()); 54 EXPECT_EQ((size_t) 5, StringRef("hello").size()); 55 EXPECT_EQ(-1, StringRef("aab").compare("aad")); 56 EXPECT_EQ( 0, StringRef("aab").compare("aab")); 57 EXPECT_EQ( 1, StringRef("aab").compare("aaa")); 58 EXPECT_EQ(-1, StringRef("aab").compare("aabb")); 59 EXPECT_EQ( 1, StringRef("aab").compare("aa")); 60 EXPECT_EQ( 1, StringRef("\xFF").compare("\1")); 61 62 EXPECT_EQ(-1, StringRef("AaB").compare_lower("aAd")); 63 EXPECT_EQ( 0, StringRef("AaB").compare_lower("aab")); 64 EXPECT_EQ( 1, StringRef("AaB").compare_lower("AAA")); 65 EXPECT_EQ(-1, StringRef("AaB").compare_lower("aaBb")); 66 EXPECT_EQ(-1, StringRef("AaB").compare_lower("bb")); 67 EXPECT_EQ( 1, StringRef("aaBb").compare_lower("AaB")); 68 EXPECT_EQ( 1, StringRef("bb").compare_lower("AaB")); 69 EXPECT_EQ( 1, StringRef("AaB").compare_lower("aA")); 70 EXPECT_EQ( 1, StringRef("\xFF").compare_lower("\1")); 71 72 EXPECT_EQ(-1, StringRef("aab").compare_numeric("aad")); 73 EXPECT_EQ( 0, StringRef("aab").compare_numeric("aab")); 74 EXPECT_EQ( 1, StringRef("aab").compare_numeric("aaa")); 75 EXPECT_EQ(-1, StringRef("aab").compare_numeric("aabb")); 76 EXPECT_EQ( 1, StringRef("aab").compare_numeric("aa")); 77 EXPECT_EQ(-1, StringRef("1").compare_numeric("10")); 78 EXPECT_EQ( 0, StringRef("10").compare_numeric("10")); 79 EXPECT_EQ( 0, StringRef("10a").compare_numeric("10a")); 80 EXPECT_EQ( 1, StringRef("2").compare_numeric("1")); 81 EXPECT_EQ( 0, StringRef("llvm_v1i64_ty").compare_numeric("llvm_v1i64_ty")); 82 EXPECT_EQ( 1, StringRef("\xFF").compare_numeric("\1")); 83 EXPECT_EQ( 1, StringRef("V16").compare_numeric("V1_q0")); 84 EXPECT_EQ(-1, StringRef("V1_q0").compare_numeric("V16")); 85 EXPECT_EQ(-1, StringRef("V8_q0").compare_numeric("V16")); 86 EXPECT_EQ( 1, StringRef("V16").compare_numeric("V8_q0")); 87 EXPECT_EQ(-1, StringRef("V1_q0").compare_numeric("V8_q0")); 88 EXPECT_EQ( 1, StringRef("V8_q0").compare_numeric("V1_q0")); 89 } 90 91 TEST(StringRefTest, Operators) { 92 EXPECT_EQ("", StringRef()); 93 EXPECT_TRUE(StringRef("aab") < StringRef("aad")); 94 EXPECT_FALSE(StringRef("aab") < StringRef("aab")); 95 EXPECT_TRUE(StringRef("aab") <= StringRef("aab")); 96 EXPECT_FALSE(StringRef("aab") <= StringRef("aaa")); 97 EXPECT_TRUE(StringRef("aad") > StringRef("aab")); 98 EXPECT_FALSE(StringRef("aab") > StringRef("aab")); 99 EXPECT_TRUE(StringRef("aab") >= StringRef("aab")); 100 EXPECT_FALSE(StringRef("aaa") >= StringRef("aab")); 101 EXPECT_EQ(StringRef("aab"), StringRef("aab")); 102 EXPECT_FALSE(StringRef("aab") == StringRef("aac")); 103 EXPECT_FALSE(StringRef("aab") != StringRef("aab")); 104 EXPECT_TRUE(StringRef("aab") != StringRef("aac")); 105 EXPECT_EQ('a', StringRef("aab")[1]); 106 } 107 108 TEST(StringRefTest, Substr) { 109 StringRef Str("hello"); 110 EXPECT_EQ("lo", Str.substr(3)); 111 EXPECT_EQ("", Str.substr(100)); 112 EXPECT_EQ("hello", Str.substr(0, 100)); 113 EXPECT_EQ("o", Str.substr(4, 10)); 114 } 115 116 TEST(StringRefTest, Slice) { 117 StringRef Str("hello"); 118 EXPECT_EQ("l", Str.slice(2, 3)); 119 EXPECT_EQ("ell", Str.slice(1, 4)); 120 EXPECT_EQ("llo", Str.slice(2, 100)); 121 EXPECT_EQ("", Str.slice(2, 1)); 122 EXPECT_EQ("", Str.slice(10, 20)); 123 } 124 125 TEST(StringRefTest, Split) { 126 StringRef Str("hello"); 127 EXPECT_EQ(std::make_pair(StringRef("hello"), StringRef("")), 128 Str.split('X')); 129 EXPECT_EQ(std::make_pair(StringRef("h"), StringRef("llo")), 130 Str.split('e')); 131 EXPECT_EQ(std::make_pair(StringRef(""), StringRef("ello")), 132 Str.split('h')); 133 EXPECT_EQ(std::make_pair(StringRef("he"), StringRef("lo")), 134 Str.split('l')); 135 EXPECT_EQ(std::make_pair(StringRef("hell"), StringRef("")), 136 Str.split('o')); 137 138 EXPECT_EQ(std::make_pair(StringRef("hello"), StringRef("")), 139 Str.rsplit('X')); 140 EXPECT_EQ(std::make_pair(StringRef("h"), StringRef("llo")), 141 Str.rsplit('e')); 142 EXPECT_EQ(std::make_pair(StringRef(""), StringRef("ello")), 143 Str.rsplit('h')); 144 EXPECT_EQ(std::make_pair(StringRef("hel"), StringRef("o")), 145 Str.rsplit('l')); 146 EXPECT_EQ(std::make_pair(StringRef("hell"), StringRef("")), 147 Str.rsplit('o')); 148 } 149 150 TEST(StringRefTest, Split2) { 151 SmallVector<StringRef, 5> parts; 152 SmallVector<StringRef, 5> expected; 153 154 expected.push_back("ab"); expected.push_back("c"); 155 StringRef(",ab,,c,").split(parts, ",", -1, false); 156 EXPECT_TRUE(parts == expected); 157 158 expected.clear(); parts.clear(); 159 expected.push_back(""); expected.push_back("ab"); expected.push_back(""); 160 expected.push_back("c"); expected.push_back(""); 161 StringRef(",ab,,c,").split(parts, ",", -1, true); 162 EXPECT_TRUE(parts == expected); 163 164 expected.clear(); parts.clear(); 165 expected.push_back(""); 166 StringRef("").split(parts, ",", -1, true); 167 EXPECT_TRUE(parts == expected); 168 169 expected.clear(); parts.clear(); 170 StringRef("").split(parts, ",", -1, false); 171 EXPECT_TRUE(parts == expected); 172 173 expected.clear(); parts.clear(); 174 StringRef(",").split(parts, ",", -1, false); 175 EXPECT_TRUE(parts == expected); 176 177 expected.clear(); parts.clear(); 178 expected.push_back(""); expected.push_back(""); 179 StringRef(",").split(parts, ",", -1, true); 180 EXPECT_TRUE(parts == expected); 181 182 expected.clear(); parts.clear(); 183 expected.push_back("a"); expected.push_back("b"); 184 StringRef("a,b").split(parts, ",", -1, true); 185 EXPECT_TRUE(parts == expected); 186 187 // Test MaxSplit 188 expected.clear(); parts.clear(); 189 expected.push_back("a,,b,c"); 190 StringRef("a,,b,c").split(parts, ",", 0, true); 191 EXPECT_TRUE(parts == expected); 192 193 expected.clear(); parts.clear(); 194 expected.push_back("a,,b,c"); 195 StringRef("a,,b,c").split(parts, ",", 0, false); 196 EXPECT_TRUE(parts == expected); 197 198 expected.clear(); parts.clear(); 199 expected.push_back("a"); expected.push_back(",b,c"); 200 StringRef("a,,b,c").split(parts, ",", 1, true); 201 EXPECT_TRUE(parts == expected); 202 203 expected.clear(); parts.clear(); 204 expected.push_back("a"); expected.push_back(",b,c"); 205 StringRef("a,,b,c").split(parts, ",", 1, false); 206 EXPECT_TRUE(parts == expected); 207 208 expected.clear(); parts.clear(); 209 expected.push_back("a"); expected.push_back(""); expected.push_back("b,c"); 210 StringRef("a,,b,c").split(parts, ",", 2, true); 211 EXPECT_TRUE(parts == expected); 212 213 expected.clear(); parts.clear(); 214 expected.push_back("a"); expected.push_back("b,c"); 215 StringRef("a,,b,c").split(parts, ",", 2, false); 216 EXPECT_TRUE(parts == expected); 217 218 expected.clear(); parts.clear(); 219 expected.push_back("a"); expected.push_back(""); expected.push_back("b"); 220 expected.push_back("c"); 221 StringRef("a,,b,c").split(parts, ",", 3, true); 222 EXPECT_TRUE(parts == expected); 223 224 expected.clear(); parts.clear(); 225 expected.push_back("a"); expected.push_back("b"); expected.push_back("c"); 226 StringRef("a,,b,c").split(parts, ",", 3, false); 227 EXPECT_TRUE(parts == expected); 228 229 expected.clear(); parts.clear(); 230 expected.push_back("a"); expected.push_back("b"); expected.push_back("c"); 231 StringRef("a,,b,c").split(parts, ',', 3, false); 232 EXPECT_TRUE(parts == expected); 233 234 expected.clear(); parts.clear(); 235 expected.push_back(""); 236 StringRef().split(parts, ",", 0, true); 237 EXPECT_TRUE(parts == expected); 238 239 expected.clear(); parts.clear(); 240 expected.push_back(StringRef()); 241 StringRef("").split(parts, ",", 0, true); 242 EXPECT_TRUE(parts == expected); 243 244 expected.clear(); parts.clear(); 245 StringRef("").split(parts, ",", 0, false); 246 EXPECT_TRUE(parts == expected); 247 StringRef().split(parts, ",", 0, false); 248 EXPECT_TRUE(parts == expected); 249 250 expected.clear(); parts.clear(); 251 expected.push_back("a"); 252 expected.push_back(""); 253 expected.push_back("b"); 254 expected.push_back("c,d"); 255 StringRef("a,,b,c,d").split(parts, ",", 3, true); 256 EXPECT_TRUE(parts == expected); 257 258 expected.clear(); parts.clear(); 259 expected.push_back(""); 260 StringRef().split(parts, ',', 0, true); 261 EXPECT_TRUE(parts == expected); 262 263 expected.clear(); parts.clear(); 264 expected.push_back(StringRef()); 265 StringRef("").split(parts, ',', 0, true); 266 EXPECT_TRUE(parts == expected); 267 268 expected.clear(); parts.clear(); 269 StringRef("").split(parts, ',', 0, false); 270 EXPECT_TRUE(parts == expected); 271 StringRef().split(parts, ',', 0, false); 272 EXPECT_TRUE(parts == expected); 273 274 expected.clear(); parts.clear(); 275 expected.push_back("a"); 276 expected.push_back(""); 277 expected.push_back("b"); 278 expected.push_back("c,d"); 279 StringRef("a,,b,c,d").split(parts, ',', 3, true); 280 EXPECT_TRUE(parts == expected); 281 } 282 283 TEST(StringRefTest, Trim) { 284 StringRef Str0("hello"); 285 StringRef Str1(" hello "); 286 StringRef Str2(" hello "); 287 288 EXPECT_EQ(StringRef("hello"), Str0.rtrim()); 289 EXPECT_EQ(StringRef(" hello"), Str1.rtrim()); 290 EXPECT_EQ(StringRef(" hello"), Str2.rtrim()); 291 EXPECT_EQ(StringRef("hello"), Str0.ltrim()); 292 EXPECT_EQ(StringRef("hello "), Str1.ltrim()); 293 EXPECT_EQ(StringRef("hello "), Str2.ltrim()); 294 EXPECT_EQ(StringRef("hello"), Str0.trim()); 295 EXPECT_EQ(StringRef("hello"), Str1.trim()); 296 EXPECT_EQ(StringRef("hello"), Str2.trim()); 297 298 EXPECT_EQ(StringRef("ello"), Str0.trim("hhhhhhhhhhh")); 299 300 EXPECT_EQ(StringRef(""), StringRef("").trim()); 301 EXPECT_EQ(StringRef(""), StringRef(" ").trim()); 302 EXPECT_EQ(StringRef("\0", 1), StringRef(" \0 ", 3).trim()); 303 EXPECT_EQ(StringRef("\0\0", 2), StringRef("\0\0", 2).trim()); 304 EXPECT_EQ(StringRef("x"), StringRef("\0\0x\0\0", 5).trim('\0')); 305 } 306 307 TEST(StringRefTest, StartsWith) { 308 StringRef Str("hello"); 309 EXPECT_TRUE(Str.startswith("")); 310 EXPECT_TRUE(Str.startswith("he")); 311 EXPECT_FALSE(Str.startswith("helloworld")); 312 EXPECT_FALSE(Str.startswith("hi")); 313 } 314 315 TEST(StringRefTest, StartsWithLower) { 316 StringRef Str("heLLo"); 317 EXPECT_TRUE(Str.startswith_lower("")); 318 EXPECT_TRUE(Str.startswith_lower("he")); 319 EXPECT_TRUE(Str.startswith_lower("hell")); 320 EXPECT_TRUE(Str.startswith_lower("HELlo")); 321 EXPECT_FALSE(Str.startswith_lower("helloworld")); 322 EXPECT_FALSE(Str.startswith_lower("hi")); 323 } 324 325 TEST(StringRefTest, ConsumeFront) { 326 StringRef Str("hello"); 327 EXPECT_TRUE(Str.consume_front("")); 328 EXPECT_EQ("hello", Str); 329 EXPECT_TRUE(Str.consume_front("he")); 330 EXPECT_EQ("llo", Str); 331 EXPECT_FALSE(Str.consume_front("lloworld")); 332 EXPECT_EQ("llo", Str); 333 EXPECT_FALSE(Str.consume_front("lol")); 334 EXPECT_EQ("llo", Str); 335 EXPECT_TRUE(Str.consume_front("llo")); 336 EXPECT_EQ("", Str); 337 EXPECT_FALSE(Str.consume_front("o")); 338 EXPECT_TRUE(Str.consume_front("")); 339 } 340 341 TEST(StringRefTest, EndsWith) { 342 StringRef Str("hello"); 343 EXPECT_TRUE(Str.endswith("")); 344 EXPECT_TRUE(Str.endswith("lo")); 345 EXPECT_FALSE(Str.endswith("helloworld")); 346 EXPECT_FALSE(Str.endswith("worldhello")); 347 EXPECT_FALSE(Str.endswith("so")); 348 } 349 350 TEST(StringRefTest, EndsWithLower) { 351 StringRef Str("heLLo"); 352 EXPECT_TRUE(Str.endswith_lower("")); 353 EXPECT_TRUE(Str.endswith_lower("lo")); 354 EXPECT_TRUE(Str.endswith_lower("LO")); 355 EXPECT_TRUE(Str.endswith_lower("ELlo")); 356 EXPECT_FALSE(Str.endswith_lower("helloworld")); 357 EXPECT_FALSE(Str.endswith_lower("hi")); 358 } 359 360 TEST(StringRefTest, ConsumeBack) { 361 StringRef Str("hello"); 362 EXPECT_TRUE(Str.consume_back("")); 363 EXPECT_EQ("hello", Str); 364 EXPECT_TRUE(Str.consume_back("lo")); 365 EXPECT_EQ("hel", Str); 366 EXPECT_FALSE(Str.consume_back("helhel")); 367 EXPECT_EQ("hel", Str); 368 EXPECT_FALSE(Str.consume_back("hle")); 369 EXPECT_EQ("hel", Str); 370 EXPECT_TRUE(Str.consume_back("hel")); 371 EXPECT_EQ("", Str); 372 EXPECT_FALSE(Str.consume_back("h")); 373 EXPECT_TRUE(Str.consume_back("")); 374 } 375 376 TEST(StringRefTest, Find) { 377 StringRef Str("hello"); 378 EXPECT_EQ(2U, Str.find('l')); 379 EXPECT_EQ(StringRef::npos, Str.find('z')); 380 EXPECT_EQ(StringRef::npos, Str.find("helloworld")); 381 EXPECT_EQ(0U, Str.find("hello")); 382 EXPECT_EQ(1U, Str.find("ello")); 383 EXPECT_EQ(StringRef::npos, Str.find("zz")); 384 EXPECT_EQ(2U, Str.find("ll", 2)); 385 EXPECT_EQ(StringRef::npos, Str.find("ll", 3)); 386 EXPECT_EQ(0U, Str.find("")); 387 StringRef LongStr("hellx xello hell ello world foo bar hello"); 388 EXPECT_EQ(36U, LongStr.find("hello")); 389 EXPECT_EQ(28U, LongStr.find("foo")); 390 EXPECT_EQ(12U, LongStr.find("hell", 2)); 391 EXPECT_EQ(0U, LongStr.find("")); 392 393 EXPECT_EQ(3U, Str.rfind('l')); 394 EXPECT_EQ(StringRef::npos, Str.rfind('z')); 395 EXPECT_EQ(StringRef::npos, Str.rfind("helloworld")); 396 EXPECT_EQ(0U, Str.rfind("hello")); 397 EXPECT_EQ(1U, Str.rfind("ello")); 398 EXPECT_EQ(StringRef::npos, Str.rfind("zz")); 399 400 EXPECT_EQ(2U, Str.find_first_of('l')); 401 EXPECT_EQ(1U, Str.find_first_of("el")); 402 EXPECT_EQ(StringRef::npos, Str.find_first_of("xyz")); 403 404 EXPECT_EQ(1U, Str.find_first_not_of('h')); 405 EXPECT_EQ(4U, Str.find_first_not_of("hel")); 406 EXPECT_EQ(StringRef::npos, Str.find_first_not_of("hello")); 407 408 EXPECT_EQ(3U, Str.find_last_not_of('o')); 409 EXPECT_EQ(1U, Str.find_last_not_of("lo")); 410 EXPECT_EQ(StringRef::npos, Str.find_last_not_of("helo")); 411 } 412 413 TEST(StringRefTest, Count) { 414 StringRef Str("hello"); 415 EXPECT_EQ(2U, Str.count('l')); 416 EXPECT_EQ(1U, Str.count('o')); 417 EXPECT_EQ(0U, Str.count('z')); 418 EXPECT_EQ(0U, Str.count("helloworld")); 419 EXPECT_EQ(1U, Str.count("hello")); 420 EXPECT_EQ(1U, Str.count("ello")); 421 EXPECT_EQ(0U, Str.count("zz")); 422 } 423 424 TEST(StringRefTest, EditDistance) { 425 StringRef Str("hello"); 426 EXPECT_EQ(2U, Str.edit_distance("hill")); 427 } 428 429 TEST(StringRefTest, Misc) { 430 std::string Storage; 431 raw_string_ostream OS(Storage); 432 OS << StringRef("hello"); 433 EXPECT_EQ("hello", OS.str()); 434 } 435 436 TEST(StringRefTest, Hashing) { 437 EXPECT_EQ(hash_value(std::string()), hash_value(StringRef())); 438 EXPECT_EQ(hash_value(std::string()), hash_value(StringRef(""))); 439 std::string S = "hello world"; 440 hash_code H = hash_value(S); 441 EXPECT_EQ(H, hash_value(StringRef("hello world"))); 442 EXPECT_EQ(H, hash_value(StringRef(S))); 443 EXPECT_NE(H, hash_value(StringRef("hello worl"))); 444 EXPECT_EQ(hash_value(std::string("hello worl")), 445 hash_value(StringRef("hello worl"))); 446 EXPECT_NE(H, hash_value(StringRef("hello world "))); 447 EXPECT_EQ(hash_value(std::string("hello world ")), 448 hash_value(StringRef("hello world "))); 449 EXPECT_EQ(H, hash_value(StringRef("hello world\0"))); 450 EXPECT_NE(hash_value(std::string("ello worl")), 451 hash_value(StringRef("hello world").slice(1, -1))); 452 } 453 454 struct UnsignedPair { 455 const char *Str; 456 uint64_t Expected; 457 } Unsigned[] = 458 { {"0", 0} 459 , {"255", 255} 460 , {"256", 256} 461 , {"65535", 65535} 462 , {"65536", 65536} 463 , {"4294967295", 4294967295ULL} 464 , {"4294967296", 4294967296ULL} 465 , {"18446744073709551615", 18446744073709551615ULL} 466 , {"042", 34} 467 , {"0x42", 66} 468 , {"0b101010", 42} 469 }; 470 471 struct SignedPair { 472 const char *Str; 473 int64_t Expected; 474 } Signed[] = 475 { {"0", 0} 476 , {"-0", 0} 477 , {"127", 127} 478 , {"128", 128} 479 , {"-128", -128} 480 , {"-129", -129} 481 , {"32767", 32767} 482 , {"32768", 32768} 483 , {"-32768", -32768} 484 , {"-32769", -32769} 485 , {"2147483647", 2147483647LL} 486 , {"2147483648", 2147483648LL} 487 , {"-2147483648", -2147483648LL} 488 , {"-2147483649", -2147483649LL} 489 , {"-9223372036854775808", -(9223372036854775807LL) - 1} 490 , {"042", 34} 491 , {"0x42", 66} 492 , {"0b101010", 42} 493 , {"-042", -34} 494 , {"-0x42", -66} 495 , {"-0b101010", -42} 496 }; 497 498 TEST(StringRefTest, getAsInteger) { 499 uint8_t U8; 500 uint16_t U16; 501 uint32_t U32; 502 uint64_t U64; 503 504 for (size_t i = 0; i < array_lengthof(Unsigned); ++i) { 505 bool U8Success = StringRef(Unsigned[i].Str).getAsInteger(0, U8); 506 if (static_cast<uint8_t>(Unsigned[i].Expected) == Unsigned[i].Expected) { 507 ASSERT_FALSE(U8Success); 508 EXPECT_EQ(U8, Unsigned[i].Expected); 509 } else { 510 ASSERT_TRUE(U8Success); 511 } 512 bool U16Success = StringRef(Unsigned[i].Str).getAsInteger(0, U16); 513 if (static_cast<uint16_t>(Unsigned[i].Expected) == Unsigned[i].Expected) { 514 ASSERT_FALSE(U16Success); 515 EXPECT_EQ(U16, Unsigned[i].Expected); 516 } else { 517 ASSERT_TRUE(U16Success); 518 } 519 bool U32Success = StringRef(Unsigned[i].Str).getAsInteger(0, U32); 520 if (static_cast<uint32_t>(Unsigned[i].Expected) == Unsigned[i].Expected) { 521 ASSERT_FALSE(U32Success); 522 EXPECT_EQ(U32, Unsigned[i].Expected); 523 } else { 524 ASSERT_TRUE(U32Success); 525 } 526 bool U64Success = StringRef(Unsigned[i].Str).getAsInteger(0, U64); 527 if (static_cast<uint64_t>(Unsigned[i].Expected) == Unsigned[i].Expected) { 528 ASSERT_FALSE(U64Success); 529 EXPECT_EQ(U64, Unsigned[i].Expected); 530 } else { 531 ASSERT_TRUE(U64Success); 532 } 533 } 534 535 int8_t S8; 536 int16_t S16; 537 int32_t S32; 538 int64_t S64; 539 540 for (size_t i = 0; i < array_lengthof(Signed); ++i) { 541 bool S8Success = StringRef(Signed[i].Str).getAsInteger(0, S8); 542 if (static_cast<int8_t>(Signed[i].Expected) == Signed[i].Expected) { 543 ASSERT_FALSE(S8Success); 544 EXPECT_EQ(S8, Signed[i].Expected); 545 } else { 546 ASSERT_TRUE(S8Success); 547 } 548 bool S16Success = StringRef(Signed[i].Str).getAsInteger(0, S16); 549 if (static_cast<int16_t>(Signed[i].Expected) == Signed[i].Expected) { 550 ASSERT_FALSE(S16Success); 551 EXPECT_EQ(S16, Signed[i].Expected); 552 } else { 553 ASSERT_TRUE(S16Success); 554 } 555 bool S32Success = StringRef(Signed[i].Str).getAsInteger(0, S32); 556 if (static_cast<int32_t>(Signed[i].Expected) == Signed[i].Expected) { 557 ASSERT_FALSE(S32Success); 558 EXPECT_EQ(S32, Signed[i].Expected); 559 } else { 560 ASSERT_TRUE(S32Success); 561 } 562 bool S64Success = StringRef(Signed[i].Str).getAsInteger(0, S64); 563 if (static_cast<int64_t>(Signed[i].Expected) == Signed[i].Expected) { 564 ASSERT_FALSE(S64Success); 565 EXPECT_EQ(S64, Signed[i].Expected); 566 } else { 567 ASSERT_TRUE(S64Success); 568 } 569 } 570 } 571 572 573 static const char* BadStrings[] = { 574 "18446744073709551617" // value just over max 575 , "123456789012345678901" // value way too large 576 , "4t23v" // illegal decimal characters 577 , "0x123W56" // illegal hex characters 578 , "0b2" // illegal bin characters 579 , "08" // illegal oct characters 580 , "0o8" // illegal oct characters 581 , "-123" // negative unsigned value 582 }; 583 584 585 TEST(StringRefTest, getAsUnsignedIntegerBadStrings) { 586 unsigned long long U64; 587 for (size_t i = 0; i < array_lengthof(BadStrings); ++i) { 588 bool IsBadNumber = StringRef(BadStrings[i]).getAsInteger(0, U64); 589 ASSERT_TRUE(IsBadNumber); 590 } 591 } 592 593 struct ConsumeUnsignedPair { 594 const char *Str; 595 uint64_t Expected; 596 const char *Leftover; 597 } ConsumeUnsigned[] = { 598 {"0", 0, ""}, 599 {"255", 255, ""}, 600 {"256", 256, ""}, 601 {"65535", 65535, ""}, 602 {"65536", 65536, ""}, 603 {"4294967295", 4294967295ULL, ""}, 604 {"4294967296", 4294967296ULL, ""}, 605 {"255A376", 255, "A376"}, 606 {"18446744073709551615", 18446744073709551615ULL, ""}, 607 {"18446744073709551615ABC", 18446744073709551615ULL, "ABC"}, 608 {"042", 34, ""}, 609 {"0x42", 66, ""}, 610 {"0x42-0x34", 66, "-0x34"}, 611 {"0b101010", 42, ""}, 612 {"0429F", 042, "9F"}, // Auto-sensed octal radix, invalid digit 613 {"0x42G12", 0x42, "G12"}, // Auto-sensed hex radix, invalid digit 614 {"0b10101020101", 42, "20101"}}; // Auto-sensed binary radix, invalid digit. 615 616 struct ConsumeSignedPair { 617 const char *Str; 618 int64_t Expected; 619 const char *Leftover; 620 } ConsumeSigned[] = { 621 {"0", 0, ""}, 622 {"-0", 0, ""}, 623 {"0-1", 0, "-1"}, 624 {"-0-1", 0, "-1"}, 625 {"127", 127, ""}, 626 {"128", 128, ""}, 627 {"127-1", 127, "-1"}, 628 {"128-1", 128, "-1"}, 629 {"-128", -128, ""}, 630 {"-129", -129, ""}, 631 {"-128-1", -128, "-1"}, 632 {"-129-1", -129, "-1"}, 633 {"32767", 32767, ""}, 634 {"32768", 32768, ""}, 635 {"32767-1", 32767, "-1"}, 636 {"32768-1", 32768, "-1"}, 637 {"-32768", -32768, ""}, 638 {"-32769", -32769, ""}, 639 {"-32768-1", -32768, "-1"}, 640 {"-32769-1", -32769, "-1"}, 641 {"2147483647", 2147483647LL, ""}, 642 {"2147483648", 2147483648LL, ""}, 643 {"2147483647-1", 2147483647LL, "-1"}, 644 {"2147483648-1", 2147483648LL, "-1"}, 645 {"-2147483648", -2147483648LL, ""}, 646 {"-2147483649", -2147483649LL, ""}, 647 {"-2147483648-1", -2147483648LL, "-1"}, 648 {"-2147483649-1", -2147483649LL, "-1"}, 649 {"-9223372036854775808", -(9223372036854775807LL) - 1, ""}, 650 {"-9223372036854775808-1", -(9223372036854775807LL) - 1, "-1"}, 651 {"042", 34, ""}, 652 {"042-1", 34, "-1"}, 653 {"0x42", 66, ""}, 654 {"0x42-1", 66, "-1"}, 655 {"0b101010", 42, ""}, 656 {"0b101010-1", 42, "-1"}, 657 {"-042", -34, ""}, 658 {"-042-1", -34, "-1"}, 659 {"-0x42", -66, ""}, 660 {"-0x42-1", -66, "-1"}, 661 {"-0b101010", -42, ""}, 662 {"-0b101010-1", -42, "-1"}}; 663 664 TEST(StringRefTest, consumeIntegerUnsigned) { 665 uint8_t U8; 666 uint16_t U16; 667 uint32_t U32; 668 uint64_t U64; 669 670 for (size_t i = 0; i < array_lengthof(ConsumeUnsigned); ++i) { 671 StringRef Str = ConsumeUnsigned[i].Str; 672 bool U8Success = Str.consumeInteger(0, U8); 673 if (static_cast<uint8_t>(ConsumeUnsigned[i].Expected) == 674 ConsumeUnsigned[i].Expected) { 675 ASSERT_FALSE(U8Success); 676 EXPECT_EQ(U8, ConsumeUnsigned[i].Expected); 677 EXPECT_EQ(Str, ConsumeUnsigned[i].Leftover); 678 } else { 679 ASSERT_TRUE(U8Success); 680 } 681 682 Str = ConsumeUnsigned[i].Str; 683 bool U16Success = Str.consumeInteger(0, U16); 684 if (static_cast<uint16_t>(ConsumeUnsigned[i].Expected) == 685 ConsumeUnsigned[i].Expected) { 686 ASSERT_FALSE(U16Success); 687 EXPECT_EQ(U16, ConsumeUnsigned[i].Expected); 688 EXPECT_EQ(Str, ConsumeUnsigned[i].Leftover); 689 } else { 690 ASSERT_TRUE(U16Success); 691 } 692 693 Str = ConsumeUnsigned[i].Str; 694 bool U32Success = Str.consumeInteger(0, U32); 695 if (static_cast<uint32_t>(ConsumeUnsigned[i].Expected) == 696 ConsumeUnsigned[i].Expected) { 697 ASSERT_FALSE(U32Success); 698 EXPECT_EQ(U32, ConsumeUnsigned[i].Expected); 699 EXPECT_EQ(Str, ConsumeUnsigned[i].Leftover); 700 } else { 701 ASSERT_TRUE(U32Success); 702 } 703 704 Str = ConsumeUnsigned[i].Str; 705 bool U64Success = Str.consumeInteger(0, U64); 706 if (static_cast<uint64_t>(ConsumeUnsigned[i].Expected) == 707 ConsumeUnsigned[i].Expected) { 708 ASSERT_FALSE(U64Success); 709 EXPECT_EQ(U64, ConsumeUnsigned[i].Expected); 710 EXPECT_EQ(Str, ConsumeUnsigned[i].Leftover); 711 } else { 712 ASSERT_TRUE(U64Success); 713 } 714 } 715 } 716 717 TEST(StringRefTest, consumeIntegerSigned) { 718 int8_t S8; 719 int16_t S16; 720 int32_t S32; 721 int64_t S64; 722 723 for (size_t i = 0; i < array_lengthof(ConsumeSigned); ++i) { 724 StringRef Str = ConsumeSigned[i].Str; 725 bool S8Success = Str.consumeInteger(0, S8); 726 if (static_cast<int8_t>(ConsumeSigned[i].Expected) == 727 ConsumeSigned[i].Expected) { 728 ASSERT_FALSE(S8Success); 729 EXPECT_EQ(S8, ConsumeSigned[i].Expected); 730 EXPECT_EQ(Str, ConsumeSigned[i].Leftover); 731 } else { 732 ASSERT_TRUE(S8Success); 733 } 734 735 Str = ConsumeSigned[i].Str; 736 bool S16Success = Str.consumeInteger(0, S16); 737 if (static_cast<int16_t>(ConsumeSigned[i].Expected) == 738 ConsumeSigned[i].Expected) { 739 ASSERT_FALSE(S16Success); 740 EXPECT_EQ(S16, ConsumeSigned[i].Expected); 741 EXPECT_EQ(Str, ConsumeSigned[i].Leftover); 742 } else { 743 ASSERT_TRUE(S16Success); 744 } 745 746 Str = ConsumeSigned[i].Str; 747 bool S32Success = Str.consumeInteger(0, S32); 748 if (static_cast<int32_t>(ConsumeSigned[i].Expected) == 749 ConsumeSigned[i].Expected) { 750 ASSERT_FALSE(S32Success); 751 EXPECT_EQ(S32, ConsumeSigned[i].Expected); 752 EXPECT_EQ(Str, ConsumeSigned[i].Leftover); 753 } else { 754 ASSERT_TRUE(S32Success); 755 } 756 757 Str = ConsumeSigned[i].Str; 758 bool S64Success = Str.consumeInteger(0, S64); 759 if (static_cast<int64_t>(ConsumeSigned[i].Expected) == 760 ConsumeSigned[i].Expected) { 761 ASSERT_FALSE(S64Success); 762 EXPECT_EQ(S64, ConsumeSigned[i].Expected); 763 EXPECT_EQ(Str, ConsumeSigned[i].Leftover); 764 } else { 765 ASSERT_TRUE(S64Success); 766 } 767 } 768 } 769 770 static const char *join_input[] = { "a", "b", "c" }; 771 static const char join_result1[] = "a"; 772 static const char join_result2[] = "a:b:c"; 773 static const char join_result3[] = "a::b::c"; 774 775 TEST(StringRefTest, joinStrings) { 776 std::vector<StringRef> v1; 777 std::vector<std::string> v2; 778 for (size_t i = 0; i < array_lengthof(join_input); ++i) { 779 v1.push_back(join_input[i]); 780 v2.push_back(join_input[i]); 781 } 782 783 bool v1_join1 = join(v1.begin(), v1.begin() + 1, ":") == join_result1; 784 EXPECT_TRUE(v1_join1); 785 bool v1_join2 = join(v1.begin(), v1.end(), ":") == join_result2; 786 EXPECT_TRUE(v1_join2); 787 bool v1_join3 = join(v1.begin(), v1.end(), "::") == join_result3; 788 EXPECT_TRUE(v1_join3); 789 790 bool v2_join1 = join(v2.begin(), v2.begin() + 1, ":") == join_result1; 791 EXPECT_TRUE(v2_join1); 792 bool v2_join2 = join(v2.begin(), v2.end(), ":") == join_result2; 793 EXPECT_TRUE(v2_join2); 794 bool v2_join3 = join(v2.begin(), v2.end(), "::") == join_result3; 795 EXPECT_TRUE(v2_join3); 796 } 797 798 799 TEST(StringRefTest, AllocatorCopy) { 800 BumpPtrAllocator Alloc; 801 // First test empty strings. We don't want these to allocate anything on the 802 // allocator. 803 StringRef StrEmpty = ""; 804 StringRef StrEmptyc = StrEmpty.copy(Alloc); 805 EXPECT_TRUE(StrEmpty.equals(StrEmptyc)); 806 EXPECT_EQ(StrEmptyc.data(), nullptr); 807 EXPECT_EQ(StrEmptyc.size(), 0u); 808 EXPECT_EQ(Alloc.getTotalMemory(), 0u); 809 810 StringRef Str1 = "hello"; 811 StringRef Str2 = "bye"; 812 StringRef Str1c = Str1.copy(Alloc); 813 StringRef Str2c = Str2.copy(Alloc); 814 EXPECT_TRUE(Str1.equals(Str1c)); 815 EXPECT_NE(Str1.data(), Str1c.data()); 816 EXPECT_TRUE(Str2.equals(Str2c)); 817 EXPECT_NE(Str2.data(), Str2c.data()); 818 } 819 820 TEST(StringRefTest, Drop) { 821 StringRef Test("StringRefTest::Drop"); 822 823 StringRef Dropped = Test.drop_front(5); 824 EXPECT_EQ(Dropped, "gRefTest::Drop"); 825 826 Dropped = Test.drop_back(5); 827 EXPECT_EQ(Dropped, "StringRefTest:"); 828 829 Dropped = Test.drop_front(0); 830 EXPECT_EQ(Dropped, Test); 831 832 Dropped = Test.drop_back(0); 833 EXPECT_EQ(Dropped, Test); 834 835 Dropped = Test.drop_front(Test.size()); 836 EXPECT_TRUE(Dropped.empty()); 837 838 Dropped = Test.drop_back(Test.size()); 839 EXPECT_TRUE(Dropped.empty()); 840 } 841 842 TEST(StringRefTest, Take) { 843 StringRef Test("StringRefTest::Take"); 844 845 StringRef Taken = Test.take_front(5); 846 EXPECT_EQ(Taken, "Strin"); 847 848 Taken = Test.take_back(5); 849 EXPECT_EQ(Taken, ":Take"); 850 851 Taken = Test.take_front(Test.size()); 852 EXPECT_EQ(Taken, Test); 853 854 Taken = Test.take_back(Test.size()); 855 EXPECT_EQ(Taken, Test); 856 857 Taken = Test.take_front(0); 858 EXPECT_TRUE(Taken.empty()); 859 860 Taken = Test.take_back(0); 861 EXPECT_TRUE(Taken.empty()); 862 } 863 864 } // end anonymous namespace 865