| OLD | NEW | 
|---|
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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 "base/strings/string_util.h" | 5 #include "base/strings/string_util.h" | 
| 6 | 6 | 
| 7 #include <math.h> | 7 #include <math.h> | 
| 8 #include <stdarg.h> | 8 #include <stdarg.h> | 
| 9 | 9 | 
| 10 #include <limits> | 10 #include <algorithm> | 
| 11 #include <sstream> |  | 
| 12 | 11 | 
| 13 #include "base/basictypes.h" | 12 #include "base/basictypes.h" | 
| 14 #include "base/strings/string16.h" | 13 #include "base/strings/string16.h" | 
| 15 #include "base/strings/utf_string_conversions.h" | 14 #include "base/strings/utf_string_conversions.h" | 
| 16 #include "testing/gmock/include/gmock/gmock.h" | 15 #include "testing/gmock/include/gmock/gmock.h" | 
| 17 #include "testing/gtest/include/gtest/gtest.h" | 16 #include "testing/gtest/include/gtest/gtest.h" | 
| 18 | 17 | 
| 19 using ::testing::ElementsAre; | 18 using ::testing::ElementsAre; | 
| 20 | 19 | 
| 21 namespace base { | 20 namespace base { | 
| (...skipping 255 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 277   {L"\nFoo", true, L"Foo"}, | 276   {L"\nFoo", true, L"Foo"}, | 
| 278   {L"\r  Foo  ", true, L"Foo"}, | 277   {L"\r  Foo  ", true, L"Foo"}, | 
| 279   {L" Foo bar ", true, L"Foo bar"}, | 278   {L" Foo bar ", true, L"Foo bar"}, | 
| 280   {L"  \tFoo  bar  \n", true, L"Foo bar"}, | 279   {L"  \tFoo  bar  \n", true, L"Foo bar"}, | 
| 281   {L" a \r b\n c \r\n d \t\re \t f \n ", true, L"abcde f"}, | 280   {L" a \r b\n c \r\n d \t\re \t f \n ", true, L"abcde f"}, | 
| 282 }; | 281 }; | 
| 283 | 282 | 
| 284 TEST(StringUtilTest, CollapseWhitespace) { | 283 TEST(StringUtilTest, CollapseWhitespace) { | 
| 285   for (size_t i = 0; i < arraysize(collapse_cases); ++i) { | 284   for (size_t i = 0; i < arraysize(collapse_cases); ++i) { | 
| 286     const collapse_case& value = collapse_cases[i]; | 285     const collapse_case& value = collapse_cases[i]; | 
| 287     EXPECT_EQ(value.output, CollapseWhitespace(value.input, value.trim)); | 286     EXPECT_EQ(WideToUTF16(value.output), | 
|  | 287               CollapseWhitespace(WideToUTF16(value.input), value.trim)); | 
| 288   } | 288   } | 
| 289 } | 289 } | 
| 290 | 290 | 
| 291 static const struct collapse_case_ascii { | 291 static const struct collapse_case_ascii { | 
| 292   const char* input; | 292   const char* input; | 
| 293   const bool trim; | 293   const bool trim; | 
| 294   const char* output; | 294   const char* output; | 
| 295 } collapse_cases_ascii[] = { | 295 } collapse_cases_ascii[] = { | 
| 296   {" Google Video ", false, "Google Video"}, | 296   {" Google Video ", false, "Google Video"}, | 
| 297   {"Google Video", false, "Google Video"}, | 297   {"Google Video", false, "Google Video"}, | 
| (...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 414     L"Google Video", | 414     L"Google Video", | 
| 415     L"Hello, world\n", | 415     L"Hello, world\n", | 
| 416     L"0123ABCDwxyz \a\b\t\r\n!+,.~" | 416     L"0123ABCDwxyz \a\b\t\r\n!+,.~" | 
| 417   }; | 417   }; | 
| 418 | 418 | 
| 419   for (size_t i = 0; i < arraysize(char_cases); ++i) { | 419   for (size_t i = 0; i < arraysize(char_cases); ++i) { | 
| 420     EXPECT_TRUE(IsStringASCII(char_cases[i])); | 420     EXPECT_TRUE(IsStringASCII(char_cases[i])); | 
| 421     std::wstring wide = ASCIIToWide(char_cases[i]); | 421     std::wstring wide = ASCIIToWide(char_cases[i]); | 
| 422     EXPECT_EQ(wchar_cases[i], wide); | 422     EXPECT_EQ(wchar_cases[i], wide); | 
| 423 | 423 | 
| 424     EXPECT_TRUE(IsStringASCII(wchar_cases[i])); |  | 
| 425     std::string ascii = WideToASCII(wchar_cases[i]); | 424     std::string ascii = WideToASCII(wchar_cases[i]); | 
| 426     EXPECT_EQ(char_cases[i], ascii); | 425     EXPECT_EQ(char_cases[i], ascii); | 
| 427   } | 426   } | 
| 428 | 427 | 
| 429   EXPECT_FALSE(IsStringASCII("Google \x80Video")); | 428   EXPECT_FALSE(IsStringASCII("Google \x80Video")); | 
| 430   EXPECT_FALSE(IsStringASCII(L"Google \x80Video")); |  | 
| 431 | 429 | 
| 432   // Convert empty strings. | 430   // Convert empty strings. | 
| 433   std::wstring wempty; | 431   std::wstring wempty; | 
| 434   std::string empty; | 432   std::string empty; | 
| 435   EXPECT_EQ(empty, WideToASCII(wempty)); | 433   EXPECT_EQ(empty, WideToASCII(wempty)); | 
| 436   EXPECT_EQ(wempty, ASCIIToWide(empty)); | 434   EXPECT_EQ(wempty, ASCIIToWide(empty)); | 
| 437 | 435 | 
| 438   // Convert strings with an embedded NUL character. | 436   // Convert strings with an embedded NUL character. | 
| 439   const char chars_with_nul[] = "test\0string"; | 437   const char chars_with_nul[] = "test\0string"; | 
| 440   const int length_with_nul = arraysize(chars_with_nul) - 1; | 438   const int length_with_nul = arraysize(chars_with_nul) - 1; | 
| (...skipping 28 matching lines...) Expand all  Loading... | 
| 469   std::string upper_a = StringToUpperASCII(original_a); | 467   std::string upper_a = StringToUpperASCII(original_a); | 
| 470   EXPECT_EQ("CC2", upper_a); | 468   EXPECT_EQ("CC2", upper_a); | 
| 471 | 469 | 
| 472   std::wstring original_w(L"Cc2"); | 470   std::wstring original_w(L"Cc2"); | 
| 473   std::wstring upper_w = StringToUpperASCII(original_w); | 471   std::wstring upper_w = StringToUpperASCII(original_w); | 
| 474   EXPECT_EQ(L"CC2", upper_w); | 472   EXPECT_EQ(L"CC2", upper_w); | 
| 475 } | 473 } | 
| 476 | 474 | 
| 477 TEST(StringUtilTest, LowerCaseEqualsASCII) { | 475 TEST(StringUtilTest, LowerCaseEqualsASCII) { | 
| 478   static const struct { | 476   static const struct { | 
| 479     const wchar_t* src_w; |  | 
| 480     const char*    src_a; | 477     const char*    src_a; | 
| 481     const char*    dst; | 478     const char*    dst; | 
| 482   } lowercase_cases[] = { | 479   } lowercase_cases[] = { | 
| 483     { L"FoO", "FoO", "foo" }, | 480     { "FoO", "foo" }, | 
| 484     { L"foo", "foo", "foo" }, | 481     { "foo", "foo" }, | 
| 485     { L"FOO", "FOO", "foo" }, | 482     { "FOO", "foo" }, | 
| 486   }; | 483   }; | 
| 487 | 484 | 
| 488   for (size_t i = 0; i < ARRAYSIZE_UNSAFE(lowercase_cases); ++i) { | 485   for (size_t i = 0; i < ARRAYSIZE_UNSAFE(lowercase_cases); ++i) { | 
| 489     EXPECT_TRUE(LowerCaseEqualsASCII(lowercase_cases[i].src_w, | 486     EXPECT_TRUE(LowerCaseEqualsASCII(ASCIIToUTF16(lowercase_cases[i].src_a), | 
| 490                                      lowercase_cases[i].dst)); | 487                                      lowercase_cases[i].dst)); | 
| 491     EXPECT_TRUE(LowerCaseEqualsASCII(lowercase_cases[i].src_a, | 488     EXPECT_TRUE(LowerCaseEqualsASCII(lowercase_cases[i].src_a, | 
| 492                                      lowercase_cases[i].dst)); | 489                                      lowercase_cases[i].dst)); | 
| 493   } | 490   } | 
| 494 } | 491 } | 
| 495 | 492 | 
| 496 TEST(StringUtilTest, FormatBytesUnlocalized) { | 493 TEST(StringUtilTest, FormatBytesUnlocalized) { | 
| 497   static const struct { | 494   static const struct { | 
| 498     int64 bytes; | 495     int64 bytes; | 
| 499     const char* expected; | 496     const char* expected; | 
| (...skipping 311 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 811   EXPECT_FALSE(StartsWithASCII("JavaScript:url", "javascript", true)); | 808   EXPECT_FALSE(StartsWithASCII("JavaScript:url", "javascript", true)); | 
| 812   EXPECT_TRUE(StartsWithASCII("javascript:url", "javascript", false)); | 809   EXPECT_TRUE(StartsWithASCII("javascript:url", "javascript", false)); | 
| 813   EXPECT_TRUE(StartsWithASCII("JavaScript:url", "javascript", false)); | 810   EXPECT_TRUE(StartsWithASCII("JavaScript:url", "javascript", false)); | 
| 814   EXPECT_FALSE(StartsWithASCII("java", "javascript", true)); | 811   EXPECT_FALSE(StartsWithASCII("java", "javascript", true)); | 
| 815   EXPECT_FALSE(StartsWithASCII("java", "javascript", false)); | 812   EXPECT_FALSE(StartsWithASCII("java", "javascript", false)); | 
| 816   EXPECT_FALSE(StartsWithASCII(std::string(), "javascript", false)); | 813   EXPECT_FALSE(StartsWithASCII(std::string(), "javascript", false)); | 
| 817   EXPECT_FALSE(StartsWithASCII(std::string(), "javascript", true)); | 814   EXPECT_FALSE(StartsWithASCII(std::string(), "javascript", true)); | 
| 818   EXPECT_TRUE(StartsWithASCII("java", std::string(), false)); | 815   EXPECT_TRUE(StartsWithASCII("java", std::string(), false)); | 
| 819   EXPECT_TRUE(StartsWithASCII("java", std::string(), true)); | 816   EXPECT_TRUE(StartsWithASCII("java", std::string(), true)); | 
| 820 | 817 | 
| 821   EXPECT_TRUE(StartsWith(L"javascript:url", L"javascript", true)); | 818   EXPECT_TRUE(StartsWith(ASCIIToUTF16("javascript:url"), | 
| 822   EXPECT_FALSE(StartsWith(L"JavaScript:url", L"javascript", true)); | 819                          ASCIIToUTF16("javascript"), true)); | 
| 823   EXPECT_TRUE(StartsWith(L"javascript:url", L"javascript", false)); | 820   EXPECT_FALSE(StartsWith(ASCIIToUTF16("JavaScript:url"), | 
| 824   EXPECT_TRUE(StartsWith(L"JavaScript:url", L"javascript", false)); | 821                           ASCIIToUTF16("javascript"), true)); | 
| 825   EXPECT_FALSE(StartsWith(L"java", L"javascript", true)); | 822   EXPECT_TRUE(StartsWith(ASCIIToUTF16("javascript:url"), | 
| 826   EXPECT_FALSE(StartsWith(L"java", L"javascript", false)); | 823                          ASCIIToUTF16("javascript"), false)); | 
| 827   EXPECT_FALSE(StartsWith(std::wstring(), L"javascript", false)); | 824   EXPECT_TRUE(StartsWith(ASCIIToUTF16("JavaScript:url"), | 
| 828   EXPECT_FALSE(StartsWith(std::wstring(), L"javascript", true)); | 825                          ASCIIToUTF16("javascript"), false)); | 
| 829   EXPECT_TRUE(StartsWith(L"java", std::wstring(), false)); | 826   EXPECT_FALSE(StartsWith(ASCIIToUTF16("java"), | 
| 830   EXPECT_TRUE(StartsWith(L"java", std::wstring(), true)); | 827                           ASCIIToUTF16("javascript"), true)); | 
|  | 828   EXPECT_FALSE(StartsWith(ASCIIToUTF16("java"), | 
|  | 829                           ASCIIToUTF16("javascript"), false)); | 
|  | 830   EXPECT_FALSE(StartsWith(string16(), ASCIIToUTF16("javascript"), false)); | 
|  | 831   EXPECT_FALSE(StartsWith(string16(), ASCIIToUTF16("javascript"), true)); | 
|  | 832   EXPECT_TRUE(StartsWith(ASCIIToUTF16("java"), string16(), false)); | 
|  | 833   EXPECT_TRUE(StartsWith(ASCIIToUTF16("java"), string16(), true)); | 
| 831 } | 834 } | 
| 832 | 835 | 
| 833 TEST(StringUtilTest, EndsWith) { | 836 TEST(StringUtilTest, EndsWith) { | 
| 834   EXPECT_TRUE(EndsWith(L"Foo.plugin", L".plugin", true)); | 837   EXPECT_TRUE(EndsWith(ASCIIToUTF16("Foo.plugin"), | 
| 835   EXPECT_FALSE(EndsWith(L"Foo.Plugin", L".plugin", true)); | 838                        ASCIIToUTF16(".plugin"), true)); | 
| 836   EXPECT_TRUE(EndsWith(L"Foo.plugin", L".plugin", false)); | 839   EXPECT_FALSE(EndsWith(ASCIIToUTF16("Foo.Plugin"), | 
| 837   EXPECT_TRUE(EndsWith(L"Foo.Plugin", L".plugin", false)); | 840                         ASCIIToUTF16(".plugin"), true)); | 
| 838   EXPECT_FALSE(EndsWith(L".plug", L".plugin", true)); | 841   EXPECT_TRUE(EndsWith(ASCIIToUTF16("Foo.plugin"), | 
| 839   EXPECT_FALSE(EndsWith(L".plug", L".plugin", false)); | 842                        ASCIIToUTF16(".plugin"), false)); | 
| 840   EXPECT_FALSE(EndsWith(L"Foo.plugin Bar", L".plugin", true)); | 843   EXPECT_TRUE(EndsWith(ASCIIToUTF16("Foo.Plugin"), | 
| 841   EXPECT_FALSE(EndsWith(L"Foo.plugin Bar", L".plugin", false)); | 844                        ASCIIToUTF16(".plugin"), false)); | 
| 842   EXPECT_FALSE(EndsWith(std::wstring(), L".plugin", false)); | 845   EXPECT_FALSE(EndsWith(ASCIIToUTF16(".plug"), ASCIIToUTF16(".plugin"), true)); | 
| 843   EXPECT_FALSE(EndsWith(std::wstring(), L".plugin", true)); | 846   EXPECT_FALSE(EndsWith(ASCIIToUTF16(".plug"), ASCIIToUTF16(".plugin"), false)); | 
| 844   EXPECT_TRUE(EndsWith(L"Foo.plugin", std::wstring(), false)); | 847   EXPECT_FALSE(EndsWith(ASCIIToUTF16("Foo.plugin Bar"), | 
| 845   EXPECT_TRUE(EndsWith(L"Foo.plugin", std::wstring(), true)); | 848                         ASCIIToUTF16(".plugin"), true)); | 
| 846   EXPECT_TRUE(EndsWith(L".plugin", L".plugin", false)); | 849   EXPECT_FALSE(EndsWith(ASCIIToUTF16("Foo.plugin Bar"), | 
| 847   EXPECT_TRUE(EndsWith(L".plugin", L".plugin", true)); | 850                         ASCIIToUTF16(".plugin"), false)); | 
| 848   EXPECT_TRUE(EndsWith(std::wstring(), std::wstring(), false)); | 851   EXPECT_FALSE(EndsWith(string16(), ASCIIToUTF16(".plugin"), false)); | 
| 849   EXPECT_TRUE(EndsWith(std::wstring(), std::wstring(), true)); | 852   EXPECT_FALSE(EndsWith(string16(), ASCIIToUTF16(".plugin"), true)); | 
|  | 853   EXPECT_TRUE(EndsWith(ASCIIToUTF16("Foo.plugin"), string16(), false)); | 
|  | 854   EXPECT_TRUE(EndsWith(ASCIIToUTF16("Foo.plugin"), string16(), true)); | 
|  | 855   EXPECT_TRUE(EndsWith(ASCIIToUTF16(".plugin"), | 
|  | 856                        ASCIIToUTF16(".plugin"), false)); | 
|  | 857   EXPECT_TRUE(EndsWith(ASCIIToUTF16(".plugin"), ASCIIToUTF16(".plugin"), true)); | 
|  | 858   EXPECT_TRUE(EndsWith(string16(), string16(), false)); | 
|  | 859   EXPECT_TRUE(EndsWith(string16(), string16(), true)); | 
| 850 } | 860 } | 
| 851 | 861 | 
| 852 TEST(StringUtilTest, GetStringFWithOffsets) { | 862 TEST(StringUtilTest, GetStringFWithOffsets) { | 
| 853   std::vector<string16> subst; | 863   std::vector<string16> subst; | 
| 854   subst.push_back(ASCIIToUTF16("1")); | 864   subst.push_back(ASCIIToUTF16("1")); | 
| 855   subst.push_back(ASCIIToUTF16("2")); | 865   subst.push_back(ASCIIToUTF16("2")); | 
| 856   std::vector<size_t> offsets; | 866   std::vector<size_t> offsets; | 
| 857 | 867 | 
| 858   ReplaceStringPlaceholders(ASCIIToUTF16("Hello, $1. Your number is $2."), | 868   ReplaceStringPlaceholders(ASCIIToUTF16("Hello, $1. Your number is $2."), | 
| 859                             subst, | 869                             subst, | 
| (...skipping 322 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1182   const std::string live = kLive; | 1192   const std::string live = kLive; | 
| 1183   std::string dead = live; | 1193   std::string dead = live; | 
| 1184   strncpy(WriteInto(&dead, 5), kDead, 4); | 1194   strncpy(WriteInto(&dead, 5), kDead, 4); | 
| 1185   EXPECT_EQ(kDead, dead); | 1195   EXPECT_EQ(kDead, dead); | 
| 1186   EXPECT_EQ(4u, dead.size()); | 1196   EXPECT_EQ(4u, dead.size()); | 
| 1187   EXPECT_EQ(kLive, live); | 1197   EXPECT_EQ(kLive, live); | 
| 1188   EXPECT_EQ(4u, live.size()); | 1198   EXPECT_EQ(4u, live.size()); | 
| 1189 } | 1199 } | 
| 1190 | 1200 | 
| 1191 }  // namespace base | 1201 }  // namespace base | 
| OLD | NEW | 
|---|