15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/strings/string_split.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::ElementsAre;
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace base {
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(WCHAR_T_IS_UTF16)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Overload SplitString with a wide-char version to make it easier to
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// test the string16 version with wide character literals.
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SplitString(const std::wstring& str,
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 wchar_t c,
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 std::vector<std::wstring>* result) {
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<string16> result16;
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SplitString(WideToUTF16(str), c, &result16);
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < result16.size(); ++i)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    result->push_back(UTF16ToWide(result16[i]));
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // anonymous namespace
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
32a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class SplitStringIntoKeyValuePairsTest : public testing::Test {
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  base::StringPairs kv_pairs;
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_F(SplitStringIntoKeyValuePairsTest, EmptyString) {
38a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_TRUE(SplitStringIntoKeyValuePairs(std::string(),
39a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                           ':',  // Key-value delimiter
40a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                           ',',  // Key-value pair delimiter
41a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                           &kv_pairs));
42a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_TRUE(kv_pairs.empty());
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
45a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_F(SplitStringIntoKeyValuePairsTest, MissingKeyValueDelimiter) {
46a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_FALSE(SplitStringIntoKeyValuePairs("key1,key2:value2",
47a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                            ':',  // Key-value delimiter
48a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                            ',',  // Key-value pair delimiter
49a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                            &kv_pairs));
50a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ASSERT_EQ(2U, kv_pairs.size());
51a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_TRUE(kv_pairs[0].first.empty());
52a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_TRUE(kv_pairs[0].second.empty());
53a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ("key2", kv_pairs[1].first);
54a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ("value2", kv_pairs[1].second);
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
57a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_F(SplitStringIntoKeyValuePairsTest, EmptyKeyWithKeyValueDelimiter) {
58a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_TRUE(SplitStringIntoKeyValuePairs(":value1,key2:value2",
59a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                           ':',  // Key-value delimiter
60a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                           ',',  // Key-value pair delimiter
61a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                           &kv_pairs));
62a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ASSERT_EQ(2U, kv_pairs.size());
63a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_TRUE(kv_pairs[0].first.empty());
64a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ("value1", kv_pairs[0].second);
65a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ("key2", kv_pairs[1].first);
66a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ("value2", kv_pairs[1].second);
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
69a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_F(SplitStringIntoKeyValuePairsTest, TrailingAndLeadingPairDelimiter) {
70a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_TRUE(SplitStringIntoKeyValuePairs(",key1:value1,key2:value2,",
71a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                           ':',   // Key-value delimiter
72a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                           ',',   // Key-value pair delimiter
73a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                           &kv_pairs));
74a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ASSERT_EQ(2U, kv_pairs.size());
75a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ("key1", kv_pairs[0].first);
76a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ("value1", kv_pairs[0].second);
77a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ("key2", kv_pairs[1].first);
78a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ("value2", kv_pairs[1].second);
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
81a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_F(SplitStringIntoKeyValuePairsTest, EmptyPair) {
82a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_TRUE(SplitStringIntoKeyValuePairs("key1:value1,,key3:value3",
83a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                           ':',   // Key-value delimiter
84a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                           ',',   // Key-value pair delimiter
85a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                           &kv_pairs));
86a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ASSERT_EQ(2U, kv_pairs.size());
87a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ("key1", kv_pairs[0].first);
88a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ("value1", kv_pairs[0].second);
89a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ("key3", kv_pairs[1].first);
90a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ("value3", kv_pairs[1].second);
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
93a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_F(SplitStringIntoKeyValuePairsTest, EmptyValue) {
94a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_FALSE(SplitStringIntoKeyValuePairs("key1:,key2:value2",
95a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                            ':',   // Key-value delimiter
96a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                            ',',   // Key-value pair delimiter
97a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                            &kv_pairs));
98a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ASSERT_EQ(2U, kv_pairs.size());
99a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ("key1", kv_pairs[0].first);
100a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ("", kv_pairs[0].second);
101a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ("key2", kv_pairs[1].first);
102a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ("value2", kv_pairs[1].second);
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_F(SplitStringIntoKeyValuePairsTest, UntrimmedWhitespace) {
106a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_TRUE(SplitStringIntoKeyValuePairs("key1 : value1",
107a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                           ':',  // Key-value delimiter
108a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                           ',',  // Key-value pair delimiter
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           &kv_pairs));
110a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ASSERT_EQ(1U, kv_pairs.size());
111a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ("key1 ", kv_pairs[0].first);
112a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(" value1", kv_pairs[0].second);
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
115a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_F(SplitStringIntoKeyValuePairsTest, TrimmedWhitespace) {
116a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_TRUE(SplitStringIntoKeyValuePairs("key1:value1 , key2:value2",
117a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                           ':',   // Key-value delimiter
118a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                           ',',   // Key-value pair delimiter
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           &kv_pairs));
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(2U, kv_pairs.size());
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("key1", kv_pairs[0].first);
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("value1", kv_pairs[0].second);
123a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ("key2", kv_pairs[1].first);
124a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ("value2", kv_pairs[1].second);
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
127a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_F(SplitStringIntoKeyValuePairsTest, MultipleKeyValueDelimiters) {
128a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_TRUE(SplitStringIntoKeyValuePairs("key1:::value1,key2:value2",
129a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                           ':',   // Key-value delimiter
130a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                           ',',   // Key-value pair delimiter
131a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                           &kv_pairs));
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(2U, kv_pairs.size());
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("key1", kv_pairs[0].first);
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("value1", kv_pairs[0].second);
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("key2", kv_pairs[1].first);
136a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ("value2", kv_pairs[1].second);
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
139a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_F(SplitStringIntoKeyValuePairsTest, OnlySplitAtGivenSeparator) {
140a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  std::string a("a ?!@#$%^&*()_+:/{}\\\t\nb");
141a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_TRUE(SplitStringIntoKeyValuePairs(a + "X" + a + "Y" + a + "X" + a,
142a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                           'X',  // Key-value delimiter
143a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                           'Y',  // Key-value pair delimiter
144a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                           &kv_pairs));
145a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ASSERT_EQ(2U, kv_pairs.size());
146a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(a, kv_pairs[0].first);
147a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(a, kv_pairs[0].second);
148a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(a, kv_pairs[1].first);
149a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(a, kv_pairs[1].second);
150a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
151a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
152a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SplitStringIntoKeyValuePairsTest, DelimiterInValue) {
154a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_TRUE(SplitStringIntoKeyValuePairs("key1:va:ue1,key2:value2",
155a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                           ':',   // Key-value delimiter
156a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                           ',',   // Key-value pair delimiter
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           &kv_pairs));
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(2U, kv_pairs.size());
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("key1", kv_pairs[0].first);
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("va:ue1", kv_pairs[0].second);
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("key2", kv_pairs[1].first);
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("value2", kv_pairs[1].second);
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(SplitStringUsingSubstrTest, EmptyString) {
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<std::string> results;
167c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SplitStringUsingSubstr(std::string(), "DELIMITER", &results);
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1u, results.size());
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_THAT(results, ElementsAre(""));
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(StringUtilTest, SplitString) {
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<std::wstring> r;
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SplitString(std::wstring(), L',', &r);
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0U, r.size());
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  r.clear();
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SplitString(L"a,b,c", L',', &r);
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(3U, r.size());
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(r[0], L"a");
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(r[1], L"b");
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(r[2], L"c");
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  r.clear();
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SplitString(L"a, b, c", L',', &r);
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(3U, r.size());
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(r[0], L"a");
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(r[1], L"b");
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(r[2], L"c");
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  r.clear();
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SplitString(L"a,,c", L',', &r);
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(3U, r.size());
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(r[0], L"a");
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(r[1], L"");
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(r[2], L"c");
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  r.clear();
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SplitString(L"   ", L'*', &r);
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0U, r.size());
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  r.clear();
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SplitString(L"foo", L'*', &r);
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1U, r.size());
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(r[0], L"foo");
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  r.clear();
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SplitString(L"foo ,", L',', &r);
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(2U, r.size());
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(r[0], L"foo");
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(r[1], L"");
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  r.clear();
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SplitString(L",", L',', &r);
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(2U, r.size());
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(r[0], L"");
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(r[1], L"");
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  r.clear();
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SplitString(L"\t\ta\t", L'\t', &r);
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(4U, r.size());
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(r[0], L"");
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(r[1], L"");
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(r[2], L"a");
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(r[3], L"");
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  r.clear();
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SplitString(L"\ta\t\nb\tcc", L'\n', &r);
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(2U, r.size());
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(r[0], L"a");
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(r[1], L"b\tcc");
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  r.clear();
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(SplitStringUsingSubstrTest, StringWithNoDelimiter) {
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<std::string> results;
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SplitStringUsingSubstr("alongwordwithnodelimiter", "DELIMITER", &results);
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1u, results.size());
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_THAT(results, ElementsAre("alongwordwithnodelimiter"));
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(SplitStringUsingSubstrTest, LeadingDelimitersSkipped) {
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<std::string> results;
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SplitStringUsingSubstr(
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "DELIMITERDELIMITERDELIMITERoneDELIMITERtwoDELIMITERthree",
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "DELIMITER",
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &results);
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(6u, results.size());
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_THAT(results, ElementsAre("", "", "", "one", "two", "three"));
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(SplitStringUsingSubstrTest, ConsecutiveDelimitersSkipped) {
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<std::string> results;
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SplitStringUsingSubstr(
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "unoDELIMITERDELIMITERDELIMITERdosDELIMITERtresDELIMITERDELIMITERcuatro",
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "DELIMITER",
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &results);
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(7u, results.size());
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_THAT(results, ElementsAre("uno", "", "", "dos", "tres", "", "cuatro"));
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(SplitStringUsingSubstrTest, TrailingDelimitersSkipped) {
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<std::string> results;
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SplitStringUsingSubstr(
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "unDELIMITERdeuxDELIMITERtroisDELIMITERquatreDELIMITERDELIMITERDELIMITER",
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "DELIMITER",
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &results);
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(7u, results.size());
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_THAT(
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      results, ElementsAre("un", "deux", "trois", "quatre", "", "", ""));
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(StringSplitTest, StringSplitDontTrim) {
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<std::string> r;
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SplitStringDontTrim("   ", '*', &r);
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1U, r.size());
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(r[0], "   ");
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SplitStringDontTrim("\t  \ta\t ", '\t', &r);
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(4U, r.size());
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(r[0], "");
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(r[1], "  ");
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(r[2], "a");
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(r[3], " ");
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SplitStringDontTrim("\ta\t\nb\tcc", '\n', &r);
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(2U, r.size());
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(r[0], "\ta\t");
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(r[1], "b\tcc");
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(StringSplitTest, SplitStringAlongWhitespace) {
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct TestData {
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char* input;
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const size_t expected_result_count;
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char* output1;
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char* output2;
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } data[] = {
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "a",       1, "a",  ""   },
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { " ",       0, "",   ""   },
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { " a",      1, "a",  ""   },
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { " ab ",    1, "ab", ""   },
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { " ab c",   2, "ab", "c"  },
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { " ab c ",  2, "ab", "c"  },
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { " ab cd",  2, "ab", "cd" },
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { " ab cd ", 2, "ab", "cd" },
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { " \ta\t",  1, "a",  ""   },
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { " b\ta\t", 2, "b",  "a"  },
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { " b\tat",  2, "b",  "at" },
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "b\tat",   2, "b",  "at" },
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "b\t at",  2, "b",  "at" },
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < ARRAYSIZE_UNSAFE(data); ++i) {
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::vector<std::string> results;
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SplitStringAlongWhitespace(data[i].input, &results);
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_EQ(data[i].expected_result_count, results.size());
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (data[i].expected_result_count > 0)
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ASSERT_EQ(data[i].output1, results[0]);
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (data[i].expected_result_count > 1)
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ASSERT_EQ(data[i].output2, results[1]);
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace base
327