1 // Copyright (c) 2006-2008 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_tokenizer.h"
6 #include "testing/gtest/include/gtest/gtest.h"
11 class StringTokenizerTest
: public testing::Test
{};
14 TEST(StringTokenizerTest
, Simple
) {
15 string input
= "this is a test";
16 StringTokenizer
t(input
, " ");
18 EXPECT_TRUE(t
.GetNext());
19 EXPECT_EQ(string("this"), t
.token());
21 EXPECT_TRUE(t
.GetNext());
22 EXPECT_EQ(string("is"), t
.token());
24 EXPECT_TRUE(t
.GetNext());
25 EXPECT_EQ(string("a"), t
.token());
27 EXPECT_TRUE(t
.GetNext());
28 EXPECT_EQ(string("test"), t
.token());
30 EXPECT_FALSE(t
.GetNext());
33 TEST(StringTokenizerTest
, Reset
) {
34 string input
= "this is a test";
35 StringTokenizer
t(input
, " ");
37 for (int i
= 0; i
< 2; ++i
) {
38 EXPECT_TRUE(t
.GetNext());
39 EXPECT_EQ(string("this"), t
.token());
41 EXPECT_TRUE(t
.GetNext());
42 EXPECT_EQ(string("is"), t
.token());
44 EXPECT_TRUE(t
.GetNext());
45 EXPECT_EQ(string("a"), t
.token());
47 EXPECT_TRUE(t
.GetNext());
48 EXPECT_EQ(string("test"), t
.token());
50 EXPECT_FALSE(t
.GetNext());
55 TEST(StringTokenizerTest
, RetDelims
) {
56 string input
= "this is a test";
57 StringTokenizer
t(input
, " ");
58 t
.set_options(StringTokenizer::RETURN_DELIMS
);
60 EXPECT_TRUE(t
.GetNext());
61 EXPECT_EQ(string("this"), t
.token());
63 EXPECT_TRUE(t
.GetNext());
64 EXPECT_EQ(string(" "), t
.token());
66 EXPECT_TRUE(t
.GetNext());
67 EXPECT_EQ(string("is"), t
.token());
69 EXPECT_TRUE(t
.GetNext());
70 EXPECT_EQ(string(" "), t
.token());
72 EXPECT_TRUE(t
.GetNext());
73 EXPECT_EQ(string("a"), t
.token());
75 EXPECT_TRUE(t
.GetNext());
76 EXPECT_EQ(string(" "), t
.token());
78 EXPECT_TRUE(t
.GetNext());
79 EXPECT_EQ(string("test"), t
.token());
81 EXPECT_FALSE(t
.GetNext());
84 TEST(StringTokenizerTest
, ManyDelims
) {
85 string input
= "this: is, a-test";
86 StringTokenizer
t(input
, ": ,-");
88 EXPECT_TRUE(t
.GetNext());
89 EXPECT_EQ(string("this"), t
.token());
91 EXPECT_TRUE(t
.GetNext());
92 EXPECT_EQ(string("is"), t
.token());
94 EXPECT_TRUE(t
.GetNext());
95 EXPECT_EQ(string("a"), t
.token());
97 EXPECT_TRUE(t
.GetNext());
98 EXPECT_EQ(string("test"), t
.token());
100 EXPECT_FALSE(t
.GetNext());
103 TEST(StringTokenizerTest
, ParseHeader
) {
104 string input
= "Content-Type: text/html ; charset=UTF-8";
105 StringTokenizer
t(input
, ": ;=");
106 t
.set_options(StringTokenizer::RETURN_DELIMS
);
108 EXPECT_TRUE(t
.GetNext());
109 EXPECT_FALSE(t
.token_is_delim());
110 EXPECT_EQ(string("Content-Type"), t
.token());
112 EXPECT_TRUE(t
.GetNext());
113 EXPECT_TRUE(t
.token_is_delim());
114 EXPECT_EQ(string(":"), t
.token());
116 EXPECT_TRUE(t
.GetNext());
117 EXPECT_TRUE(t
.token_is_delim());
118 EXPECT_EQ(string(" "), t
.token());
120 EXPECT_TRUE(t
.GetNext());
121 EXPECT_FALSE(t
.token_is_delim());
122 EXPECT_EQ(string("text/html"), t
.token());
124 EXPECT_TRUE(t
.GetNext());
125 EXPECT_TRUE(t
.token_is_delim());
126 EXPECT_EQ(string(" "), t
.token());
128 EXPECT_TRUE(t
.GetNext());
129 EXPECT_TRUE(t
.token_is_delim());
130 EXPECT_EQ(string(";"), t
.token());
132 EXPECT_TRUE(t
.GetNext());
133 EXPECT_TRUE(t
.token_is_delim());
134 EXPECT_EQ(string(" "), t
.token());
136 EXPECT_TRUE(t
.GetNext());
137 EXPECT_FALSE(t
.token_is_delim());
138 EXPECT_EQ(string("charset"), t
.token());
140 EXPECT_TRUE(t
.GetNext());
141 EXPECT_TRUE(t
.token_is_delim());
142 EXPECT_EQ(string("="), t
.token());
144 EXPECT_TRUE(t
.GetNext());
145 EXPECT_FALSE(t
.token_is_delim());
146 EXPECT_EQ(string("UTF-8"), t
.token());
148 EXPECT_FALSE(t
.GetNext());
149 EXPECT_FALSE(t
.token_is_delim());
152 TEST(StringTokenizerTest
, ParseQuotedString
) {
153 string input
= "foo bar 'hello world' baz";
154 StringTokenizer
t(input
, " ");
155 t
.set_quote_chars("'");
157 EXPECT_TRUE(t
.GetNext());
158 EXPECT_EQ(string("foo"), t
.token());
160 EXPECT_TRUE(t
.GetNext());
161 EXPECT_EQ(string("bar"), t
.token());
163 EXPECT_TRUE(t
.GetNext());
164 EXPECT_EQ(string("'hello world'"), t
.token());
166 EXPECT_TRUE(t
.GetNext());
167 EXPECT_EQ(string("baz"), t
.token());
169 EXPECT_FALSE(t
.GetNext());
172 TEST(StringTokenizerTest
, ParseQuotedString_Malformed
) {
173 string input
= "bar 'hello wo";
174 StringTokenizer
t(input
, " ");
175 t
.set_quote_chars("'");
177 EXPECT_TRUE(t
.GetNext());
178 EXPECT_EQ(string("bar"), t
.token());
180 EXPECT_TRUE(t
.GetNext());
181 EXPECT_EQ(string("'hello wo"), t
.token());
183 EXPECT_FALSE(t
.GetNext());
186 TEST(StringTokenizerTest
, ParseQuotedString_Multiple
) {
187 string input
= "bar 'hel\"lo\" wo' baz\"";
188 StringTokenizer
t(input
, " ");
189 t
.set_quote_chars("'\"");
191 EXPECT_TRUE(t
.GetNext());
192 EXPECT_EQ(string("bar"), t
.token());
194 EXPECT_TRUE(t
.GetNext());
195 EXPECT_EQ(string("'hel\"lo\" wo'"), t
.token());
197 EXPECT_TRUE(t
.GetNext());
198 EXPECT_EQ(string("baz\""), t
.token());
200 EXPECT_FALSE(t
.GetNext());
203 TEST(StringTokenizerTest
, ParseQuotedString_EscapedQuotes
) {
204 string input
= "foo 'don\\'t do that'";
205 StringTokenizer
t(input
, " ");
206 t
.set_quote_chars("'");
208 EXPECT_TRUE(t
.GetNext());
209 EXPECT_EQ(string("foo"), t
.token());
211 EXPECT_TRUE(t
.GetNext());
212 EXPECT_EQ(string("'don\\'t do that'"), t
.token());
214 EXPECT_FALSE(t
.GetNext());
217 TEST(StringTokenizerTest
, ParseQuotedString_EscapedQuotes2
) {
218 string input
= "foo='a, b', bar";
219 StringTokenizer
t(input
, ", ");
220 t
.set_quote_chars("'");
222 EXPECT_TRUE(t
.GetNext());
223 EXPECT_EQ(string("foo='a, b'"), t
.token());
225 EXPECT_TRUE(t
.GetNext());
226 EXPECT_EQ(string("bar"), t
.token());
228 EXPECT_FALSE(t
.GetNext());