Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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_split.h" | 5 #include "base/strings/string_split.h" |
| 6 | 6 |
| 7 #include "base/strings/utf_string_conversions.h" | 7 #include "base/strings/utf_string_conversions.h" |
| 8 #include "testing/gmock/include/gmock/gmock.h" | 8 #include "testing/gmock/include/gmock/gmock.h" |
| 9 #include "testing/gtest/include/gtest/gtest.h" | 9 #include "testing/gtest/include/gtest/gtest.h" |
| 10 | 10 |
| (...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 162 EXPECT_EQ("value2", kv_pairs[1].second); | 162 EXPECT_EQ("value2", kv_pairs[1].second); |
| 163 } | 163 } |
| 164 | 164 |
| 165 TEST(SplitStringUsingSubstrTest, EmptyString) { | 165 TEST(SplitStringUsingSubstrTest, EmptyString) { |
| 166 std::vector<std::string> results; | 166 std::vector<std::string> results; |
| 167 SplitStringUsingSubstr(std::string(), "DELIMITER", &results); | 167 SplitStringUsingSubstr(std::string(), "DELIMITER", &results); |
| 168 ASSERT_EQ(1u, results.size()); | 168 ASSERT_EQ(1u, results.size()); |
| 169 EXPECT_THAT(results, ElementsAre("")); | 169 EXPECT_THAT(results, ElementsAre("")); |
| 170 } | 170 } |
| 171 | 171 |
| 172 TEST(StringUtilTest, SplitString) { | 172 TEST(StringUtilTest, SplitString_Basics) { |
| 173 std::vector<std::string> r; | |
| 174 | |
| 175 r = SplitString(std::string(), ",:;", KEEP_WHITESPACE, SPLIT_WANT_ALL); | |
| 176 EXPECT_TRUE(r.empty()); | |
| 177 | |
| 178 // Empty separator list | |
| 179 r = SplitString("hello, world", "", KEEP_WHITESPACE, SPLIT_WANT_ALL); | |
| 180 ASSERT_EQ(1u, r.size()); | |
| 181 EXPECT_EQ("hello, world", r[0]); | |
| 182 | |
| 183 // Should split on any of the separators. | |
| 184 r = SplitString("::,,;;", ",:;", KEEP_WHITESPACE, SPLIT_WANT_ALL); | |
| 185 ASSERT_EQ(7u, r.size()); | |
| 186 for (auto str : r) | |
| 187 ASSERT_TRUE(str.empty()); | |
| 188 | |
| 189 r = SplitString("red, green; blue:", ",:;", TRIM_WHITESPACE, | |
| 190 SPLIT_WANT_NONEMPTY); | |
| 191 ASSERT_EQ(3u, r.size()); | |
| 192 EXPECT_EQ("red", r[0]); | |
| 193 EXPECT_EQ("green", r[1]); | |
| 194 EXPECT_EQ("blue", r[2]); | |
| 195 | |
| 196 // Want to split a string along whitespace sequences. | |
| 197 r = SplitString(" red green \tblue\n", " \t\n", TRIM_WHITESPACE, | |
| 198 SPLIT_WANT_NONEMPTY); | |
| 199 ASSERT_EQ(3u, r.size()); | |
| 200 EXPECT_EQ("red", r[0]); | |
| 201 EXPECT_EQ("green", r[1]); | |
| 202 EXPECT_EQ("blue", r[2]); | |
| 203 | |
| 204 // Weird case of splitting on spaces but not trimming. | |
| 205 r = SplitString(" red ", " ", TRIM_WHITESPACE, SPLIT_WANT_ALL); | |
| 206 ASSERT_EQ(3u, r.size()); | |
| 207 EXPECT_EQ("", r[0]); // Before the first space. | |
| 208 EXPECT_EQ("red", r[1]); | |
| 209 EXPECT_EQ("", r[2]); // After the last space. | |
| 210 } | |
| 211 | |
| 212 TEST(StringUtilTest, SplitString_WhitespaceAndResultType) { | |
| 213 std::vector<std::string> r; | |
| 214 | |
| 215 // Empty input handling. | |
| 216 r = SplitString(std::string(), ",", KEEP_WHITESPACE, SPLIT_WANT_ALL); | |
| 217 EXPECT_TRUE(r.empty()); | |
| 218 r = SplitString(std::string(), ",", KEEP_WHITESPACE, SPLIT_WANT_NONEMPTY); | |
| 219 EXPECT_TRUE(r.empty()); | |
| 220 | |
| 221 // Input string is space and we're trimming. | |
| 222 r = SplitString(" ", ",", TRIM_WHITESPACE, SPLIT_WANT_ALL); | |
| 223 ASSERT_EQ(1u, r.size()); | |
| 224 EXPECT_EQ("", r[0]); | |
| 225 r = SplitString(" ", ",", TRIM_WHITESPACE, SPLIT_WANT_NONEMPTY); | |
| 226 EXPECT_TRUE(r.empty()); | |
| 227 | |
| 228 // Test all 4 combinations of flags on ", ,". | |
| 229 r = SplitString(", ,", ",", KEEP_WHITESPACE, SPLIT_WANT_ALL); | |
| 230 ASSERT_EQ(3u, r.size()); | |
| 231 EXPECT_EQ("", r[0]); | |
| 232 EXPECT_EQ(" ", r[1]); | |
| 233 EXPECT_EQ("", r[2]); | |
| 234 r = SplitString(", ,", ",", KEEP_WHITESPACE, SPLIT_WANT_NONEMPTY); | |
| 235 ASSERT_EQ(1u, r.size()); | |
| 236 ASSERT_EQ(" ", r[0]); | |
| 237 r = SplitString(", ,", ",", TRIM_WHITESPACE, SPLIT_WANT_ALL); | |
| 238 ASSERT_EQ(3u, r.size()); | |
| 239 EXPECT_EQ("", r[0]); | |
| 240 EXPECT_EQ("", r[1]); | |
| 241 EXPECT_EQ("", r[2]); | |
| 242 r = SplitString(", ,", ",", TRIM_WHITESPACE, SPLIT_WANT_NONEMPTY); | |
| 243 ASSERT_TRUE(r.empty()); | |
| 244 } | |
| 245 | |
| 246 TEST(StringUtilTest, SplitString_Legacy) { | |
| 173 std::vector<std::wstring> r; | 247 std::vector<std::wstring> r; |
| 174 | 248 |
| 175 SplitString(std::wstring(), L',', &r); | 249 SplitString(std::wstring(), L',', &r); |
| 176 EXPECT_EQ(0U, r.size()); | 250 EXPECT_EQ(0U, r.size()); |
| 177 r.clear(); | 251 r.clear(); |
| 178 | 252 |
| 179 SplitString(L"a,b,c", L',', &r); | 253 SplitString(L"a,b,c", L',', &r); |
| 180 ASSERT_EQ(3U, r.size()); | 254 ASSERT_EQ(3U, r.size()); |
| 181 EXPECT_EQ(r[0], L"a"); | 255 EXPECT_EQ(r[0], L"a"); |
| 182 EXPECT_EQ(r[1], L"b"); | 256 EXPECT_EQ(r[1], L"b"); |
| 183 EXPECT_EQ(r[2], L"c"); | 257 EXPECT_EQ(r[2], L"c"); |
| 184 r.clear(); | 258 r.clear(); |
| 185 | 259 |
| 186 SplitString(L"a, b, c", L',', &r); | 260 SplitString(L"a, b, c", L',', &r); |
| 187 ASSERT_EQ(3U, r.size()); | 261 ASSERT_EQ(3U, r.size()); |
| 188 EXPECT_EQ(r[0], L"a"); | 262 EXPECT_EQ(r[0], L"a"); |
| 189 EXPECT_EQ(r[1], L"b"); | 263 EXPECT_EQ(r[1], L"b"); |
| 190 EXPECT_EQ(r[2], L"c"); | 264 EXPECT_EQ(r[2], L"c"); |
| 191 r.clear(); | 265 r.clear(); |
| 192 | 266 |
| 193 SplitString(L"a,,c", L',', &r); | 267 SplitString(L"a,,c", L',', &r); |
| 194 ASSERT_EQ(3U, r.size()); | 268 ASSERT_EQ(3U, r.size()); |
| 195 EXPECT_EQ(r[0], L"a"); | 269 EXPECT_EQ(r[0], L"a"); |
| 196 EXPECT_EQ(r[1], L""); | 270 EXPECT_EQ(r[1], L""); |
| 197 EXPECT_EQ(r[2], L"c"); | 271 EXPECT_EQ(r[2], L"c"); |
| 198 r.clear(); | 272 r.clear(); |
| 199 | 273 |
| 274 SplitString(L"a, ,c", L',', &r); | |
| 275 ASSERT_EQ(3U, r.size()); | |
| 276 EXPECT_EQ(r[0], L"a"); | |
| 277 EXPECT_EQ(r[1], L""); | |
| 278 EXPECT_EQ(r[2], L"c"); | |
| 279 r.clear(); | |
| 280 | |
| 200 SplitString(L" ", L'*', &r); | 281 SplitString(L" ", L'*', &r); |
| 201 EXPECT_EQ(0U, r.size()); | 282 EXPECT_EQ(0U, r.size()); |
| 202 r.clear(); | 283 r.clear(); |
| 203 | 284 |
| 204 SplitString(L"foo", L'*', &r); | 285 SplitString(L"foo", L'*', &r); |
| 205 ASSERT_EQ(1U, r.size()); | 286 ASSERT_EQ(1U, r.size()); |
| 206 EXPECT_EQ(r[0], L"foo"); | 287 EXPECT_EQ(r[0], L"foo"); |
| 207 r.clear(); | 288 r.clear(); |
| 208 | 289 |
| 209 SplitString(L"foo ,", L',', &r); | 290 SplitString(L"foo ,", L',', &r); |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 264 std::vector<std::string> results; | 345 std::vector<std::string> results; |
| 265 SplitStringUsingSubstr( | 346 SplitStringUsingSubstr( |
| 266 "unDELIMITERdeuxDELIMITERtroisDELIMITERquatreDELIMITERDELIMITERDELIMITER", | 347 "unDELIMITERdeuxDELIMITERtroisDELIMITERquatreDELIMITERDELIMITERDELIMITER", |
| 267 "DELIMITER", | 348 "DELIMITER", |
| 268 &results); | 349 &results); |
| 269 ASSERT_EQ(7u, results.size()); | 350 ASSERT_EQ(7u, results.size()); |
| 270 EXPECT_THAT( | 351 EXPECT_THAT( |
| 271 results, ElementsAre("un", "deux", "trois", "quatre", "", "", "")); | 352 results, ElementsAre("un", "deux", "trois", "quatre", "", "", "")); |
| 272 } | 353 } |
| 273 | 354 |
| 355 /* | |
|
danakj
2015/06/11 23:58:35
New test commented out?
brettw
2015/06/12 17:37:08
I removed this. This was the Tokenize unit test (a
| |
| 356 TEST(StringUtilTest, SplitStringUsingSet) { | |
| 357 std::vector<std::string> r; | |
| 358 | |
| 359 SplitStringUsingSet(std::string("This is a string"), std::string(" "), &r); | |
| 360 ASSERT_EQ(4U, r.size()); | |
| 361 EXPECT_EQ(r[0], std::string("This")); | |
| 362 EXPECT_EQ(r[1], std::string("is")); | |
| 363 EXPECT_EQ(r[2], std::string("a")); | |
| 364 EXPECT_EQ(r[3], std::string("string")); | |
| 365 r.clear(); | |
| 366 | |
| 367 SplitStringUsingSet(std::string("one,two,three"), std::string(","), &r); | |
| 368 ASSERT_EQ(3U, r.size()); | |
| 369 EXPECT_EQ(r[0], std::string("one")); | |
| 370 EXPECT_EQ(r[1], std::string("two")); | |
| 371 EXPECT_EQ(r[2], std::string("three")); | |
| 372 r.clear(); | |
| 373 | |
| 374 SplitStringUsingSet(std::string("one,two:three;four"), std::string(",:"), &r); | |
| 375 ASSERT_EQ(3U, r.size()); | |
| 376 EXPECT_EQ(r[0], std::string("one")); | |
| 377 EXPECT_EQ(r[1], std::string("two")); | |
| 378 EXPECT_EQ(r[2], std::string("three;four")); | |
| 379 r.clear(); | |
| 380 | |
| 381 SplitStringUsingSet(std::string("one,two:three;four"), std::string(";,:"), | |
| 382 &r); | |
| 383 ASSERT_EQ(4U, r.size()); | |
| 384 EXPECT_EQ(r[0], std::string("one")); | |
| 385 EXPECT_EQ(r[1], std::string("two")); | |
| 386 EXPECT_EQ(r[2], std::string("three")); | |
| 387 EXPECT_EQ(r[3], std::string("four")); | |
| 388 r.clear(); | |
| 389 | |
| 390 SplitStringUsingSet(std::string("one, two, three"), std::string(","), &r); | |
| 391 ASSERT_EQ(3U, r.size()); | |
| 392 EXPECT_EQ(r[0], std::string("one")); | |
| 393 EXPECT_EQ(r[1], std::string(" two")); | |
| 394 EXPECT_EQ(r[2], std::string(" three")); | |
| 395 r.clear(); | |
| 396 | |
| 397 SplitStringUsingSet(std::string("one, two, three, "), std::string(","), &r); | |
| 398 ASSERT_EQ(4U, r.size()); | |
| 399 EXPECT_EQ(r[0], std::string("one")); | |
| 400 EXPECT_EQ(r[1], std::string(" two")); | |
| 401 EXPECT_EQ(r[2], std::string(" three")); | |
| 402 EXPECT_EQ(r[3], std::string(" ")); | |
| 403 r.clear(); | |
| 404 | |
| 405 SplitStringUsingSet(std::string("one, two, three,"), std::string(","), &r); | |
| 406 ASSERT_EQ(3U, r.size()); | |
| 407 EXPECT_EQ(r[0], std::string("one")); | |
| 408 EXPECT_EQ(r[1], std::string(" two")); | |
| 409 EXPECT_EQ(r[2], std::string(" three")); | |
| 410 r.clear(); | |
| 411 | |
| 412 SplitStringUsingSet(std::string(), std::string(","), &r); | |
| 413 ASSERT_EQ(0U, r.size()); | |
| 414 r.clear(); | |
| 415 | |
| 416 SplitStringUsingSet(std::string(","), std::string(","), &r); | |
| 417 ASSERT_EQ(0U, r.size()); | |
| 418 r.clear(); | |
| 419 | |
| 420 SplitStringUsingSet(std::string(",;:."), std::string(".:;,"), &r); | |
| 421 ASSERT_EQ(0U, r.size()); | |
| 422 r.clear(); | |
| 423 | |
| 424 SplitStringUsingSet(std::string("\t\ta\t"), std::string("\t"), &r); | |
| 425 ASSERT_EQ(1U, r.size()); | |
| 426 EXPECT_EQ(r[0], std::string("a")); | |
| 427 r.clear(); | |
| 428 | |
| 429 SplitStringUsingSet(std::string("\ta\t\nb\tcc"), std::string("\n"), &r); | |
| 430 ASSERT_EQ(2U, r.size()); | |
| 431 EXPECT_EQ(r[0], std::string("\ta\t")); | |
| 432 EXPECT_EQ(r[1], std::string("b\tcc")); | |
| 433 r.clear(); | |
| 434 } | |
| 435 */ | |
| 436 | |
| 274 TEST(StringSplitTest, StringSplitDontTrim) { | 437 TEST(StringSplitTest, StringSplitDontTrim) { |
| 275 std::vector<std::string> r; | 438 std::vector<std::string> r; |
| 276 | 439 |
| 277 SplitStringDontTrim(" ", '*', &r); | 440 SplitStringDontTrim(" ", '*', &r); |
| 278 ASSERT_EQ(1U, r.size()); | 441 ASSERT_EQ(1U, r.size()); |
| 279 EXPECT_EQ(r[0], " "); | 442 EXPECT_EQ(r[0], " "); |
| 280 | 443 |
| 281 SplitStringDontTrim("\t \ta\t ", '\t', &r); | 444 SplitStringDontTrim("\t \ta\t ", '\t', &r); |
| 282 ASSERT_EQ(4U, r.size()); | 445 ASSERT_EQ(4U, r.size()); |
| 283 EXPECT_EQ(r[0], ""); | 446 EXPECT_EQ(r[0], ""); |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 317 SplitStringAlongWhitespace(data[i].input, &results); | 480 SplitStringAlongWhitespace(data[i].input, &results); |
| 318 ASSERT_EQ(data[i].expected_result_count, results.size()); | 481 ASSERT_EQ(data[i].expected_result_count, results.size()); |
| 319 if (data[i].expected_result_count > 0) | 482 if (data[i].expected_result_count > 0) |
| 320 ASSERT_EQ(data[i].output1, results[0]); | 483 ASSERT_EQ(data[i].output1, results[0]); |
| 321 if (data[i].expected_result_count > 1) | 484 if (data[i].expected_result_count > 1) |
| 322 ASSERT_EQ(data[i].output2, results[1]); | 485 ASSERT_EQ(data[i].output2, results[1]); |
| 323 } | 486 } |
| 324 } | 487 } |
| 325 | 488 |
| 326 } // namespace base | 489 } // namespace base |
| OLD | NEW |