1 // Copyright (c) 2010 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.
5 #include "base/string_split.h"
6 #include "testing/gmock/include/gmock/gmock.h"
7 #include "testing/gtest/include/gtest/gtest.h"
9 using ::testing::ElementsAre
;
13 class SplitStringIntoKeyValuesTest
: public testing::Test
{
16 std::vector
<std::string
> values
;
19 TEST_F(SplitStringIntoKeyValuesTest
, EmptyInputMultipleValues
) {
20 EXPECT_FALSE(SplitStringIntoKeyValues("", // Empty input
21 '\t', // Key separators
23 EXPECT_TRUE(key
.empty());
24 EXPECT_TRUE(values
.empty());
27 TEST_F(SplitStringIntoKeyValuesTest
, EmptyValueInputMultipleValues
) {
28 EXPECT_FALSE(SplitStringIntoKeyValues("key_with_no_value\t",
29 '\t', // Key separators
31 EXPECT_EQ("key_with_no_value", key
);
32 EXPECT_TRUE(values
.empty());
35 TEST_F(SplitStringIntoKeyValuesTest
, EmptyKeyInputMultipleValues
) {
36 EXPECT_TRUE(SplitStringIntoKeyValues("\tvalue for empty key",
37 '\t', // Key separators
39 EXPECT_TRUE(key
.empty());
40 ASSERT_EQ(1U, values
.size());
43 TEST_F(SplitStringIntoKeyValuesTest
, KeyWithMultipleValues
) {
44 EXPECT_TRUE(SplitStringIntoKeyValues("key1\tvalue1, value2 value3",
45 '\t', // Key separators
47 EXPECT_EQ("key1", key
);
48 ASSERT_EQ(1U, values
.size());
49 EXPECT_EQ("value1, value2 value3", values
[0]);
52 TEST_F(SplitStringIntoKeyValuesTest
, EmptyInputSingleValue
) {
53 EXPECT_FALSE(SplitStringIntoKeyValues("", // Empty input
54 '\t', // Key separators
56 EXPECT_TRUE(key
.empty());
57 EXPECT_TRUE(values
.empty());
60 TEST_F(SplitStringIntoKeyValuesTest
, EmptyValueInputSingleValue
) {
61 EXPECT_FALSE(SplitStringIntoKeyValues("key_with_no_value\t",
62 '\t', // Key separators
64 EXPECT_EQ("key_with_no_value", key
);
65 EXPECT_TRUE(values
.empty());
68 TEST_F(SplitStringIntoKeyValuesTest
, EmptyKeyInputSingleValue
) {
69 EXPECT_TRUE(SplitStringIntoKeyValues("\tvalue for empty key",
70 '\t', // Key separators
72 EXPECT_TRUE(key
.empty());
73 ASSERT_EQ(1U, values
.size());
74 EXPECT_EQ("value for empty key", values
[0]);
77 TEST_F(SplitStringIntoKeyValuesTest
, KeyWithSingleValue
) {
78 EXPECT_TRUE(SplitStringIntoKeyValues("key1\tvalue1, value2 value3",
79 '\t', // Key separators
81 EXPECT_EQ("key1", key
);
82 ASSERT_EQ(1U, values
.size());
83 EXPECT_EQ("value1, value2 value3", values
[0]);
86 class SplitStringIntoKeyValuePairsTest
: public testing::Test
{
88 std::vector
<std::pair
<std::string
, std::string
> > kv_pairs
;
91 TEST_F(SplitStringIntoKeyValuePairsTest
, EmptyString
) {
92 EXPECT_TRUE(SplitStringIntoKeyValuePairs("",
93 ':', // Key-value delimiters
94 ',', // Key-value pair delims
96 EXPECT_TRUE(kv_pairs
.empty());
99 TEST_F(SplitStringIntoKeyValuePairsTest
, EmptySecondPair
) {
100 EXPECT_TRUE(SplitStringIntoKeyValuePairs("key1:value1,,key3:value3",
101 ':', // Key-value delimiters
102 ',', // Key-value pair delims
104 ASSERT_EQ(2U, kv_pairs
.size());
105 EXPECT_EQ("key1", kv_pairs
[0].first
);
106 EXPECT_EQ("value1", kv_pairs
[0].second
);
107 EXPECT_EQ("key3", kv_pairs
[1].first
);
108 EXPECT_EQ("value3", kv_pairs
[1].second
);
111 TEST_F(SplitStringIntoKeyValuePairsTest
, EmptySecondValue
) {
112 EXPECT_FALSE(SplitStringIntoKeyValuePairs("key1:value1 , key2:",
113 ':', // Key-value delimiters
114 ',', // Key-value pair delims
116 ASSERT_EQ(2U, kv_pairs
.size());
117 EXPECT_EQ("key1", kv_pairs
[0].first
);
118 EXPECT_EQ("value1", kv_pairs
[0].second
);
119 EXPECT_EQ("key2", kv_pairs
[1].first
);
120 EXPECT_EQ("", kv_pairs
[1].second
);
123 TEST_F(SplitStringIntoKeyValuePairsTest
, DelimiterInValue
) {
124 EXPECT_TRUE(SplitStringIntoKeyValuePairs("key1:va:ue1 , key2:value2",
125 ':', // Key-value delimiters
126 ',', // Key-value pair delims
128 ASSERT_EQ(2U, kv_pairs
.size());
129 EXPECT_EQ("key1", kv_pairs
[0].first
);
130 EXPECT_EQ("va:ue1", kv_pairs
[0].second
);
131 EXPECT_EQ("key2", kv_pairs
[1].first
);
132 EXPECT_EQ("value2", kv_pairs
[1].second
);
135 TEST(SplitStringUsingSubstrTest
, EmptyString
) {
136 std::vector
<std::string
> results
;
137 SplitStringUsingSubstr("", "DELIMITER", &results
);
138 ASSERT_EQ(1u, results
.size());
139 EXPECT_THAT(results
, ElementsAre(""));
142 // Test for SplitString
143 TEST(StringUtilTest
, SplitString
) {
144 std::vector
<std::wstring
> r
;
146 SplitString(L
"", L
',', &r
);
147 ASSERT_EQ(1U, r
.size());
148 EXPECT_EQ(r
[0], L
"");
151 SplitString(L
"a,b,c", L
',', &r
);
152 ASSERT_EQ(3U, r
.size());
153 EXPECT_EQ(r
[0], L
"a");
154 EXPECT_EQ(r
[1], L
"b");
155 EXPECT_EQ(r
[2], L
"c");
158 SplitString(L
"a, b, c", L
',', &r
);
159 ASSERT_EQ(3U, r
.size());
160 EXPECT_EQ(r
[0], L
"a");
161 EXPECT_EQ(r
[1], L
"b");
162 EXPECT_EQ(r
[2], L
"c");
165 SplitString(L
"a,,c", L
',', &r
);
166 ASSERT_EQ(3U, r
.size());
167 EXPECT_EQ(r
[0], L
"a");
168 EXPECT_EQ(r
[1], L
"");
169 EXPECT_EQ(r
[2], L
"c");
172 SplitString(L
"", L
'*', &r
);
173 ASSERT_EQ(1U, r
.size());
174 EXPECT_EQ(r
[0], L
"");
177 SplitString(L
"foo", L
'*', &r
);
178 ASSERT_EQ(1U, r
.size());
179 EXPECT_EQ(r
[0], L
"foo");
182 SplitString(L
"foo ,", L
',', &r
);
183 ASSERT_EQ(2U, r
.size());
184 EXPECT_EQ(r
[0], L
"foo");
185 EXPECT_EQ(r
[1], L
"");
188 SplitString(L
",", L
',', &r
);
189 ASSERT_EQ(2U, r
.size());
190 EXPECT_EQ(r
[0], L
"");
191 EXPECT_EQ(r
[1], L
"");
194 SplitString(L
"\t\ta\t", L
'\t', &r
);
195 ASSERT_EQ(4U, r
.size());
196 EXPECT_EQ(r
[0], L
"");
197 EXPECT_EQ(r
[1], L
"");
198 EXPECT_EQ(r
[2], L
"a");
199 EXPECT_EQ(r
[3], L
"");
202 SplitString(L
"\ta\t\nb\tcc", L
'\n', &r
);
203 ASSERT_EQ(2U, r
.size());
204 EXPECT_EQ(r
[0], L
"a");
205 EXPECT_EQ(r
[1], L
"b\tcc");
209 TEST(SplitStringUsingSubstrTest
, StringWithNoDelimiter
) {
210 std::vector
<std::string
> results
;
211 SplitStringUsingSubstr("alongwordwithnodelimiter", "DELIMITER", &results
);
212 ASSERT_EQ(1u, results
.size());
213 EXPECT_THAT(results
, ElementsAre("alongwordwithnodelimiter"));
216 TEST(SplitStringUsingSubstrTest
, LeadingDelimitersSkipped
) {
217 std::vector
<std::string
> results
;
218 SplitStringUsingSubstr(
219 "DELIMITERDELIMITERDELIMITERoneDELIMITERtwoDELIMITERthree",
222 ASSERT_EQ(6u, results
.size());
223 EXPECT_THAT(results
, ElementsAre("", "", "", "one", "two", "three"));
226 TEST(SplitStringUsingSubstrTest
, ConsecutiveDelimitersSkipped
) {
227 std::vector
<std::string
> results
;
228 SplitStringUsingSubstr(
229 "unoDELIMITERDELIMITERDELIMITERdosDELIMITERtresDELIMITERDELIMITERcuatro",
232 ASSERT_EQ(7u, results
.size());
233 EXPECT_THAT(results
, ElementsAre("uno", "", "", "dos", "tres", "", "cuatro"));
236 TEST(SplitStringUsingSubstrTest
, TrailingDelimitersSkipped
) {
237 std::vector
<std::string
> results
;
238 SplitStringUsingSubstr(
239 "unDELIMITERdeuxDELIMITERtroisDELIMITERquatreDELIMITERDELIMITERDELIMITER",
242 ASSERT_EQ(7u, results
.size());
244 results
, ElementsAre("un", "deux", "trois", "quatre", "", "", ""));
247 TEST(StringSplitTest
, StringSplitDontTrim
) {
248 std::vector
<std::string
> r
;
250 SplitStringDontTrim("\t\ta\t", '\t', &r
);
251 ASSERT_EQ(4U, r
.size());
254 EXPECT_EQ(r
[2], "a");
258 SplitStringDontTrim("\ta\t\nb\tcc", '\n', &r
);
259 ASSERT_EQ(2U, r
.size());
260 EXPECT_EQ(r
[0], "\ta\t");
261 EXPECT_EQ(r
[1], "b\tcc");
265 TEST(StringSplitTest
, SplitStringAlongWhitespace
) {
267 const std::wstring input
;
268 const size_t expected_result_count
;
269 const std::wstring output1
;
270 const std::wstring output2
;
272 { L
"a", 1, L
"a", L
"" },
273 { L
" ", 0, L
"", L
"" },
274 { L
" a", 1, L
"a", L
"" },
275 { L
" ab ", 1, L
"ab", L
"" },
276 { L
" ab c", 2, L
"ab", L
"c" },
277 { L
" ab c ", 2, L
"ab", L
"c" },
278 { L
" ab cd", 2, L
"ab", L
"cd" },
279 { L
" ab cd ", 2, L
"ab", L
"cd" },
280 { L
" \ta\t", 1, L
"a", L
"" },
281 { L
" b\ta\t", 2, L
"b", L
"a" },
282 { L
" b\tat", 2, L
"b", L
"at" },
283 { L
"b\tat", 2, L
"b", L
"at" },
284 { L
"b\t at", 2, L
"b", L
"at" },
286 for (size_t i
= 0; i
< ARRAYSIZE_UNSAFE(data
); ++i
) {
287 std::vector
<std::wstring
> results
;
288 SplitStringAlongWhitespace(data
[i
].input
, &results
);
289 ASSERT_EQ(data
[i
].expected_result_count
, results
.size());
290 if (data
[i
].expected_result_count
> 0)
291 ASSERT_EQ(data
[i
].output1
, results
[0]);
292 if (data
[i
].expected_result_count
> 1)
293 ASSERT_EQ(data
[i
].output2
, results
[1]);