1*6777b538SAndroid Build Coastguard Worker // Copyright 2006-2008 The Chromium Authors
2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file.
4*6777b538SAndroid Build Coastguard Worker
5*6777b538SAndroid Build Coastguard Worker #include "base/strings/string_tokenizer.h"
6*6777b538SAndroid Build Coastguard Worker
7*6777b538SAndroid Build Coastguard Worker #include "testing/gtest/include/gtest/gtest.h"
8*6777b538SAndroid Build Coastguard Worker
9*6777b538SAndroid Build Coastguard Worker using std::string;
10*6777b538SAndroid Build Coastguard Worker
11*6777b538SAndroid Build Coastguard Worker namespace base {
12*6777b538SAndroid Build Coastguard Worker
13*6777b538SAndroid Build Coastguard Worker namespace {
14*6777b538SAndroid Build Coastguard Worker
TEST(StringTokenizerTest,Simple)15*6777b538SAndroid Build Coastguard Worker TEST(StringTokenizerTest, Simple) {
16*6777b538SAndroid Build Coastguard Worker string input = "this is a test";
17*6777b538SAndroid Build Coastguard Worker StringTokenizer t(input, " ");
18*6777b538SAndroid Build Coastguard Worker // The start of string, before returning any tokens, is considered a
19*6777b538SAndroid Build Coastguard Worker // delimiter.
20*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(t.token_is_delim());
21*6777b538SAndroid Build Coastguard Worker
22*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(t.GetNext());
23*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(t.token_is_delim());
24*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("this", t.token());
25*6777b538SAndroid Build Coastguard Worker
26*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(t.GetNext());
27*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(t.token_is_delim());
28*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("is", t.token());
29*6777b538SAndroid Build Coastguard Worker
30*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(t.GetNext());
31*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(t.token_is_delim());
32*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("a", t.token());
33*6777b538SAndroid Build Coastguard Worker
34*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(t.GetNext());
35*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(t.token_is_delim());
36*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("test", t.token());
37*6777b538SAndroid Build Coastguard Worker
38*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(t.GetNext());
39*6777b538SAndroid Build Coastguard Worker // The end of string, after the last token tokens, is considered a delimiter.
40*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(t.token_is_delim());
41*6777b538SAndroid Build Coastguard Worker }
42*6777b538SAndroid Build Coastguard Worker
TEST(StringTokenizerTest,Reset)43*6777b538SAndroid Build Coastguard Worker TEST(StringTokenizerTest, Reset) {
44*6777b538SAndroid Build Coastguard Worker string input = "this is a test";
45*6777b538SAndroid Build Coastguard Worker StringTokenizer t(input, " ");
46*6777b538SAndroid Build Coastguard Worker
47*6777b538SAndroid Build Coastguard Worker for (int i = 0; i < 2; ++i) {
48*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(t.token_is_delim());
49*6777b538SAndroid Build Coastguard Worker
50*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(t.GetNext());
51*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(t.token_is_delim());
52*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("this", t.token());
53*6777b538SAndroid Build Coastguard Worker
54*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(t.GetNext());
55*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(t.token_is_delim());
56*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("is", t.token());
57*6777b538SAndroid Build Coastguard Worker
58*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(t.GetNext());
59*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(t.token_is_delim());
60*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("a", t.token());
61*6777b538SAndroid Build Coastguard Worker
62*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(t.GetNext());
63*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(t.token_is_delim());
64*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("test", t.token());
65*6777b538SAndroid Build Coastguard Worker
66*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(t.GetNext());
67*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(t.token_is_delim());
68*6777b538SAndroid Build Coastguard Worker
69*6777b538SAndroid Build Coastguard Worker t.Reset();
70*6777b538SAndroid Build Coastguard Worker }
71*6777b538SAndroid Build Coastguard Worker }
72*6777b538SAndroid Build Coastguard Worker
TEST(StringTokenizerTest,RetDelims)73*6777b538SAndroid Build Coastguard Worker TEST(StringTokenizerTest, RetDelims) {
74*6777b538SAndroid Build Coastguard Worker string input = "this is a test";
75*6777b538SAndroid Build Coastguard Worker StringTokenizer t(input, " ");
76*6777b538SAndroid Build Coastguard Worker t.set_options(StringTokenizer::RETURN_DELIMS);
77*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(t.token_is_delim());
78*6777b538SAndroid Build Coastguard Worker
79*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(t.GetNext());
80*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(t.token_is_delim());
81*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("this", t.token());
82*6777b538SAndroid Build Coastguard Worker
83*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(t.GetNext());
84*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(t.token_is_delim());
85*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(" ", t.token());
86*6777b538SAndroid Build Coastguard Worker
87*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(t.GetNext());
88*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(t.token_is_delim());
89*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("is", t.token());
90*6777b538SAndroid Build Coastguard Worker
91*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(t.GetNext());
92*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(t.token_is_delim());
93*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(" ", t.token());
94*6777b538SAndroid Build Coastguard Worker
95*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(t.GetNext());
96*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(t.token_is_delim());
97*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("a", t.token());
98*6777b538SAndroid Build Coastguard Worker
99*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(t.GetNext());
100*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(t.token_is_delim());
101*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(" ", t.token());
102*6777b538SAndroid Build Coastguard Worker
103*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(t.GetNext());
104*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(t.token_is_delim());
105*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("test", t.token());
106*6777b538SAndroid Build Coastguard Worker
107*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(t.GetNext());
108*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(t.token_is_delim());
109*6777b538SAndroid Build Coastguard Worker }
110*6777b538SAndroid Build Coastguard Worker
TEST(StringTokenizerTest,RetEmptyTokens)111*6777b538SAndroid Build Coastguard Worker TEST(StringTokenizerTest, RetEmptyTokens) {
112*6777b538SAndroid Build Coastguard Worker string input = "foo='a, b',,bar,,baz,quux";
113*6777b538SAndroid Build Coastguard Worker StringTokenizer t(input, ",");
114*6777b538SAndroid Build Coastguard Worker t.set_options(StringTokenizer::RETURN_EMPTY_TOKENS);
115*6777b538SAndroid Build Coastguard Worker t.set_quote_chars("'");
116*6777b538SAndroid Build Coastguard Worker
117*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(t.GetNext());
118*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("foo='a, b'", t.token());
119*6777b538SAndroid Build Coastguard Worker
120*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(t.GetNext());
121*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("", t.token());
122*6777b538SAndroid Build Coastguard Worker
123*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(t.GetNext());
124*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("bar", t.token());
125*6777b538SAndroid Build Coastguard Worker
126*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(t.GetNext());
127*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("", t.token());
128*6777b538SAndroid Build Coastguard Worker
129*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(t.GetNext());
130*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("baz", t.token());
131*6777b538SAndroid Build Coastguard Worker
132*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(t.GetNext());
133*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("quux", t.token());
134*6777b538SAndroid Build Coastguard Worker
135*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(t.GetNext());
136*6777b538SAndroid Build Coastguard Worker }
137*6777b538SAndroid Build Coastguard Worker
TEST(StringTokenizerTest,RetEmptyTokens_AtStart)138*6777b538SAndroid Build Coastguard Worker TEST(StringTokenizerTest, RetEmptyTokens_AtStart) {
139*6777b538SAndroid Build Coastguard Worker string input = ",bar";
140*6777b538SAndroid Build Coastguard Worker StringTokenizer t(input, ",");
141*6777b538SAndroid Build Coastguard Worker t.set_options(StringTokenizer::RETURN_EMPTY_TOKENS);
142*6777b538SAndroid Build Coastguard Worker t.set_quote_chars("'");
143*6777b538SAndroid Build Coastguard Worker
144*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(t.GetNext());
145*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("", t.token());
146*6777b538SAndroid Build Coastguard Worker
147*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(t.GetNext());
148*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("bar", t.token());
149*6777b538SAndroid Build Coastguard Worker
150*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(t.GetNext());
151*6777b538SAndroid Build Coastguard Worker }
152*6777b538SAndroid Build Coastguard Worker
TEST(StringTokenizerTest,RetEmptyTokens_AtEnd)153*6777b538SAndroid Build Coastguard Worker TEST(StringTokenizerTest, RetEmptyTokens_AtEnd) {
154*6777b538SAndroid Build Coastguard Worker string input = "bar,";
155*6777b538SAndroid Build Coastguard Worker StringTokenizer t(input, ",");
156*6777b538SAndroid Build Coastguard Worker t.set_options(StringTokenizer::RETURN_EMPTY_TOKENS);
157*6777b538SAndroid Build Coastguard Worker t.set_quote_chars("'");
158*6777b538SAndroid Build Coastguard Worker
159*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(t.GetNext());
160*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("bar", t.token());
161*6777b538SAndroid Build Coastguard Worker
162*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(t.GetNext());
163*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("", t.token());
164*6777b538SAndroid Build Coastguard Worker
165*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(t.GetNext());
166*6777b538SAndroid Build Coastguard Worker }
167*6777b538SAndroid Build Coastguard Worker
TEST(StringTokenizerTest,RetEmptyTokens_Both)168*6777b538SAndroid Build Coastguard Worker TEST(StringTokenizerTest, RetEmptyTokens_Both) {
169*6777b538SAndroid Build Coastguard Worker string input = ",";
170*6777b538SAndroid Build Coastguard Worker StringTokenizer t(input, ",");
171*6777b538SAndroid Build Coastguard Worker t.set_options(StringTokenizer::RETURN_EMPTY_TOKENS);
172*6777b538SAndroid Build Coastguard Worker t.set_quote_chars("'");
173*6777b538SAndroid Build Coastguard Worker
174*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(t.GetNext());
175*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("", t.token());
176*6777b538SAndroid Build Coastguard Worker
177*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(t.GetNext());
178*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("", t.token());
179*6777b538SAndroid Build Coastguard Worker
180*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(t.GetNext());
181*6777b538SAndroid Build Coastguard Worker }
182*6777b538SAndroid Build Coastguard Worker
TEST(StringTokenizerTest,RetEmptyTokens_Empty)183*6777b538SAndroid Build Coastguard Worker TEST(StringTokenizerTest, RetEmptyTokens_Empty) {
184*6777b538SAndroid Build Coastguard Worker string input = "";
185*6777b538SAndroid Build Coastguard Worker StringTokenizer t(input, ",");
186*6777b538SAndroid Build Coastguard Worker t.set_options(StringTokenizer::RETURN_EMPTY_TOKENS);
187*6777b538SAndroid Build Coastguard Worker
188*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(t.GetNext());
189*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("", t.token());
190*6777b538SAndroid Build Coastguard Worker
191*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(t.GetNext());
192*6777b538SAndroid Build Coastguard Worker }
193*6777b538SAndroid Build Coastguard Worker
TEST(StringTokenizerTest,RetDelimsAndEmptyTokens)194*6777b538SAndroid Build Coastguard Worker TEST(StringTokenizerTest, RetDelimsAndEmptyTokens) {
195*6777b538SAndroid Build Coastguard Worker string input = "foo='a, b',,bar,,baz,quux";
196*6777b538SAndroid Build Coastguard Worker StringTokenizer t(input, ",");
197*6777b538SAndroid Build Coastguard Worker t.set_options(StringTokenizer::RETURN_DELIMS |
198*6777b538SAndroid Build Coastguard Worker StringTokenizer::RETURN_EMPTY_TOKENS);
199*6777b538SAndroid Build Coastguard Worker t.set_quote_chars("'");
200*6777b538SAndroid Build Coastguard Worker
201*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(t.GetNext());
202*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("foo='a, b'", t.token());
203*6777b538SAndroid Build Coastguard Worker
204*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(t.GetNext());
205*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(",", t.token());
206*6777b538SAndroid Build Coastguard Worker
207*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(t.GetNext());
208*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("", t.token());
209*6777b538SAndroid Build Coastguard Worker
210*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(t.GetNext());
211*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(",", t.token());
212*6777b538SAndroid Build Coastguard Worker
213*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(t.GetNext());
214*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("bar", t.token());
215*6777b538SAndroid Build Coastguard Worker
216*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(t.GetNext());
217*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(",", t.token());
218*6777b538SAndroid Build Coastguard Worker
219*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(t.GetNext());
220*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("", t.token());
221*6777b538SAndroid Build Coastguard Worker
222*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(t.GetNext());
223*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(",", t.token());
224*6777b538SAndroid Build Coastguard Worker
225*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(t.GetNext());
226*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("baz", t.token());
227*6777b538SAndroid Build Coastguard Worker
228*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(t.GetNext());
229*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(",", t.token());
230*6777b538SAndroid Build Coastguard Worker
231*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(t.GetNext());
232*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("quux", t.token());
233*6777b538SAndroid Build Coastguard Worker
234*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(t.GetNext());
235*6777b538SAndroid Build Coastguard Worker }
236*6777b538SAndroid Build Coastguard Worker
TEST(StringTokenizerTest,ManyDelims)237*6777b538SAndroid Build Coastguard Worker TEST(StringTokenizerTest, ManyDelims) {
238*6777b538SAndroid Build Coastguard Worker string input = "this: is, a-test";
239*6777b538SAndroid Build Coastguard Worker StringTokenizer t(input, ": ,-");
240*6777b538SAndroid Build Coastguard Worker
241*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(t.GetNext());
242*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("this", t.token());
243*6777b538SAndroid Build Coastguard Worker
244*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(t.GetNext());
245*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("is", t.token());
246*6777b538SAndroid Build Coastguard Worker
247*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(t.GetNext());
248*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("a", t.token());
249*6777b538SAndroid Build Coastguard Worker
250*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(t.GetNext());
251*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("test", t.token());
252*6777b538SAndroid Build Coastguard Worker
253*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(t.GetNext());
254*6777b538SAndroid Build Coastguard Worker }
255*6777b538SAndroid Build Coastguard Worker
TEST(StringTokenizerTest,ParseHeader)256*6777b538SAndroid Build Coastguard Worker TEST(StringTokenizerTest, ParseHeader) {
257*6777b538SAndroid Build Coastguard Worker string input = "Content-Type: text/html ; charset=UTF-8";
258*6777b538SAndroid Build Coastguard Worker StringTokenizer t(input, ": ;=");
259*6777b538SAndroid Build Coastguard Worker t.set_options(StringTokenizer::RETURN_DELIMS);
260*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(t.token_is_delim());
261*6777b538SAndroid Build Coastguard Worker
262*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(t.GetNext());
263*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(t.token_is_delim());
264*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("Content-Type", t.token());
265*6777b538SAndroid Build Coastguard Worker
266*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(t.GetNext());
267*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(t.token_is_delim());
268*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(":", t.token());
269*6777b538SAndroid Build Coastguard Worker
270*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(t.GetNext());
271*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(t.token_is_delim());
272*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(" ", t.token());
273*6777b538SAndroid Build Coastguard Worker
274*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(t.GetNext());
275*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(t.token_is_delim());
276*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("text/html", t.token());
277*6777b538SAndroid Build Coastguard Worker
278*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(t.GetNext());
279*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(t.token_is_delim());
280*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(" ", t.token());
281*6777b538SAndroid Build Coastguard Worker
282*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(t.GetNext());
283*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(t.token_is_delim());
284*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(";", t.token());
285*6777b538SAndroid Build Coastguard Worker
286*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(t.GetNext());
287*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(t.token_is_delim());
288*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(" ", t.token());
289*6777b538SAndroid Build Coastguard Worker
290*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(t.GetNext());
291*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(t.token_is_delim());
292*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("charset", t.token());
293*6777b538SAndroid Build Coastguard Worker
294*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(t.GetNext());
295*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(t.token_is_delim());
296*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("=", t.token());
297*6777b538SAndroid Build Coastguard Worker
298*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(t.GetNext());
299*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(t.token_is_delim());
300*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("UTF-8", t.token());
301*6777b538SAndroid Build Coastguard Worker
302*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(t.GetNext());
303*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(t.token_is_delim());
304*6777b538SAndroid Build Coastguard Worker }
305*6777b538SAndroid Build Coastguard Worker
TEST(StringTokenizerTest,ParseQuotedString)306*6777b538SAndroid Build Coastguard Worker TEST(StringTokenizerTest, ParseQuotedString) {
307*6777b538SAndroid Build Coastguard Worker string input = "foo bar 'hello world' baz";
308*6777b538SAndroid Build Coastguard Worker StringTokenizer t(input, " ");
309*6777b538SAndroid Build Coastguard Worker t.set_quote_chars("'");
310*6777b538SAndroid Build Coastguard Worker
311*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(t.GetNext());
312*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("foo", t.token());
313*6777b538SAndroid Build Coastguard Worker
314*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(t.GetNext());
315*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("bar", t.token());
316*6777b538SAndroid Build Coastguard Worker
317*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(t.GetNext());
318*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("'hello world'", t.token());
319*6777b538SAndroid Build Coastguard Worker
320*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(t.GetNext());
321*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("baz", t.token());
322*6777b538SAndroid Build Coastguard Worker
323*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(t.GetNext());
324*6777b538SAndroid Build Coastguard Worker }
325*6777b538SAndroid Build Coastguard Worker
TEST(StringTokenizerTest,ParseQuotedString_Malformed)326*6777b538SAndroid Build Coastguard Worker TEST(StringTokenizerTest, ParseQuotedString_Malformed) {
327*6777b538SAndroid Build Coastguard Worker string input = "bar 'hello wo";
328*6777b538SAndroid Build Coastguard Worker StringTokenizer t(input, " ");
329*6777b538SAndroid Build Coastguard Worker t.set_quote_chars("'");
330*6777b538SAndroid Build Coastguard Worker
331*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(t.GetNext());
332*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("bar", t.token());
333*6777b538SAndroid Build Coastguard Worker
334*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(t.GetNext());
335*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("'hello wo", t.token());
336*6777b538SAndroid Build Coastguard Worker
337*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(t.GetNext());
338*6777b538SAndroid Build Coastguard Worker }
339*6777b538SAndroid Build Coastguard Worker
TEST(StringTokenizerTest,ParseQuotedString_Multiple)340*6777b538SAndroid Build Coastguard Worker TEST(StringTokenizerTest, ParseQuotedString_Multiple) {
341*6777b538SAndroid Build Coastguard Worker string input = "bar 'hel\"lo\" wo' baz\"";
342*6777b538SAndroid Build Coastguard Worker StringTokenizer t(input, " ");
343*6777b538SAndroid Build Coastguard Worker t.set_quote_chars("'\"");
344*6777b538SAndroid Build Coastguard Worker
345*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(t.GetNext());
346*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("bar", t.token());
347*6777b538SAndroid Build Coastguard Worker
348*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(t.GetNext());
349*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("'hel\"lo\" wo'", t.token());
350*6777b538SAndroid Build Coastguard Worker
351*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(t.GetNext());
352*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("baz\"", t.token());
353*6777b538SAndroid Build Coastguard Worker
354*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(t.GetNext());
355*6777b538SAndroid Build Coastguard Worker }
356*6777b538SAndroid Build Coastguard Worker
TEST(StringTokenizerTest,ParseQuotedString_EscapedQuotes)357*6777b538SAndroid Build Coastguard Worker TEST(StringTokenizerTest, ParseQuotedString_EscapedQuotes) {
358*6777b538SAndroid Build Coastguard Worker string input = "foo 'don\\'t do that'";
359*6777b538SAndroid Build Coastguard Worker StringTokenizer t(input, " ");
360*6777b538SAndroid Build Coastguard Worker t.set_quote_chars("'");
361*6777b538SAndroid Build Coastguard Worker
362*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(t.GetNext());
363*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("foo", t.token());
364*6777b538SAndroid Build Coastguard Worker
365*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(t.GetNext());
366*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("'don\\'t do that'", t.token());
367*6777b538SAndroid Build Coastguard Worker
368*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(t.GetNext());
369*6777b538SAndroid Build Coastguard Worker }
370*6777b538SAndroid Build Coastguard Worker
TEST(StringTokenizerTest,ParseQuotedString_EscapedQuotes2)371*6777b538SAndroid Build Coastguard Worker TEST(StringTokenizerTest, ParseQuotedString_EscapedQuotes2) {
372*6777b538SAndroid Build Coastguard Worker string input = "foo='a, b', bar";
373*6777b538SAndroid Build Coastguard Worker StringTokenizer t(input, ", ");
374*6777b538SAndroid Build Coastguard Worker t.set_quote_chars("'");
375*6777b538SAndroid Build Coastguard Worker
376*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(t.GetNext());
377*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("foo='a, b'", t.token());
378*6777b538SAndroid Build Coastguard Worker
379*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(t.GetNext());
380*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("bar", t.token());
381*6777b538SAndroid Build Coastguard Worker
382*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(t.GetNext());
383*6777b538SAndroid Build Coastguard Worker }
384*6777b538SAndroid Build Coastguard Worker
TEST(StringTokenizerTest,ParseWithWhitespace_NoQuotes)385*6777b538SAndroid Build Coastguard Worker TEST(StringTokenizerTest, ParseWithWhitespace_NoQuotes) {
386*6777b538SAndroid Build Coastguard Worker string input = "\t\t\t foo=a,\r\n b,\r\n\t\t\t bar\t ";
387*6777b538SAndroid Build Coastguard Worker StringTokenizer t(input, ",", StringTokenizer::WhitespacePolicy::kSkipOver);
388*6777b538SAndroid Build Coastguard Worker
389*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(t.GetNext());
390*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("foo=a", t.token());
391*6777b538SAndroid Build Coastguard Worker
392*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(t.GetNext());
393*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("b", t.token());
394*6777b538SAndroid Build Coastguard Worker
395*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(t.GetNext());
396*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("bar", t.token());
397*6777b538SAndroid Build Coastguard Worker
398*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(t.GetNext());
399*6777b538SAndroid Build Coastguard Worker }
400*6777b538SAndroid Build Coastguard Worker
TEST(StringTokenizerTest,ParseWithWhitespace_Quotes)401*6777b538SAndroid Build Coastguard Worker TEST(StringTokenizerTest, ParseWithWhitespace_Quotes) {
402*6777b538SAndroid Build Coastguard Worker string input = "\t\t\t foo='a, b',\t\t\t bar\t ";
403*6777b538SAndroid Build Coastguard Worker StringTokenizer t(input, ",", StringTokenizer::WhitespacePolicy::kSkipOver);
404*6777b538SAndroid Build Coastguard Worker t.set_quote_chars("'");
405*6777b538SAndroid Build Coastguard Worker
406*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(t.GetNext());
407*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("foo='a, b'", t.token());
408*6777b538SAndroid Build Coastguard Worker
409*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(t.GetNext());
410*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("bar", t.token());
411*6777b538SAndroid Build Coastguard Worker
412*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(t.GetNext());
413*6777b538SAndroid Build Coastguard Worker }
414*6777b538SAndroid Build Coastguard Worker
415*6777b538SAndroid Build Coastguard Worker } // namespace
416*6777b538SAndroid Build Coastguard Worker
417*6777b538SAndroid Build Coastguard Worker } // namespace base
418