OLD | NEW |
(Empty) | |
| 1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. |
| 4 |
| 5 #include "chrome/browser/sync/notifier/base/string.h" |
| 6 #include "notifier/testing/notifier/unittest.h" |
| 7 |
| 8 namespace notifier { |
| 9 |
| 10 TEST_NOTIFIER_F(StringTest); |
| 11 |
| 12 TEST_F(StringTest, StringToInt) { |
| 13 ASSERT_EQ(StringToInt("625"), 625); |
| 14 ASSERT_EQ(StringToInt("6"), 6); |
| 15 ASSERT_EQ(StringToInt("0"), 0); |
| 16 ASSERT_EQ(StringToInt(" 122"), 122); |
| 17 ASSERT_EQ(StringToInt("a"), 0); |
| 18 ASSERT_EQ(StringToInt(" a"), 0); |
| 19 ASSERT_EQ(StringToInt("2147483647"), 2147483647); |
| 20 ASSERT_EQ(StringToInt("-2147483648"), |
| 21 static_cast<int>(0x80000000)); // Hex constant avoids gcc warning. |
| 22 |
| 23 int value = 0; |
| 24 ASSERT_FALSE(ParseStringToInt("62.5", &value, true)); |
| 25 ASSERT_FALSE(ParseStringToInt("625e", &value, true)); |
| 26 ASSERT_FALSE(ParseStringToInt("2147483648", &value, true)); |
| 27 ASSERT_FALSE(ParseStringToInt("-2147483649", &value, true)); |
| 28 ASSERT_FALSE(ParseStringToInt("-4857004031", &value, true)); |
| 29 } |
| 30 |
| 31 TEST_F(StringTest, StringToUint) { |
| 32 ASSERT_EQ(StringToUint("625"), 625); |
| 33 ASSERT_EQ(StringToUint("6"), 6); |
| 34 ASSERT_EQ(StringToUint("0"), 0); |
| 35 ASSERT_EQ(StringToUint(" 122"), 122); |
| 36 ASSERT_EQ(StringToUint("a"), 0); |
| 37 ASSERT_EQ(StringToUint(" a"), 0); |
| 38 ASSERT_EQ(StringToUint("4294967295"), static_cast<uint32>(0xffffffff)); |
| 39 |
| 40 uint32 value = 0; |
| 41 ASSERT_FALSE(ParseStringToUint("62.5", &value, true)); |
| 42 ASSERT_FALSE(ParseStringToUint("625e", &value, true)); |
| 43 ASSERT_FALSE(ParseStringToUint("4294967296", &value, true)); |
| 44 ASSERT_FALSE(ParseStringToUint("-1", &value, true)); |
| 45 } |
| 46 |
| 47 TEST_F(StringTest, StringToInt64) { |
| 48 ASSERT_EQ(StringToInt64("119600064000000000"), |
| 49 INT64_C(119600064000000000)); |
| 50 ASSERT_EQ(StringToInt64(" 119600064000000000"), |
| 51 INT64_C(119600064000000000)); |
| 52 ASSERT_EQ(StringToInt64("625"), 625); |
| 53 ASSERT_EQ(StringToInt64("6"), 6); |
| 54 ASSERT_EQ(StringToInt64("0"), 0); |
| 55 ASSERT_EQ(StringToInt64(" 122"), 122); |
| 56 ASSERT_EQ(StringToInt64("a"), 0); |
| 57 ASSERT_EQ(StringToInt64(" a"), 0); |
| 58 ASSERT_EQ(StringToInt64("9223372036854775807"), INT64_C(9223372036854775807)); |
| 59 ASSERT_EQ(StringToInt64("-9223372036854775808I64"), |
| 60 static_cast<int64>(INT64_C(0x8000000000000000))); |
| 61 |
| 62 int64 value = 0; |
| 63 ASSERT_FALSE(ParseStringToInt64("62.5", &value, true)); |
| 64 ASSERT_FALSE(ParseStringToInt64("625e", &value, true)); |
| 65 ASSERT_FALSE(ParseStringToInt64("9223372036854775808", &value, true)); |
| 66 ASSERT_FALSE(ParseStringToInt64("-9223372036854775809", &value, true)); |
| 67 } |
| 68 |
| 69 TEST_F(StringTest, StringToDouble) { |
| 70 ASSERT_DOUBLE_EQ(StringToDouble("625"), 625); |
| 71 ASSERT_DOUBLE_EQ(StringToDouble("-625"), -625); |
| 72 ASSERT_DOUBLE_EQ(StringToDouble("-6.25"), -6.25); |
| 73 ASSERT_DOUBLE_EQ(StringToDouble("6.25"), 6.25); |
| 74 ASSERT_DOUBLE_EQ(StringToDouble("0.00"), 0); |
| 75 ASSERT_DOUBLE_EQ(StringToDouble(" 55.1"), 55.1); |
| 76 ASSERT_DOUBLE_EQ(StringToDouble(" 55.001"), 55.001); |
| 77 ASSERT_DOUBLE_EQ(StringToDouble(" 1.001"), 1.001); |
| 78 |
| 79 double value = 0.0; |
| 80 ASSERT_FALSE(ParseStringToDouble("62*5", &value, true)); |
| 81 } |
| 82 |
| 83 TEST_F(StringTest, Int64ToHexString) { |
| 84 ASSERT_STREQ("1a8e79fe1d58000", |
| 85 Int64ToHexString(INT64_C(119600064000000000)).c_str()); |
| 86 ASSERT_STREQ("271", Int64ToHexString(625).c_str()); |
| 87 ASSERT_STREQ("0", Int64ToHexString(0).c_str()); |
| 88 } |
| 89 |
| 90 TEST_F(StringTest, StringStartsWith) { |
| 91 { std::string s(""); ASSERT_TRUE(StringStartsWith(s, "")); } |
| 92 { std::string s("abc"); ASSERT_TRUE(StringStartsWith(s, "ab")); } |
| 93 { std::string s("abc"); ASSERT_FALSE(StringStartsWith(s, "bc")); } |
| 94 } |
| 95 |
| 96 TEST_F(StringTest, StringEndsWith) { |
| 97 { std::string s(""); ASSERT_TRUE(StringEndsWith(s, "")); } |
| 98 { std::string s("abc"); ASSERT_TRUE(StringEndsWith(s, "bc")); } |
| 99 { std::string s("abc"); ASSERT_FALSE(StringEndsWith(s, "ab")); } |
| 100 } |
| 101 |
| 102 TEST_F(StringTest, MakeStringEndWith) { |
| 103 { |
| 104 std::string s(""); |
| 105 std::string t(MakeStringEndWith(s, "")); |
| 106 ASSERT_STREQ(t.c_str(), ""); |
| 107 } |
| 108 { |
| 109 std::string s("abc"); |
| 110 std::string t(MakeStringEndWith(s, "def")); |
| 111 ASSERT_STREQ(t.c_str(), "abcdef"); |
| 112 } |
| 113 { |
| 114 std::string s("abc"); |
| 115 std::string t(MakeStringEndWith(s, "bc")); |
| 116 ASSERT_STREQ(t.c_str(), "abc"); |
| 117 } |
| 118 } |
| 119 |
| 120 TEST_F(StringTest, LowerString) { |
| 121 { std::string s(""); LowerString(&s); ASSERT_STREQ(s.c_str(), ""); } |
| 122 { std::string s("a"); LowerString(&s); ASSERT_STREQ(s.c_str(), "a"); } |
| 123 { std::string s("A"); LowerString(&s); ASSERT_STREQ(s.c_str(), "a"); } |
| 124 { std::string s("abc"); LowerString(&s); ASSERT_STREQ(s.c_str(), "abc"); } |
| 125 { std::string s("ABC"); LowerString(&s); ASSERT_STREQ(s.c_str(), "abc"); } |
| 126 } |
| 127 |
| 128 TEST_F(StringTest, UpperString) { |
| 129 { std::string s(""); UpperString(&s); ASSERT_STREQ(s.c_str(), ""); } |
| 130 { std::string s("A"); UpperString(&s); ASSERT_STREQ(s.c_str(), "A"); } |
| 131 { std::string s("a"); UpperString(&s); ASSERT_STREQ(s.c_str(), "A"); } |
| 132 { std::string s("ABC"); UpperString(&s); ASSERT_STREQ(s.c_str(), "ABC"); } |
| 133 { std::string s("abc"); UpperString(&s); ASSERT_STREQ(s.c_str(), "ABC"); } |
| 134 } |
| 135 |
| 136 TEST_F(StringTest, TrimString) { |
| 137 const char* white = " \n\t"; |
| 138 std::string s, c; |
| 139 |
| 140 // TrimStringLeft |
| 141 s = ""; // empty |
| 142 c = ""; |
| 143 ASSERT_EQ(TrimStringLeft(&s, white), 0); |
| 144 ASSERT_STREQ(s.c_str(), c.c_str()); |
| 145 |
| 146 s = " \n\t"; // all bad |
| 147 c = ""; |
| 148 ASSERT_EQ(TrimStringLeft(&s, white), 3); |
| 149 ASSERT_STREQ(s.c_str(), c.c_str()); |
| 150 |
| 151 s = "dog"; // nothing bad |
| 152 c = "dog"; |
| 153 ASSERT_EQ(TrimStringLeft(&s, white), 0); |
| 154 ASSERT_STREQ(s.c_str(), c.c_str()); |
| 155 |
| 156 s = " dog "; // some bad |
| 157 c = "dog "; |
| 158 ASSERT_EQ(TrimStringLeft(&s, white), 1); |
| 159 ASSERT_STREQ(s.c_str(), c.c_str()); |
| 160 |
| 161 s = " \n\t\t I love my little dog \n\t "; |
| 162 c = "I love my little dog \n\t "; |
| 163 ASSERT_EQ(TrimStringLeft(&s, white), 5); |
| 164 ASSERT_STREQ(s.c_str(), c.c_str()); |
| 165 |
| 166 // TrimStringRight |
| 167 s = ""; |
| 168 c = ""; |
| 169 ASSERT_EQ(TrimStringRight(&s, white), 0); |
| 170 ASSERT_STREQ(s.c_str(), c.c_str()); |
| 171 |
| 172 s = " \n\t"; |
| 173 c = ""; |
| 174 ASSERT_EQ(TrimStringRight(&s, white), 3); |
| 175 ASSERT_STREQ(s.c_str(), c.c_str()); |
| 176 |
| 177 s = "dog"; |
| 178 c = "dog"; |
| 179 ASSERT_EQ(TrimStringRight(&s, white), 0); |
| 180 ASSERT_STREQ(s.c_str(), c.c_str()); |
| 181 |
| 182 s = " dog "; |
| 183 c = " dog"; |
| 184 ASSERT_EQ(TrimStringRight(&s, white), 1); |
| 185 ASSERT_STREQ(s.c_str(), c.c_str()); |
| 186 |
| 187 s = " \n\t\t I love my little dog \n\t "; |
| 188 c = " \n\t\t I love my little dog"; |
| 189 ASSERT_EQ(TrimStringRight(&s, white), 4); |
| 190 ASSERT_STREQ(s.c_str(), c.c_str()); |
| 191 |
| 192 // TrimString |
| 193 s = ""; |
| 194 c = ""; |
| 195 ASSERT_EQ(TrimString(&s, white), 0); |
| 196 ASSERT_STREQ(s.c_str(), c.c_str()); |
| 197 |
| 198 s = " \n\t"; |
| 199 c = ""; |
| 200 ASSERT_EQ(TrimString(&s, white), 3); |
| 201 ASSERT_STREQ(s.c_str(), c.c_str()); |
| 202 |
| 203 s = "dog"; |
| 204 c = "dog"; |
| 205 ASSERT_EQ(TrimString(&s, white), 0); |
| 206 ASSERT_STREQ(s.c_str(), c.c_str()); |
| 207 |
| 208 s = " dog "; |
| 209 c = "dog"; |
| 210 ASSERT_EQ(TrimString(&s, white), 2); |
| 211 ASSERT_STREQ(s.c_str(), c.c_str()); |
| 212 |
| 213 s = " \n\t\t I love my little dog \n\t "; |
| 214 c = "I love my little dog"; |
| 215 ASSERT_EQ(TrimString(&s, white), 9); |
| 216 ASSERT_STREQ(s.c_str(), c.c_str()); |
| 217 } |
| 218 |
| 219 TEST_F(StringTest, SplitOneStringToken) { |
| 220 const char* teststrings[] = { |
| 221 "alongword", |
| 222 "alongword ", |
| 223 "alongword ", |
| 224 "alongword anotherword", |
| 225 " alongword", |
| 226 "", |
| 227 }; |
| 228 const char* source = NULL; |
| 229 |
| 230 source = teststrings[0]; |
| 231 ASSERT_STREQ(SplitOneStringToken(&source, " ").c_str(), "alongword"); |
| 232 ASSERT_STREQ(source, NULL); |
| 233 |
| 234 source = teststrings[1]; |
| 235 ASSERT_STREQ(SplitOneStringToken(&source, " ").c_str(), "alongword"); |
| 236 ASSERT_STREQ(source, teststrings[1] + strlen("alongword") + 1); |
| 237 |
| 238 source = teststrings[2]; |
| 239 ASSERT_STREQ(SplitOneStringToken(&source, " ").c_str(), "alongword"); |
| 240 ASSERT_STREQ(source, teststrings[2] + strlen("alongword") + 1); |
| 241 |
| 242 source = teststrings[3]; |
| 243 ASSERT_STREQ(SplitOneStringToken(&source, " ").c_str(), "alongword"); |
| 244 ASSERT_STREQ(source, teststrings[3] + strlen("alongword") + 1); |
| 245 |
| 246 source = teststrings[4]; |
| 247 ASSERT_STREQ(SplitOneStringToken(&source, " ").c_str(), ""); |
| 248 ASSERT_STREQ(source, teststrings[4] + 1); |
| 249 |
| 250 source = teststrings[5]; |
| 251 ASSERT_STREQ(SplitOneStringToken(&source, " ").c_str(), ""); |
| 252 ASSERT_STREQ(source, NULL); |
| 253 } |
| 254 |
| 255 TEST_F(StringTest, FixedString) { |
| 256 // Test basic operation. |
| 257 const wchar_t kData[] = L"hello world"; |
| 258 FixedString<wchar_t, 40> buf; |
| 259 |
| 260 buf.Append(kData); |
| 261 EXPECT_EQ(arraysize(kData)-1, buf.size()); |
| 262 EXPECT_EQ(0, wcscmp(kData, buf.get())); |
| 263 |
| 264 buf.Append(' '); |
| 265 buf.Append(kData); |
| 266 const wchar_t kExpected[] = L"hello world hello world"; |
| 267 EXPECT_EQ(arraysize(kExpected)-1, buf.size()); |
| 268 EXPECT_EQ(0, wcscmp(kExpected, buf.get())); |
| 269 EXPECT_EQ(false, buf.was_truncated()); |
| 270 |
| 271 // Test overflow. |
| 272 FixedString<wchar_t, 5> buf2; |
| 273 buf2.Append(L"hello world"); |
| 274 EXPECT_EQ(static_cast<size_t>(0), buf2.size()); |
| 275 EXPECT_EQ(0, buf2.get()[0]); |
| 276 EXPECT_EQ(true, buf2.was_truncated()); |
| 277 } |
| 278 |
| 279 TEST_F(StringTest, LowerToPascalCase) { |
| 280 EXPECT_STREQ("", LowerWithUnderToPascalCase("").c_str()); |
| 281 EXPECT_STREQ("A", LowerWithUnderToPascalCase("a").c_str()); |
| 282 EXPECT_STREQ("TestS", LowerWithUnderToPascalCase("test_s").c_str()); |
| 283 EXPECT_STREQ("XQ", LowerWithUnderToPascalCase("x_q").c_str()); |
| 284 EXPECT_STREQ("XQDNS", LowerWithUnderToPascalCase("x_qDNS").c_str()); |
| 285 } |
| 286 |
| 287 TEST_F(StringTest, PascalCaseToLower) { |
| 288 EXPECT_STREQ("", PascalCaseToLowerWithUnder("").c_str()); |
| 289 EXPECT_STREQ("a", PascalCaseToLowerWithUnder("A").c_str()); |
| 290 EXPECT_STREQ("test_s", PascalCaseToLowerWithUnder("TestS").c_str()); |
| 291 EXPECT_STREQ("xq", PascalCaseToLowerWithUnder("XQ").c_str()); |
| 292 EXPECT_STREQ("dns_name", PascalCaseToLowerWithUnder("DNSName").c_str()); |
| 293 EXPECT_STREQ("xqdns", PascalCaseToLowerWithUnder("XQDNS").c_str()); |
| 294 EXPECT_STREQ("xqdn_sa", PascalCaseToLowerWithUnder("XQDNSa").c_str()); |
| 295 EXPECT_STREQ("dns1", PascalCaseToLowerWithUnder("DNS1").c_str()); |
| 296 } |
| 297 |
| 298 TEST_F(StringTest, HtmlEncode) { |
| 299 EXPECT_STREQ("dns", HtmlEncode("dns").c_str()); |
| 300 EXPECT_STREQ("&", HtmlEncode("&").c_str()); |
| 301 EXPECT_STREQ("&amp;", HtmlEncode("&").c_str()); |
| 302 EXPECT_STREQ("<!>", HtmlEncode("<!>").c_str()); |
| 303 } |
| 304 |
| 305 TEST_F(StringTest, HtmlDecode) { |
| 306 EXPECT_STREQ("dns", HtmlDecode("dns").c_str()); |
| 307 EXPECT_STREQ("&", HtmlDecode("&").c_str()); |
| 308 EXPECT_STREQ("&", HtmlDecode("&amp;").c_str()); |
| 309 EXPECT_STREQ("<!>", HtmlDecode("<!>").c_str()); |
| 310 } |
| 311 |
| 312 TEST_F(StringTest, UrlEncode) { |
| 313 EXPECT_STREQ("%26", UrlEncode("&").c_str()); |
| 314 EXPECT_STREQ("%3f%20", UrlEncode("? ").c_str()); |
| 315 EXPECT_STREQ("as%20dfdsa", UrlEncode("as dfdsa").c_str()); |
| 316 EXPECT_STREQ("%3c!%3e", UrlEncode("<!>").c_str()); |
| 317 EXPECT_STREQ("!%23!", UrlEncode("!#!").c_str()); |
| 318 EXPECT_STREQ("!!", UrlEncode("!!").c_str()); |
| 319 } |
| 320 |
| 321 TEST_F(StringTest, UrlDecode) { |
| 322 EXPECT_STREQ("&", UrlDecode("%26").c_str()); |
| 323 EXPECT_STREQ("? ", UrlDecode("%3f%20").c_str()); |
| 324 EXPECT_STREQ("as dfdsa", UrlDecode("as%20dfdsa").c_str()); |
| 325 EXPECT_STREQ("<!>", UrlDecode("%3c!%3e").c_str()); |
| 326 EXPECT_STREQ("&", UrlDecode("&").c_str()); |
| 327 } |
| 328 |
| 329 TEST_F(StringTest, StringReplace) { |
| 330 // Test StringReplace core functionality. |
| 331 std::string s = "<attribute name=abcd/>"; |
| 332 StringReplace(&s, "=", " = ", false); |
| 333 EXPECT_STREQ(s.c_str(), "<attribute name = abcd/>"); |
| 334 |
| 335 // Test for negative case. |
| 336 s = "<attribute name=abcd/>"; |
| 337 StringReplace(&s, "-", "=", false); |
| 338 EXPECT_STREQ(s.c_str(), "<attribute name=abcd/>"); |
| 339 |
| 340 // Test StringReplace core functionality with replace_all flag set. |
| 341 s = "<attribute name==abcd/>"; |
| 342 StringReplace(&s, "=", " = ", true); |
| 343 EXPECT_STREQ(s.c_str(), "<attribute name = = abcd/>"); |
| 344 |
| 345 // Input is an empty string. |
| 346 s = ""; |
| 347 StringReplace(&s, "=", " = ", false); |
| 348 EXPECT_STREQ(s.c_str(), ""); |
| 349 |
| 350 // Input is an empty string and this is a request for repeated |
| 351 // string replaces. |
| 352 s = ""; |
| 353 StringReplace(&s, "=", " = ", true); |
| 354 EXPECT_STREQ(s.c_str(), ""); |
| 355 |
| 356 // Input and string to replace is an empty string. |
| 357 s = ""; |
| 358 StringReplace(&s, "", " = ", false); |
| 359 EXPECT_STREQ(s.c_str(), ""); |
| 360 } |
| 361 |
| 362 } // namespace notifier |
OLD | NEW |