1*8f0ba417SAndroid Build Coastguard Worker /*
2*8f0ba417SAndroid Build Coastguard Worker * Copyright (C) 2015 The Android Open Source Project
3*8f0ba417SAndroid Build Coastguard Worker *
4*8f0ba417SAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
5*8f0ba417SAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
6*8f0ba417SAndroid Build Coastguard Worker * You may obtain a copy of the License at
7*8f0ba417SAndroid Build Coastguard Worker *
8*8f0ba417SAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
9*8f0ba417SAndroid Build Coastguard Worker *
10*8f0ba417SAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
11*8f0ba417SAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
12*8f0ba417SAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*8f0ba417SAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
14*8f0ba417SAndroid Build Coastguard Worker * limitations under the License.
15*8f0ba417SAndroid Build Coastguard Worker */
16*8f0ba417SAndroid Build Coastguard Worker
17*8f0ba417SAndroid Build Coastguard Worker #include "android-base/strings.h"
18*8f0ba417SAndroid Build Coastguard Worker
19*8f0ba417SAndroid Build Coastguard Worker #include <gtest/gtest.h>
20*8f0ba417SAndroid Build Coastguard Worker
21*8f0ba417SAndroid Build Coastguard Worker #include <string>
22*8f0ba417SAndroid Build Coastguard Worker #include <vector>
23*8f0ba417SAndroid Build Coastguard Worker #include <set>
24*8f0ba417SAndroid Build Coastguard Worker #include <unordered_set>
25*8f0ba417SAndroid Build Coastguard Worker
TEST(strings,split_empty)26*8f0ba417SAndroid Build Coastguard Worker TEST(strings, split_empty) {
27*8f0ba417SAndroid Build Coastguard Worker std::vector<std::string> parts = android::base::Split("", ",");
28*8f0ba417SAndroid Build Coastguard Worker ASSERT_EQ(1U, parts.size());
29*8f0ba417SAndroid Build Coastguard Worker ASSERT_EQ("", parts[0]);
30*8f0ba417SAndroid Build Coastguard Worker }
31*8f0ba417SAndroid Build Coastguard Worker
TEST(strings,split_single)32*8f0ba417SAndroid Build Coastguard Worker TEST(strings, split_single) {
33*8f0ba417SAndroid Build Coastguard Worker std::vector<std::string> parts = android::base::Split("foo", ",");
34*8f0ba417SAndroid Build Coastguard Worker ASSERT_EQ(1U, parts.size());
35*8f0ba417SAndroid Build Coastguard Worker ASSERT_EQ("foo", parts[0]);
36*8f0ba417SAndroid Build Coastguard Worker }
37*8f0ba417SAndroid Build Coastguard Worker
TEST(strings,split_simple)38*8f0ba417SAndroid Build Coastguard Worker TEST(strings, split_simple) {
39*8f0ba417SAndroid Build Coastguard Worker std::vector<std::string> parts = android::base::Split("foo,bar,baz", ",");
40*8f0ba417SAndroid Build Coastguard Worker ASSERT_EQ(3U, parts.size());
41*8f0ba417SAndroid Build Coastguard Worker ASSERT_EQ("foo", parts[0]);
42*8f0ba417SAndroid Build Coastguard Worker ASSERT_EQ("bar", parts[1]);
43*8f0ba417SAndroid Build Coastguard Worker ASSERT_EQ("baz", parts[2]);
44*8f0ba417SAndroid Build Coastguard Worker }
45*8f0ba417SAndroid Build Coastguard Worker
TEST(strings,split_with_empty_part)46*8f0ba417SAndroid Build Coastguard Worker TEST(strings, split_with_empty_part) {
47*8f0ba417SAndroid Build Coastguard Worker std::vector<std::string> parts = android::base::Split("foo,,bar", ",");
48*8f0ba417SAndroid Build Coastguard Worker ASSERT_EQ(3U, parts.size());
49*8f0ba417SAndroid Build Coastguard Worker ASSERT_EQ("foo", parts[0]);
50*8f0ba417SAndroid Build Coastguard Worker ASSERT_EQ("", parts[1]);
51*8f0ba417SAndroid Build Coastguard Worker ASSERT_EQ("bar", parts[2]);
52*8f0ba417SAndroid Build Coastguard Worker }
53*8f0ba417SAndroid Build Coastguard Worker
TEST(strings,split_with_trailing_empty_part)54*8f0ba417SAndroid Build Coastguard Worker TEST(strings, split_with_trailing_empty_part) {
55*8f0ba417SAndroid Build Coastguard Worker std::vector<std::string> parts = android::base::Split("foo,bar,", ",");
56*8f0ba417SAndroid Build Coastguard Worker ASSERT_EQ(3U, parts.size());
57*8f0ba417SAndroid Build Coastguard Worker ASSERT_EQ("foo", parts[0]);
58*8f0ba417SAndroid Build Coastguard Worker ASSERT_EQ("bar", parts[1]);
59*8f0ba417SAndroid Build Coastguard Worker ASSERT_EQ("", parts[2]);
60*8f0ba417SAndroid Build Coastguard Worker }
61*8f0ba417SAndroid Build Coastguard Worker
TEST(strings,split_null_char)62*8f0ba417SAndroid Build Coastguard Worker TEST(strings, split_null_char) {
63*8f0ba417SAndroid Build Coastguard Worker std::vector<std::string> parts =
64*8f0ba417SAndroid Build Coastguard Worker android::base::Split(std::string("foo\0bar", 7), std::string("\0", 1));
65*8f0ba417SAndroid Build Coastguard Worker ASSERT_EQ(2U, parts.size());
66*8f0ba417SAndroid Build Coastguard Worker ASSERT_EQ("foo", parts[0]);
67*8f0ba417SAndroid Build Coastguard Worker ASSERT_EQ("bar", parts[1]);
68*8f0ba417SAndroid Build Coastguard Worker }
69*8f0ba417SAndroid Build Coastguard Worker
TEST(strings,split_any)70*8f0ba417SAndroid Build Coastguard Worker TEST(strings, split_any) {
71*8f0ba417SAndroid Build Coastguard Worker std::vector<std::string> parts = android::base::Split("foo:bar,baz", ",:");
72*8f0ba417SAndroid Build Coastguard Worker ASSERT_EQ(3U, parts.size());
73*8f0ba417SAndroid Build Coastguard Worker ASSERT_EQ("foo", parts[0]);
74*8f0ba417SAndroid Build Coastguard Worker ASSERT_EQ("bar", parts[1]);
75*8f0ba417SAndroid Build Coastguard Worker ASSERT_EQ("baz", parts[2]);
76*8f0ba417SAndroid Build Coastguard Worker }
77*8f0ba417SAndroid Build Coastguard Worker
TEST(strings,split_any_with_empty_part)78*8f0ba417SAndroid Build Coastguard Worker TEST(strings, split_any_with_empty_part) {
79*8f0ba417SAndroid Build Coastguard Worker std::vector<std::string> parts = android::base::Split("foo:,bar", ",:");
80*8f0ba417SAndroid Build Coastguard Worker ASSERT_EQ(3U, parts.size());
81*8f0ba417SAndroid Build Coastguard Worker ASSERT_EQ("foo", parts[0]);
82*8f0ba417SAndroid Build Coastguard Worker ASSERT_EQ("", parts[1]);
83*8f0ba417SAndroid Build Coastguard Worker ASSERT_EQ("bar", parts[2]);
84*8f0ba417SAndroid Build Coastguard Worker }
85*8f0ba417SAndroid Build Coastguard Worker
TEST(strings,tokenize_empty)86*8f0ba417SAndroid Build Coastguard Worker TEST(strings, tokenize_empty) {
87*8f0ba417SAndroid Build Coastguard Worker std::vector<std::string> parts = android::base::Tokenize("", " ");
88*8f0ba417SAndroid Build Coastguard Worker ASSERT_EQ(0U, parts.size());
89*8f0ba417SAndroid Build Coastguard Worker }
90*8f0ba417SAndroid Build Coastguard Worker
TEST(strings,tokenize_all_delimiter)91*8f0ba417SAndroid Build Coastguard Worker TEST(strings, tokenize_all_delimiter) {
92*8f0ba417SAndroid Build Coastguard Worker std::vector<std::string> parts = android::base::Tokenize(" \t ", " \t");
93*8f0ba417SAndroid Build Coastguard Worker ASSERT_EQ(0U, parts.size());
94*8f0ba417SAndroid Build Coastguard Worker }
95*8f0ba417SAndroid Build Coastguard Worker
TEST(strings,tokenize_trivial)96*8f0ba417SAndroid Build Coastguard Worker TEST(strings, tokenize_trivial) {
97*8f0ba417SAndroid Build Coastguard Worker std::vector<std::string> parts = android::base::Tokenize("foo", "\t");
98*8f0ba417SAndroid Build Coastguard Worker ASSERT_EQ(1U, parts.size());
99*8f0ba417SAndroid Build Coastguard Worker ASSERT_EQ("foo", parts[0]);
100*8f0ba417SAndroid Build Coastguard Worker }
101*8f0ba417SAndroid Build Coastguard Worker
TEST(strings,tokenize_single)102*8f0ba417SAndroid Build Coastguard Worker TEST(strings, tokenize_single) {
103*8f0ba417SAndroid Build Coastguard Worker std::vector<std::string> parts = android::base::Tokenize("foo\t", "\t");
104*8f0ba417SAndroid Build Coastguard Worker ASSERT_EQ(1U, parts.size());
105*8f0ba417SAndroid Build Coastguard Worker ASSERT_EQ("foo", parts[0]);
106*8f0ba417SAndroid Build Coastguard Worker }
107*8f0ba417SAndroid Build Coastguard Worker
TEST(strings,tokenize_simple)108*8f0ba417SAndroid Build Coastguard Worker TEST(strings, tokenize_simple) {
109*8f0ba417SAndroid Build Coastguard Worker std::vector<std::string> parts = android::base::Tokenize("foo bar baz", " ");
110*8f0ba417SAndroid Build Coastguard Worker ASSERT_EQ(3U, parts.size());
111*8f0ba417SAndroid Build Coastguard Worker ASSERT_EQ("foo", parts[0]);
112*8f0ba417SAndroid Build Coastguard Worker ASSERT_EQ("bar", parts[1]);
113*8f0ba417SAndroid Build Coastguard Worker ASSERT_EQ("baz", parts[2]);
114*8f0ba417SAndroid Build Coastguard Worker }
115*8f0ba417SAndroid Build Coastguard Worker
TEST(strings,tokenize_any)116*8f0ba417SAndroid Build Coastguard Worker TEST(strings, tokenize_any) {
117*8f0ba417SAndroid Build Coastguard Worker std::vector<std::string> parts = android::base::Tokenize("foo \tbar\t\t baz", " \t");
118*8f0ba417SAndroid Build Coastguard Worker ASSERT_EQ(3U, parts.size());
119*8f0ba417SAndroid Build Coastguard Worker ASSERT_EQ("foo", parts[0]);
120*8f0ba417SAndroid Build Coastguard Worker ASSERT_EQ("bar", parts[1]);
121*8f0ba417SAndroid Build Coastguard Worker ASSERT_EQ("baz", parts[2]);
122*8f0ba417SAndroid Build Coastguard Worker }
123*8f0ba417SAndroid Build Coastguard Worker
TEST(strings,tokenize_beginning_trailing_delimiters)124*8f0ba417SAndroid Build Coastguard Worker TEST(strings, tokenize_beginning_trailing_delimiters) {
125*8f0ba417SAndroid Build Coastguard Worker std::vector<std::string> parts = android::base::Tokenize(" foo bar baz \t", " \t");
126*8f0ba417SAndroid Build Coastguard Worker ASSERT_EQ(3U, parts.size());
127*8f0ba417SAndroid Build Coastguard Worker ASSERT_EQ("foo", parts[0]);
128*8f0ba417SAndroid Build Coastguard Worker ASSERT_EQ("bar", parts[1]);
129*8f0ba417SAndroid Build Coastguard Worker ASSERT_EQ("baz", parts[2]);
130*8f0ba417SAndroid Build Coastguard Worker }
131*8f0ba417SAndroid Build Coastguard Worker
TEST(strings,trim_empty)132*8f0ba417SAndroid Build Coastguard Worker TEST(strings, trim_empty) {
133*8f0ba417SAndroid Build Coastguard Worker ASSERT_EQ("", android::base::Trim(""));
134*8f0ba417SAndroid Build Coastguard Worker }
135*8f0ba417SAndroid Build Coastguard Worker
TEST(strings,trim_already_trimmed)136*8f0ba417SAndroid Build Coastguard Worker TEST(strings, trim_already_trimmed) {
137*8f0ba417SAndroid Build Coastguard Worker ASSERT_EQ("foo", android::base::Trim("foo"));
138*8f0ba417SAndroid Build Coastguard Worker }
139*8f0ba417SAndroid Build Coastguard Worker
TEST(strings,trim_left)140*8f0ba417SAndroid Build Coastguard Worker TEST(strings, trim_left) {
141*8f0ba417SAndroid Build Coastguard Worker ASSERT_EQ("foo", android::base::Trim(" foo"));
142*8f0ba417SAndroid Build Coastguard Worker }
143*8f0ba417SAndroid Build Coastguard Worker
TEST(strings,trim_right)144*8f0ba417SAndroid Build Coastguard Worker TEST(strings, trim_right) {
145*8f0ba417SAndroid Build Coastguard Worker ASSERT_EQ("foo", android::base::Trim("foo "));
146*8f0ba417SAndroid Build Coastguard Worker }
147*8f0ba417SAndroid Build Coastguard Worker
TEST(strings,trim_both)148*8f0ba417SAndroid Build Coastguard Worker TEST(strings, trim_both) {
149*8f0ba417SAndroid Build Coastguard Worker ASSERT_EQ("foo", android::base::Trim(" foo "));
150*8f0ba417SAndroid Build Coastguard Worker }
151*8f0ba417SAndroid Build Coastguard Worker
TEST(strings,trim_no_trim_middle)152*8f0ba417SAndroid Build Coastguard Worker TEST(strings, trim_no_trim_middle) {
153*8f0ba417SAndroid Build Coastguard Worker ASSERT_EQ("foo bar", android::base::Trim("foo bar"));
154*8f0ba417SAndroid Build Coastguard Worker }
155*8f0ba417SAndroid Build Coastguard Worker
TEST(strings,trim_other_whitespace)156*8f0ba417SAndroid Build Coastguard Worker TEST(strings, trim_other_whitespace) {
157*8f0ba417SAndroid Build Coastguard Worker ASSERT_EQ("foo", android::base::Trim("\v\tfoo\n\f"));
158*8f0ba417SAndroid Build Coastguard Worker }
159*8f0ba417SAndroid Build Coastguard Worker
TEST(strings,trim_build_implicit_string_conversion)160*8f0ba417SAndroid Build Coastguard Worker TEST(strings, trim_build_implicit_string_conversion) {
161*8f0ba417SAndroid Build Coastguard Worker struct Foo {
162*8f0ba417SAndroid Build Coastguard Worker operator std::string() { return " foo "; }
163*8f0ba417SAndroid Build Coastguard Worker explicit operator std::string_view() { return " foo "; }
164*8f0ba417SAndroid Build Coastguard Worker };
165*8f0ba417SAndroid Build Coastguard Worker ASSERT_EQ("foo", android::base::Trim(Foo()));
166*8f0ba417SAndroid Build Coastguard Worker }
167*8f0ba417SAndroid Build Coastguard Worker
TEST(strings,trim_build_implicit_string_view_conversion)168*8f0ba417SAndroid Build Coastguard Worker TEST(strings, trim_build_implicit_string_view_conversion) {
169*8f0ba417SAndroid Build Coastguard Worker struct Foo {
170*8f0ba417SAndroid Build Coastguard Worker explicit operator std::string() { return " foo "; }
171*8f0ba417SAndroid Build Coastguard Worker operator std::string_view() { return " foo "; }
172*8f0ba417SAndroid Build Coastguard Worker };
173*8f0ba417SAndroid Build Coastguard Worker ASSERT_EQ("foo", android::base::Trim(Foo()));
174*8f0ba417SAndroid Build Coastguard Worker }
175*8f0ba417SAndroid Build Coastguard Worker
TEST(strings,join_nothing)176*8f0ba417SAndroid Build Coastguard Worker TEST(strings, join_nothing) {
177*8f0ba417SAndroid Build Coastguard Worker std::vector<std::string> list = {};
178*8f0ba417SAndroid Build Coastguard Worker ASSERT_EQ("", android::base::Join(list, ','));
179*8f0ba417SAndroid Build Coastguard Worker }
180*8f0ba417SAndroid Build Coastguard Worker
TEST(strings,join_single)181*8f0ba417SAndroid Build Coastguard Worker TEST(strings, join_single) {
182*8f0ba417SAndroid Build Coastguard Worker std::vector<std::string> list = {"foo"};
183*8f0ba417SAndroid Build Coastguard Worker ASSERT_EQ("foo", android::base::Join(list, ','));
184*8f0ba417SAndroid Build Coastguard Worker }
185*8f0ba417SAndroid Build Coastguard Worker
TEST(strings,join_simple)186*8f0ba417SAndroid Build Coastguard Worker TEST(strings, join_simple) {
187*8f0ba417SAndroid Build Coastguard Worker std::vector<std::string> list = {"foo", "bar", "baz"};
188*8f0ba417SAndroid Build Coastguard Worker ASSERT_EQ("foo,bar,baz", android::base::Join(list, ','));
189*8f0ba417SAndroid Build Coastguard Worker }
190*8f0ba417SAndroid Build Coastguard Worker
TEST(strings,join_separator_in_vector)191*8f0ba417SAndroid Build Coastguard Worker TEST(strings, join_separator_in_vector) {
192*8f0ba417SAndroid Build Coastguard Worker std::vector<std::string> list = {",", ","};
193*8f0ba417SAndroid Build Coastguard Worker ASSERT_EQ(",,,", android::base::Join(list, ','));
194*8f0ba417SAndroid Build Coastguard Worker }
195*8f0ba417SAndroid Build Coastguard Worker
TEST(strings,join_single_int)196*8f0ba417SAndroid Build Coastguard Worker TEST(strings, join_single_int) {
197*8f0ba417SAndroid Build Coastguard Worker ASSERT_EQ("42", android::base::Join(std::vector{42}, ','));
198*8f0ba417SAndroid Build Coastguard Worker }
199*8f0ba417SAndroid Build Coastguard Worker
TEST(strings,join_simple_ints)200*8f0ba417SAndroid Build Coastguard Worker TEST(strings, join_simple_ints) {
201*8f0ba417SAndroid Build Coastguard Worker std::set<int> list = {1, 2, 3};
202*8f0ba417SAndroid Build Coastguard Worker ASSERT_EQ("1,2,3", android::base::Join(list, ','));
203*8f0ba417SAndroid Build Coastguard Worker }
204*8f0ba417SAndroid Build Coastguard Worker
TEST(strings,join_unordered_set)205*8f0ba417SAndroid Build Coastguard Worker TEST(strings, join_unordered_set) {
206*8f0ba417SAndroid Build Coastguard Worker std::unordered_set<int> list = {1, 2};
207*8f0ba417SAndroid Build Coastguard Worker ASSERT_TRUE("1,2" == android::base::Join(list, ',') ||
208*8f0ba417SAndroid Build Coastguard Worker "2,1" == android::base::Join(list, ','));
209*8f0ba417SAndroid Build Coastguard Worker }
210*8f0ba417SAndroid Build Coastguard Worker
TEST(strings,StartsWith_empty)211*8f0ba417SAndroid Build Coastguard Worker TEST(strings, StartsWith_empty) {
212*8f0ba417SAndroid Build Coastguard Worker ASSERT_FALSE(android::base::StartsWith("", "foo"));
213*8f0ba417SAndroid Build Coastguard Worker ASSERT_TRUE(android::base::StartsWith("", ""));
214*8f0ba417SAndroid Build Coastguard Worker }
215*8f0ba417SAndroid Build Coastguard Worker
TEST(strings,StartsWithIgnoreCase_empty)216*8f0ba417SAndroid Build Coastguard Worker TEST(strings, StartsWithIgnoreCase_empty) {
217*8f0ba417SAndroid Build Coastguard Worker ASSERT_FALSE(android::base::StartsWithIgnoreCase("", "foo"));
218*8f0ba417SAndroid Build Coastguard Worker ASSERT_TRUE(android::base::StartsWithIgnoreCase("", ""));
219*8f0ba417SAndroid Build Coastguard Worker }
220*8f0ba417SAndroid Build Coastguard Worker
TEST(strings,StartsWith_simple)221*8f0ba417SAndroid Build Coastguard Worker TEST(strings, StartsWith_simple) {
222*8f0ba417SAndroid Build Coastguard Worker ASSERT_TRUE(android::base::StartsWith("foo", ""));
223*8f0ba417SAndroid Build Coastguard Worker ASSERT_TRUE(android::base::StartsWith("foo", "f"));
224*8f0ba417SAndroid Build Coastguard Worker ASSERT_TRUE(android::base::StartsWith("foo", "fo"));
225*8f0ba417SAndroid Build Coastguard Worker ASSERT_TRUE(android::base::StartsWith("foo", "foo"));
226*8f0ba417SAndroid Build Coastguard Worker }
227*8f0ba417SAndroid Build Coastguard Worker
TEST(strings,StartsWithIgnoreCase_simple)228*8f0ba417SAndroid Build Coastguard Worker TEST(strings, StartsWithIgnoreCase_simple) {
229*8f0ba417SAndroid Build Coastguard Worker ASSERT_TRUE(android::base::StartsWithIgnoreCase("foo", ""));
230*8f0ba417SAndroid Build Coastguard Worker ASSERT_TRUE(android::base::StartsWithIgnoreCase("foo", "f"));
231*8f0ba417SAndroid Build Coastguard Worker ASSERT_TRUE(android::base::StartsWithIgnoreCase("foo", "F"));
232*8f0ba417SAndroid Build Coastguard Worker ASSERT_TRUE(android::base::StartsWithIgnoreCase("foo", "fo"));
233*8f0ba417SAndroid Build Coastguard Worker ASSERT_TRUE(android::base::StartsWithIgnoreCase("foo", "fO"));
234*8f0ba417SAndroid Build Coastguard Worker ASSERT_TRUE(android::base::StartsWithIgnoreCase("foo", "Fo"));
235*8f0ba417SAndroid Build Coastguard Worker ASSERT_TRUE(android::base::StartsWithIgnoreCase("foo", "FO"));
236*8f0ba417SAndroid Build Coastguard Worker ASSERT_TRUE(android::base::StartsWithIgnoreCase("foo", "foo"));
237*8f0ba417SAndroid Build Coastguard Worker ASSERT_TRUE(android::base::StartsWithIgnoreCase("foo", "foO"));
238*8f0ba417SAndroid Build Coastguard Worker ASSERT_TRUE(android::base::StartsWithIgnoreCase("foo", "fOo"));
239*8f0ba417SAndroid Build Coastguard Worker ASSERT_TRUE(android::base::StartsWithIgnoreCase("foo", "fOO"));
240*8f0ba417SAndroid Build Coastguard Worker ASSERT_TRUE(android::base::StartsWithIgnoreCase("foo", "Foo"));
241*8f0ba417SAndroid Build Coastguard Worker ASSERT_TRUE(android::base::StartsWithIgnoreCase("foo", "FoO"));
242*8f0ba417SAndroid Build Coastguard Worker ASSERT_TRUE(android::base::StartsWithIgnoreCase("foo", "FOo"));
243*8f0ba417SAndroid Build Coastguard Worker ASSERT_TRUE(android::base::StartsWithIgnoreCase("foo", "FOO"));
244*8f0ba417SAndroid Build Coastguard Worker }
245*8f0ba417SAndroid Build Coastguard Worker
TEST(strings,StartsWith_prefix_too_long)246*8f0ba417SAndroid Build Coastguard Worker TEST(strings, StartsWith_prefix_too_long) {
247*8f0ba417SAndroid Build Coastguard Worker ASSERT_FALSE(android::base::StartsWith("foo", "foobar"));
248*8f0ba417SAndroid Build Coastguard Worker }
249*8f0ba417SAndroid Build Coastguard Worker
TEST(strings,StartsWithIgnoreCase_prefix_too_long)250*8f0ba417SAndroid Build Coastguard Worker TEST(strings, StartsWithIgnoreCase_prefix_too_long) {
251*8f0ba417SAndroid Build Coastguard Worker ASSERT_FALSE(android::base::StartsWithIgnoreCase("foo", "foobar"));
252*8f0ba417SAndroid Build Coastguard Worker ASSERT_FALSE(android::base::StartsWithIgnoreCase("foo", "FOOBAR"));
253*8f0ba417SAndroid Build Coastguard Worker }
254*8f0ba417SAndroid Build Coastguard Worker
TEST(strings,StartsWith_contains_prefix)255*8f0ba417SAndroid Build Coastguard Worker TEST(strings, StartsWith_contains_prefix) {
256*8f0ba417SAndroid Build Coastguard Worker ASSERT_FALSE(android::base::StartsWith("foobar", "oba"));
257*8f0ba417SAndroid Build Coastguard Worker ASSERT_FALSE(android::base::StartsWith("foobar", "bar"));
258*8f0ba417SAndroid Build Coastguard Worker }
259*8f0ba417SAndroid Build Coastguard Worker
TEST(strings,StartsWithIgnoreCase_contains_prefix)260*8f0ba417SAndroid Build Coastguard Worker TEST(strings, StartsWithIgnoreCase_contains_prefix) {
261*8f0ba417SAndroid Build Coastguard Worker ASSERT_FALSE(android::base::StartsWithIgnoreCase("foobar", "oba"));
262*8f0ba417SAndroid Build Coastguard Worker ASSERT_FALSE(android::base::StartsWithIgnoreCase("foobar", "OBA"));
263*8f0ba417SAndroid Build Coastguard Worker ASSERT_FALSE(android::base::StartsWithIgnoreCase("foobar", "bar"));
264*8f0ba417SAndroid Build Coastguard Worker ASSERT_FALSE(android::base::StartsWithIgnoreCase("foobar", "BAR"));
265*8f0ba417SAndroid Build Coastguard Worker }
266*8f0ba417SAndroid Build Coastguard Worker
TEST(strings,StartsWith_char)267*8f0ba417SAndroid Build Coastguard Worker TEST(strings, StartsWith_char) {
268*8f0ba417SAndroid Build Coastguard Worker ASSERT_FALSE(android::base::StartsWith("", 'f'));
269*8f0ba417SAndroid Build Coastguard Worker ASSERT_TRUE(android::base::StartsWith("foo", 'f'));
270*8f0ba417SAndroid Build Coastguard Worker ASSERT_FALSE(android::base::StartsWith("foo", 'o'));
271*8f0ba417SAndroid Build Coastguard Worker }
272*8f0ba417SAndroid Build Coastguard Worker
TEST(strings,EndsWith_empty)273*8f0ba417SAndroid Build Coastguard Worker TEST(strings, EndsWith_empty) {
274*8f0ba417SAndroid Build Coastguard Worker ASSERT_FALSE(android::base::EndsWith("", "foo"));
275*8f0ba417SAndroid Build Coastguard Worker ASSERT_TRUE(android::base::EndsWith("", ""));
276*8f0ba417SAndroid Build Coastguard Worker }
277*8f0ba417SAndroid Build Coastguard Worker
TEST(strings,EndsWithIgnoreCase_empty)278*8f0ba417SAndroid Build Coastguard Worker TEST(strings, EndsWithIgnoreCase_empty) {
279*8f0ba417SAndroid Build Coastguard Worker ASSERT_FALSE(android::base::EndsWithIgnoreCase("", "foo"));
280*8f0ba417SAndroid Build Coastguard Worker ASSERT_FALSE(android::base::EndsWithIgnoreCase("", "FOO"));
281*8f0ba417SAndroid Build Coastguard Worker ASSERT_TRUE(android::base::EndsWithIgnoreCase("", ""));
282*8f0ba417SAndroid Build Coastguard Worker }
283*8f0ba417SAndroid Build Coastguard Worker
TEST(strings,EndsWith_simple)284*8f0ba417SAndroid Build Coastguard Worker TEST(strings, EndsWith_simple) {
285*8f0ba417SAndroid Build Coastguard Worker ASSERT_TRUE(android::base::EndsWith("foo", ""));
286*8f0ba417SAndroid Build Coastguard Worker ASSERT_TRUE(android::base::EndsWith("foo", "o"));
287*8f0ba417SAndroid Build Coastguard Worker ASSERT_TRUE(android::base::EndsWith("foo", "oo"));
288*8f0ba417SAndroid Build Coastguard Worker ASSERT_TRUE(android::base::EndsWith("foo", "foo"));
289*8f0ba417SAndroid Build Coastguard Worker }
290*8f0ba417SAndroid Build Coastguard Worker
TEST(strings,EndsWithIgnoreCase_simple)291*8f0ba417SAndroid Build Coastguard Worker TEST(strings, EndsWithIgnoreCase_simple) {
292*8f0ba417SAndroid Build Coastguard Worker ASSERT_TRUE(android::base::EndsWithIgnoreCase("foo", ""));
293*8f0ba417SAndroid Build Coastguard Worker ASSERT_TRUE(android::base::EndsWithIgnoreCase("foo", "o"));
294*8f0ba417SAndroid Build Coastguard Worker ASSERT_TRUE(android::base::EndsWithIgnoreCase("foo", "O"));
295*8f0ba417SAndroid Build Coastguard Worker ASSERT_TRUE(android::base::EndsWithIgnoreCase("foo", "oo"));
296*8f0ba417SAndroid Build Coastguard Worker ASSERT_TRUE(android::base::EndsWithIgnoreCase("foo", "oO"));
297*8f0ba417SAndroid Build Coastguard Worker ASSERT_TRUE(android::base::EndsWithIgnoreCase("foo", "Oo"));
298*8f0ba417SAndroid Build Coastguard Worker ASSERT_TRUE(android::base::EndsWithIgnoreCase("foo", "OO"));
299*8f0ba417SAndroid Build Coastguard Worker ASSERT_TRUE(android::base::EndsWithIgnoreCase("foo", "foo"));
300*8f0ba417SAndroid Build Coastguard Worker ASSERT_TRUE(android::base::EndsWithIgnoreCase("foo", "foO"));
301*8f0ba417SAndroid Build Coastguard Worker ASSERT_TRUE(android::base::EndsWithIgnoreCase("foo", "fOo"));
302*8f0ba417SAndroid Build Coastguard Worker ASSERT_TRUE(android::base::EndsWithIgnoreCase("foo", "fOO"));
303*8f0ba417SAndroid Build Coastguard Worker ASSERT_TRUE(android::base::EndsWithIgnoreCase("foo", "Foo"));
304*8f0ba417SAndroid Build Coastguard Worker ASSERT_TRUE(android::base::EndsWithIgnoreCase("foo", "FoO"));
305*8f0ba417SAndroid Build Coastguard Worker ASSERT_TRUE(android::base::EndsWithIgnoreCase("foo", "FOo"));
306*8f0ba417SAndroid Build Coastguard Worker ASSERT_TRUE(android::base::EndsWithIgnoreCase("foo", "FOO"));
307*8f0ba417SAndroid Build Coastguard Worker }
308*8f0ba417SAndroid Build Coastguard Worker
TEST(strings,EndsWith_prefix_too_long)309*8f0ba417SAndroid Build Coastguard Worker TEST(strings, EndsWith_prefix_too_long) {
310*8f0ba417SAndroid Build Coastguard Worker ASSERT_FALSE(android::base::EndsWith("foo", "foobar"));
311*8f0ba417SAndroid Build Coastguard Worker }
312*8f0ba417SAndroid Build Coastguard Worker
TEST(strings,EndsWithIgnoreCase_prefix_too_long)313*8f0ba417SAndroid Build Coastguard Worker TEST(strings, EndsWithIgnoreCase_prefix_too_long) {
314*8f0ba417SAndroid Build Coastguard Worker ASSERT_FALSE(android::base::EndsWithIgnoreCase("foo", "foobar"));
315*8f0ba417SAndroid Build Coastguard Worker ASSERT_FALSE(android::base::EndsWithIgnoreCase("foo", "FOOBAR"));
316*8f0ba417SAndroid Build Coastguard Worker }
317*8f0ba417SAndroid Build Coastguard Worker
TEST(strings,EndsWith_contains_prefix)318*8f0ba417SAndroid Build Coastguard Worker TEST(strings, EndsWith_contains_prefix) {
319*8f0ba417SAndroid Build Coastguard Worker ASSERT_FALSE(android::base::EndsWith("foobar", "oba"));
320*8f0ba417SAndroid Build Coastguard Worker ASSERT_FALSE(android::base::EndsWith("foobar", "foo"));
321*8f0ba417SAndroid Build Coastguard Worker }
322*8f0ba417SAndroid Build Coastguard Worker
TEST(strings,EndsWithIgnoreCase_contains_prefix)323*8f0ba417SAndroid Build Coastguard Worker TEST(strings, EndsWithIgnoreCase_contains_prefix) {
324*8f0ba417SAndroid Build Coastguard Worker ASSERT_FALSE(android::base::EndsWithIgnoreCase("foobar", "OBA"));
325*8f0ba417SAndroid Build Coastguard Worker ASSERT_FALSE(android::base::EndsWithIgnoreCase("foobar", "FOO"));
326*8f0ba417SAndroid Build Coastguard Worker }
327*8f0ba417SAndroid Build Coastguard Worker
TEST(strings,StartsWith_std_string)328*8f0ba417SAndroid Build Coastguard Worker TEST(strings, StartsWith_std_string) {
329*8f0ba417SAndroid Build Coastguard Worker ASSERT_TRUE(android::base::StartsWith("hello", std::string{"hell"}));
330*8f0ba417SAndroid Build Coastguard Worker ASSERT_FALSE(android::base::StartsWith("goodbye", std::string{"hell"}));
331*8f0ba417SAndroid Build Coastguard Worker }
332*8f0ba417SAndroid Build Coastguard Worker
TEST(strings,StartsWithIgnoreCase_std_string)333*8f0ba417SAndroid Build Coastguard Worker TEST(strings, StartsWithIgnoreCase_std_string) {
334*8f0ba417SAndroid Build Coastguard Worker ASSERT_TRUE(android::base::StartsWithIgnoreCase("HeLlO", std::string{"hell"}));
335*8f0ba417SAndroid Build Coastguard Worker ASSERT_FALSE(android::base::StartsWithIgnoreCase("GoOdByE", std::string{"hell"}));
336*8f0ba417SAndroid Build Coastguard Worker }
337*8f0ba417SAndroid Build Coastguard Worker
TEST(strings,EndsWith_std_string)338*8f0ba417SAndroid Build Coastguard Worker TEST(strings, EndsWith_std_string) {
339*8f0ba417SAndroid Build Coastguard Worker ASSERT_TRUE(android::base::EndsWith("hello", std::string{"lo"}));
340*8f0ba417SAndroid Build Coastguard Worker ASSERT_FALSE(android::base::EndsWith("goodbye", std::string{"lo"}));
341*8f0ba417SAndroid Build Coastguard Worker }
342*8f0ba417SAndroid Build Coastguard Worker
TEST(strings,EndsWithIgnoreCase_std_string)343*8f0ba417SAndroid Build Coastguard Worker TEST(strings, EndsWithIgnoreCase_std_string) {
344*8f0ba417SAndroid Build Coastguard Worker ASSERT_TRUE(android::base::EndsWithIgnoreCase("HeLlO", std::string{"lo"}));
345*8f0ba417SAndroid Build Coastguard Worker ASSERT_FALSE(android::base::EndsWithIgnoreCase("GoOdByE", std::string{"lo"}));
346*8f0ba417SAndroid Build Coastguard Worker }
347*8f0ba417SAndroid Build Coastguard Worker
TEST(strings,EndsWith_char)348*8f0ba417SAndroid Build Coastguard Worker TEST(strings, EndsWith_char) {
349*8f0ba417SAndroid Build Coastguard Worker ASSERT_FALSE(android::base::EndsWith("", 'o'));
350*8f0ba417SAndroid Build Coastguard Worker ASSERT_TRUE(android::base::EndsWith("foo", 'o'));
351*8f0ba417SAndroid Build Coastguard Worker ASSERT_FALSE(android::base::EndsWith("foo", "f"));
352*8f0ba417SAndroid Build Coastguard Worker }
353*8f0ba417SAndroid Build Coastguard Worker
TEST(strings,EqualsIgnoreCase)354*8f0ba417SAndroid Build Coastguard Worker TEST(strings, EqualsIgnoreCase) {
355*8f0ba417SAndroid Build Coastguard Worker ASSERT_TRUE(android::base::EqualsIgnoreCase("foo", "FOO"));
356*8f0ba417SAndroid Build Coastguard Worker ASSERT_TRUE(android::base::EqualsIgnoreCase("FOO", "foo"));
357*8f0ba417SAndroid Build Coastguard Worker ASSERT_FALSE(android::base::EqualsIgnoreCase("foo", "bar"));
358*8f0ba417SAndroid Build Coastguard Worker ASSERT_FALSE(android::base::EqualsIgnoreCase("foo", "fool"));
359*8f0ba417SAndroid Build Coastguard Worker }
360*8f0ba417SAndroid Build Coastguard Worker
TEST(strings,ubsan_28729303)361*8f0ba417SAndroid Build Coastguard Worker TEST(strings, ubsan_28729303) {
362*8f0ba417SAndroid Build Coastguard Worker android::base::Split("/dev/null", ":");
363*8f0ba417SAndroid Build Coastguard Worker }
364*8f0ba417SAndroid Build Coastguard Worker
TEST(strings,ConsumePrefix)365*8f0ba417SAndroid Build Coastguard Worker TEST(strings, ConsumePrefix) {
366*8f0ba417SAndroid Build Coastguard Worker std::string_view s{"foo.bar"};
367*8f0ba417SAndroid Build Coastguard Worker ASSERT_FALSE(android::base::ConsumePrefix(&s, "bar."));
368*8f0ba417SAndroid Build Coastguard Worker ASSERT_EQ("foo.bar", s);
369*8f0ba417SAndroid Build Coastguard Worker ASSERT_TRUE(android::base::ConsumePrefix(&s, "foo."));
370*8f0ba417SAndroid Build Coastguard Worker ASSERT_EQ("bar", s);
371*8f0ba417SAndroid Build Coastguard Worker }
372*8f0ba417SAndroid Build Coastguard Worker
TEST(strings,ConsumeSuffix)373*8f0ba417SAndroid Build Coastguard Worker TEST(strings, ConsumeSuffix) {
374*8f0ba417SAndroid Build Coastguard Worker std::string_view s{"foo.bar"};
375*8f0ba417SAndroid Build Coastguard Worker ASSERT_FALSE(android::base::ConsumeSuffix(&s, ".foo"));
376*8f0ba417SAndroid Build Coastguard Worker ASSERT_EQ("foo.bar", s);
377*8f0ba417SAndroid Build Coastguard Worker ASSERT_TRUE(android::base::ConsumeSuffix(&s, ".bar"));
378*8f0ba417SAndroid Build Coastguard Worker ASSERT_EQ("foo", s);
379*8f0ba417SAndroid Build Coastguard Worker }
380*8f0ba417SAndroid Build Coastguard Worker
TEST(strings,StringReplace_false)381*8f0ba417SAndroid Build Coastguard Worker TEST(strings, StringReplace_false) {
382*8f0ba417SAndroid Build Coastguard Worker // No change.
383*8f0ba417SAndroid Build Coastguard Worker ASSERT_EQ("abcabc", android::base::StringReplace("abcabc", "z", "Z", false));
384*8f0ba417SAndroid Build Coastguard Worker ASSERT_EQ("", android::base::StringReplace("", "z", "Z", false));
385*8f0ba417SAndroid Build Coastguard Worker ASSERT_EQ("abcabc", android::base::StringReplace("abcabc", "", "Z", false));
386*8f0ba417SAndroid Build Coastguard Worker
387*8f0ba417SAndroid Build Coastguard Worker // Equal lengths.
388*8f0ba417SAndroid Build Coastguard Worker ASSERT_EQ("Abcabc", android::base::StringReplace("abcabc", "a", "A", false));
389*8f0ba417SAndroid Build Coastguard Worker ASSERT_EQ("aBcabc", android::base::StringReplace("abcabc", "b", "B", false));
390*8f0ba417SAndroid Build Coastguard Worker ASSERT_EQ("abCabc", android::base::StringReplace("abcabc", "c", "C", false));
391*8f0ba417SAndroid Build Coastguard Worker
392*8f0ba417SAndroid Build Coastguard Worker // Longer replacement.
393*8f0ba417SAndroid Build Coastguard Worker ASSERT_EQ("foobcabc", android::base::StringReplace("abcabc", "a", "foo", false));
394*8f0ba417SAndroid Build Coastguard Worker ASSERT_EQ("afoocabc", android::base::StringReplace("abcabc", "b", "foo", false));
395*8f0ba417SAndroid Build Coastguard Worker ASSERT_EQ("abfooabc", android::base::StringReplace("abcabc", "c", "foo", false));
396*8f0ba417SAndroid Build Coastguard Worker
397*8f0ba417SAndroid Build Coastguard Worker // Shorter replacement.
398*8f0ba417SAndroid Build Coastguard Worker ASSERT_EQ("xxyz", android::base::StringReplace("abcxyz", "abc", "x", false));
399*8f0ba417SAndroid Build Coastguard Worker ASSERT_EQ("axyz", android::base::StringReplace("abcxyz", "bcx", "x", false));
400*8f0ba417SAndroid Build Coastguard Worker ASSERT_EQ("abcx", android::base::StringReplace("abcxyz", "xyz", "x", false));
401*8f0ba417SAndroid Build Coastguard Worker }
402*8f0ba417SAndroid Build Coastguard Worker
TEST(strings,StringReplace_true)403*8f0ba417SAndroid Build Coastguard Worker TEST(strings, StringReplace_true) {
404*8f0ba417SAndroid Build Coastguard Worker // No change.
405*8f0ba417SAndroid Build Coastguard Worker ASSERT_EQ("abcabc", android::base::StringReplace("abcabc", "z", "Z", true));
406*8f0ba417SAndroid Build Coastguard Worker ASSERT_EQ("", android::base::StringReplace("", "z", "Z", true));
407*8f0ba417SAndroid Build Coastguard Worker ASSERT_EQ("abcabc", android::base::StringReplace("abcabc", "", "Z", true));
408*8f0ba417SAndroid Build Coastguard Worker
409*8f0ba417SAndroid Build Coastguard Worker // Equal lengths.
410*8f0ba417SAndroid Build Coastguard Worker ASSERT_EQ("AbcAbc", android::base::StringReplace("abcabc", "a", "A", true));
411*8f0ba417SAndroid Build Coastguard Worker ASSERT_EQ("aBcaBc", android::base::StringReplace("abcabc", "b", "B", true));
412*8f0ba417SAndroid Build Coastguard Worker ASSERT_EQ("abCabC", android::base::StringReplace("abcabc", "c", "C", true));
413*8f0ba417SAndroid Build Coastguard Worker
414*8f0ba417SAndroid Build Coastguard Worker // Longer replacement.
415*8f0ba417SAndroid Build Coastguard Worker ASSERT_EQ("foobcfoobc", android::base::StringReplace("abcabc", "a", "foo", true));
416*8f0ba417SAndroid Build Coastguard Worker ASSERT_EQ("afoocafooc", android::base::StringReplace("abcabc", "b", "foo", true));
417*8f0ba417SAndroid Build Coastguard Worker ASSERT_EQ("abfooabfoo", android::base::StringReplace("abcabc", "c", "foo", true));
418*8f0ba417SAndroid Build Coastguard Worker
419*8f0ba417SAndroid Build Coastguard Worker // Shorter replacement.
420*8f0ba417SAndroid Build Coastguard Worker ASSERT_EQ("xxyzx", android::base::StringReplace("abcxyzabc", "abc", "x", true));
421*8f0ba417SAndroid Build Coastguard Worker ASSERT_EQ("<xx>", android::base::StringReplace("<abcabc>", "abc", "x", true));
422*8f0ba417SAndroid Build Coastguard Worker }
423*8f0ba417SAndroid Build Coastguard Worker
TEST(strings,ErrnoNumberAsString)424*8f0ba417SAndroid Build Coastguard Worker TEST(strings, ErrnoNumberAsString) {
425*8f0ba417SAndroid Build Coastguard Worker EXPECT_EQ("No such file or directory", android::base::ErrnoNumberAsString(ENOENT));
426*8f0ba417SAndroid Build Coastguard Worker }
427