xref: /aosp_15_r20/external/cronet/base/strings/string_piece_unittest.cc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker // Copyright 2012 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 <stddef.h>
6*6777b538SAndroid Build Coastguard Worker 
7*6777b538SAndroid Build Coastguard Worker #include <string>
8*6777b538SAndroid Build Coastguard Worker #include <string_view>
9*6777b538SAndroid Build Coastguard Worker 
10*6777b538SAndroid Build Coastguard Worker #include "base/strings/string_piece.h"
11*6777b538SAndroid Build Coastguard Worker #include "base/strings/utf_string_conversions.h"
12*6777b538SAndroid Build Coastguard Worker #include "testing/gtest/include/gtest/gtest.h"
13*6777b538SAndroid Build Coastguard Worker 
14*6777b538SAndroid Build Coastguard Worker namespace base {
15*6777b538SAndroid Build Coastguard Worker 
16*6777b538SAndroid Build Coastguard Worker template <typename CharT>
17*6777b538SAndroid Build Coastguard Worker class CommonStringPieceTest : public ::testing::Test {
18*6777b538SAndroid Build Coastguard Worker  public:
as_string(const char * input)19*6777b538SAndroid Build Coastguard Worker   static std::string as_string(const char* input) { return input; }
as_string(const std::string & input)20*6777b538SAndroid Build Coastguard Worker   static const std::string& as_string(const std::string& input) {
21*6777b538SAndroid Build Coastguard Worker     return input;
22*6777b538SAndroid Build Coastguard Worker   }
23*6777b538SAndroid Build Coastguard Worker };
24*6777b538SAndroid Build Coastguard Worker 
25*6777b538SAndroid Build Coastguard Worker template <>
26*6777b538SAndroid Build Coastguard Worker class CommonStringPieceTest<char16_t> : public ::testing::Test {
27*6777b538SAndroid Build Coastguard Worker  public:
as_string(const char * input)28*6777b538SAndroid Build Coastguard Worker   static std::u16string as_string(const char* input) {
29*6777b538SAndroid Build Coastguard Worker     return UTF8ToUTF16(input);
30*6777b538SAndroid Build Coastguard Worker   }
as_string(const std::string & input)31*6777b538SAndroid Build Coastguard Worker   static std::u16string as_string(const std::string& input) {
32*6777b538SAndroid Build Coastguard Worker     return UTF8ToUTF16(input);
33*6777b538SAndroid Build Coastguard Worker   }
34*6777b538SAndroid Build Coastguard Worker };
35*6777b538SAndroid Build Coastguard Worker 
36*6777b538SAndroid Build Coastguard Worker typedef ::testing::Types<char, char16_t> SupportedCharTypes;
37*6777b538SAndroid Build Coastguard Worker 
38*6777b538SAndroid Build Coastguard Worker TYPED_TEST_SUITE(CommonStringPieceTest, SupportedCharTypes);
39*6777b538SAndroid Build Coastguard Worker 
TYPED_TEST(CommonStringPieceTest,CheckComparisonOperators)40*6777b538SAndroid Build Coastguard Worker TYPED_TEST(CommonStringPieceTest, CheckComparisonOperators) {
41*6777b538SAndroid Build Coastguard Worker #define CMP_Y(op, x, y)                                                        \
42*6777b538SAndroid Build Coastguard Worker   {                                                                            \
43*6777b538SAndroid Build Coastguard Worker     std::basic_string<TypeParam> lhs(TestFixture::as_string(x));               \
44*6777b538SAndroid Build Coastguard Worker     std::basic_string<TypeParam> rhs(TestFixture::as_string(y));               \
45*6777b538SAndroid Build Coastguard Worker     ASSERT_TRUE((std::basic_string_view<TypeParam>((lhs.c_str()))              \
46*6777b538SAndroid Build Coastguard Worker                      op std::basic_string_view<TypeParam>((rhs.c_str()))));    \
47*6777b538SAndroid Build Coastguard Worker     ASSERT_TRUE(std::basic_string_view<TypeParam>(lhs) op rhs);                \
48*6777b538SAndroid Build Coastguard Worker     ASSERT_TRUE(lhs op std::basic_string_view<TypeParam>(rhs));                \
49*6777b538SAndroid Build Coastguard Worker     ASSERT_TRUE((                                                              \
50*6777b538SAndroid Build Coastguard Worker         std::basic_string_view<TypeParam>((lhs.c_str()))                       \
51*6777b538SAndroid Build Coastguard Worker             .compare(std::basic_string_view<TypeParam>((rhs.c_str()))) op 0)); \
52*6777b538SAndroid Build Coastguard Worker   }
53*6777b538SAndroid Build Coastguard Worker 
54*6777b538SAndroid Build Coastguard Worker #define CMP_N(op, x, y)                                                        \
55*6777b538SAndroid Build Coastguard Worker   {                                                                            \
56*6777b538SAndroid Build Coastguard Worker     std::basic_string<TypeParam> lhs(TestFixture::as_string(x));               \
57*6777b538SAndroid Build Coastguard Worker     std::basic_string<TypeParam> rhs(TestFixture::as_string(y));               \
58*6777b538SAndroid Build Coastguard Worker     ASSERT_FALSE((std::basic_string_view<TypeParam>((lhs.c_str()))             \
59*6777b538SAndroid Build Coastguard Worker                       op std::basic_string_view<TypeParam>((rhs.c_str()))));   \
60*6777b538SAndroid Build Coastguard Worker     ASSERT_FALSE(std::basic_string_view<TypeParam>(lhs) op rhs);               \
61*6777b538SAndroid Build Coastguard Worker     ASSERT_FALSE(lhs op std::basic_string_view<TypeParam>(rhs));               \
62*6777b538SAndroid Build Coastguard Worker     ASSERT_FALSE((                                                             \
63*6777b538SAndroid Build Coastguard Worker         std::basic_string_view<TypeParam>((lhs.c_str()))                       \
64*6777b538SAndroid Build Coastguard Worker             .compare(std::basic_string_view<TypeParam>((rhs.c_str()))) op 0)); \
65*6777b538SAndroid Build Coastguard Worker   }
66*6777b538SAndroid Build Coastguard Worker 
67*6777b538SAndroid Build Coastguard Worker   CMP_Y(==, "", "")
68*6777b538SAndroid Build Coastguard Worker   CMP_Y(==, "a", "a")
69*6777b538SAndroid Build Coastguard Worker   CMP_Y(==, "aa", "aa")
70*6777b538SAndroid Build Coastguard Worker   CMP_N(==, "a", "")
71*6777b538SAndroid Build Coastguard Worker   CMP_N(==, "", "a")
72*6777b538SAndroid Build Coastguard Worker   CMP_N(==, "a", "b")
73*6777b538SAndroid Build Coastguard Worker   CMP_N(==, "a", "aa")
74*6777b538SAndroid Build Coastguard Worker   CMP_N(==, "aa", "a")
75*6777b538SAndroid Build Coastguard Worker 
76*6777b538SAndroid Build Coastguard Worker   CMP_N(!=, "", "")
77*6777b538SAndroid Build Coastguard Worker   CMP_N(!=, "a", "a")
78*6777b538SAndroid Build Coastguard Worker   CMP_N(!=, "aa", "aa")
79*6777b538SAndroid Build Coastguard Worker   CMP_Y(!=, "a", "")
80*6777b538SAndroid Build Coastguard Worker   CMP_Y(!=, "", "a")
81*6777b538SAndroid Build Coastguard Worker   CMP_Y(!=, "a", "b")
82*6777b538SAndroid Build Coastguard Worker   CMP_Y(!=, "a", "aa")
83*6777b538SAndroid Build Coastguard Worker   CMP_Y(!=, "aa", "a")
84*6777b538SAndroid Build Coastguard Worker 
85*6777b538SAndroid Build Coastguard Worker   CMP_Y(<, "a", "b")
86*6777b538SAndroid Build Coastguard Worker   CMP_Y(<, "a", "aa")
87*6777b538SAndroid Build Coastguard Worker   CMP_Y(<, "aa", "b")
88*6777b538SAndroid Build Coastguard Worker   CMP_Y(<, "aa", "bb")
89*6777b538SAndroid Build Coastguard Worker   CMP_N(<, "a", "a")
90*6777b538SAndroid Build Coastguard Worker   CMP_N(<, "b", "a")
91*6777b538SAndroid Build Coastguard Worker   CMP_N(<, "aa", "a")
92*6777b538SAndroid Build Coastguard Worker   CMP_N(<, "b", "aa")
93*6777b538SAndroid Build Coastguard Worker   CMP_N(<, "bb", "aa")
94*6777b538SAndroid Build Coastguard Worker 
95*6777b538SAndroid Build Coastguard Worker   CMP_Y(<=, "a", "a")
96*6777b538SAndroid Build Coastguard Worker   CMP_Y(<=, "a", "b")
97*6777b538SAndroid Build Coastguard Worker   CMP_Y(<=, "a", "aa")
98*6777b538SAndroid Build Coastguard Worker   CMP_Y(<=, "aa", "b")
99*6777b538SAndroid Build Coastguard Worker   CMP_Y(<=, "aa", "bb")
100*6777b538SAndroid Build Coastguard Worker   CMP_N(<=, "b", "a")
101*6777b538SAndroid Build Coastguard Worker   CMP_N(<=, "aa", "a")
102*6777b538SAndroid Build Coastguard Worker   CMP_N(<=, "b", "aa")
103*6777b538SAndroid Build Coastguard Worker   CMP_N(<=, "bb", "aa")
104*6777b538SAndroid Build Coastguard Worker 
105*6777b538SAndroid Build Coastguard Worker   CMP_N(>=, "a", "b")
106*6777b538SAndroid Build Coastguard Worker   CMP_N(>=, "a", "aa")
107*6777b538SAndroid Build Coastguard Worker   CMP_N(>=, "aa", "b")
108*6777b538SAndroid Build Coastguard Worker   CMP_N(>=, "aa", "bb")
109*6777b538SAndroid Build Coastguard Worker   CMP_Y(>=, "a", "a")
110*6777b538SAndroid Build Coastguard Worker   CMP_Y(>=, "b", "a")
111*6777b538SAndroid Build Coastguard Worker   CMP_Y(>=, "aa", "a")
112*6777b538SAndroid Build Coastguard Worker   CMP_Y(>=, "b", "aa")
113*6777b538SAndroid Build Coastguard Worker   CMP_Y(>=, "bb", "aa")
114*6777b538SAndroid Build Coastguard Worker 
115*6777b538SAndroid Build Coastguard Worker   CMP_N(>, "a", "a")
116*6777b538SAndroid Build Coastguard Worker   CMP_N(>, "a", "b")
117*6777b538SAndroid Build Coastguard Worker   CMP_N(>, "a", "aa")
118*6777b538SAndroid Build Coastguard Worker   CMP_N(>, "aa", "b")
119*6777b538SAndroid Build Coastguard Worker   CMP_N(>, "aa", "bb")
120*6777b538SAndroid Build Coastguard Worker   CMP_Y(>, "b", "a")
121*6777b538SAndroid Build Coastguard Worker   CMP_Y(>, "aa", "a")
122*6777b538SAndroid Build Coastguard Worker   CMP_Y(>, "b", "aa")
123*6777b538SAndroid Build Coastguard Worker   CMP_Y(>, "bb", "aa")
124*6777b538SAndroid Build Coastguard Worker 
125*6777b538SAndroid Build Coastguard Worker   std::string x;
126*6777b538SAndroid Build Coastguard Worker   for (int i = 0; i < 256; i++) {
127*6777b538SAndroid Build Coastguard Worker     x += 'a';
128*6777b538SAndroid Build Coastguard Worker     std::string y = x;
129*6777b538SAndroid Build Coastguard Worker     CMP_Y(==, x, y);
130*6777b538SAndroid Build Coastguard Worker     for (int j = 0; j < i; j++) {
131*6777b538SAndroid Build Coastguard Worker       std::string z = x;
132*6777b538SAndroid Build Coastguard Worker       z[j] = 'b';       // Differs in position 'j'
133*6777b538SAndroid Build Coastguard Worker       CMP_N(==, x, z);
134*6777b538SAndroid Build Coastguard Worker     }
135*6777b538SAndroid Build Coastguard Worker   }
136*6777b538SAndroid Build Coastguard Worker 
137*6777b538SAndroid Build Coastguard Worker #undef CMP_Y
138*6777b538SAndroid Build Coastguard Worker #undef CMP_N
139*6777b538SAndroid Build Coastguard Worker }
140*6777b538SAndroid Build Coastguard Worker 
TYPED_TEST(CommonStringPieceTest,CheckSTL)141*6777b538SAndroid Build Coastguard Worker TYPED_TEST(CommonStringPieceTest, CheckSTL) {
142*6777b538SAndroid Build Coastguard Worker   std::basic_string<TypeParam> alphabet(
143*6777b538SAndroid Build Coastguard Worker       TestFixture::as_string("abcdefghijklmnopqrstuvwxyz"));
144*6777b538SAndroid Build Coastguard Worker   std::basic_string<TypeParam> abc(TestFixture::as_string("abc"));
145*6777b538SAndroid Build Coastguard Worker   std::basic_string<TypeParam> xyz(TestFixture::as_string("xyz"));
146*6777b538SAndroid Build Coastguard Worker   std::basic_string<TypeParam> foobar(TestFixture::as_string("foobar"));
147*6777b538SAndroid Build Coastguard Worker 
148*6777b538SAndroid Build Coastguard Worker   std::basic_string_view<TypeParam> a(alphabet);
149*6777b538SAndroid Build Coastguard Worker   std::basic_string_view<TypeParam> b(abc);
150*6777b538SAndroid Build Coastguard Worker   std::basic_string_view<TypeParam> c(xyz);
151*6777b538SAndroid Build Coastguard Worker   std::basic_string_view<TypeParam> d(foobar);
152*6777b538SAndroid Build Coastguard Worker   std::basic_string_view<TypeParam> e;
153*6777b538SAndroid Build Coastguard Worker   std::basic_string<TypeParam> temp(TestFixture::as_string("123"));
154*6777b538SAndroid Build Coastguard Worker   temp += static_cast<TypeParam>(0);
155*6777b538SAndroid Build Coastguard Worker   temp += TestFixture::as_string("456");
156*6777b538SAndroid Build Coastguard Worker   std::basic_string_view<TypeParam> f(temp);
157*6777b538SAndroid Build Coastguard Worker 
158*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(a[6], static_cast<TypeParam>('g'));
159*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(b[0], static_cast<TypeParam>('a'));
160*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(c[2], static_cast<TypeParam>('z'));
161*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(f[3], static_cast<TypeParam>('\0'));
162*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(f[5], static_cast<TypeParam>('5'));
163*6777b538SAndroid Build Coastguard Worker 
164*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(*d.data(), static_cast<TypeParam>('f'));
165*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(d.data()[5], static_cast<TypeParam>('r'));
166*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(e.data(), nullptr);
167*6777b538SAndroid Build Coastguard Worker 
168*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(*a.begin(), static_cast<TypeParam>('a'));
169*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(*(b.begin() + 2), static_cast<TypeParam>('c'));
170*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(*(c.end() - 1), static_cast<TypeParam>('z'));
171*6777b538SAndroid Build Coastguard Worker 
172*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(*a.rbegin(), static_cast<TypeParam>('z'));
173*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(*(b.rbegin() + 2), static_cast<TypeParam>('a'));
174*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(*(c.rend() - 1), static_cast<TypeParam>('x'));
175*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(a.rbegin() + 26, a.rend());
176*6777b538SAndroid Build Coastguard Worker 
177*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(a.size(), 26U);
178*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(b.size(), 3U);
179*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(c.size(), 3U);
180*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(d.size(), 6U);
181*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(e.size(), 0U);
182*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(f.size(), 7U);
183*6777b538SAndroid Build Coastguard Worker 
184*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(!d.empty());
185*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(d.begin() != d.end());
186*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(d.begin() + 6, d.end());
187*6777b538SAndroid Build Coastguard Worker 
188*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(e.empty());
189*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(e.begin(), e.end());
190*6777b538SAndroid Build Coastguard Worker 
191*6777b538SAndroid Build Coastguard Worker   d = std::basic_string_view<TypeParam>();
192*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(d.size(), 0U);
193*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(d.empty());
194*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(d.data(), nullptr);
195*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(d.begin(), d.end());
196*6777b538SAndroid Build Coastguard Worker 
197*6777b538SAndroid Build Coastguard Worker   ASSERT_GE(a.max_size(), a.size());
198*6777b538SAndroid Build Coastguard Worker }
199*6777b538SAndroid Build Coastguard Worker 
TYPED_TEST(CommonStringPieceTest,CheckFind)200*6777b538SAndroid Build Coastguard Worker TYPED_TEST(CommonStringPieceTest, CheckFind) {
201*6777b538SAndroid Build Coastguard Worker   typedef std::basic_string_view<TypeParam> Piece;
202*6777b538SAndroid Build Coastguard Worker 
203*6777b538SAndroid Build Coastguard Worker   std::basic_string<TypeParam> alphabet(
204*6777b538SAndroid Build Coastguard Worker       TestFixture::as_string("abcdefghijklmnopqrstuvwxyz"));
205*6777b538SAndroid Build Coastguard Worker   std::basic_string<TypeParam> abc(TestFixture::as_string("abc"));
206*6777b538SAndroid Build Coastguard Worker   std::basic_string<TypeParam> xyz(TestFixture::as_string("xyz"));
207*6777b538SAndroid Build Coastguard Worker   std::basic_string<TypeParam> foobar(TestFixture::as_string("foobar"));
208*6777b538SAndroid Build Coastguard Worker 
209*6777b538SAndroid Build Coastguard Worker   std::basic_string_view<TypeParam> a(alphabet);
210*6777b538SAndroid Build Coastguard Worker   std::basic_string_view<TypeParam> b(abc);
211*6777b538SAndroid Build Coastguard Worker   std::basic_string_view<TypeParam> c(xyz);
212*6777b538SAndroid Build Coastguard Worker   std::basic_string_view<TypeParam> d(foobar);
213*6777b538SAndroid Build Coastguard Worker 
214*6777b538SAndroid Build Coastguard Worker   d = Piece();
215*6777b538SAndroid Build Coastguard Worker   Piece e;
216*6777b538SAndroid Build Coastguard Worker   std::basic_string<TypeParam> temp(TestFixture::as_string("123"));
217*6777b538SAndroid Build Coastguard Worker   temp.push_back('\0');
218*6777b538SAndroid Build Coastguard Worker   temp += TestFixture::as_string("456");
219*6777b538SAndroid Build Coastguard Worker   Piece f(temp);
220*6777b538SAndroid Build Coastguard Worker 
221*6777b538SAndroid Build Coastguard Worker   TypeParam buf[4] = {'%', '%', '%', '%'};
222*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(a.copy(buf, 4), 4U);
223*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(buf[0], a[0]);
224*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(buf[1], a[1]);
225*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(buf[2], a[2]);
226*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(buf[3], a[3]);
227*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(a.copy(buf, 3, 7), 3U);
228*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(buf[0], a[7]);
229*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(buf[1], a[8]);
230*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(buf[2], a[9]);
231*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(buf[3], a[3]);
232*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(c.copy(buf, 99), 3U);
233*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(buf[0], c[0]);
234*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(buf[1], c[1]);
235*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(buf[2], c[2]);
236*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(buf[3], a[3]);
237*6777b538SAndroid Build Coastguard Worker 
238*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(Piece::npos, std::basic_string<TypeParam>::npos);
239*6777b538SAndroid Build Coastguard Worker 
240*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(a.find(b), 0U);
241*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(a.find(b, 1), Piece::npos);
242*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(a.find(c), 23U);
243*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(a.find(c, 9), 23U);
244*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(a.find(c, Piece::npos), Piece::npos);
245*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(b.find(c), Piece::npos);
246*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(b.find(c, Piece::npos), Piece::npos);
247*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(a.find(d), 0U);
248*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(a.find(e), 0U);
249*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(a.find(d, 12), 12U);
250*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(a.find(e, 17), 17U);
251*6777b538SAndroid Build Coastguard Worker   std::basic_string<TypeParam> not_found(
252*6777b538SAndroid Build Coastguard Worker       TestFixture::as_string("xx not found bb"));
253*6777b538SAndroid Build Coastguard Worker   Piece g(not_found);
254*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(a.find(g), Piece::npos);
255*6777b538SAndroid Build Coastguard Worker   // empty string nonsense
256*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(d.find(b), Piece::npos);
257*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(e.find(b), Piece::npos);
258*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(d.find(b, 4), Piece::npos);
259*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(e.find(b, 7), Piece::npos);
260*6777b538SAndroid Build Coastguard Worker 
261*6777b538SAndroid Build Coastguard Worker   size_t empty_search_pos =
262*6777b538SAndroid Build Coastguard Worker       std::basic_string<TypeParam>().find(std::basic_string<TypeParam>());
263*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(d.find(d), empty_search_pos);
264*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(d.find(e), empty_search_pos);
265*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(e.find(d), empty_search_pos);
266*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(e.find(e), empty_search_pos);
267*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(d.find(d, 4), std::string().find(std::string(), 4));
268*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(d.find(e, 4), std::string().find(std::string(), 4));
269*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(e.find(d, 4), std::string().find(std::string(), 4));
270*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(e.find(e, 4), std::string().find(std::string(), 4));
271*6777b538SAndroid Build Coastguard Worker 
272*6777b538SAndroid Build Coastguard Worker   constexpr TypeParam kNul = '\0';
273*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(a.find('a'), 0U);
274*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(a.find('c'), 2U);
275*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(a.find('z'), 25U);
276*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(a.find('$'), Piece::npos);
277*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(a.find(kNul), Piece::npos);
278*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(f.find(kNul), 3U);
279*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(f.find('3'), 2U);
280*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(f.find('5'), 5U);
281*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(g.find('o'), 4U);
282*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(g.find('o', 4), 4U);
283*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(g.find('o', 5), 8U);
284*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(a.find('b', 5), Piece::npos);
285*6777b538SAndroid Build Coastguard Worker   // empty string nonsense
286*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(d.find(kNul), Piece::npos);
287*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(e.find(kNul), Piece::npos);
288*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(d.find(kNul, 4), Piece::npos);
289*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(e.find(kNul, 7), Piece::npos);
290*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(d.find('x'), Piece::npos);
291*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(e.find('x'), Piece::npos);
292*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(d.find('x', 4), Piece::npos);
293*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(e.find('x', 7), Piece::npos);
294*6777b538SAndroid Build Coastguard Worker 
295*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(a.find(b.data(), 1, 0), 1U);
296*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(a.find(c.data(), 9, 0), 9U);
297*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(a.find(c.data(), Piece::npos, 0), Piece::npos);
298*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(b.find(c.data(), Piece::npos, 0), Piece::npos);
299*6777b538SAndroid Build Coastguard Worker   // empty string nonsense
300*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(d.find(b.data(), 4, 0), Piece::npos);
301*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(e.find(b.data(), 7, 0), Piece::npos);
302*6777b538SAndroid Build Coastguard Worker 
303*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(a.find(b.data(), 1), Piece::npos);
304*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(a.find(c.data(), 9), 23U);
305*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(a.find(c.data(), Piece::npos), Piece::npos);
306*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(b.find(c.data(), Piece::npos), Piece::npos);
307*6777b538SAndroid Build Coastguard Worker   // empty string nonsense
308*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(d.find(b.data(), 4), Piece::npos);
309*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(e.find(b.data(), 7), Piece::npos);
310*6777b538SAndroid Build Coastguard Worker 
311*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(a.rfind(b), 0U);
312*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(a.rfind(b, 1), 0U);
313*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(a.rfind(c), 23U);
314*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(a.rfind(c, 22U), Piece::npos);
315*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(a.rfind(c, 1U), Piece::npos);
316*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(a.rfind(c, 0U), Piece::npos);
317*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(b.rfind(c), Piece::npos);
318*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(b.rfind(c, 0U), Piece::npos);
319*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(a.rfind(d),
320*6777b538SAndroid Build Coastguard Worker             static_cast<size_t>(a.rfind(std::basic_string<TypeParam>())));
321*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(a.rfind(e), a.rfind(std::basic_string<TypeParam>()));
322*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(a.rfind(d),
323*6777b538SAndroid Build Coastguard Worker             static_cast<size_t>(std::basic_string<TypeParam>(a).rfind(
324*6777b538SAndroid Build Coastguard Worker                 std::basic_string<TypeParam>())));
325*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(a.rfind(e), std::basic_string<TypeParam>(a).rfind(
326*6777b538SAndroid Build Coastguard Worker                             std::basic_string<TypeParam>()));
327*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(a.rfind(d, 12), 12U);
328*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(a.rfind(e, 17), 17U);
329*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(a.rfind(g), Piece::npos);
330*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(d.rfind(b), Piece::npos);
331*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(e.rfind(b), Piece::npos);
332*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(d.rfind(b, 4), Piece::npos);
333*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(e.rfind(b, 7), Piece::npos);
334*6777b538SAndroid Build Coastguard Worker   // empty string nonsense
335*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(d.rfind(d, 4), std::string().rfind(std::string()));
336*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(e.rfind(d, 7), std::string().rfind(std::string()));
337*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(d.rfind(e, 4), std::string().rfind(std::string()));
338*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(e.rfind(e, 7), std::string().rfind(std::string()));
339*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(d.rfind(d), std::string().rfind(std::string()));
340*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(e.rfind(d), std::string().rfind(std::string()));
341*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(d.rfind(e), std::string().rfind(std::string()));
342*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(e.rfind(e), std::string().rfind(std::string()));
343*6777b538SAndroid Build Coastguard Worker 
344*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(g.rfind('o'), 8U);
345*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(g.rfind('q'), Piece::npos);
346*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(g.rfind('o', 8), 8U);
347*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(g.rfind('o', 7), 4U);
348*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(g.rfind('o', 3), Piece::npos);
349*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(f.rfind(kNul), 3U);
350*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(f.rfind(kNul, 12), 3U);
351*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(f.rfind('3'), 2U);
352*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(f.rfind('5'), 5U);
353*6777b538SAndroid Build Coastguard Worker   // empty string nonsense
354*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(d.rfind('o'), Piece::npos);
355*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(e.rfind('o'), Piece::npos);
356*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(d.rfind('o', 4), Piece::npos);
357*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(e.rfind('o', 7), Piece::npos);
358*6777b538SAndroid Build Coastguard Worker 
359*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(a.rfind(b.data(), 1, 0), 1U);
360*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(a.rfind(c.data(), 22U, 0), 22U);
361*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(a.rfind(c.data(), 1U, 0), 1U);
362*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(a.rfind(c.data(), 0U, 0), 0U);
363*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(b.rfind(c.data(), 0U, 0), 0U);
364*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(d.rfind(b.data(), 4, 0), 0U);
365*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(e.rfind(b.data(), 7, 0), 0U);
366*6777b538SAndroid Build Coastguard Worker 
367*6777b538SAndroid Build Coastguard Worker   std::basic_string<TypeParam> one_two_three_four(
368*6777b538SAndroid Build Coastguard Worker       TestFixture::as_string("one,two:three;four"));
369*6777b538SAndroid Build Coastguard Worker   std::basic_string<TypeParam> comma_colon(TestFixture::as_string(",:"));
370*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(3U, Piece(one_two_three_four).find_first_of(comma_colon));
371*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(a.find_first_of(b), 0U);
372*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(a.find_first_of(b, 0), 0U);
373*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(a.find_first_of(b, 1), 1U);
374*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(a.find_first_of(b, 2), 2U);
375*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(a.find_first_of(b, 3), Piece::npos);
376*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(a.find_first_of(c), 23U);
377*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(a.find_first_of(c, 23), 23U);
378*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(a.find_first_of(c, 24), 24U);
379*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(a.find_first_of(c, 25), 25U);
380*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(a.find_first_of(c, 26), Piece::npos);
381*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(g.find_first_of(b), 13U);
382*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(g.find_first_of(c), 0U);
383*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(a.find_first_of(f), Piece::npos);
384*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(f.find_first_of(a), Piece::npos);
385*6777b538SAndroid Build Coastguard Worker   // empty string nonsense
386*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(a.find_first_of(d), Piece::npos);
387*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(a.find_first_of(e), Piece::npos);
388*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(d.find_first_of(b), Piece::npos);
389*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(e.find_first_of(b), Piece::npos);
390*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(d.find_first_of(d), Piece::npos);
391*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(e.find_first_of(d), Piece::npos);
392*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(d.find_first_of(e), Piece::npos);
393*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(e.find_first_of(e), Piece::npos);
394*6777b538SAndroid Build Coastguard Worker 
395*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(a.find_first_not_of(b), 3U);
396*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(a.find_first_not_of(c), 0U);
397*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(b.find_first_not_of(a), Piece::npos);
398*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(c.find_first_not_of(a), Piece::npos);
399*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(f.find_first_not_of(a), 0U);
400*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(a.find_first_not_of(f), 0U);
401*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(a.find_first_not_of(d), 0U);
402*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(a.find_first_not_of(e), 0U);
403*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(a.find_first_not_of(d, 1), 1U);
404*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(a.find_first_not_of(e, 1), 1U);
405*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(a.find_first_not_of(d, a.size()), Piece::npos);
406*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(a.find_first_not_of(e, a.size()), Piece::npos);
407*6777b538SAndroid Build Coastguard Worker   // empty string nonsense
408*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(d.find_first_not_of(a), Piece::npos);
409*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(e.find_first_not_of(a), Piece::npos);
410*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(d.find_first_not_of(d), Piece::npos);
411*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(e.find_first_not_of(d), Piece::npos);
412*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(d.find_first_not_of(e), Piece::npos);
413*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(e.find_first_not_of(e), Piece::npos);
414*6777b538SAndroid Build Coastguard Worker 
415*6777b538SAndroid Build Coastguard Worker   std::basic_string<TypeParam> equals(TestFixture::as_string("===="));
416*6777b538SAndroid Build Coastguard Worker   Piece h(equals);
417*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(h.find_first_not_of('='), Piece::npos);
418*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(h.find_first_not_of('=', 3), Piece::npos);
419*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(h.find_first_not_of(kNul), 0U);
420*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(g.find_first_not_of('x'), 2U);
421*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(f.find_first_not_of(kNul), 0U);
422*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(f.find_first_not_of(kNul, 3), 4U);
423*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(f.find_first_not_of(kNul, 2), 2U);
424*6777b538SAndroid Build Coastguard Worker   // empty string nonsense
425*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(d.find_first_not_of('x'), Piece::npos);
426*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(e.find_first_not_of('x'), Piece::npos);
427*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(d.find_first_not_of(kNul), Piece::npos);
428*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(e.find_first_not_of(kNul), Piece::npos);
429*6777b538SAndroid Build Coastguard Worker 
430*6777b538SAndroid Build Coastguard Worker   //  Piece g("xx not found bb");
431*6777b538SAndroid Build Coastguard Worker   std::basic_string<TypeParam> fifty_six(TestFixture::as_string("56"));
432*6777b538SAndroid Build Coastguard Worker   Piece i(fifty_six);
433*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(h.find_last_of(a), Piece::npos);
434*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(g.find_last_of(a), g.size()-1);
435*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(a.find_last_of(b), 2U);
436*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(a.find_last_of(c), a.size()-1);
437*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(f.find_last_of(i), 6U);
438*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(a.find_last_of('a'), 0U);
439*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(a.find_last_of('b'), 1U);
440*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(a.find_last_of('z'), 25U);
441*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(a.find_last_of('a', 5), 0U);
442*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(a.find_last_of('b', 5), 1U);
443*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(a.find_last_of('b', 0), Piece::npos);
444*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(a.find_last_of('z', 25), 25U);
445*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(a.find_last_of('z', 24), Piece::npos);
446*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(f.find_last_of(i, 5), 5U);
447*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(f.find_last_of(i, 6), 6U);
448*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(f.find_last_of(a, 4), Piece::npos);
449*6777b538SAndroid Build Coastguard Worker   // empty string nonsense
450*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(f.find_last_of(d), Piece::npos);
451*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(f.find_last_of(e), Piece::npos);
452*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(f.find_last_of(d, 4), Piece::npos);
453*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(f.find_last_of(e, 4), Piece::npos);
454*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(d.find_last_of(d), Piece::npos);
455*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(d.find_last_of(e), Piece::npos);
456*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(e.find_last_of(d), Piece::npos);
457*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(e.find_last_of(e), Piece::npos);
458*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(d.find_last_of(f), Piece::npos);
459*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(e.find_last_of(f), Piece::npos);
460*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(d.find_last_of(d, 4), Piece::npos);
461*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(d.find_last_of(e, 4), Piece::npos);
462*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(e.find_last_of(d, 4), Piece::npos);
463*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(e.find_last_of(e, 4), Piece::npos);
464*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(d.find_last_of(f, 4), Piece::npos);
465*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(e.find_last_of(f, 4), Piece::npos);
466*6777b538SAndroid Build Coastguard Worker 
467*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(a.find_last_not_of(b), a.size()-1);
468*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(a.find_last_not_of(c), 22U);
469*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(b.find_last_not_of(a), Piece::npos);
470*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(b.find_last_not_of(b), Piece::npos);
471*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(f.find_last_not_of(i), 4U);
472*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(a.find_last_not_of(c, 24), 22U);
473*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(a.find_last_not_of(b, 3), 3U);
474*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(a.find_last_not_of(b, 2), Piece::npos);
475*6777b538SAndroid Build Coastguard Worker   // empty string nonsense
476*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(f.find_last_not_of(d), f.size()-1);
477*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(f.find_last_not_of(e), f.size()-1);
478*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(f.find_last_not_of(d, 4), 4U);
479*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(f.find_last_not_of(e, 4), 4U);
480*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(d.find_last_not_of(d), Piece::npos);
481*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(d.find_last_not_of(e), Piece::npos);
482*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(e.find_last_not_of(d), Piece::npos);
483*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(e.find_last_not_of(e), Piece::npos);
484*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(d.find_last_not_of(f), Piece::npos);
485*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(e.find_last_not_of(f), Piece::npos);
486*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(d.find_last_not_of(d, 4), Piece::npos);
487*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(d.find_last_not_of(e, 4), Piece::npos);
488*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(e.find_last_not_of(d, 4), Piece::npos);
489*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(e.find_last_not_of(e, 4), Piece::npos);
490*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(d.find_last_not_of(f, 4), Piece::npos);
491*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(e.find_last_not_of(f, 4), Piece::npos);
492*6777b538SAndroid Build Coastguard Worker 
493*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(h.find_last_not_of('x'), h.size() - 1);
494*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(h.find_last_not_of('='), Piece::npos);
495*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(b.find_last_not_of('c'), 1U);
496*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(h.find_last_not_of('x', 2), 2U);
497*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(h.find_last_not_of('=', 2), Piece::npos);
498*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(b.find_last_not_of('b', 1), 0U);
499*6777b538SAndroid Build Coastguard Worker   // empty string nonsense
500*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(d.find_last_not_of('x'), Piece::npos);
501*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(e.find_last_not_of('x'), Piece::npos);
502*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(d.find_last_not_of(kNul), Piece::npos);
503*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(e.find_last_not_of(kNul), Piece::npos);
504*6777b538SAndroid Build Coastguard Worker 
505*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(a.substr(0, 3), b);
506*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(a.substr(23), c);
507*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(a.substr(23, 3), c);
508*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(a.substr(23, 99), c);
509*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(a.substr(), a);
510*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(a.substr(0), a);
511*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(a.substr(3, 2), TestFixture::as_string("de"));
512*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(d.substr(0, 99), e);
513*6777b538SAndroid Build Coastguard Worker }
514*6777b538SAndroid Build Coastguard Worker 
TYPED_TEST(CommonStringPieceTest,CheckCustom)515*6777b538SAndroid Build Coastguard Worker TYPED_TEST(CommonStringPieceTest, CheckCustom) {
516*6777b538SAndroid Build Coastguard Worker   std::basic_string<TypeParam> foobar(TestFixture::as_string("foobar"));
517*6777b538SAndroid Build Coastguard Worker   std::basic_string_view<TypeParam> a(foobar);
518*6777b538SAndroid Build Coastguard Worker   std::basic_string<TypeParam> s1(TestFixture::as_string("123"));
519*6777b538SAndroid Build Coastguard Worker   s1 += static_cast<TypeParam>('\0');
520*6777b538SAndroid Build Coastguard Worker   s1 += TestFixture::as_string("456");
521*6777b538SAndroid Build Coastguard Worker   [[maybe_unused]] std::basic_string_view<TypeParam> b(s1);
522*6777b538SAndroid Build Coastguard Worker   std::basic_string_view<TypeParam> e;
523*6777b538SAndroid Build Coastguard Worker   std::basic_string<TypeParam> s2;
524*6777b538SAndroid Build Coastguard Worker 
525*6777b538SAndroid Build Coastguard Worker   // remove_prefix
526*6777b538SAndroid Build Coastguard Worker   std::basic_string_view<TypeParam> c(a);
527*6777b538SAndroid Build Coastguard Worker   c.remove_prefix(3);
528*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(c, TestFixture::as_string("bar"));
529*6777b538SAndroid Build Coastguard Worker   c = a;
530*6777b538SAndroid Build Coastguard Worker   c.remove_prefix(0);
531*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(c, a);
532*6777b538SAndroid Build Coastguard Worker   c.remove_prefix(c.size());
533*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(c, e);
534*6777b538SAndroid Build Coastguard Worker 
535*6777b538SAndroid Build Coastguard Worker   // remove_suffix
536*6777b538SAndroid Build Coastguard Worker   c = a;
537*6777b538SAndroid Build Coastguard Worker   c.remove_suffix(3);
538*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(c, TestFixture::as_string("foo"));
539*6777b538SAndroid Build Coastguard Worker   c = a;
540*6777b538SAndroid Build Coastguard Worker   c.remove_suffix(0);
541*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(c, a);
542*6777b538SAndroid Build Coastguard Worker   c.remove_suffix(c.size());
543*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(c, e);
544*6777b538SAndroid Build Coastguard Worker 
545*6777b538SAndroid Build Coastguard Worker   // assignment
546*6777b538SAndroid Build Coastguard Worker   c = foobar.c_str();
547*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(c, a);
548*6777b538SAndroid Build Coastguard Worker   c = {foobar.c_str(), 6};
549*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(c, a);
550*6777b538SAndroid Build Coastguard Worker   c = {foobar.c_str(), 0};
551*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(c, e);
552*6777b538SAndroid Build Coastguard Worker   c = {foobar.c_str(), 7};  // Note, has an embedded NULL
553*6777b538SAndroid Build Coastguard Worker   ASSERT_NE(c, a);
554*6777b538SAndroid Build Coastguard Worker 
555*6777b538SAndroid Build Coastguard Worker   // operator STRING_TYPE()
556*6777b538SAndroid Build Coastguard Worker   std::basic_string<TypeParam> s5(std::basic_string<TypeParam>(a).c_str(),
557*6777b538SAndroid Build Coastguard Worker                                   7);  // Note, has an embedded NULL
558*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(c, s5);
559*6777b538SAndroid Build Coastguard Worker   std::basic_string<TypeParam> s6(e);
560*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(s6.empty());
561*6777b538SAndroid Build Coastguard Worker }
562*6777b538SAndroid Build Coastguard Worker 
TEST(StringPieceTest,CheckCustom)563*6777b538SAndroid Build Coastguard Worker TEST(StringPieceTest, CheckCustom) {
564*6777b538SAndroid Build Coastguard Worker   StringPiece a("foobar");
565*6777b538SAndroid Build Coastguard Worker   std::string s1("123");
566*6777b538SAndroid Build Coastguard Worker   s1 += '\0';
567*6777b538SAndroid Build Coastguard Worker   s1 += "456";
568*6777b538SAndroid Build Coastguard Worker   [[maybe_unused]] StringPiece b(s1);
569*6777b538SAndroid Build Coastguard Worker   StringPiece e;
570*6777b538SAndroid Build Coastguard Worker   std::string s2;
571*6777b538SAndroid Build Coastguard Worker 
572*6777b538SAndroid Build Coastguard Worker   StringPiece c;
573*6777b538SAndroid Build Coastguard Worker   c = {"foobar", 6};
574*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(c, a);
575*6777b538SAndroid Build Coastguard Worker   c = {"foobar", 0};
576*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(c, e);
577*6777b538SAndroid Build Coastguard Worker   c = {"foobar", 7};
578*6777b538SAndroid Build Coastguard Worker   ASSERT_NE(c, a);
579*6777b538SAndroid Build Coastguard Worker }
580*6777b538SAndroid Build Coastguard Worker 
TYPED_TEST(CommonStringPieceTest,CheckNULL)581*6777b538SAndroid Build Coastguard Worker TYPED_TEST(CommonStringPieceTest, CheckNULL) {
582*6777b538SAndroid Build Coastguard Worker   std::basic_string_view<TypeParam> s;
583*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(s.data(), nullptr);
584*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(s.size(), 0U);
585*6777b538SAndroid Build Coastguard Worker 
586*6777b538SAndroid Build Coastguard Worker   std::basic_string<TypeParam> str(s);
587*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(str.length(), 0U);
588*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(str, std::basic_string<TypeParam>());
589*6777b538SAndroid Build Coastguard Worker }
590*6777b538SAndroid Build Coastguard Worker 
TYPED_TEST(CommonStringPieceTest,CheckComparisons2)591*6777b538SAndroid Build Coastguard Worker TYPED_TEST(CommonStringPieceTest, CheckComparisons2) {
592*6777b538SAndroid Build Coastguard Worker   std::basic_string<TypeParam> alphabet(
593*6777b538SAndroid Build Coastguard Worker       TestFixture::as_string("abcdefghijklmnopqrstuvwxyz"));
594*6777b538SAndroid Build Coastguard Worker   std::basic_string<TypeParam> alphabet_z(
595*6777b538SAndroid Build Coastguard Worker       TestFixture::as_string("abcdefghijklmnopqrstuvwxyzz"));
596*6777b538SAndroid Build Coastguard Worker   std::basic_string<TypeParam> alphabet_y(
597*6777b538SAndroid Build Coastguard Worker       TestFixture::as_string("abcdefghijklmnopqrstuvwxyy"));
598*6777b538SAndroid Build Coastguard Worker   std::basic_string_view<TypeParam> abc(alphabet);
599*6777b538SAndroid Build Coastguard Worker 
600*6777b538SAndroid Build Coastguard Worker   // check comparison operations on strings longer than 4 bytes.
601*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(abc, std::basic_string_view<TypeParam>(alphabet));
602*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(abc.compare(std::basic_string_view<TypeParam>(alphabet)), 0);
603*6777b538SAndroid Build Coastguard Worker 
604*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(abc < std::basic_string_view<TypeParam>(alphabet_z));
605*6777b538SAndroid Build Coastguard Worker   ASSERT_LT(abc.compare(std::basic_string_view<TypeParam>(alphabet_z)), 0);
606*6777b538SAndroid Build Coastguard Worker 
607*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(abc > std::basic_string_view<TypeParam>(alphabet_y));
608*6777b538SAndroid Build Coastguard Worker   ASSERT_GT(abc.compare(std::basic_string_view<TypeParam>(alphabet_y)), 0);
609*6777b538SAndroid Build Coastguard Worker }
610*6777b538SAndroid Build Coastguard Worker 
TYPED_TEST(CommonStringPieceTest,StringCompareNotAmbiguous)611*6777b538SAndroid Build Coastguard Worker TYPED_TEST(CommonStringPieceTest, StringCompareNotAmbiguous) {
612*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(TestFixture::as_string("hello").c_str() ==
613*6777b538SAndroid Build Coastguard Worker               TestFixture::as_string("hello"));
614*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(TestFixture::as_string("hello").c_str() <
615*6777b538SAndroid Build Coastguard Worker               TestFixture::as_string("world"));
616*6777b538SAndroid Build Coastguard Worker }
617*6777b538SAndroid Build Coastguard Worker 
TYPED_TEST(CommonStringPieceTest,HeterogenousStringPieceEquals)618*6777b538SAndroid Build Coastguard Worker TYPED_TEST(CommonStringPieceTest, HeterogenousStringPieceEquals) {
619*6777b538SAndroid Build Coastguard Worker   std::basic_string<TypeParam> hello(TestFixture::as_string("hello"));
620*6777b538SAndroid Build Coastguard Worker 
621*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(std::basic_string_view<TypeParam>(hello), hello);
622*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(hello.c_str(), std::basic_string_view<TypeParam>(hello));
623*6777b538SAndroid Build Coastguard Worker }
624*6777b538SAndroid Build Coastguard Worker 
625*6777b538SAndroid Build Coastguard Worker // std::u16string-specific stuff
TEST(StringPiece16Test,CheckSTL)626*6777b538SAndroid Build Coastguard Worker TEST(StringPiece16Test, CheckSTL) {
627*6777b538SAndroid Build Coastguard Worker   // Check some non-ascii characters.
628*6777b538SAndroid Build Coastguard Worker   std::u16string fifth(u"123");
629*6777b538SAndroid Build Coastguard Worker   fifth.push_back(0x0000);
630*6777b538SAndroid Build Coastguard Worker   fifth.push_back(0xd8c5);
631*6777b538SAndroid Build Coastguard Worker   fifth.push_back(0xdffe);
632*6777b538SAndroid Build Coastguard Worker   StringPiece16 f(fifth);
633*6777b538SAndroid Build Coastguard Worker 
634*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(f[3], '\0');
635*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(f[5], 0xdffe);
636*6777b538SAndroid Build Coastguard Worker 
637*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(f.size(), 6U);
638*6777b538SAndroid Build Coastguard Worker }
639*6777b538SAndroid Build Coastguard Worker 
TEST(StringPiece16Test,CheckConversion)640*6777b538SAndroid Build Coastguard Worker TEST(StringPiece16Test, CheckConversion) {
641*6777b538SAndroid Build Coastguard Worker   // Make sure that we can convert from UTF8 to UTF16 and back. We use a
642*6777b538SAndroid Build Coastguard Worker   // character (G clef) outside the BMP to test this.
643*6777b538SAndroid Build Coastguard Worker   const char* kTest = "\U0001D11E";
644*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(UTF16ToUTF8(UTF8ToUTF16(kTest)), kTest);
645*6777b538SAndroid Build Coastguard Worker }
646*6777b538SAndroid Build Coastguard Worker 
TYPED_TEST(CommonStringPieceTest,CheckConstructors)647*6777b538SAndroid Build Coastguard Worker TYPED_TEST(CommonStringPieceTest, CheckConstructors) {
648*6777b538SAndroid Build Coastguard Worker   std::basic_string<TypeParam> str(TestFixture::as_string("hello world"));
649*6777b538SAndroid Build Coastguard Worker   std::basic_string<TypeParam> empty;
650*6777b538SAndroid Build Coastguard Worker 
651*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(str, std::basic_string_view<TypeParam>(str));
652*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(str, std::basic_string_view<TypeParam>(str.c_str()));
653*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(TestFixture::as_string("hello") ==
654*6777b538SAndroid Build Coastguard Worker               std::basic_string_view<TypeParam>(str.c_str(), 5));
655*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(
656*6777b538SAndroid Build Coastguard Worker       empty,
657*6777b538SAndroid Build Coastguard Worker       std::basic_string_view<TypeParam>(
658*6777b538SAndroid Build Coastguard Worker           str.c_str(),
659*6777b538SAndroid Build Coastguard Worker           static_cast<typename std::basic_string_view<TypeParam>::size_type>(
660*6777b538SAndroid Build Coastguard Worker               0)));
661*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(empty, std::basic_string_view<TypeParam>());
662*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(
663*6777b538SAndroid Build Coastguard Worker       empty ==
664*6777b538SAndroid Build Coastguard Worker       std::basic_string_view<TypeParam>(
665*6777b538SAndroid Build Coastguard Worker           nullptr,
666*6777b538SAndroid Build Coastguard Worker           static_cast<typename std::basic_string_view<TypeParam>::size_type>(
667*6777b538SAndroid Build Coastguard Worker               0)));
668*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(empty, std::basic_string_view<TypeParam>());
669*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(empty, std::basic_string_view<TypeParam>(empty));
670*6777b538SAndroid Build Coastguard Worker }
671*6777b538SAndroid Build Coastguard Worker 
TEST(StringPieceTest,ConstexprCtor)672*6777b538SAndroid Build Coastguard Worker TEST(StringPieceTest, ConstexprCtor) {
673*6777b538SAndroid Build Coastguard Worker   {
674*6777b538SAndroid Build Coastguard Worker     constexpr StringPiece piece;
675*6777b538SAndroid Build Coastguard Worker     std::ignore = piece;
676*6777b538SAndroid Build Coastguard Worker   }
677*6777b538SAndroid Build Coastguard Worker 
678*6777b538SAndroid Build Coastguard Worker   {
679*6777b538SAndroid Build Coastguard Worker     constexpr StringPiece piece("abc");
680*6777b538SAndroid Build Coastguard Worker     std::ignore = piece;
681*6777b538SAndroid Build Coastguard Worker   }
682*6777b538SAndroid Build Coastguard Worker 
683*6777b538SAndroid Build Coastguard Worker   {
684*6777b538SAndroid Build Coastguard Worker     constexpr StringPiece piece("abc", 2);
685*6777b538SAndroid Build Coastguard Worker     std::ignore = piece;
686*6777b538SAndroid Build Coastguard Worker   }
687*6777b538SAndroid Build Coastguard Worker }
688*6777b538SAndroid Build Coastguard Worker 
689*6777b538SAndroid Build Coastguard Worker // Chromium development assumes StringPiece (which is std::string_view) is
690*6777b538SAndroid Build Coastguard Worker // implemented with an STL that enables hardening checks. We treat bugs that
691*6777b538SAndroid Build Coastguard Worker // trigger one of these conditions as functional rather than security bugs. If
692*6777b538SAndroid Build Coastguard Worker // this test fails on some embedder, it should not be disabled. Instead, the
693*6777b538SAndroid Build Coastguard Worker // embedder should fix their STL or build configuration to enable corresponding
694*6777b538SAndroid Build Coastguard Worker // hardening checks.
695*6777b538SAndroid Build Coastguard Worker //
696*6777b538SAndroid Build Coastguard Worker // See https://chromium.googlesource.com/chromium/src/+/main/docs/security/faq.md#indexing-a-container-out-of-bounds-hits-a-libcpp_verbose_abort_is-this-a-security-bug
TEST(StringPieceTest,OutOfBoundsDeath)697*6777b538SAndroid Build Coastguard Worker TEST(StringPieceTest, OutOfBoundsDeath) {
698*6777b538SAndroid Build Coastguard Worker   {
699*6777b538SAndroid Build Coastguard Worker     constexpr StringPiece piece;
700*6777b538SAndroid Build Coastguard Worker     ASSERT_DEATH_IF_SUPPORTED(piece[0], "");
701*6777b538SAndroid Build Coastguard Worker   }
702*6777b538SAndroid Build Coastguard Worker 
703*6777b538SAndroid Build Coastguard Worker   {
704*6777b538SAndroid Build Coastguard Worker     constexpr StringPiece piece;
705*6777b538SAndroid Build Coastguard Worker     ASSERT_DEATH_IF_SUPPORTED(piece.front(), "");
706*6777b538SAndroid Build Coastguard Worker   }
707*6777b538SAndroid Build Coastguard Worker 
708*6777b538SAndroid Build Coastguard Worker   {
709*6777b538SAndroid Build Coastguard Worker     constexpr StringPiece piece;
710*6777b538SAndroid Build Coastguard Worker     ASSERT_DEATH_IF_SUPPORTED(piece.back(), "");
711*6777b538SAndroid Build Coastguard Worker   }
712*6777b538SAndroid Build Coastguard Worker 
713*6777b538SAndroid Build Coastguard Worker   {
714*6777b538SAndroid Build Coastguard Worker     StringPiece piece;
715*6777b538SAndroid Build Coastguard Worker     ASSERT_DEATH_IF_SUPPORTED(piece.remove_suffix(1), "");
716*6777b538SAndroid Build Coastguard Worker   }
717*6777b538SAndroid Build Coastguard Worker 
718*6777b538SAndroid Build Coastguard Worker   {
719*6777b538SAndroid Build Coastguard Worker     StringPiece piece;
720*6777b538SAndroid Build Coastguard Worker     ASSERT_DEATH_IF_SUPPORTED(piece.remove_prefix(1), "");
721*6777b538SAndroid Build Coastguard Worker   }
722*6777b538SAndroid Build Coastguard Worker 
723*6777b538SAndroid Build Coastguard Worker   {
724*6777b538SAndroid Build Coastguard Worker     StringPiece piece;
725*6777b538SAndroid Build Coastguard Worker     ASSERT_DEATH_IF_SUPPORTED(piece.copy(nullptr, 0, 1), "");
726*6777b538SAndroid Build Coastguard Worker   }
727*6777b538SAndroid Build Coastguard Worker 
728*6777b538SAndroid Build Coastguard Worker   {
729*6777b538SAndroid Build Coastguard Worker     StringPiece piece;
730*6777b538SAndroid Build Coastguard Worker     ASSERT_DEATH_IF_SUPPORTED(piece.substr(1), "");
731*6777b538SAndroid Build Coastguard Worker   }
732*6777b538SAndroid Build Coastguard Worker }
733*6777b538SAndroid Build Coastguard Worker 
TEST(StringPieceTest,InvalidLengthDeath)734*6777b538SAndroid Build Coastguard Worker TEST(StringPieceTest, InvalidLengthDeath) {
735*6777b538SAndroid Build Coastguard Worker   int length = -1;
736*6777b538SAndroid Build Coastguard Worker   ASSERT_DEATH_IF_SUPPORTED({ StringPiece piece("hello", length); }, "");
737*6777b538SAndroid Build Coastguard Worker }
738*6777b538SAndroid Build Coastguard Worker 
TEST(StringPieceTest,ConstexprData)739*6777b538SAndroid Build Coastguard Worker TEST(StringPieceTest, ConstexprData) {
740*6777b538SAndroid Build Coastguard Worker   {
741*6777b538SAndroid Build Coastguard Worker     constexpr StringPiece piece;
742*6777b538SAndroid Build Coastguard Worker     static_assert(piece.data() == nullptr, "");
743*6777b538SAndroid Build Coastguard Worker   }
744*6777b538SAndroid Build Coastguard Worker 
745*6777b538SAndroid Build Coastguard Worker   {
746*6777b538SAndroid Build Coastguard Worker     constexpr StringPiece piece("abc");
747*6777b538SAndroid Build Coastguard Worker     static_assert(piece.data()[0] == 'a', "");
748*6777b538SAndroid Build Coastguard Worker     static_assert(piece.data()[1] == 'b', "");
749*6777b538SAndroid Build Coastguard Worker     static_assert(piece.data()[2] == 'c', "");
750*6777b538SAndroid Build Coastguard Worker   }
751*6777b538SAndroid Build Coastguard Worker 
752*6777b538SAndroid Build Coastguard Worker   {
753*6777b538SAndroid Build Coastguard Worker     constexpr StringPiece piece("def", 2);
754*6777b538SAndroid Build Coastguard Worker     static_assert(piece.data()[0] == 'd', "");
755*6777b538SAndroid Build Coastguard Worker     static_assert(piece.data()[1] == 'e', "");
756*6777b538SAndroid Build Coastguard Worker   }
757*6777b538SAndroid Build Coastguard Worker }
758*6777b538SAndroid Build Coastguard Worker 
TEST(StringPieceTest,ConstexprSize)759*6777b538SAndroid Build Coastguard Worker TEST(StringPieceTest, ConstexprSize) {
760*6777b538SAndroid Build Coastguard Worker   {
761*6777b538SAndroid Build Coastguard Worker     constexpr StringPiece piece;
762*6777b538SAndroid Build Coastguard Worker     static_assert(piece.size() == 0, "");
763*6777b538SAndroid Build Coastguard Worker   }
764*6777b538SAndroid Build Coastguard Worker 
765*6777b538SAndroid Build Coastguard Worker   {
766*6777b538SAndroid Build Coastguard Worker     constexpr StringPiece piece("abc");
767*6777b538SAndroid Build Coastguard Worker     static_assert(piece.size() == 3, "");
768*6777b538SAndroid Build Coastguard Worker   }
769*6777b538SAndroid Build Coastguard Worker 
770*6777b538SAndroid Build Coastguard Worker   {
771*6777b538SAndroid Build Coastguard Worker     constexpr StringPiece piece("def", 2);
772*6777b538SAndroid Build Coastguard Worker     static_assert(piece.size() == 2, "");
773*6777b538SAndroid Build Coastguard Worker   }
774*6777b538SAndroid Build Coastguard Worker }
775*6777b538SAndroid Build Coastguard Worker 
TEST(StringPieceTest,ConstexprFront)776*6777b538SAndroid Build Coastguard Worker TEST(StringPieceTest, ConstexprFront) {
777*6777b538SAndroid Build Coastguard Worker   static_assert(StringPiece("abc").front() == 'a', "");
778*6777b538SAndroid Build Coastguard Worker }
779*6777b538SAndroid Build Coastguard Worker 
TEST(StringPieceTest,ConstexprBack)780*6777b538SAndroid Build Coastguard Worker TEST(StringPieceTest, ConstexprBack) {
781*6777b538SAndroid Build Coastguard Worker   static_assert(StringPiece("abc").back() == 'c', "");
782*6777b538SAndroid Build Coastguard Worker }
783*6777b538SAndroid Build Coastguard Worker 
TEST(StringPieceTest,Compare)784*6777b538SAndroid Build Coastguard Worker TEST(StringPieceTest, Compare) {
785*6777b538SAndroid Build Coastguard Worker   constexpr StringPiece piece = "def";
786*6777b538SAndroid Build Coastguard Worker 
787*6777b538SAndroid Build Coastguard Worker   static_assert(piece.compare("ab") == 1, "");
788*6777b538SAndroid Build Coastguard Worker   static_assert(piece.compare("abc") == 1, "");
789*6777b538SAndroid Build Coastguard Worker   static_assert(piece.compare("abcd") == 1, "");
790*6777b538SAndroid Build Coastguard Worker   static_assert(piece.compare("de") == 1, "");
791*6777b538SAndroid Build Coastguard Worker   static_assert(piece.compare("def") == 0, "");
792*6777b538SAndroid Build Coastguard Worker   static_assert(piece.compare("defg") == -1, "");
793*6777b538SAndroid Build Coastguard Worker   static_assert(piece.compare("gh") == -1, "");
794*6777b538SAndroid Build Coastguard Worker   static_assert(piece.compare("ghi") == -1, "");
795*6777b538SAndroid Build Coastguard Worker   static_assert(piece.compare("ghij") == -1, "");
796*6777b538SAndroid Build Coastguard Worker 
797*6777b538SAndroid Build Coastguard Worker   static_assert(piece.compare(0, 0, "") == 0, "");
798*6777b538SAndroid Build Coastguard Worker   static_assert(piece.compare(0, 1, "d") == 0, "");
799*6777b538SAndroid Build Coastguard Worker   static_assert(piece.compare(0, 2, "de") == 0, "");
800*6777b538SAndroid Build Coastguard Worker   static_assert(piece.compare(0, 3, "def") == 0, "");
801*6777b538SAndroid Build Coastguard Worker   static_assert(piece.compare(1, 0, "") == 0, "");
802*6777b538SAndroid Build Coastguard Worker   static_assert(piece.compare(1, 1, "e") == 0, "");
803*6777b538SAndroid Build Coastguard Worker   static_assert(piece.compare(1, 2, "ef") == 0, "");
804*6777b538SAndroid Build Coastguard Worker   static_assert(piece.compare(1, 3, "ef") == 0, "");
805*6777b538SAndroid Build Coastguard Worker   static_assert(piece.compare(2, 0, "") == 0, "");
806*6777b538SAndroid Build Coastguard Worker   static_assert(piece.compare(2, 1, "f") == 0, "");
807*6777b538SAndroid Build Coastguard Worker   static_assert(piece.compare(2, 2, "f") == 0, "");
808*6777b538SAndroid Build Coastguard Worker   static_assert(piece.compare(2, 3, "f") == 0, "");
809*6777b538SAndroid Build Coastguard Worker   static_assert(piece.compare(3, 0, "") == 0, "");
810*6777b538SAndroid Build Coastguard Worker   static_assert(piece.compare(3, 1, "") == 0, "");
811*6777b538SAndroid Build Coastguard Worker   static_assert(piece.compare(3, 2, "") == 0, "");
812*6777b538SAndroid Build Coastguard Worker   static_assert(piece.compare(3, 3, "") == 0, "");
813*6777b538SAndroid Build Coastguard Worker 
814*6777b538SAndroid Build Coastguard Worker   static_assert(piece.compare(0, 0, "def", 0) == 0, "");
815*6777b538SAndroid Build Coastguard Worker   static_assert(piece.compare(0, 1, "def", 1) == 0, "");
816*6777b538SAndroid Build Coastguard Worker   static_assert(piece.compare(0, 2, "def", 2) == 0, "");
817*6777b538SAndroid Build Coastguard Worker   static_assert(piece.compare(0, 3, "def", 3) == 0, "");
818*6777b538SAndroid Build Coastguard Worker   static_assert(piece.compare(1, 0, "ef", 0) == 0, "");
819*6777b538SAndroid Build Coastguard Worker   static_assert(piece.compare(1, 1, "ef", 1) == 0, "");
820*6777b538SAndroid Build Coastguard Worker   static_assert(piece.compare(1, 2, "ef", 2) == 0, "");
821*6777b538SAndroid Build Coastguard Worker   static_assert(piece.compare(1, 3, "ef", 2) == 0, "");
822*6777b538SAndroid Build Coastguard Worker   static_assert(piece.compare(2, 0, "f", 0) == 0, "");
823*6777b538SAndroid Build Coastguard Worker   static_assert(piece.compare(2, 1, "f", 1) == 0, "");
824*6777b538SAndroid Build Coastguard Worker   static_assert(piece.compare(2, 2, "f", 1) == 0, "");
825*6777b538SAndroid Build Coastguard Worker   static_assert(piece.compare(2, 3, "f", 1) == 0, "");
826*6777b538SAndroid Build Coastguard Worker   static_assert(piece.compare(3, 0, "", 0) == 0, "");
827*6777b538SAndroid Build Coastguard Worker   static_assert(piece.compare(3, 1, "", 0) == 0, "");
828*6777b538SAndroid Build Coastguard Worker   static_assert(piece.compare(3, 2, "", 0) == 0, "");
829*6777b538SAndroid Build Coastguard Worker   static_assert(piece.compare(3, 3, "", 0) == 0, "");
830*6777b538SAndroid Build Coastguard Worker 
831*6777b538SAndroid Build Coastguard Worker   static_assert(piece.compare(0, 0, "def", 0, 0) == 0, "");
832*6777b538SAndroid Build Coastguard Worker   static_assert(piece.compare(0, 1, "def", 0, 1) == 0, "");
833*6777b538SAndroid Build Coastguard Worker   static_assert(piece.compare(0, 2, "def", 0, 2) == 0, "");
834*6777b538SAndroid Build Coastguard Worker   static_assert(piece.compare(0, 3, "def", 0, 3) == 0, "");
835*6777b538SAndroid Build Coastguard Worker   static_assert(piece.compare(1, 0, "def", 1, 0) == 0, "");
836*6777b538SAndroid Build Coastguard Worker   static_assert(piece.compare(1, 1, "def", 1, 1) == 0, "");
837*6777b538SAndroid Build Coastguard Worker   static_assert(piece.compare(1, 2, "def", 1, 2) == 0, "");
838*6777b538SAndroid Build Coastguard Worker   static_assert(piece.compare(1, 3, "def", 1, 3) == 0, "");
839*6777b538SAndroid Build Coastguard Worker   static_assert(piece.compare(2, 0, "def", 2, 0) == 0, "");
840*6777b538SAndroid Build Coastguard Worker   static_assert(piece.compare(2, 1, "def", 2, 1) == 0, "");
841*6777b538SAndroid Build Coastguard Worker   static_assert(piece.compare(2, 2, "def", 2, 2) == 0, "");
842*6777b538SAndroid Build Coastguard Worker   static_assert(piece.compare(2, 3, "def", 2, 3) == 0, "");
843*6777b538SAndroid Build Coastguard Worker   static_assert(piece.compare(3, 0, "def", 3, 0) == 0, "");
844*6777b538SAndroid Build Coastguard Worker   static_assert(piece.compare(3, 1, "def", 3, 1) == 0, "");
845*6777b538SAndroid Build Coastguard Worker   static_assert(piece.compare(3, 2, "def", 3, 2) == 0, "");
846*6777b538SAndroid Build Coastguard Worker   static_assert(piece.compare(3, 3, "def", 3, 3) == 0, "");
847*6777b538SAndroid Build Coastguard Worker }
848*6777b538SAndroid Build Coastguard Worker 
TEST(StringPieceTest,Substr)849*6777b538SAndroid Build Coastguard Worker TEST(StringPieceTest, Substr) {
850*6777b538SAndroid Build Coastguard Worker   constexpr StringPiece piece = "abcdefghijklmnopqrstuvwxyz";
851*6777b538SAndroid Build Coastguard Worker 
852*6777b538SAndroid Build Coastguard Worker   static_assert(piece.substr(0, 2) == "ab", "");
853*6777b538SAndroid Build Coastguard Worker   static_assert(piece.substr(0, 3) == "abc", "");
854*6777b538SAndroid Build Coastguard Worker   static_assert(piece.substr(0, 4) == "abcd", "");
855*6777b538SAndroid Build Coastguard Worker   static_assert(piece.substr(3, 2) == "de", "");
856*6777b538SAndroid Build Coastguard Worker   static_assert(piece.substr(3, 3) == "def", "");
857*6777b538SAndroid Build Coastguard Worker   static_assert(piece.substr(23) == "xyz", "");
858*6777b538SAndroid Build Coastguard Worker   static_assert(piece.substr(23, 3) == "xyz", "");
859*6777b538SAndroid Build Coastguard Worker   static_assert(piece.substr(23, 99) == "xyz", "");
860*6777b538SAndroid Build Coastguard Worker   static_assert(piece.substr() == piece, "");
861*6777b538SAndroid Build Coastguard Worker   static_assert(piece.substr(0) == piece, "");
862*6777b538SAndroid Build Coastguard Worker   static_assert(piece.substr(0, 99) == piece, "");
863*6777b538SAndroid Build Coastguard Worker }
864*6777b538SAndroid Build Coastguard Worker 
TEST(StringPieceTest,Find)865*6777b538SAndroid Build Coastguard Worker TEST(StringPieceTest, Find) {
866*6777b538SAndroid Build Coastguard Worker   constexpr StringPiece foobar("foobar", 6);
867*6777b538SAndroid Build Coastguard Worker   constexpr StringPiece foo = foobar.substr(0, 3);
868*6777b538SAndroid Build Coastguard Worker   constexpr StringPiece bar = foobar.substr(3);
869*6777b538SAndroid Build Coastguard Worker 
870*6777b538SAndroid Build Coastguard Worker   // find
871*6777b538SAndroid Build Coastguard Worker   static_assert(foobar.find(bar, 0) == 3, "");
872*6777b538SAndroid Build Coastguard Worker   static_assert(foobar.find('o', 0) == 1, "");
873*6777b538SAndroid Build Coastguard Worker   static_assert(foobar.find("ox", 0, 1) == 1, "");
874*6777b538SAndroid Build Coastguard Worker   static_assert(foobar.find("ox", 0) == StringPiece::npos, "");
875*6777b538SAndroid Build Coastguard Worker 
876*6777b538SAndroid Build Coastguard Worker   // rfind
877*6777b538SAndroid Build Coastguard Worker   static_assert(foobar.rfind(bar, 5) == 3, "");
878*6777b538SAndroid Build Coastguard Worker   static_assert(foobar.rfind('o', 5) == 2, "");
879*6777b538SAndroid Build Coastguard Worker   static_assert(foobar.rfind("ox", 5, 1) == 2, "");
880*6777b538SAndroid Build Coastguard Worker   static_assert(foobar.rfind("ox", 5) == StringPiece::npos, "");
881*6777b538SAndroid Build Coastguard Worker 
882*6777b538SAndroid Build Coastguard Worker   // find_first_of
883*6777b538SAndroid Build Coastguard Worker   static_assert(foobar.find_first_of(foo, 2) == 2, "");
884*6777b538SAndroid Build Coastguard Worker   static_assert(foobar.find_first_of('o', 2) == 2, "");
885*6777b538SAndroid Build Coastguard Worker   static_assert(foobar.find_first_of("ox", 2, 2) == 2, "");
886*6777b538SAndroid Build Coastguard Worker   static_assert(foobar.find_first_of("ox", 2) == 2, "");
887*6777b538SAndroid Build Coastguard Worker 
888*6777b538SAndroid Build Coastguard Worker   // find_last_of
889*6777b538SAndroid Build Coastguard Worker   static_assert(foobar.find_last_of(foo, 5) == 2, "");
890*6777b538SAndroid Build Coastguard Worker   static_assert(foobar.find_last_of('o', 5) == 2, "");
891*6777b538SAndroid Build Coastguard Worker   static_assert(foobar.find_last_of("ox", 5, 2) == 2, "");
892*6777b538SAndroid Build Coastguard Worker   static_assert(foobar.find_last_of("ox", 5) == 2, "");
893*6777b538SAndroid Build Coastguard Worker 
894*6777b538SAndroid Build Coastguard Worker   // find_first_not_of
895*6777b538SAndroid Build Coastguard Worker   static_assert(foobar.find_first_not_of(foo, 2) == 3, "");
896*6777b538SAndroid Build Coastguard Worker   static_assert(foobar.find_first_not_of('o', 2) == 3, "");
897*6777b538SAndroid Build Coastguard Worker   static_assert(foobar.find_first_not_of("ox", 2, 2) == 3, "");
898*6777b538SAndroid Build Coastguard Worker   static_assert(foobar.find_first_not_of("ox", 2) == 3, "");
899*6777b538SAndroid Build Coastguard Worker 
900*6777b538SAndroid Build Coastguard Worker   // find_last_not_of
901*6777b538SAndroid Build Coastguard Worker   static_assert(foobar.find_last_not_of(bar, 5) == 2, "");
902*6777b538SAndroid Build Coastguard Worker   static_assert(foobar.find_last_not_of('a', 4) == 3, "");
903*6777b538SAndroid Build Coastguard Worker   static_assert(foobar.find_last_not_of("ox", 2, 2) == 0, "");
904*6777b538SAndroid Build Coastguard Worker   static_assert(foobar.find_last_not_of("ox", 2) == 0, "");
905*6777b538SAndroid Build Coastguard Worker }
906*6777b538SAndroid Build Coastguard Worker 
907*6777b538SAndroid Build Coastguard Worker // Test that `base::StringPiece` and `std::string_view` are interoperable.
TEST(StringPieceTest,StringPieceToStringView)908*6777b538SAndroid Build Coastguard Worker TEST(StringPieceTest, StringPieceToStringView) {
909*6777b538SAndroid Build Coastguard Worker   constexpr StringPiece kPiece = "foo";
910*6777b538SAndroid Build Coastguard Worker   constexpr std::string_view kView = kPiece;
911*6777b538SAndroid Build Coastguard Worker   static_assert(kPiece.data() == kView.data());
912*6777b538SAndroid Build Coastguard Worker   static_assert(kPiece.size() == kView.size());
913*6777b538SAndroid Build Coastguard Worker }
914*6777b538SAndroid Build Coastguard Worker 
TEST(StringPieceTest,StringViewToStringPiece)915*6777b538SAndroid Build Coastguard Worker TEST(StringPieceTest, StringViewToStringPiece) {
916*6777b538SAndroid Build Coastguard Worker   constexpr std::string_view kView = "bar";
917*6777b538SAndroid Build Coastguard Worker   constexpr StringPiece kPiece = kView;
918*6777b538SAndroid Build Coastguard Worker   static_assert(kView.data() == kPiece.data());
919*6777b538SAndroid Build Coastguard Worker   static_assert(kView.size() == kPiece.size());
920*6777b538SAndroid Build Coastguard Worker }
921*6777b538SAndroid Build Coastguard Worker 
922*6777b538SAndroid Build Coastguard Worker }  // namespace base
923