| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include <string> | 5 #include <string> |
| 6 | 6 |
| 7 #include "base/string16.h" | 7 #include "base/string16.h" |
| 8 #include "base/string_piece.h" | 8 #include "base/string_piece.h" |
| 9 #include "base/utf_string_conversions.h" | 9 #include "base/utf_string_conversions.h" |
| 10 #include "testing/gtest/include/gtest/gtest.h" | 10 #include "testing/gtest/include/gtest/gtest.h" |
| 11 | 11 |
| 12 namespace base { | 12 namespace base { |
| 13 | 13 |
| 14 template <typename T> | 14 TEST(StringPieceTest, CheckComparisonOperators) { |
| 15 class CommonStringPieceTest : public ::testing::Test { | 15 #define CMP_Y(op, x, y) \ |
| 16 public: | 16 ASSERT_TRUE( (StringPiece((x)) op StringPiece((y)))); \ |
| 17 static const T as_string(const char* input) { | 17 ASSERT_TRUE( (StringPiece((x)).compare(StringPiece((y))) op 0)) |
| 18 return T(input); | |
| 19 } | |
| 20 static const T& as_string(const T& input) { | |
| 21 return input; | |
| 22 } | |
| 23 }; | |
| 24 | 18 |
| 25 template <> | 19 #define CMP_N(op, x, y) \ |
| 26 class CommonStringPieceTest<string16> : public ::testing::Test { | 20 ASSERT_FALSE(StringPiece((x)) op StringPiece((y))); \ |
| 27 public: | 21 ASSERT_FALSE(StringPiece((x)).compare(StringPiece((y))) op 0) |
| 28 static const string16 as_string(const char* input) { | |
| 29 return ASCIIToUTF16(input); | |
| 30 } | |
| 31 static const string16 as_string(const std::string& input) { | |
| 32 return ASCIIToUTF16(input); | |
| 33 } | |
| 34 }; | |
| 35 | |
| 36 typedef ::testing::Types<std::string, string16> SupportedStringTypes; | |
| 37 | |
| 38 TYPED_TEST_CASE(CommonStringPieceTest, SupportedStringTypes); | |
| 39 | |
| 40 TYPED_TEST(CommonStringPieceTest, CheckComparisonOperators) { | |
| 41 #define CMP_Y(op, x, y) \ | |
| 42 { \ | |
| 43 TypeParam lhs(TestFixture::as_string(x)); \ | |
| 44 TypeParam rhs(TestFixture::as_string(y)); \ | |
| 45 ASSERT_TRUE( (BasicStringPiece<TypeParam>((lhs.c_str())) op \ | |
| 46 BasicStringPiece<TypeParam>((rhs.c_str())))); \ | |
| 47 ASSERT_TRUE( (BasicStringPiece<TypeParam>((lhs.c_str())).compare( \ | |
| 48 BasicStringPiece<TypeParam>((rhs.c_str()))) op 0)); \ | |
| 49 } | |
| 50 | |
| 51 #define CMP_N(op, x, y) \ | |
| 52 { \ | |
| 53 TypeParam lhs(TestFixture::as_string(x)); \ | |
| 54 TypeParam rhs(TestFixture::as_string(y)); \ | |
| 55 ASSERT_FALSE( (BasicStringPiece<TypeParam>((lhs.c_str())) op \ | |
| 56 BasicStringPiece<TypeParam>((rhs.c_str())))); \ | |
| 57 ASSERT_FALSE( (BasicStringPiece<TypeParam>((lhs.c_str())).compare( \ | |
| 58 BasicStringPiece<TypeParam>((rhs.c_str()))) op 0)); \ | |
| 59 } | |
| 60 | 22 |
| 61 CMP_Y(==, "", ""); | 23 CMP_Y(==, "", ""); |
| 62 CMP_Y(==, "a", "a"); | 24 CMP_Y(==, "a", "a"); |
| 63 CMP_Y(==, "aa", "aa"); | 25 CMP_Y(==, "aa", "aa"); |
| 64 CMP_N(==, "a", ""); | 26 CMP_N(==, "a", ""); |
| 65 CMP_N(==, "", "a"); | 27 CMP_N(==, "", "a"); |
| 66 CMP_N(==, "a", "b"); | 28 CMP_N(==, "a", "b"); |
| 67 CMP_N(==, "a", "aa"); | 29 CMP_N(==, "a", "aa"); |
| 68 CMP_N(==, "aa", "a"); | 30 CMP_N(==, "aa", "a"); |
| 69 | 31 |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 125 std::string z = x; | 87 std::string z = x; |
| 126 z[j] = 'b'; // Differs in position 'j' | 88 z[j] = 'b'; // Differs in position 'j' |
| 127 CMP_N(==, x, z); | 89 CMP_N(==, x, z); |
| 128 } | 90 } |
| 129 } | 91 } |
| 130 | 92 |
| 131 #undef CMP_Y | 93 #undef CMP_Y |
| 132 #undef CMP_N | 94 #undef CMP_N |
| 133 } | 95 } |
| 134 | 96 |
| 135 TYPED_TEST(CommonStringPieceTest, CheckSTL) { | 97 TEST(StringPieceTest, CheckSTL) { |
| 136 TypeParam alphabet(TestFixture::as_string("abcdefghijklmnopqrstuvwxyz")); | 98 StringPiece a("abcdefghijklmnopqrstuvwxyz"); |
| 137 TypeParam abc(TestFixture::as_string("abc")); | 99 StringPiece b("abc"); |
| 138 TypeParam xyz(TestFixture::as_string("xyz")); | 100 StringPiece c("xyz"); |
| 139 TypeParam foobar(TestFixture::as_string("foobar")); | 101 StringPiece d("foobar"); |
| 102 StringPiece e; |
| 103 std::string temp("123"); |
| 104 temp += '\0'; |
| 105 temp += "456"; |
| 106 StringPiece f(temp); |
| 140 | 107 |
| 141 BasicStringPiece<TypeParam> a(alphabet); | 108 ASSERT_EQ(a[6], 'g'); |
| 142 BasicStringPiece<TypeParam> b(abc); | 109 ASSERT_EQ(b[0], 'a'); |
| 143 BasicStringPiece<TypeParam> c(xyz); | 110 ASSERT_EQ(c[2], 'z'); |
| 144 BasicStringPiece<TypeParam> d(foobar); | 111 ASSERT_EQ(f[3], '\0'); |
| 145 BasicStringPiece<TypeParam> e; | 112 ASSERT_EQ(f[5], '5'); |
| 146 TypeParam temp(TestFixture::as_string("123")); | |
| 147 temp += static_cast<typename TypeParam::value_type>(0); | |
| 148 temp += TestFixture::as_string("456"); | |
| 149 BasicStringPiece<TypeParam> f(temp); | |
| 150 | 113 |
| 151 ASSERT_EQ(a[6], static_cast<typename TypeParam::value_type>('g')); | 114 ASSERT_EQ(*d.data(), 'f'); |
| 152 ASSERT_EQ(b[0], static_cast<typename TypeParam::value_type>('a')); | 115 ASSERT_EQ(d.data()[5], 'r'); |
| 153 ASSERT_EQ(c[2], static_cast<typename TypeParam::value_type>('z')); | |
| 154 ASSERT_EQ(f[3], static_cast<typename TypeParam::value_type>('\0')); | |
| 155 ASSERT_EQ(f[5], static_cast<typename TypeParam::value_type>('5')); | |
| 156 | |
| 157 ASSERT_EQ(*d.data(), static_cast<typename TypeParam::value_type>('f')); | |
| 158 ASSERT_EQ(d.data()[5], static_cast<typename TypeParam::value_type>('r')); | |
| 159 ASSERT_TRUE(e.data() == NULL); | 116 ASSERT_TRUE(e.data() == NULL); |
| 160 | 117 |
| 161 ASSERT_EQ(*a.begin(), static_cast<typename TypeParam::value_type>('a')); | 118 ASSERT_EQ(*a.begin(), 'a'); |
| 162 ASSERT_EQ(*(b.begin() + 2), static_cast<typename TypeParam::value_type>('c')); | 119 ASSERT_EQ(*(b.begin() + 2), 'c'); |
| 163 ASSERT_EQ(*(c.end() - 1), static_cast<typename TypeParam::value_type>('z')); | 120 ASSERT_EQ(*(c.end() - 1), 'z'); |
| 164 | 121 |
| 165 ASSERT_EQ(*a.rbegin(), static_cast<typename TypeParam::value_type>('z')); | 122 ASSERT_EQ(*a.rbegin(), 'z'); |
| 166 ASSERT_EQ(*(b.rbegin() + 2), | 123 ASSERT_EQ(*(b.rbegin() + 2), 'a'); |
| 167 static_cast<typename TypeParam::value_type>('a')); | 124 ASSERT_EQ(*(c.rend() - 1), 'x'); |
| 168 ASSERT_EQ(*(c.rend() - 1), static_cast<typename TypeParam::value_type>('x')); | |
| 169 ASSERT_TRUE(a.rbegin() + 26 == a.rend()); | 125 ASSERT_TRUE(a.rbegin() + 26 == a.rend()); |
| 170 | 126 |
| 171 ASSERT_EQ(a.size(), 26U); | 127 ASSERT_EQ(a.size(), 26U); |
| 172 ASSERT_EQ(b.size(), 3U); | 128 ASSERT_EQ(b.size(), 3U); |
| 173 ASSERT_EQ(c.size(), 3U); | 129 ASSERT_EQ(c.size(), 3U); |
| 174 ASSERT_EQ(d.size(), 6U); | 130 ASSERT_EQ(d.size(), 6U); |
| 175 ASSERT_EQ(e.size(), 0U); | 131 ASSERT_EQ(e.size(), 0U); |
| 176 ASSERT_EQ(f.size(), 7U); | 132 ASSERT_EQ(f.size(), 7U); |
| 177 | 133 |
| 178 ASSERT_TRUE(!d.empty()); | 134 ASSERT_TRUE(!d.empty()); |
| 179 ASSERT_TRUE(d.begin() != d.end()); | 135 ASSERT_TRUE(d.begin() != d.end()); |
| 180 ASSERT_TRUE(d.begin() + 6 == d.end()); | 136 ASSERT_TRUE(d.begin() + 6 == d.end()); |
| 181 | 137 |
| 182 ASSERT_TRUE(e.empty()); | 138 ASSERT_TRUE(e.empty()); |
| 183 ASSERT_TRUE(e.begin() == e.end()); | 139 ASSERT_TRUE(e.begin() == e.end()); |
| 184 | 140 |
| 185 d.clear(); | 141 d.clear(); |
| 186 ASSERT_EQ(d.size(), 0U); | 142 ASSERT_EQ(d.size(), 0U); |
| 187 ASSERT_TRUE(d.empty()); | 143 ASSERT_TRUE(d.empty()); |
| 188 ASSERT_TRUE(d.data() == NULL); | 144 ASSERT_TRUE(d.data() == NULL); |
| 189 ASSERT_TRUE(d.begin() == d.end()); | 145 ASSERT_TRUE(d.begin() == d.end()); |
| 190 | 146 |
| 191 ASSERT_GE(a.max_size(), a.capacity()); | 147 ASSERT_GE(a.max_size(), a.capacity()); |
| 192 ASSERT_GE(a.capacity(), a.size()); | 148 ASSERT_GE(a.capacity(), a.size()); |
| 193 } | |
| 194 | |
| 195 // STL stuff only supported by the std::string version | |
| 196 TEST(StringPieceTest, CheckSTL) { | |
| 197 StringPiece a("abcdefghijklmnopqrstuvwxyz"); | |
| 198 StringPiece b("abc"); | |
| 199 StringPiece c("xyz"); | |
| 200 StringPiece d("foobar"); | |
| 201 d.clear(); | |
| 202 StringPiece e; | |
| 203 std::string temp("123"); | |
| 204 temp += '\0'; | |
| 205 temp += "456"; | |
| 206 StringPiece f(temp); | |
| 207 | 149 |
| 208 char buf[4] = { '%', '%', '%', '%' }; | 150 char buf[4] = { '%', '%', '%', '%' }; |
| 209 ASSERT_EQ(a.copy(buf, 4), 4U); | 151 ASSERT_EQ(a.copy(buf, 4), 4U); |
| 210 ASSERT_EQ(buf[0], a[0]); | 152 ASSERT_EQ(buf[0], a[0]); |
| 211 ASSERT_EQ(buf[1], a[1]); | 153 ASSERT_EQ(buf[1], a[1]); |
| 212 ASSERT_EQ(buf[2], a[2]); | 154 ASSERT_EQ(buf[2], a[2]); |
| 213 ASSERT_EQ(buf[3], a[3]); | 155 ASSERT_EQ(buf[3], a[3]); |
| 214 ASSERT_EQ(a.copy(buf, 3, 7), 3U); | 156 ASSERT_EQ(a.copy(buf, 3, 7), 3U); |
| 215 ASSERT_EQ(buf[0], a[7]); | 157 ASSERT_EQ(buf[0], a[7]); |
| 216 ASSERT_EQ(buf[1], a[8]); | 158 ASSERT_EQ(buf[1], a[8]); |
| (...skipping 234 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 451 ASSERT_EQ(a.substr(23, 99), c); | 393 ASSERT_EQ(a.substr(23, 99), c); |
| 452 ASSERT_EQ(a.substr(0), a); | 394 ASSERT_EQ(a.substr(0), a); |
| 453 ASSERT_EQ(a.substr(3, 2), "de"); | 395 ASSERT_EQ(a.substr(3, 2), "de"); |
| 454 // empty string nonsense | 396 // empty string nonsense |
| 455 ASSERT_EQ(a.substr(99, 2), e); | 397 ASSERT_EQ(a.substr(99, 2), e); |
| 456 ASSERT_EQ(d.substr(99), e); | 398 ASSERT_EQ(d.substr(99), e); |
| 457 ASSERT_EQ(d.substr(0, 99), e); | 399 ASSERT_EQ(d.substr(0, 99), e); |
| 458 ASSERT_EQ(d.substr(99, 99), e); | 400 ASSERT_EQ(d.substr(99, 99), e); |
| 459 } | 401 } |
| 460 | 402 |
| 461 TYPED_TEST(CommonStringPieceTest, CheckCustom) { | |
| 462 TypeParam foobar(TestFixture::as_string("foobar")); | |
| 463 BasicStringPiece<TypeParam> a(foobar); | |
| 464 TypeParam s1(TestFixture::as_string("123")); | |
| 465 s1 += static_cast<typename TypeParam::value_type>('\0'); | |
| 466 s1 += TestFixture::as_string("456"); | |
| 467 BasicStringPiece<TypeParam> b(s1); | |
| 468 BasicStringPiece<TypeParam> e; | |
| 469 TypeParam s2; | |
| 470 | |
| 471 // remove_prefix | |
| 472 BasicStringPiece<TypeParam> c(a); | |
| 473 c.remove_prefix(3); | |
| 474 ASSERT_EQ(c, TestFixture::as_string("bar")); | |
| 475 c = a; | |
| 476 c.remove_prefix(0); | |
| 477 ASSERT_EQ(c, a); | |
| 478 c.remove_prefix(c.size()); | |
| 479 ASSERT_EQ(c, e); | |
| 480 | |
| 481 // remove_suffix | |
| 482 c = a; | |
| 483 c.remove_suffix(3); | |
| 484 ASSERT_EQ(c, TestFixture::as_string("foo")); | |
| 485 c = a; | |
| 486 c.remove_suffix(0); | |
| 487 ASSERT_EQ(c, a); | |
| 488 c.remove_suffix(c.size()); | |
| 489 ASSERT_EQ(c, e); | |
| 490 | |
| 491 // set | |
| 492 c.set(foobar.c_str()); | |
| 493 ASSERT_EQ(c, a); | |
| 494 c.set(foobar.c_str(), 6); | |
| 495 ASSERT_EQ(c, a); | |
| 496 c.set(foobar.c_str(), 0); | |
| 497 ASSERT_EQ(c, e); | |
| 498 c.set(foobar.c_str(), 7); // Note, has an embedded NULL | |
| 499 ASSERT_NE(c, a); | |
| 500 | |
| 501 // as_string | |
| 502 TypeParam s3(a.as_string().c_str(), 7); // Note, has an embedded NULL | |
| 503 ASSERT_TRUE(c == s3); | |
| 504 TypeParam s4(e.as_string()); | |
| 505 ASSERT_TRUE(s4.empty()); | |
| 506 } | |
| 507 | |
| 508 TEST(StringPieceTest, CheckCustom) { | 403 TEST(StringPieceTest, CheckCustom) { |
| 509 StringPiece a("foobar"); | 404 StringPiece a("foobar"); |
| 510 std::string s1("123"); | 405 std::string s1("123"); |
| 511 s1 += '\0'; | 406 s1 += '\0'; |
| 512 s1 += "456"; | 407 s1 += "456"; |
| 513 StringPiece b(s1); | 408 StringPiece b(s1); |
| 514 StringPiece e; | 409 StringPiece e; |
| 515 std::string s2; | 410 std::string s2; |
| 516 | 411 |
| 517 // CopyToString | 412 // CopyToString |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 550 ASSERT_TRUE(a.ends_with("bar")); | 445 ASSERT_TRUE(a.ends_with("bar")); |
| 551 ASSERT_TRUE(a.ends_with(e)); | 446 ASSERT_TRUE(a.ends_with(e)); |
| 552 ASSERT_TRUE(b.ends_with(s1)); | 447 ASSERT_TRUE(b.ends_with(s1)); |
| 553 ASSERT_TRUE(b.ends_with(b)); | 448 ASSERT_TRUE(b.ends_with(b)); |
| 554 ASSERT_TRUE(b.ends_with(e)); | 449 ASSERT_TRUE(b.ends_with(e)); |
| 555 ASSERT_TRUE(e.ends_with("")); | 450 ASSERT_TRUE(e.ends_with("")); |
| 556 ASSERT_TRUE(!a.ends_with(b)); | 451 ASSERT_TRUE(!a.ends_with(b)); |
| 557 ASSERT_TRUE(!b.ends_with(a)); | 452 ASSERT_TRUE(!b.ends_with(a)); |
| 558 ASSERT_TRUE(!e.ends_with(a)); | 453 ASSERT_TRUE(!e.ends_with(a)); |
| 559 | 454 |
| 560 StringPiece c; | 455 // remove_prefix |
| 456 StringPiece c(a); |
| 457 c.remove_prefix(3); |
| 458 ASSERT_EQ(c, "bar"); |
| 459 c = a; |
| 460 c.remove_prefix(0); |
| 461 ASSERT_EQ(c, a); |
| 462 c.remove_prefix(c.size()); |
| 463 ASSERT_EQ(c, e); |
| 464 |
| 465 // remove_suffix |
| 466 c = a; |
| 467 c.remove_suffix(3); |
| 468 ASSERT_EQ(c, "foo"); |
| 469 c = a; |
| 470 c.remove_suffix(0); |
| 471 ASSERT_EQ(c, a); |
| 472 c.remove_suffix(c.size()); |
| 473 ASSERT_EQ(c, e); |
| 474 |
| 475 // set |
| 476 c.set("foobar", 6); |
| 477 ASSERT_EQ(c, a); |
| 478 c.set("foobar", 0); |
| 479 ASSERT_EQ(c, e); |
| 480 c.set("foobar", 7); |
| 481 ASSERT_NE(c, a); |
| 482 |
| 483 c.set("foobar"); |
| 484 ASSERT_EQ(c, a); |
| 485 |
| 561 c.set(static_cast<const void*>("foobar"), 6); | 486 c.set(static_cast<const void*>("foobar"), 6); |
| 562 ASSERT_EQ(c, a); | 487 ASSERT_EQ(c, a); |
| 563 c.set(static_cast<const void*>("foobar"), 0); | 488 c.set(static_cast<const void*>("foobar"), 0); |
| 564 ASSERT_EQ(c, e); | 489 ASSERT_EQ(c, e); |
| 565 c.set(static_cast<const void*>("foobar"), 7); | 490 c.set(static_cast<const void*>("foobar"), 7); |
| 566 ASSERT_NE(c, a); | 491 ASSERT_NE(c, a); |
| 492 |
| 493 // as_string |
| 494 std::string s3(a.as_string().c_str(), 7); |
| 495 ASSERT_EQ(c, s3); |
| 496 std::string s4(e.as_string()); |
| 497 ASSERT_TRUE(s4.empty()); |
| 567 } | 498 } |
| 568 | 499 |
| 569 TYPED_TEST(CommonStringPieceTest, CheckNULL) { | 500 TEST(StringPieceTest, CheckNULL) { |
| 570 // we used to crash here, but now we don't. | 501 // we used to crash here, but now we don't. |
| 571 BasicStringPiece<TypeParam> s(NULL); | 502 StringPiece s(NULL); |
| 572 ASSERT_EQ(s.data(), (const typename TypeParam::value_type*)NULL); | 503 ASSERT_EQ(s.data(), (const char*)NULL); |
| 573 ASSERT_EQ(s.size(), 0U); | 504 ASSERT_EQ(s.size(), 0U); |
| 574 | 505 |
| 575 s.set(NULL); | 506 s.set(NULL); |
| 576 ASSERT_EQ(s.data(), (const typename TypeParam::value_type*)NULL); | 507 ASSERT_EQ(s.data(), (const char*)NULL); |
| 577 ASSERT_EQ(s.size(), 0U); | 508 ASSERT_EQ(s.size(), 0U); |
| 578 | |
| 579 TypeParam str = s.as_string(); | |
| 580 ASSERT_EQ(str.length(), 0U); | |
| 581 ASSERT_EQ(str, TypeParam()); | |
| 582 } | 509 } |
| 583 | 510 |
| 584 TYPED_TEST(CommonStringPieceTest, CheckComparisons2) { | |
| 585 TypeParam alphabet(TestFixture::as_string("abcdefghijklmnopqrstuvwxyz")); | |
| 586 TypeParam alphabet_z(TestFixture::as_string("abcdefghijklmnopqrstuvwxyzz")); | |
| 587 TypeParam alphabet_y(TestFixture::as_string("abcdefghijklmnopqrstuvwxyy")); | |
| 588 BasicStringPiece<TypeParam> abc(alphabet); | |
| 589 | |
| 590 // check comparison operations on strings longer than 4 bytes. | |
| 591 ASSERT_TRUE(abc == BasicStringPiece<TypeParam>(alphabet)); | |
| 592 ASSERT_TRUE(abc.compare(BasicStringPiece<TypeParam>(alphabet)) == 0); | |
| 593 | |
| 594 ASSERT_TRUE(abc < BasicStringPiece<TypeParam>(alphabet_z)); | |
| 595 ASSERT_TRUE(abc.compare(BasicStringPiece<TypeParam>(alphabet_z)) < 0); | |
| 596 | |
| 597 ASSERT_TRUE(abc > BasicStringPiece<TypeParam>(alphabet_y)); | |
| 598 ASSERT_TRUE(abc.compare(BasicStringPiece<TypeParam>(alphabet_y)) > 0); | |
| 599 } | |
| 600 | |
| 601 // Test operations only supported by std::string version. | |
| 602 TEST(StringPieceTest, CheckComparisons2) { | 511 TEST(StringPieceTest, CheckComparisons2) { |
| 603 StringPiece abc("abcdefghijklmnopqrstuvwxyz"); | 512 StringPiece abc("abcdefghijklmnopqrstuvwxyz"); |
| 604 | 513 |
| 514 // check comparison operations on strings longer than 4 bytes. |
| 515 ASSERT_TRUE(abc == StringPiece("abcdefghijklmnopqrstuvwxyz")); |
| 516 ASSERT_TRUE(abc.compare(StringPiece("abcdefghijklmnopqrstuvwxyz")) == 0); |
| 517 |
| 518 ASSERT_TRUE(abc < StringPiece("abcdefghijklmnopqrstuvwxzz")); |
| 519 ASSERT_TRUE(abc.compare(StringPiece("abcdefghijklmnopqrstuvwxzz")) < 0); |
| 520 |
| 521 ASSERT_TRUE(abc > StringPiece("abcdefghijklmnopqrstuvwxyy")); |
| 522 ASSERT_TRUE(abc.compare(StringPiece("abcdefghijklmnopqrstuvwxyy")) > 0); |
| 523 |
| 605 // starts_with | 524 // starts_with |
| 606 ASSERT_TRUE(abc.starts_with(abc)); | 525 ASSERT_TRUE(abc.starts_with(abc)); |
| 607 ASSERT_TRUE(abc.starts_with("abcdefghijklm")); | 526 ASSERT_TRUE(abc.starts_with("abcdefghijklm")); |
| 608 ASSERT_TRUE(!abc.starts_with("abcdefguvwxyz")); | 527 ASSERT_TRUE(!abc.starts_with("abcdefguvwxyz")); |
| 609 | 528 |
| 610 // ends_with | 529 // ends_with |
| 611 ASSERT_TRUE(abc.ends_with(abc)); | 530 ASSERT_TRUE(abc.ends_with(abc)); |
| 612 ASSERT_TRUE(!abc.ends_with("abcdefguvwxyz")); | 531 ASSERT_TRUE(!abc.ends_with("abcdefguvwxyz")); |
| 613 ASSERT_TRUE(abc.ends_with("nopqrstuvwxyz")); | 532 ASSERT_TRUE(abc.ends_with("nopqrstuvwxyz")); |
| 614 } | 533 } |
| 615 | 534 |
| 616 TYPED_TEST(CommonStringPieceTest, StringCompareNotAmbiguous) { | 535 TEST(StringPieceTest, StringCompareNotAmbiguous) { |
| 617 ASSERT_TRUE(TestFixture::as_string("hello").c_str() == | 536 ASSERT_TRUE("hello" == std::string("hello")); |
| 618 TestFixture::as_string("hello")); | 537 ASSERT_TRUE("hello" < std::string("world")); |
| 619 ASSERT_TRUE(TestFixture::as_string("hello").c_str() < | |
| 620 TestFixture::as_string("world")); | |
| 621 } | 538 } |
| 622 | 539 |
| 623 TYPED_TEST(CommonStringPieceTest, HeterogenousStringPieceEquals) { | 540 TEST(StringPieceTest, HeterogenousStringPieceEquals) { |
| 624 TypeParam hello(TestFixture::as_string("hello")); | 541 ASSERT_TRUE(StringPiece("hello") == std::string("hello")); |
| 625 | 542 ASSERT_TRUE("hello" == StringPiece("hello")); |
| 626 ASSERT_TRUE(BasicStringPiece<TypeParam>(hello) == hello); | |
| 627 ASSERT_TRUE(hello.c_str() == BasicStringPiece<TypeParam>(hello)); | |
| 628 } | 543 } |
| 629 | 544 |
| 630 // string16-specific stuff | 545 TEST(StringPiece16Test, CheckComparisonOperators) { |
| 546 ASSERT_TRUE(StringPiece16(string16()) == |
| 547 StringPiece16(string16())); |
| 548 ASSERT_TRUE(StringPiece16(ASCIIToUTF16("a")) == |
| 549 StringPiece16(ASCIIToUTF16("a"))); |
| 550 ASSERT_TRUE(StringPiece16(ASCIIToUTF16("aa")) == |
| 551 StringPiece16(ASCIIToUTF16("aa"))); |
| 552 ASSERT_FALSE(StringPiece16(ASCIIToUTF16("a")) == |
| 553 StringPiece16(string16())); |
| 554 ASSERT_FALSE(StringPiece16(string16()) == |
| 555 StringPiece16(ASCIIToUTF16("a"))); |
| 556 ASSERT_FALSE(StringPiece16(ASCIIToUTF16("a")) == |
| 557 StringPiece16(ASCIIToUTF16("b"))); |
| 558 ASSERT_FALSE(StringPiece16(ASCIIToUTF16("a")) == |
| 559 StringPiece16(ASCIIToUTF16("aa"))); |
| 560 ASSERT_FALSE(StringPiece16(ASCIIToUTF16("aa")) == |
| 561 StringPiece16(ASCIIToUTF16("a"))); |
| 562 |
| 563 ASSERT_FALSE(StringPiece16(string16()) != |
| 564 StringPiece16(string16())); |
| 565 ASSERT_FALSE(StringPiece16(ASCIIToUTF16("a")) != |
| 566 StringPiece16(ASCIIToUTF16("a"))); |
| 567 ASSERT_FALSE(StringPiece16(ASCIIToUTF16("aa")) != |
| 568 StringPiece16(ASCIIToUTF16("aa"))); |
| 569 ASSERT_TRUE(StringPiece16(ASCIIToUTF16("a")) != |
| 570 StringPiece16(string16())); |
| 571 ASSERT_TRUE(StringPiece16(string16()) != |
| 572 StringPiece16(ASCIIToUTF16("a"))); |
| 573 ASSERT_TRUE(StringPiece16(ASCIIToUTF16("a")) != |
| 574 StringPiece16(ASCIIToUTF16("b"))); |
| 575 ASSERT_TRUE(StringPiece16(ASCIIToUTF16("a")) != |
| 576 StringPiece16(ASCIIToUTF16("aa"))); |
| 577 ASSERT_TRUE(StringPiece16(ASCIIToUTF16("aa")) != |
| 578 StringPiece16(ASCIIToUTF16("a"))); |
| 579 |
| 580 ASSERT_TRUE(StringPiece16(ASCIIToUTF16("a")) < |
| 581 StringPiece16(ASCIIToUTF16("b"))); |
| 582 ASSERT_TRUE(StringPiece16(ASCIIToUTF16("a")) < |
| 583 StringPiece16(ASCIIToUTF16("aa"))); |
| 584 ASSERT_TRUE(StringPiece16(ASCIIToUTF16("aa")) < |
| 585 StringPiece16(ASCIIToUTF16("b"))); |
| 586 ASSERT_TRUE(StringPiece16(ASCIIToUTF16("aa")) < |
| 587 StringPiece16(ASCIIToUTF16("bb"))); |
| 588 ASSERT_FALSE(StringPiece16(ASCIIToUTF16("a")) < |
| 589 StringPiece16(ASCIIToUTF16("a"))); |
| 590 ASSERT_FALSE(StringPiece16(ASCIIToUTF16("b")) < |
| 591 StringPiece16(ASCIIToUTF16("a"))); |
| 592 ASSERT_FALSE(StringPiece16(ASCIIToUTF16("aa")) < |
| 593 StringPiece16(ASCIIToUTF16("a"))); |
| 594 ASSERT_FALSE(StringPiece16(ASCIIToUTF16("b")) < |
| 595 StringPiece16(ASCIIToUTF16("aa"))); |
| 596 ASSERT_FALSE(StringPiece16(ASCIIToUTF16("bb")) < |
| 597 StringPiece16(ASCIIToUTF16("aa"))); |
| 598 |
| 599 ASSERT_TRUE(StringPiece16(ASCIIToUTF16("a")) <= |
| 600 StringPiece16(ASCIIToUTF16("a"))); |
| 601 ASSERT_TRUE(StringPiece16(ASCIIToUTF16("a")) <= |
| 602 StringPiece16(ASCIIToUTF16("b"))); |
| 603 ASSERT_TRUE(StringPiece16(ASCIIToUTF16("a")) <= |
| 604 StringPiece16(ASCIIToUTF16("aa"))); |
| 605 ASSERT_TRUE(StringPiece16(ASCIIToUTF16("aa")) <= |
| 606 StringPiece16(ASCIIToUTF16("b"))); |
| 607 ASSERT_TRUE(StringPiece16(ASCIIToUTF16("aa")) <= |
| 608 StringPiece16(ASCIIToUTF16("bb"))); |
| 609 ASSERT_FALSE(StringPiece16(ASCIIToUTF16("b")) <= |
| 610 StringPiece16(ASCIIToUTF16("a"))); |
| 611 ASSERT_FALSE(StringPiece16(ASCIIToUTF16("aa")) <= |
| 612 StringPiece16(ASCIIToUTF16("a"))); |
| 613 ASSERT_FALSE(StringPiece16(ASCIIToUTF16("b")) <= |
| 614 StringPiece16(ASCIIToUTF16("aa"))); |
| 615 ASSERT_FALSE(StringPiece16(ASCIIToUTF16("bb")) <= |
| 616 StringPiece16(ASCIIToUTF16("aa"))); |
| 617 |
| 618 ASSERT_TRUE(StringPiece16(ASCIIToUTF16("a")) <= |
| 619 StringPiece16(ASCIIToUTF16("a"))); |
| 620 ASSERT_TRUE(StringPiece16(ASCIIToUTF16("a")) <= |
| 621 StringPiece16(ASCIIToUTF16("b"))); |
| 622 ASSERT_TRUE(StringPiece16(ASCIIToUTF16("a")) <= |
| 623 StringPiece16(ASCIIToUTF16("aa"))); |
| 624 ASSERT_TRUE(StringPiece16(ASCIIToUTF16("aa")) <= |
| 625 StringPiece16(ASCIIToUTF16("b"))); |
| 626 ASSERT_TRUE(StringPiece16(ASCIIToUTF16("aa")) <= |
| 627 StringPiece16(ASCIIToUTF16("bb"))); |
| 628 ASSERT_FALSE(StringPiece16(ASCIIToUTF16("b")) <= |
| 629 StringPiece16(ASCIIToUTF16("a"))); |
| 630 ASSERT_FALSE(StringPiece16(ASCIIToUTF16("aa")) <= |
| 631 StringPiece16(ASCIIToUTF16("a"))); |
| 632 ASSERT_FALSE(StringPiece16(ASCIIToUTF16("b")) <= |
| 633 StringPiece16(ASCIIToUTF16("aa"))); |
| 634 ASSERT_FALSE(StringPiece16(ASCIIToUTF16("bb")) <= |
| 635 StringPiece16(ASCIIToUTF16("aa"))); |
| 636 |
| 637 ASSERT_FALSE(StringPiece16(ASCIIToUTF16("a")) >= |
| 638 StringPiece16(ASCIIToUTF16("b"))); |
| 639 ASSERT_FALSE(StringPiece16(ASCIIToUTF16("a")) >= |
| 640 StringPiece16(ASCIIToUTF16("aa"))); |
| 641 ASSERT_FALSE(StringPiece16(ASCIIToUTF16("aa")) >= |
| 642 StringPiece16(ASCIIToUTF16("b"))); |
| 643 ASSERT_FALSE(StringPiece16(ASCIIToUTF16("aa")) >= |
| 644 StringPiece16(ASCIIToUTF16("bb"))); |
| 645 ASSERT_TRUE(StringPiece16(ASCIIToUTF16("a")) >= |
| 646 StringPiece16(ASCIIToUTF16("a"))); |
| 647 ASSERT_TRUE(StringPiece16(ASCIIToUTF16("b")) >= |
| 648 StringPiece16(ASCIIToUTF16("a"))); |
| 649 ASSERT_TRUE(StringPiece16(ASCIIToUTF16("aa")) >= |
| 650 StringPiece16(ASCIIToUTF16("a"))); |
| 651 ASSERT_TRUE(StringPiece16(ASCIIToUTF16("b")) >= |
| 652 StringPiece16(ASCIIToUTF16("aa"))); |
| 653 ASSERT_TRUE(StringPiece16(ASCIIToUTF16("bb")) >= |
| 654 StringPiece16(ASCIIToUTF16("aa"))); |
| 655 |
| 656 ASSERT_FALSE(StringPiece16(ASCIIToUTF16("a")) > |
| 657 StringPiece16(ASCIIToUTF16("a"))); |
| 658 ASSERT_FALSE(StringPiece16(ASCIIToUTF16("a")) > |
| 659 StringPiece16(ASCIIToUTF16("b"))); |
| 660 ASSERT_FALSE(StringPiece16(ASCIIToUTF16("a")) > |
| 661 StringPiece16(ASCIIToUTF16("aa"))); |
| 662 ASSERT_FALSE(StringPiece16(ASCIIToUTF16("aa")) > |
| 663 StringPiece16(ASCIIToUTF16("b"))); |
| 664 ASSERT_FALSE(StringPiece16(ASCIIToUTF16("aa")) > |
| 665 StringPiece16(ASCIIToUTF16("bb"))); |
| 666 ASSERT_TRUE(StringPiece16(ASCIIToUTF16("b")) > |
| 667 StringPiece16(ASCIIToUTF16("a"))); |
| 668 ASSERT_TRUE(StringPiece16(ASCIIToUTF16("aa")) > |
| 669 StringPiece16(ASCIIToUTF16("a"))); |
| 670 ASSERT_TRUE(StringPiece16(ASCIIToUTF16("b")) > |
| 671 StringPiece16(ASCIIToUTF16("aa"))); |
| 672 ASSERT_TRUE(StringPiece16(ASCIIToUTF16("bb")) > |
| 673 StringPiece16(ASCIIToUTF16("aa"))); |
| 674 |
| 675 string16 x; |
| 676 for (int i = 0; i < 256; i++) { |
| 677 x += 'a'; |
| 678 string16 y = x; |
| 679 ASSERT_EQ(StringPiece16(x), StringPiece16(y)); |
| 680 for (int j = 0; j < i; j++) { |
| 681 string16 z = x; |
| 682 z[j] = 'b'; // Differs in position 'j' |
| 683 ASSERT_NE(StringPiece16(x), StringPiece16(z)); |
| 684 } |
| 685 } |
| 686 } |
| 687 |
| 631 TEST(StringPiece16Test, CheckSTL) { | 688 TEST(StringPiece16Test, CheckSTL) { |
| 689 string16 first = ASCIIToUTF16("abcdefghijklmnopqrstuvwxyz"); |
| 690 StringPiece16 a(first); |
| 691 string16 second = ASCIIToUTF16("abc"); |
| 692 StringPiece16 b(second.c_str()); |
| 693 string16 third = ASCIIToUTF16("xyz"); |
| 694 StringPiece16 c(third.c_str(), third.size()); |
| 695 string16 fourth = ASCIIToUTF16("foobarrandomstuff"); |
| 696 StringPiece16 d(fourth.c_str(), 6); |
| 697 StringPiece16 e; |
| 632 // Check some non-ascii characters. | 698 // Check some non-ascii characters. |
| 633 string16 fifth(ASCIIToUTF16("123")); | 699 string16 fifth(ASCIIToUTF16("123")); |
| 634 fifth.push_back(0x0000); | 700 fifth.push_back(0x0000); |
| 635 fifth.push_back(0xd8c5); | 701 fifth.push_back(0xd8c5); |
| 636 fifth.push_back(0xdffe); | 702 fifth.push_back(0xdffe); |
| 637 StringPiece16 f(fifth); | 703 StringPiece16 f(fifth); |
| 638 | 704 |
| 705 ASSERT_EQ(a[6], 'g'); |
| 706 ASSERT_EQ(b[0], 'a'); |
| 707 ASSERT_EQ(c[2], 'z'); |
| 639 ASSERT_EQ(f[3], '\0'); | 708 ASSERT_EQ(f[3], '\0'); |
| 640 ASSERT_EQ(f[5], static_cast<char16>(0xdffe)); | 709 ASSERT_EQ(f[5], static_cast<char16>(0xdffe)); |
| 641 | 710 |
| 711 ASSERT_EQ(*d.data(), 'f'); |
| 712 ASSERT_EQ(d.data()[5], 'r'); |
| 713 ASSERT_TRUE(e.data() == NULL); |
| 714 |
| 715 ASSERT_EQ(*a.begin(), 'a'); |
| 716 ASSERT_EQ(*(b.begin() + 2), 'c'); |
| 717 ASSERT_EQ(*(c.end() - 1), 'z'); |
| 718 |
| 719 ASSERT_EQ(*a.rbegin(), 'z'); |
| 720 ASSERT_EQ(*(b.rbegin() + 2), 'a'); |
| 721 ASSERT_EQ(*(c.rend() - 1), 'x'); |
| 722 ASSERT_TRUE(a.rbegin() + 26 == a.rend()); |
| 723 |
| 724 ASSERT_EQ(a.size(), 26U); |
| 725 ASSERT_EQ(b.size(), 3U); |
| 726 ASSERT_EQ(c.size(), 3U); |
| 727 ASSERT_EQ(d.size(), 6U); |
| 728 ASSERT_EQ(e.size(), 0U); |
| 642 ASSERT_EQ(f.size(), 6U); | 729 ASSERT_EQ(f.size(), 6U); |
| 730 |
| 731 ASSERT_TRUE(!d.empty()); |
| 732 ASSERT_TRUE(d.begin() != d.end()); |
| 733 ASSERT_TRUE(d.begin() + 6 == d.end()); |
| 734 |
| 735 ASSERT_TRUE(e.empty()); |
| 736 ASSERT_TRUE(e.begin() == e.end()); |
| 737 |
| 738 d.clear(); |
| 739 ASSERT_EQ(d.size(), 0U); |
| 740 ASSERT_TRUE(d.empty()); |
| 741 ASSERT_TRUE(d.data() == NULL); |
| 742 ASSERT_TRUE(d.begin() == d.end()); |
| 743 |
| 744 ASSERT_GE(a.max_size(), a.capacity()); |
| 745 ASSERT_GE(a.capacity(), a.size()); |
| 643 } | 746 } |
| 644 | 747 |
| 748 TEST(StringPiece16Test, CheckNULL) { |
| 749 StringPiece16 s(NULL); |
| 750 ASSERT_EQ(s.data(), (const char16*)NULL); |
| 751 ASSERT_EQ(s.size(), 0U); |
| 645 | 752 |
| 753 s.set(NULL); |
| 754 ASSERT_EQ(s.data(), (const char16*)NULL); |
| 755 ASSERT_EQ(s.size(), 0U); |
| 756 |
| 757 string16 str = s.as_string16(); |
| 758 ASSERT_EQ(s.data(), (const char16*)NULL); |
| 759 ASSERT_EQ(s.size(), 0U); |
| 760 } |
| 761 |
| 762 TEST(StringPiece16Test, HeterogenousStringPieceEquals) { |
| 763 ASSERT_TRUE(StringPiece16(ASCIIToUTF16("hello")) == ASCIIToUTF16("hello")); |
| 764 } |
| 646 | 765 |
| 647 TEST(StringPiece16Test, CheckConversion) { | 766 TEST(StringPiece16Test, CheckConversion) { |
| 648 // Make sure that we can convert from UTF8 to UTF16 and back. We use a two | 767 // Make sure that we can convert from UTF8 to UTF16 and back. We use a two |
| 649 // byte character (G clef) to test this. | 768 // byte character (G clef) to test this. |
| 650 ASSERT_EQ( | 769 ASSERT_EQ( |
| 651 UTF16ToUTF8( | 770 UTF16ToUTF8( |
| 652 StringPiece16(UTF8ToUTF16("\xf0\x9d\x84\x9e")).as_string()), | 771 StringPiece16(UTF8ToUTF16("\xf0\x9d\x84\x9e")).as_string16()), |
| 653 "\xf0\x9d\x84\x9e"); | 772 "\xf0\x9d\x84\x9e"); |
| 654 } | 773 } |
| 655 | 774 |
| 656 } // namespace base | 775 } // namespace base |
| OLD | NEW |