xref: /aosp_15_r20/external/cronet/base/strings/cstring_view_unittest.cc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker // Copyright 2024 The Chromium Authors
2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file.
4*6777b538SAndroid Build Coastguard Worker 
5*6777b538SAndroid Build Coastguard Worker #include "base/strings/cstring_view.h"
6*6777b538SAndroid Build Coastguard Worker 
7*6777b538SAndroid Build Coastguard Worker #include <concepts>
8*6777b538SAndroid Build Coastguard Worker #include <limits>
9*6777b538SAndroid Build Coastguard Worker #include <sstream>
10*6777b538SAndroid Build Coastguard Worker #include <type_traits>
11*6777b538SAndroid Build Coastguard Worker 
12*6777b538SAndroid Build Coastguard Worker #include "base/containers/span.h"
13*6777b538SAndroid Build Coastguard Worker #include "base/debug/alias.h"
14*6777b538SAndroid Build Coastguard Worker #include "base/strings/strcat.h"
15*6777b538SAndroid Build Coastguard Worker #include "base/test/gtest_util.h"
16*6777b538SAndroid Build Coastguard Worker #include "testing/gtest/include/gtest/gtest.h"
17*6777b538SAndroid Build Coastguard Worker 
18*6777b538SAndroid Build Coastguard Worker namespace base {
19*6777b538SAndroid Build Coastguard Worker namespace {
20*6777b538SAndroid Build Coastguard Worker 
21*6777b538SAndroid Build Coastguard Worker static_assert(std::is_default_constructible_v<cstring_view>);
22*6777b538SAndroid Build Coastguard Worker static_assert(std::is_trivially_copy_constructible_v<cstring_view>);
23*6777b538SAndroid Build Coastguard Worker static_assert(std::is_trivially_copy_assignable_v<cstring_view>);
24*6777b538SAndroid Build Coastguard Worker static_assert(std::is_trivially_move_constructible_v<cstring_view>);
25*6777b538SAndroid Build Coastguard Worker static_assert(std::is_trivially_move_assignable_v<cstring_view>);
26*6777b538SAndroid Build Coastguard Worker static_assert(std::is_trivially_destructible_v<cstring_view>);
27*6777b538SAndroid Build Coastguard Worker 
28*6777b538SAndroid Build Coastguard Worker static_assert(std::ranges::contiguous_range<cstring_view>);
29*6777b538SAndroid Build Coastguard Worker static_assert(std::ranges::borrowed_range<cstring_view>);
30*6777b538SAndroid Build Coastguard Worker 
31*6777b538SAndroid Build Coastguard Worker // The view is the size of 2 pointers (technically, pointer and address).
32*6777b538SAndroid Build Coastguard Worker static_assert(sizeof(cstring_view) == sizeof(uintptr_t) + sizeof(size_t));
33*6777b538SAndroid Build Coastguard Worker 
34*6777b538SAndroid Build Coastguard Worker static_assert(cstring_view::npos == std::string_view::npos);
35*6777b538SAndroid Build Coastguard Worker static_assert(u16cstring_view::npos == std::u16string_view::npos);
36*6777b538SAndroid Build Coastguard Worker static_assert(u16cstring_view::npos == std::u32string_view::npos);
37*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_WIN)
38*6777b538SAndroid Build Coastguard Worker static_assert(wcstring_view::npos == std::wstring_view::npos);
39*6777b538SAndroid Build Coastguard Worker #endif
40*6777b538SAndroid Build Coastguard Worker 
TEST(CStringViewTest,DefaultConstructed)41*6777b538SAndroid Build Coastguard Worker TEST(CStringViewTest, DefaultConstructed) {
42*6777b538SAndroid Build Coastguard Worker   constexpr auto c = cstring_view();
43*6777b538SAndroid Build Coastguard Worker   static_assert(std::same_as<decltype(c), const cstring_view>);
44*6777b538SAndroid Build Coastguard Worker   static_assert(c.size() == 0u);
45*6777b538SAndroid Build Coastguard Worker   static_assert(c[c.size()] == '\0');
46*6777b538SAndroid Build Coastguard Worker }
47*6777b538SAndroid Build Coastguard Worker 
TEST(CStringViewTest,LiteralConstructed)48*6777b538SAndroid Build Coastguard Worker TEST(CStringViewTest, LiteralConstructed) {
49*6777b538SAndroid Build Coastguard Worker   constexpr auto empty = cstring_view("");
50*6777b538SAndroid Build Coastguard Worker   constexpr auto stuff = cstring_view("stuff");
51*6777b538SAndroid Build Coastguard Worker   constexpr auto other = cstring_view("other");
52*6777b538SAndroid Build Coastguard Worker   static_assert(std::same_as<decltype(empty), const cstring_view>);
53*6777b538SAndroid Build Coastguard Worker   static_assert(std::same_as<decltype(stuff), const cstring_view>);
54*6777b538SAndroid Build Coastguard Worker   static_assert(std::same_as<decltype(other), const cstring_view>);
55*6777b538SAndroid Build Coastguard Worker 
56*6777b538SAndroid Build Coastguard Worker   static_assert(empty.size() == 0u);
57*6777b538SAndroid Build Coastguard Worker   static_assert(stuff.size() == 5u);
58*6777b538SAndroid Build Coastguard Worker   static_assert(other.size() == 5u);
59*6777b538SAndroid Build Coastguard Worker 
60*6777b538SAndroid Build Coastguard Worker   static_assert(empty[empty.size()] == '\0');
61*6777b538SAndroid Build Coastguard Worker   static_assert(stuff[stuff.size()] == '\0');
62*6777b538SAndroid Build Coastguard Worker   static_assert(other[other.size()] == '\0');
63*6777b538SAndroid Build Coastguard Worker 
64*6777b538SAndroid Build Coastguard Worker   // Implicit construction.
65*6777b538SAndroid Build Coastguard Worker   {
66*6777b538SAndroid Build Coastguard Worker     cstring_view s = "stuff";
67*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(s, cstring_view("stuff"));
68*6777b538SAndroid Build Coastguard Worker   }
69*6777b538SAndroid Build Coastguard Worker }
70*6777b538SAndroid Build Coastguard Worker 
TEST(CStringViewTest,PointerSizeConstructed)71*6777b538SAndroid Build Coastguard Worker TEST(CStringViewTest, PointerSizeConstructed) {
72*6777b538SAndroid Build Coastguard Worker   constexpr const char* c_empty = "";
73*6777b538SAndroid Build Coastguard Worker   constexpr auto empty = UNSAFE_BUFFERS(cstring_view(c_empty, 0u));
74*6777b538SAndroid Build Coastguard Worker   static_assert(std::same_as<const cstring_view, decltype(empty)>);
75*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(empty.data(), c_empty);
76*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(empty.size(), 0u);
77*6777b538SAndroid Build Coastguard Worker 
78*6777b538SAndroid Build Coastguard Worker   constexpr const char* c_stuff = "stuff";
79*6777b538SAndroid Build Coastguard Worker   constexpr auto stuff = UNSAFE_BUFFERS(cstring_view(c_stuff, 5u));
80*6777b538SAndroid Build Coastguard Worker   static_assert(std::same_as<const cstring_view, decltype(stuff)>);
81*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(stuff.data(), c_stuff);
82*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(stuff.size(), 5u);
83*6777b538SAndroid Build Coastguard Worker }
84*6777b538SAndroid Build Coastguard Worker 
TEST(CStringViewTest,StringConstructed)85*6777b538SAndroid Build Coastguard Worker TEST(CStringViewTest, StringConstructed) {
86*6777b538SAndroid Build Coastguard Worker   std::string empty;
87*6777b538SAndroid Build Coastguard Worker   {
88*6777b538SAndroid Build Coastguard Worker     auto c = cstring_view(empty);
89*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(c.size(), 0u);
90*6777b538SAndroid Build Coastguard Worker   }
91*6777b538SAndroid Build Coastguard Worker   std::string stuff = "stuff";
92*6777b538SAndroid Build Coastguard Worker   {
93*6777b538SAndroid Build Coastguard Worker     auto c = cstring_view(stuff);
94*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(c.c_str(), stuff.c_str());
95*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(c.size(), 5u);
96*6777b538SAndroid Build Coastguard Worker   }
97*6777b538SAndroid Build Coastguard Worker   std::u16string stuff16 = u"stuff";
98*6777b538SAndroid Build Coastguard Worker   {
99*6777b538SAndroid Build Coastguard Worker     auto c = u16cstring_view(stuff16);
100*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(c.c_str(), stuff16.c_str());
101*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(c.size(), 5u);
102*6777b538SAndroid Build Coastguard Worker   }
103*6777b538SAndroid Build Coastguard Worker   std::u32string stuff32 = U"stuff";
104*6777b538SAndroid Build Coastguard Worker   {
105*6777b538SAndroid Build Coastguard Worker     auto c = u32cstring_view(stuff32);
106*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(c.c_str(), stuff32.c_str());
107*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(c.size(), 5u);
108*6777b538SAndroid Build Coastguard Worker   }
109*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_WIN)
110*6777b538SAndroid Build Coastguard Worker   std::wstring stuffw = L"stuff";
111*6777b538SAndroid Build Coastguard Worker   {
112*6777b538SAndroid Build Coastguard Worker     auto c = wcstring_view(stuffw);
113*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(c.c_str(), stuffw.c_str());
114*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(c.size(), 5u);
115*6777b538SAndroid Build Coastguard Worker   }
116*6777b538SAndroid Build Coastguard Worker #endif
117*6777b538SAndroid Build Coastguard Worker 
118*6777b538SAndroid Build Coastguard Worker   // Implicit construction.
119*6777b538SAndroid Build Coastguard Worker   {
120*6777b538SAndroid Build Coastguard Worker     auto s = std::string("stuff");
121*6777b538SAndroid Build Coastguard Worker     cstring_view v = s;
122*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(v, cstring_view("stuff"));
123*6777b538SAndroid Build Coastguard Worker   }
124*6777b538SAndroid Build Coastguard Worker }
125*6777b538SAndroid Build Coastguard Worker 
TEST(CStringViewTest,Equality)126*6777b538SAndroid Build Coastguard Worker TEST(CStringViewTest, Equality) {
127*6777b538SAndroid Build Coastguard Worker   constexpr auto stuff = cstring_view("stuff");
128*6777b538SAndroid Build Coastguard Worker 
129*6777b538SAndroid Build Coastguard Worker   static_assert(stuff != cstring_view());
130*6777b538SAndroid Build Coastguard Worker   static_assert(stuff == cstring_view("stuff"));
131*6777b538SAndroid Build Coastguard Worker   static_assert(stuff != cstring_view("other"));
132*6777b538SAndroid Build Coastguard Worker 
133*6777b538SAndroid Build Coastguard Worker   // Implicit conversion to cstring_view from literal in comparison.
134*6777b538SAndroid Build Coastguard Worker   static_assert(stuff == "stuff");
135*6777b538SAndroid Build Coastguard Worker }
136*6777b538SAndroid Build Coastguard Worker 
TEST(CStringViewTest,Ordering)137*6777b538SAndroid Build Coastguard Worker TEST(CStringViewTest, Ordering) {
138*6777b538SAndroid Build Coastguard Worker   constexpr auto stuff = cstring_view("stuff");
139*6777b538SAndroid Build Coastguard Worker 
140*6777b538SAndroid Build Coastguard Worker   static_assert(stuff <=> stuff == std::weak_ordering::equivalent);
141*6777b538SAndroid Build Coastguard Worker   static_assert(stuff <=> cstring_view() == std::weak_ordering::greater);
142*6777b538SAndroid Build Coastguard Worker   static_assert(stuff <=> cstring_view("stuff") ==
143*6777b538SAndroid Build Coastguard Worker                 std::weak_ordering::equivalent);
144*6777b538SAndroid Build Coastguard Worker   static_assert(stuff <=> cstring_view("zz") == std::weak_ordering::less);
145*6777b538SAndroid Build Coastguard Worker 
146*6777b538SAndroid Build Coastguard Worker   // Implicit conversion to cstring_view from literal in ordering compare.
147*6777b538SAndroid Build Coastguard Worker   static_assert(stuff <=> "stuff" == std::weak_ordering::equivalent);
148*6777b538SAndroid Build Coastguard Worker }
149*6777b538SAndroid Build Coastguard Worker 
TEST(CStringViewTest,Iterate)150*6777b538SAndroid Build Coastguard Worker TEST(CStringViewTest, Iterate) {
151*6777b538SAndroid Build Coastguard Worker   constexpr auto def = cstring_view();
152*6777b538SAndroid Build Coastguard Worker   static_assert(def.begin() == def.end());
153*6777b538SAndroid Build Coastguard Worker   static_assert(def.cbegin() == def.cend());
154*6777b538SAndroid Build Coastguard Worker 
155*6777b538SAndroid Build Coastguard Worker   constexpr auto stuff = cstring_view("stuff");
156*6777b538SAndroid Build Coastguard Worker   static_assert(stuff.begin() != stuff.end());
157*6777b538SAndroid Build Coastguard Worker   static_assert(stuff.cbegin() != stuff.cend());
158*6777b538SAndroid Build Coastguard Worker   static_assert(std::same_as<const char&, decltype(*stuff.begin())>);
159*6777b538SAndroid Build Coastguard Worker 
160*6777b538SAndroid Build Coastguard Worker   {
161*6777b538SAndroid Build Coastguard Worker     size_t i = 0u;
162*6777b538SAndroid Build Coastguard Worker     for (auto& c : stuff) {
163*6777b538SAndroid Build Coastguard Worker       static_assert(std::same_as<const char&, decltype(c)>);
164*6777b538SAndroid Build Coastguard Worker       EXPECT_EQ(&c, &stuff[i]);
165*6777b538SAndroid Build Coastguard Worker       ++i;
166*6777b538SAndroid Build Coastguard Worker     }
167*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(i, 5u);
168*6777b538SAndroid Build Coastguard Worker   }
169*6777b538SAndroid Build Coastguard Worker }
170*6777b538SAndroid Build Coastguard Worker 
TEST(CStringViewTest,IterateReverse)171*6777b538SAndroid Build Coastguard Worker TEST(CStringViewTest, IterateReverse) {
172*6777b538SAndroid Build Coastguard Worker   constexpr auto def = cstring_view();
173*6777b538SAndroid Build Coastguard Worker   static_assert(def.rbegin() == def.rend());
174*6777b538SAndroid Build Coastguard Worker   static_assert(def.rcbegin() == def.rcend());
175*6777b538SAndroid Build Coastguard Worker 
176*6777b538SAndroid Build Coastguard Worker   constexpr auto stuff = cstring_view("stuff");
177*6777b538SAndroid Build Coastguard Worker   static_assert(stuff.rbegin() != stuff.rend());
178*6777b538SAndroid Build Coastguard Worker   static_assert(stuff.rcbegin() != stuff.rcend());
179*6777b538SAndroid Build Coastguard Worker   static_assert(std::same_as<const char&, decltype(*stuff.rbegin())>);
180*6777b538SAndroid Build Coastguard Worker 
181*6777b538SAndroid Build Coastguard Worker   {
182*6777b538SAndroid Build Coastguard Worker     size_t i = 0u;
183*6777b538SAndroid Build Coastguard Worker     for (auto it = stuff.rbegin(); it != stuff.rend(); ++it) {
184*6777b538SAndroid Build Coastguard Worker       static_assert(std::same_as<const char&, decltype(*it)>);
185*6777b538SAndroid Build Coastguard Worker       EXPECT_EQ(&*it, &stuff[4u - i]);
186*6777b538SAndroid Build Coastguard Worker       ++i;
187*6777b538SAndroid Build Coastguard Worker     }
188*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(i, 5u);
189*6777b538SAndroid Build Coastguard Worker   }
190*6777b538SAndroid Build Coastguard Worker }
191*6777b538SAndroid Build Coastguard Worker 
TEST(CStringViewDeathTest,IterateBoundsChecked)192*6777b538SAndroid Build Coastguard Worker TEST(CStringViewDeathTest, IterateBoundsChecked) {
193*6777b538SAndroid Build Coastguard Worker   auto use = [](auto x) { base::debug::Alias(&x); };
194*6777b538SAndroid Build Coastguard Worker 
195*6777b538SAndroid Build Coastguard Worker   constexpr auto stuff = cstring_view("stuff");
196*6777b538SAndroid Build Coastguard Worker 
197*6777b538SAndroid Build Coastguard Worker   // The NUL terminator is out of bounds for iterating (checked by indexing into
198*6777b538SAndroid Build Coastguard Worker   // the iterator) since it's not included in the range that the iterator walks
199*6777b538SAndroid Build Coastguard Worker   // (but is in bounds for indexing on the view).
200*6777b538SAndroid Build Coastguard Worker   BASE_EXPECT_DEATH(use(*stuff.end()), "");       // Can't deref end.
201*6777b538SAndroid Build Coastguard Worker   BASE_EXPECT_DEATH(use(stuff.begin()[5]), "");   // Can't index end.
202*6777b538SAndroid Build Coastguard Worker   BASE_EXPECT_DEATH(use(stuff.begin() + 6), "");  // Can't move past end.
203*6777b538SAndroid Build Coastguard Worker   BASE_EXPECT_DEATH(use(stuff.begin() - 1), "");  // Can't move past begin.
204*6777b538SAndroid Build Coastguard Worker 
205*6777b538SAndroid Build Coastguard Worker   BASE_EXPECT_DEATH(use(*stuff.rend()), "");
206*6777b538SAndroid Build Coastguard Worker   BASE_EXPECT_DEATH(use(stuff.rbegin()[5]), "");
207*6777b538SAndroid Build Coastguard Worker   BASE_EXPECT_DEATH(use(stuff.rbegin() + 6), "");
208*6777b538SAndroid Build Coastguard Worker   BASE_EXPECT_DEATH(use(stuff.rbegin() - 1), "");
209*6777b538SAndroid Build Coastguard Worker }
210*6777b538SAndroid Build Coastguard Worker 
TEST(CStringViewTest,Index)211*6777b538SAndroid Build Coastguard Worker TEST(CStringViewTest, Index) {
212*6777b538SAndroid Build Coastguard Worker   constexpr auto empty = cstring_view();
213*6777b538SAndroid Build Coastguard Worker   static_assert(empty[0u] == '\0');
214*6777b538SAndroid Build Coastguard Worker 
215*6777b538SAndroid Build Coastguard Worker   static_assert(empty.at(0u) == '\0');
216*6777b538SAndroid Build Coastguard Worker 
217*6777b538SAndroid Build Coastguard Worker   constexpr auto stuff = cstring_view("stuff");
218*6777b538SAndroid Build Coastguard Worker   static_assert(stuff[0u] == 's');
219*6777b538SAndroid Build Coastguard Worker   static_assert(&stuff[0u] == stuff.data());
220*6777b538SAndroid Build Coastguard Worker   static_assert(stuff[5u] == '\0');
221*6777b538SAndroid Build Coastguard Worker   static_assert(&stuff[5u] == UNSAFE_BUFFERS(stuff.data() + 5u));
222*6777b538SAndroid Build Coastguard Worker 
223*6777b538SAndroid Build Coastguard Worker   static_assert(stuff.at(0u) == 's');
224*6777b538SAndroid Build Coastguard Worker   static_assert(&stuff.at(0u) == stuff.data());
225*6777b538SAndroid Build Coastguard Worker   static_assert(stuff.at(5u) == '\0');
226*6777b538SAndroid Build Coastguard Worker   static_assert(&stuff.at(5u) == UNSAFE_BUFFERS(stuff.data() + 5u));
227*6777b538SAndroid Build Coastguard Worker }
228*6777b538SAndroid Build Coastguard Worker 
TEST(CStringViewDeathTest,IndexChecked)229*6777b538SAndroid Build Coastguard Worker TEST(CStringViewDeathTest, IndexChecked) {
230*6777b538SAndroid Build Coastguard Worker   auto use = [](auto x) { base::debug::Alias(&x); };
231*6777b538SAndroid Build Coastguard Worker 
232*6777b538SAndroid Build Coastguard Worker   constexpr auto empty = cstring_view();
233*6777b538SAndroid Build Coastguard Worker   BASE_EXPECT_DEATH(use(empty[1u]), "");
234*6777b538SAndroid Build Coastguard Worker   BASE_EXPECT_DEATH(use(empty[std::numeric_limits<size_t>::max()]), "");
235*6777b538SAndroid Build Coastguard Worker 
236*6777b538SAndroid Build Coastguard Worker   BASE_EXPECT_DEATH(use(empty.at(1u)), "");
237*6777b538SAndroid Build Coastguard Worker   BASE_EXPECT_DEATH(use(empty.at(std::numeric_limits<size_t>::max())), "");
238*6777b538SAndroid Build Coastguard Worker 
239*6777b538SAndroid Build Coastguard Worker   constexpr auto stuff = cstring_view("stuff");
240*6777b538SAndroid Build Coastguard Worker   BASE_EXPECT_DEATH(use(stuff[6u]), "");
241*6777b538SAndroid Build Coastguard Worker   BASE_EXPECT_DEATH(use(stuff[std::numeric_limits<size_t>::max()]), "");
242*6777b538SAndroid Build Coastguard Worker 
243*6777b538SAndroid Build Coastguard Worker   BASE_EXPECT_DEATH(use(stuff.at(6u)), "");
244*6777b538SAndroid Build Coastguard Worker   BASE_EXPECT_DEATH(use(stuff.at(std::numeric_limits<size_t>::max())), "");
245*6777b538SAndroid Build Coastguard Worker }
246*6777b538SAndroid Build Coastguard Worker 
TEST(CStringViewTest,FrontBack)247*6777b538SAndroid Build Coastguard Worker TEST(CStringViewTest, FrontBack) {
248*6777b538SAndroid Build Coastguard Worker   constexpr auto stuff = cstring_view("stuff");
249*6777b538SAndroid Build Coastguard Worker   static_assert(stuff.front() == 's');
250*6777b538SAndroid Build Coastguard Worker   static_assert(&stuff.front() == stuff.data());
251*6777b538SAndroid Build Coastguard Worker   static_assert(stuff.back() == 'f');
252*6777b538SAndroid Build Coastguard Worker   static_assert(&stuff.back() == UNSAFE_BUFFERS(stuff.data() + 4u));
253*6777b538SAndroid Build Coastguard Worker 
254*6777b538SAndroid Build Coastguard Worker   constexpr auto one = cstring_view("1");
255*6777b538SAndroid Build Coastguard Worker   static_assert(one.front() == '1');
256*6777b538SAndroid Build Coastguard Worker   static_assert(&one.front() == one.data());
257*6777b538SAndroid Build Coastguard Worker   static_assert(one.back() == '1');
258*6777b538SAndroid Build Coastguard Worker   static_assert(&one.back() == one.data());
259*6777b538SAndroid Build Coastguard Worker }
260*6777b538SAndroid Build Coastguard Worker 
TEST(CStringViewDeathTest,FrontBackChecked)261*6777b538SAndroid Build Coastguard Worker TEST(CStringViewDeathTest, FrontBackChecked) {
262*6777b538SAndroid Build Coastguard Worker   auto use = [](auto x) { base::debug::Alias(&x); };
263*6777b538SAndroid Build Coastguard Worker 
264*6777b538SAndroid Build Coastguard Worker   constexpr auto empty = cstring_view();
265*6777b538SAndroid Build Coastguard Worker   BASE_EXPECT_DEATH(use(empty.front()), "");
266*6777b538SAndroid Build Coastguard Worker   BASE_EXPECT_DEATH(use(empty.back()), "");
267*6777b538SAndroid Build Coastguard Worker }
268*6777b538SAndroid Build Coastguard Worker 
TEST(CStringViewTest,Size)269*6777b538SAndroid Build Coastguard Worker TEST(CStringViewTest, Size) {
270*6777b538SAndroid Build Coastguard Worker   constexpr auto empty = cstring_view();
271*6777b538SAndroid Build Coastguard Worker   static_assert(empty.size() == 0u);
272*6777b538SAndroid Build Coastguard Worker   static_assert(empty.size_bytes() == 0u);
273*6777b538SAndroid Build Coastguard Worker   constexpr auto stuff = cstring_view("stuff");
274*6777b538SAndroid Build Coastguard Worker   static_assert(stuff.size() == 5u);
275*6777b538SAndroid Build Coastguard Worker   static_assert(stuff.size_bytes() == 5u);
276*6777b538SAndroid Build Coastguard Worker 
277*6777b538SAndroid Build Coastguard Worker   constexpr auto empty16 = u16cstring_view();
278*6777b538SAndroid Build Coastguard Worker   static_assert(empty16.size() == 0u);
279*6777b538SAndroid Build Coastguard Worker   static_assert(empty16.size_bytes() == 0u);
280*6777b538SAndroid Build Coastguard Worker   constexpr auto stuff16 = u16cstring_view(u"stuff");
281*6777b538SAndroid Build Coastguard Worker   static_assert(stuff16.size() == 5u);
282*6777b538SAndroid Build Coastguard Worker   static_assert(stuff16.size_bytes() == 10u);
283*6777b538SAndroid Build Coastguard Worker 
284*6777b538SAndroid Build Coastguard Worker   constexpr auto empty32 = u32cstring_view();
285*6777b538SAndroid Build Coastguard Worker   static_assert(empty32.size() == 0u);
286*6777b538SAndroid Build Coastguard Worker   static_assert(empty32.size_bytes() == 0u);
287*6777b538SAndroid Build Coastguard Worker   constexpr auto stuff32 = u32cstring_view(U"stuff");
288*6777b538SAndroid Build Coastguard Worker   static_assert(stuff32.size() == 5u);
289*6777b538SAndroid Build Coastguard Worker   static_assert(stuff32.size_bytes() == 20u);
290*6777b538SAndroid Build Coastguard Worker 
291*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_WIN)
292*6777b538SAndroid Build Coastguard Worker   constexpr auto emptyw = wcstring_view();
293*6777b538SAndroid Build Coastguard Worker   static_assert(emptyw.size() == 0u);
294*6777b538SAndroid Build Coastguard Worker   static_assert(emptyw.size_bytes() == 0u);
295*6777b538SAndroid Build Coastguard Worker   constexpr auto stuffw = wcstring_view(L"stuff");
296*6777b538SAndroid Build Coastguard Worker   static_assert(stuffw.size() == 5u);
297*6777b538SAndroid Build Coastguard Worker   static_assert(stuffw.size_bytes() == 10u);
298*6777b538SAndroid Build Coastguard Worker #endif
299*6777b538SAndroid Build Coastguard Worker }
300*6777b538SAndroid Build Coastguard Worker 
TEST(CStringViewTest,Empty)301*6777b538SAndroid Build Coastguard Worker TEST(CStringViewTest, Empty) {
302*6777b538SAndroid Build Coastguard Worker   constexpr auto empty = cstring_view();
303*6777b538SAndroid Build Coastguard Worker   static_assert(empty.empty());
304*6777b538SAndroid Build Coastguard Worker   constexpr auto one = cstring_view("1");
305*6777b538SAndroid Build Coastguard Worker   static_assert(!one.empty());
306*6777b538SAndroid Build Coastguard Worker   constexpr auto stuff = cstring_view("stuff");
307*6777b538SAndroid Build Coastguard Worker   static_assert(!stuff.empty());
308*6777b538SAndroid Build Coastguard Worker 
309*6777b538SAndroid Build Coastguard Worker   constexpr auto empty16 = u16cstring_view();
310*6777b538SAndroid Build Coastguard Worker   static_assert(empty16.empty());
311*6777b538SAndroid Build Coastguard Worker   constexpr auto stuff16 = u16cstring_view(u"stuff");
312*6777b538SAndroid Build Coastguard Worker   static_assert(!stuff16.empty());
313*6777b538SAndroid Build Coastguard Worker 
314*6777b538SAndroid Build Coastguard Worker   constexpr auto empty32 = u32cstring_view();
315*6777b538SAndroid Build Coastguard Worker   static_assert(empty32.empty());
316*6777b538SAndroid Build Coastguard Worker   constexpr auto stuff32 = u32cstring_view(U"stuff");
317*6777b538SAndroid Build Coastguard Worker   static_assert(!stuff32.empty());
318*6777b538SAndroid Build Coastguard Worker 
319*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_WIN)
320*6777b538SAndroid Build Coastguard Worker   constexpr auto emptyw = wcstring_view();
321*6777b538SAndroid Build Coastguard Worker   static_assert(emptyw.empty());
322*6777b538SAndroid Build Coastguard Worker   constexpr auto stuffw = wcstring_view(L"stuff");
323*6777b538SAndroid Build Coastguard Worker   static_assert(!stuffw.empty());
324*6777b538SAndroid Build Coastguard Worker #endif
325*6777b538SAndroid Build Coastguard Worker }
326*6777b538SAndroid Build Coastguard Worker 
TEST(CStringViewTest,MaxSize)327*6777b538SAndroid Build Coastguard Worker TEST(CStringViewTest, MaxSize) {
328*6777b538SAndroid Build Coastguard Worker   static_assert(cstring_view().max_size() ==
329*6777b538SAndroid Build Coastguard Worker                 std::numeric_limits<size_t>::max());
330*6777b538SAndroid Build Coastguard Worker   static_assert(u16cstring_view().max_size() ==
331*6777b538SAndroid Build Coastguard Worker                 std::numeric_limits<size_t>::max() / 2u);
332*6777b538SAndroid Build Coastguard Worker   static_assert(u32cstring_view().max_size() ==
333*6777b538SAndroid Build Coastguard Worker                 std::numeric_limits<size_t>::max() / 4u);
334*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_WIN)
335*6777b538SAndroid Build Coastguard Worker   static_assert(wcstring_view().max_size() ==
336*6777b538SAndroid Build Coastguard Worker                 std::numeric_limits<size_t>::max() / 2u);
337*6777b538SAndroid Build Coastguard Worker #endif
338*6777b538SAndroid Build Coastguard Worker }
339*6777b538SAndroid Build Coastguard Worker 
TEST(CStringViewTest,ToSpan)340*6777b538SAndroid Build Coastguard Worker TEST(CStringViewTest, ToSpan) {
341*6777b538SAndroid Build Coastguard Worker   constexpr auto empty = cstring_view();
342*6777b538SAndroid Build Coastguard Worker   {
343*6777b538SAndroid Build Coastguard Worker     auto s = base::span(empty);
344*6777b538SAndroid Build Coastguard Worker     static_assert(std::same_as<base::span<const char>, decltype(s)>);
345*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(s.data(), empty.data());
346*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(s.size(), 0u);
347*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(s.size_bytes(), 0u);
348*6777b538SAndroid Build Coastguard Worker   }
349*6777b538SAndroid Build Coastguard Worker   constexpr auto stuff = cstring_view("stuff");
350*6777b538SAndroid Build Coastguard Worker   {
351*6777b538SAndroid Build Coastguard Worker     auto s = base::span(stuff);
352*6777b538SAndroid Build Coastguard Worker     static_assert(std::same_as<base::span<const char>, decltype(s)>);
353*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(s.data(), stuff.data());
354*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(s.size(), 5u);
355*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(s.size_bytes(), 5u);
356*6777b538SAndroid Build Coastguard Worker   }
357*6777b538SAndroid Build Coastguard Worker   constexpr auto stuff16 = u16cstring_view(u"stuff");
358*6777b538SAndroid Build Coastguard Worker   {
359*6777b538SAndroid Build Coastguard Worker     auto s = base::span(stuff16);
360*6777b538SAndroid Build Coastguard Worker     static_assert(std::same_as<base::span<const char16_t>, decltype(s)>);
361*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(s.data(), stuff16.data());
362*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(s.size(), 5u);
363*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(s.size_bytes(), 10u);
364*6777b538SAndroid Build Coastguard Worker   }
365*6777b538SAndroid Build Coastguard Worker   constexpr auto stuff32 = u32cstring_view(U"stuff");
366*6777b538SAndroid Build Coastguard Worker   {
367*6777b538SAndroid Build Coastguard Worker     auto s = base::span(stuff32);
368*6777b538SAndroid Build Coastguard Worker     static_assert(std::same_as<base::span<const char32_t>, decltype(s)>);
369*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(s.data(), stuff32.data());
370*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(s.size(), 5u);
371*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(s.size_bytes(), 20u);
372*6777b538SAndroid Build Coastguard Worker   }
373*6777b538SAndroid Build Coastguard Worker }
374*6777b538SAndroid Build Coastguard Worker 
TEST(CStringViewTest,Cstr)375*6777b538SAndroid Build Coastguard Worker TEST(CStringViewTest, Cstr) {
376*6777b538SAndroid Build Coastguard Worker   constexpr auto empty = cstring_view();
377*6777b538SAndroid Build Coastguard Worker   constexpr auto stuff = cstring_view("stuff");
378*6777b538SAndroid Build Coastguard Worker 
379*6777b538SAndroid Build Coastguard Worker   static_assert(*stuff.c_str() == 's');
380*6777b538SAndroid Build Coastguard Worker 
381*6777b538SAndroid Build Coastguard Worker   EXPECT_STREQ(empty.c_str(), "");
382*6777b538SAndroid Build Coastguard Worker   EXPECT_STREQ(stuff.c_str(), "stuff");
383*6777b538SAndroid Build Coastguard Worker }
384*6777b538SAndroid Build Coastguard Worker 
TEST(CStringViewTest,CopyConstuct)385*6777b538SAndroid Build Coastguard Worker TEST(CStringViewTest, CopyConstuct) {
386*6777b538SAndroid Build Coastguard Worker   static_assert(std::is_trivially_copy_constructible_v<cstring_view>);
387*6777b538SAndroid Build Coastguard Worker 
388*6777b538SAndroid Build Coastguard Worker   auto stuff = cstring_view("stuff");
389*6777b538SAndroid Build Coastguard Worker   auto other = stuff;
390*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(other.data(), stuff.data());
391*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(other.size(), stuff.size());
392*6777b538SAndroid Build Coastguard Worker }
393*6777b538SAndroid Build Coastguard Worker 
TEST(CStringViewTest,CopyAssign)394*6777b538SAndroid Build Coastguard Worker TEST(CStringViewTest, CopyAssign) {
395*6777b538SAndroid Build Coastguard Worker   static_assert(std::is_trivially_copy_assignable_v<cstring_view>);
396*6777b538SAndroid Build Coastguard Worker 
397*6777b538SAndroid Build Coastguard Worker   auto empty = cstring_view();
398*6777b538SAndroid Build Coastguard Worker   auto stuff = cstring_view("stuff");
399*6777b538SAndroid Build Coastguard Worker   empty = stuff;
400*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(empty.data(), stuff.data());
401*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(empty.size(), stuff.size());
402*6777b538SAndroid Build Coastguard Worker }
403*6777b538SAndroid Build Coastguard Worker 
TEST(CStringViewTest,RemovePrefix)404*6777b538SAndroid Build Coastguard Worker TEST(CStringViewTest, RemovePrefix) {
405*6777b538SAndroid Build Coastguard Worker   auto empty = cstring_view();
406*6777b538SAndroid Build Coastguard Worker   auto mod_empty = empty;
407*6777b538SAndroid Build Coastguard Worker   mod_empty.remove_prefix(0u);
408*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(mod_empty.data(), &empty[0u]);
409*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(mod_empty.size(), 0u);
410*6777b538SAndroid Build Coastguard Worker 
411*6777b538SAndroid Build Coastguard Worker   auto stuff = cstring_view("stuff");
412*6777b538SAndroid Build Coastguard Worker   auto mod_stuff = stuff;
413*6777b538SAndroid Build Coastguard Worker   mod_stuff.remove_prefix(0u);
414*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(mod_stuff.data(), &stuff[0u]);
415*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(mod_stuff.size(), 5u);
416*6777b538SAndroid Build Coastguard Worker   mod_stuff.remove_prefix(2u);
417*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(mod_stuff.data(), &stuff[2u]);
418*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(mod_stuff.size(), 3u);
419*6777b538SAndroid Build Coastguard Worker   mod_stuff.remove_prefix(1u);
420*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(mod_stuff.data(), &stuff[3u]);
421*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(mod_stuff.size(), 2u);
422*6777b538SAndroid Build Coastguard Worker   mod_stuff.remove_prefix(2u);
423*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(mod_stuff.data(), &stuff[5u]);
424*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(mod_stuff.size(), 0u);
425*6777b538SAndroid Build Coastguard Worker 
426*6777b538SAndroid Build Coastguard Worker   static_assert([] {
427*6777b538SAndroid Build Coastguard Worker     auto stuff = cstring_view("stuff");
428*6777b538SAndroid Build Coastguard Worker     stuff.remove_prefix(2u);
429*6777b538SAndroid Build Coastguard Worker     return stuff;
430*6777b538SAndroid Build Coastguard Worker   }() == "uff");
431*6777b538SAndroid Build Coastguard Worker 
432*6777b538SAndroid Build Coastguard Worker   auto stuff16 = u16cstring_view(u"stuff");
433*6777b538SAndroid Build Coastguard Worker   auto mod_stuff16 = stuff16;
434*6777b538SAndroid Build Coastguard Worker   mod_stuff16.remove_prefix(2u);
435*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(mod_stuff16.data(), &stuff16[2u]);
436*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(mod_stuff16.size(), 3u);
437*6777b538SAndroid Build Coastguard Worker 
438*6777b538SAndroid Build Coastguard Worker   auto stuff32 = u32cstring_view(U"stuff");
439*6777b538SAndroid Build Coastguard Worker   auto mod_stuff32 = stuff32;
440*6777b538SAndroid Build Coastguard Worker   mod_stuff32.remove_prefix(2u);
441*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(mod_stuff32.data(), &stuff32[2u]);
442*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(mod_stuff32.size(), 3u);
443*6777b538SAndroid Build Coastguard Worker 
444*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_WIN)
445*6777b538SAndroid Build Coastguard Worker   auto stuffw = wcstring_view(L"stuff");
446*6777b538SAndroid Build Coastguard Worker   auto mod_stuffw = stuffw;
447*6777b538SAndroid Build Coastguard Worker   mod_stuffw.remove_prefix(2u);
448*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(mod_stuffw.data(), &stuffw[2u]);
449*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(mod_stuffw.size(), 3u);
450*6777b538SAndroid Build Coastguard Worker #endif
451*6777b538SAndroid Build Coastguard Worker }
452*6777b538SAndroid Build Coastguard Worker 
TEST(CStringViewDeathTest,RemovePrefixChecked)453*6777b538SAndroid Build Coastguard Worker TEST(CStringViewDeathTest, RemovePrefixChecked) {
454*6777b538SAndroid Build Coastguard Worker   auto empty = cstring_view();
455*6777b538SAndroid Build Coastguard Worker   BASE_EXPECT_DEATH(empty.remove_prefix(1u), "");
456*6777b538SAndroid Build Coastguard Worker 
457*6777b538SAndroid Build Coastguard Worker   auto stuff = cstring_view("stuff");
458*6777b538SAndroid Build Coastguard Worker   BASE_EXPECT_DEATH(stuff.remove_prefix(6u), "");
459*6777b538SAndroid Build Coastguard Worker   stuff.remove_prefix(4u);
460*6777b538SAndroid Build Coastguard Worker   BASE_EXPECT_DEATH(stuff.remove_prefix(2u), "");
461*6777b538SAndroid Build Coastguard Worker }
462*6777b538SAndroid Build Coastguard Worker 
TEST(CStringViewTest,Swap)463*6777b538SAndroid Build Coastguard Worker TEST(CStringViewTest, Swap) {
464*6777b538SAndroid Build Coastguard Worker   auto empty = cstring_view();
465*6777b538SAndroid Build Coastguard Worker   auto stuff = cstring_view("stuff");
466*6777b538SAndroid Build Coastguard Worker   empty.swap(stuff);
467*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(stuff, cstring_view(""));
468*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(empty, cstring_view("stuff"));
469*6777b538SAndroid Build Coastguard Worker 
470*6777b538SAndroid Build Coastguard Worker   static_assert([] {
471*6777b538SAndroid Build Coastguard Worker     auto abc = cstring_view("abc");
472*6777b538SAndroid Build Coastguard Worker     auto ef = cstring_view("ef");
473*6777b538SAndroid Build Coastguard Worker     abc.swap(ef);
474*6777b538SAndroid Build Coastguard Worker     return ef;
475*6777b538SAndroid Build Coastguard Worker   }() == "abc");
476*6777b538SAndroid Build Coastguard Worker 
477*6777b538SAndroid Build Coastguard Worker   auto one16 = u16cstring_view(u"one");
478*6777b538SAndroid Build Coastguard Worker   auto two16 = u16cstring_view(u"twotwo");
479*6777b538SAndroid Build Coastguard Worker   one16.swap(two16);
480*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(one16, u16cstring_view(u"twotwo"));
481*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(two16, u16cstring_view(u"one"));
482*6777b538SAndroid Build Coastguard Worker }
483*6777b538SAndroid Build Coastguard Worker 
TEST(CStringViewTest,Substr)484*6777b538SAndroid Build Coastguard Worker TEST(CStringViewTest, Substr) {
485*6777b538SAndroid Build Coastguard Worker   auto substr = cstring_view("hello").substr(1u);
486*6777b538SAndroid Build Coastguard Worker   static_assert(std::same_as<std::string_view, decltype(substr)>);
487*6777b538SAndroid Build Coastguard Worker 
488*6777b538SAndroid Build Coastguard Worker   static_assert(cstring_view("").substr(0u) == "");
489*6777b538SAndroid Build Coastguard Worker   static_assert(cstring_view("").substr(0u, 0u) == "");
490*6777b538SAndroid Build Coastguard Worker   static_assert(cstring_view("stuff").substr(0u) == "stuff");
491*6777b538SAndroid Build Coastguard Worker   static_assert(cstring_view("stuff").substr(0u, 2u) == "st");
492*6777b538SAndroid Build Coastguard Worker   static_assert(cstring_view("stuff").substr(2u) == "uff");
493*6777b538SAndroid Build Coastguard Worker   static_assert(cstring_view("stuff").substr(2u, 3u) == "uff");
494*6777b538SAndroid Build Coastguard Worker   static_assert(cstring_view("stuff").substr(2u, 1u) == "u");
495*6777b538SAndroid Build Coastguard Worker   static_assert(cstring_view("stuff").substr(2u, 0u) == "");
496*6777b538SAndroid Build Coastguard Worker 
497*6777b538SAndroid Build Coastguard Worker   // `count` going off the end is clamped. Same as for string_view with
498*6777b538SAndroid Build Coastguard Worker   // hardening.
499*6777b538SAndroid Build Coastguard Worker   static_assert(cstring_view("stuff").substr(2u, 4u) == "uff");
500*6777b538SAndroid Build Coastguard Worker   static_assert(std::string_view("stuff").substr(2u, 4u) == "uff");
501*6777b538SAndroid Build Coastguard Worker }
502*6777b538SAndroid Build Coastguard Worker 
TEST(CStringViewDeathTest,SubstrBoundsChecked)503*6777b538SAndroid Build Coastguard Worker TEST(CStringViewDeathTest, SubstrBoundsChecked) {
504*6777b538SAndroid Build Coastguard Worker   auto use = [](auto x) { base::debug::Alias(&x); };
505*6777b538SAndroid Build Coastguard Worker 
506*6777b538SAndroid Build Coastguard Worker   auto stuff = cstring_view("stuff");
507*6777b538SAndroid Build Coastguard Worker 
508*6777b538SAndroid Build Coastguard Worker   // `pos` going off the end is CHECKed. Same as for string_view with hardening.
509*6777b538SAndroid Build Coastguard Worker   BASE_EXPECT_DEATH(use(stuff.substr(6u, 0u)), "");
510*6777b538SAndroid Build Coastguard Worker   BASE_EXPECT_DEATH(use(std::string_view("stuff").substr(6u, 0u)), "");
511*6777b538SAndroid Build Coastguard Worker   BASE_EXPECT_DEATH(use(stuff.substr(6u, 1u)), "");
512*6777b538SAndroid Build Coastguard Worker   BASE_EXPECT_DEATH(use(std::string_view("stuff").substr(6u, 1u)), "");
513*6777b538SAndroid Build Coastguard Worker }
514*6777b538SAndroid Build Coastguard Worker 
TEST(CStringViewTest,StartsWith)515*6777b538SAndroid Build Coastguard Worker TEST(CStringViewTest, StartsWith) {
516*6777b538SAndroid Build Coastguard Worker   // Comparison with `const char*`.
517*6777b538SAndroid Build Coastguard Worker   static_assert(!cstring_view("").starts_with("hello"));
518*6777b538SAndroid Build Coastguard Worker   static_assert(cstring_view("").starts_with(""));
519*6777b538SAndroid Build Coastguard Worker   static_assert(cstring_view("hello").starts_with("hello"));
520*6777b538SAndroid Build Coastguard Worker   static_assert(cstring_view("hello").starts_with(""));
521*6777b538SAndroid Build Coastguard Worker   static_assert(cstring_view("hello").starts_with("he"));
522*6777b538SAndroid Build Coastguard Worker   static_assert(!cstring_view("hello").starts_with("ello"));
523*6777b538SAndroid Build Coastguard Worker   constexpr const char* query = "ello";
524*6777b538SAndroid Build Coastguard Worker   static_assert(!cstring_view("hello").starts_with(query));
525*6777b538SAndroid Build Coastguard Worker 
526*6777b538SAndroid Build Coastguard Worker   static_assert(u16cstring_view(u"hello").starts_with(u"he"));
527*6777b538SAndroid Build Coastguard Worker   static_assert(u32cstring_view(U"hello").starts_with(U"he"));
528*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_WIN)
529*6777b538SAndroid Build Coastguard Worker   static_assert(wcstring_view(L"hello").starts_with(L"he"));
530*6777b538SAndroid Build Coastguard Worker #endif
531*6777b538SAndroid Build Coastguard Worker 
532*6777b538SAndroid Build Coastguard Worker   // Comparison with `string/string_view/cstring_view`.
533*6777b538SAndroid Build Coastguard Worker   static_assert(cstring_view("hello").starts_with(std::string("he")));
534*6777b538SAndroid Build Coastguard Worker   static_assert(!cstring_view("hello").starts_with(std::string("el")));
535*6777b538SAndroid Build Coastguard Worker   static_assert(cstring_view("hello").starts_with(std::string_view("he")));
536*6777b538SAndroid Build Coastguard Worker   static_assert(!cstring_view("hello").starts_with(std::string_view("el")));
537*6777b538SAndroid Build Coastguard Worker   static_assert(cstring_view("hello").starts_with(cstring_view("he")));
538*6777b538SAndroid Build Coastguard Worker   static_assert(!cstring_view("hello").starts_with(cstring_view("el")));
539*6777b538SAndroid Build Coastguard Worker 
540*6777b538SAndroid Build Coastguard Worker   static_assert(!cstring_view("hello").starts_with(std::string("hellos")));
541*6777b538SAndroid Build Coastguard Worker   static_assert(!cstring_view("hello").starts_with(std::string_view("hellos")));
542*6777b538SAndroid Build Coastguard Worker   static_assert(!cstring_view("hello").starts_with(cstring_view("hellos")));
543*6777b538SAndroid Build Coastguard Worker 
544*6777b538SAndroid Build Coastguard Worker   static_assert(u16cstring_view(u"hello").starts_with(std::u16string(u"he")));
545*6777b538SAndroid Build Coastguard Worker   static_assert(u32cstring_view(U"hello").starts_with(std::u32string(U"he")));
546*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_WIN)
547*6777b538SAndroid Build Coastguard Worker   static_assert(wcstring_view(L"hello").starts_with(std::wstring(L"he")));
548*6777b538SAndroid Build Coastguard Worker #endif
549*6777b538SAndroid Build Coastguard Worker 
550*6777b538SAndroid Build Coastguard Worker   // Comparison with a character.
551*6777b538SAndroid Build Coastguard Worker   static_assert(!cstring_view("").starts_with('h'));
552*6777b538SAndroid Build Coastguard Worker   static_assert(cstring_view("hello").starts_with('h'));
553*6777b538SAndroid Build Coastguard Worker   static_assert(!cstring_view("hello").starts_with('e'));
554*6777b538SAndroid Build Coastguard Worker 
555*6777b538SAndroid Build Coastguard Worker   static_assert(u16cstring_view(u"hello").starts_with(u'h'));
556*6777b538SAndroid Build Coastguard Worker   static_assert(u32cstring_view(U"hello").starts_with(U'h'));
557*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_WIN)
558*6777b538SAndroid Build Coastguard Worker   static_assert(wcstring_view(L"hello").starts_with(L'h'));
559*6777b538SAndroid Build Coastguard Worker #endif
560*6777b538SAndroid Build Coastguard Worker }
561*6777b538SAndroid Build Coastguard Worker 
TEST(CStringViewTest,EndsWith)562*6777b538SAndroid Build Coastguard Worker TEST(CStringViewTest, EndsWith) {
563*6777b538SAndroid Build Coastguard Worker   // Comparison with `const char*`.
564*6777b538SAndroid Build Coastguard Worker   static_assert(!cstring_view("").ends_with("hello"));
565*6777b538SAndroid Build Coastguard Worker   static_assert(cstring_view("").ends_with(""));
566*6777b538SAndroid Build Coastguard Worker   static_assert(cstring_view("hello").ends_with("hello"));
567*6777b538SAndroid Build Coastguard Worker   static_assert(cstring_view("hello").ends_with(""));
568*6777b538SAndroid Build Coastguard Worker   static_assert(cstring_view("hello").ends_with("lo"));
569*6777b538SAndroid Build Coastguard Worker   static_assert(!cstring_view("hello").ends_with("hel"));
570*6777b538SAndroid Build Coastguard Worker   constexpr const char* query = "hel";
571*6777b538SAndroid Build Coastguard Worker   static_assert(!cstring_view("hello").ends_with(query));
572*6777b538SAndroid Build Coastguard Worker 
573*6777b538SAndroid Build Coastguard Worker   static_assert(u16cstring_view(u"hello").ends_with(u"lo"));
574*6777b538SAndroid Build Coastguard Worker   static_assert(u32cstring_view(U"hello").ends_with(U"lo"));
575*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_WIN)
576*6777b538SAndroid Build Coastguard Worker   static_assert(wcstring_view(L"hello").ends_with(L"lo"));
577*6777b538SAndroid Build Coastguard Worker #endif
578*6777b538SAndroid Build Coastguard Worker 
579*6777b538SAndroid Build Coastguard Worker   // Comparison with `string/string_view/cstring_view`.
580*6777b538SAndroid Build Coastguard Worker   static_assert(cstring_view("hello").ends_with(std::string("lo")));
581*6777b538SAndroid Build Coastguard Worker   static_assert(!cstring_view("hello").ends_with(std::string("ell")));
582*6777b538SAndroid Build Coastguard Worker   static_assert(cstring_view("hello").ends_with(std::string_view("lo")));
583*6777b538SAndroid Build Coastguard Worker   static_assert(!cstring_view("hello").ends_with(std::string_view("ell")));
584*6777b538SAndroid Build Coastguard Worker   static_assert(cstring_view("hello").ends_with(cstring_view("lo")));
585*6777b538SAndroid Build Coastguard Worker   static_assert(!cstring_view("hello").ends_with(cstring_view("ell")));
586*6777b538SAndroid Build Coastguard Worker 
587*6777b538SAndroid Build Coastguard Worker   static_assert(!cstring_view("hello").ends_with(std::string("shello")));
588*6777b538SAndroid Build Coastguard Worker   static_assert(!cstring_view("hello").ends_with(std::string_view("shello")));
589*6777b538SAndroid Build Coastguard Worker   static_assert(!cstring_view("hello").ends_with(cstring_view("shello")));
590*6777b538SAndroid Build Coastguard Worker 
591*6777b538SAndroid Build Coastguard Worker   static_assert(u16cstring_view(u"hello").ends_with(std::u16string(u"lo")));
592*6777b538SAndroid Build Coastguard Worker   static_assert(u32cstring_view(U"hello").ends_with(std::u32string(U"lo")));
593*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_WIN)
594*6777b538SAndroid Build Coastguard Worker   static_assert(wcstring_view(L"hello").ends_with(std::wstring(L"lo")));
595*6777b538SAndroid Build Coastguard Worker #endif
596*6777b538SAndroid Build Coastguard Worker 
597*6777b538SAndroid Build Coastguard Worker   // Comparison with a character.
598*6777b538SAndroid Build Coastguard Worker   static_assert(!cstring_view("").ends_with('h'));
599*6777b538SAndroid Build Coastguard Worker   static_assert(cstring_view("hello").ends_with('o'));
600*6777b538SAndroid Build Coastguard Worker   static_assert(!cstring_view("hello").ends_with('l'));
601*6777b538SAndroid Build Coastguard Worker 
602*6777b538SAndroid Build Coastguard Worker   static_assert(u16cstring_view(u"hello").ends_with(u'o'));
603*6777b538SAndroid Build Coastguard Worker   static_assert(u32cstring_view(U"hello").ends_with(U'o'));
604*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_WIN)
605*6777b538SAndroid Build Coastguard Worker   static_assert(wcstring_view(L"hello").ends_with(L'o'));
606*6777b538SAndroid Build Coastguard Worker #endif
607*6777b538SAndroid Build Coastguard Worker }
608*6777b538SAndroid Build Coastguard Worker 
TEST(CStringViewTest,Find)609*6777b538SAndroid Build Coastguard Worker TEST(CStringViewTest, Find) {
610*6777b538SAndroid Build Coastguard Worker   // OOB `pos` will return npos. The NUL is never searched.
611*6777b538SAndroid Build Coastguard Worker   static_assert(cstring_view("hello").find('h', 1000u) == cstring_view::npos);
612*6777b538SAndroid Build Coastguard Worker   static_assert(cstring_view("hello").find('\0', 5u) == cstring_view::npos);
613*6777b538SAndroid Build Coastguard Worker 
614*6777b538SAndroid Build Coastguard Worker   // Searching for a Char.
615*6777b538SAndroid Build Coastguard Worker   static_assert(cstring_view("hello").find('e') == 1u);
616*6777b538SAndroid Build Coastguard Worker   static_assert(cstring_view("hello").find('z') == cstring_view::npos);
617*6777b538SAndroid Build Coastguard Worker   static_assert(cstring_view("hello").find('l') == 2u);
618*6777b538SAndroid Build Coastguard Worker   static_assert(cstring_view("hello").find('l', 3u) == 3u);
619*6777b538SAndroid Build Coastguard Worker 
620*6777b538SAndroid Build Coastguard Worker   static_assert(u16cstring_view(u"hello").find(u'e') == 1u);
621*6777b538SAndroid Build Coastguard Worker   static_assert(u16cstring_view(u"hello").find(u'z') == cstring_view::npos);
622*6777b538SAndroid Build Coastguard Worker   static_assert(u16cstring_view(u"hello").find(u'l') == 2u);
623*6777b538SAndroid Build Coastguard Worker   static_assert(u16cstring_view(u"hello").find(u'l', 3u) == 3u);
624*6777b538SAndroid Build Coastguard Worker 
625*6777b538SAndroid Build Coastguard Worker   static_assert(u32cstring_view(U"hello").find(U'e') == 1u);
626*6777b538SAndroid Build Coastguard Worker   static_assert(u32cstring_view(U"hello").find(U'z') == cstring_view::npos);
627*6777b538SAndroid Build Coastguard Worker   static_assert(u32cstring_view(U"hello").find(U'l') == 2u);
628*6777b538SAndroid Build Coastguard Worker   static_assert(u32cstring_view(U"hello").find(U'l', 3u) == 3u);
629*6777b538SAndroid Build Coastguard Worker 
630*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_WIN)
631*6777b538SAndroid Build Coastguard Worker   static_assert(wcstring_view(L"hello").find(L'e') == 1u);
632*6777b538SAndroid Build Coastguard Worker   static_assert(wcstring_view(L"hello").find(L'z') == cstring_view::npos);
633*6777b538SAndroid Build Coastguard Worker   static_assert(wcstring_view(L"hello").find(L'l') == 2u);
634*6777b538SAndroid Build Coastguard Worker   static_assert(wcstring_view(L"hello").find(L'l', 3u) == 3u);
635*6777b538SAndroid Build Coastguard Worker #endif
636*6777b538SAndroid Build Coastguard Worker 
637*6777b538SAndroid Build Coastguard Worker   // Searching for a string.
638*6777b538SAndroid Build Coastguard Worker   static_assert(cstring_view("hello hello").find("lo") == 3u);
639*6777b538SAndroid Build Coastguard Worker   static_assert(cstring_view("hello hello").find("lol") == cstring_view::npos);
640*6777b538SAndroid Build Coastguard Worker   static_assert(u16cstring_view(u"hello hello").find(u"lo") == 3u);
641*6777b538SAndroid Build Coastguard Worker   static_assert(u16cstring_view(u"hello hello").find(u"lol") ==
642*6777b538SAndroid Build Coastguard Worker                 cstring_view::npos);
643*6777b538SAndroid Build Coastguard Worker   static_assert(u32cstring_view(U"hello hello").find(U"lo") == 3u);
644*6777b538SAndroid Build Coastguard Worker   static_assert(u32cstring_view(U"hello hello").find(U"lol") ==
645*6777b538SAndroid Build Coastguard Worker                 cstring_view::npos);
646*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_WIN)
647*6777b538SAndroid Build Coastguard Worker   static_assert(wcstring_view(L"hello hello").find(L"lo") == 3u);
648*6777b538SAndroid Build Coastguard Worker   static_assert(wcstring_view(L"hello hello").find(L"lol") ==
649*6777b538SAndroid Build Coastguard Worker                 cstring_view::npos);
650*6777b538SAndroid Build Coastguard Worker #endif
651*6777b538SAndroid Build Coastguard Worker }
652*6777b538SAndroid Build Coastguard Worker 
TEST(CStringViewTest,Rfind)653*6777b538SAndroid Build Coastguard Worker TEST(CStringViewTest, Rfind) {
654*6777b538SAndroid Build Coastguard Worker   // OOB `pos` will clamp to the end of the view. The NUL is never searched.
655*6777b538SAndroid Build Coastguard Worker   static_assert(cstring_view("hello").rfind('h', 0u) == 0u);
656*6777b538SAndroid Build Coastguard Worker   static_assert(cstring_view("hello").rfind('h', 1000u) == 0u);
657*6777b538SAndroid Build Coastguard Worker   static_assert(cstring_view("hello").rfind('\0', 5u) == cstring_view::npos);
658*6777b538SAndroid Build Coastguard Worker 
659*6777b538SAndroid Build Coastguard Worker   // Searching for a Char.
660*6777b538SAndroid Build Coastguard Worker   static_assert(cstring_view("hello").rfind('e') == 1u);
661*6777b538SAndroid Build Coastguard Worker   static_assert(cstring_view("hello").rfind('z') == cstring_view::npos);
662*6777b538SAndroid Build Coastguard Worker   static_assert(cstring_view("hello").rfind('l') == 3u);
663*6777b538SAndroid Build Coastguard Worker   static_assert(cstring_view("hello").rfind('l', 2u) == 2u);
664*6777b538SAndroid Build Coastguard Worker 
665*6777b538SAndroid Build Coastguard Worker   static_assert(u16cstring_view(u"hello").rfind(u'e') == 1u);
666*6777b538SAndroid Build Coastguard Worker   static_assert(u16cstring_view(u"hello").rfind(u'z') == cstring_view::npos);
667*6777b538SAndroid Build Coastguard Worker   static_assert(u16cstring_view(u"hello").rfind(u'l') == 3u);
668*6777b538SAndroid Build Coastguard Worker   static_assert(u16cstring_view(u"hello").rfind(u'l', 2u) == 2u);
669*6777b538SAndroid Build Coastguard Worker 
670*6777b538SAndroid Build Coastguard Worker   static_assert(u32cstring_view(U"hello").rfind(U'e') == 1u);
671*6777b538SAndroid Build Coastguard Worker   static_assert(u32cstring_view(U"hello").rfind(U'z') == cstring_view::npos);
672*6777b538SAndroid Build Coastguard Worker   static_assert(u32cstring_view(U"hello").rfind(U'l') == 3u);
673*6777b538SAndroid Build Coastguard Worker   static_assert(u32cstring_view(U"hello").rfind(U'l', 2u) == 2u);
674*6777b538SAndroid Build Coastguard Worker 
675*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_WIN)
676*6777b538SAndroid Build Coastguard Worker   static_assert(wcstring_view(L"hello").rfind(L'e') == 1u);
677*6777b538SAndroid Build Coastguard Worker   static_assert(wcstring_view(L"hello").rfind(L'z') == cstring_view::npos);
678*6777b538SAndroid Build Coastguard Worker   static_assert(wcstring_view(L"hello").rfind(L'l') == 3u);
679*6777b538SAndroid Build Coastguard Worker   static_assert(wcstring_view(L"hello").rfind(L'l', 2u) == 2u);
680*6777b538SAndroid Build Coastguard Worker #endif
681*6777b538SAndroid Build Coastguard Worker 
682*6777b538SAndroid Build Coastguard Worker   // Searching for a string.
683*6777b538SAndroid Build Coastguard Worker   static_assert(cstring_view("hello hello").rfind("lo") == 9u);
684*6777b538SAndroid Build Coastguard Worker   static_assert(cstring_view("hello hello").rfind("lol") == cstring_view::npos);
685*6777b538SAndroid Build Coastguard Worker   static_assert(u16cstring_view(u"hello hello").rfind(u"lo") == 9u);
686*6777b538SAndroid Build Coastguard Worker   static_assert(u16cstring_view(u"hello hello").rfind(u"lol") ==
687*6777b538SAndroid Build Coastguard Worker                 cstring_view::npos);
688*6777b538SAndroid Build Coastguard Worker   static_assert(u32cstring_view(U"hello hello").rfind(U"lo") == 9u);
689*6777b538SAndroid Build Coastguard Worker   static_assert(u32cstring_view(U"hello hello").rfind(U"lol") ==
690*6777b538SAndroid Build Coastguard Worker                 cstring_view::npos);
691*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_WIN)
692*6777b538SAndroid Build Coastguard Worker   static_assert(wcstring_view(L"hello hello").rfind(L"lo") == 9u);
693*6777b538SAndroid Build Coastguard Worker   static_assert(wcstring_view(L"hello hello").rfind(L"lol") ==
694*6777b538SAndroid Build Coastguard Worker                 cstring_view::npos);
695*6777b538SAndroid Build Coastguard Worker #endif
696*6777b538SAndroid Build Coastguard Worker }
697*6777b538SAndroid Build Coastguard Worker 
TEST(CStringViewTest,FindFirstOf)698*6777b538SAndroid Build Coastguard Worker TEST(CStringViewTest, FindFirstOf) {
699*6777b538SAndroid Build Coastguard Worker   // OOB `pos` will return npos. The NUL is never searched.
700*6777b538SAndroid Build Coastguard Worker   static_assert(cstring_view("hello").find_first_of('h', 1000u) ==
701*6777b538SAndroid Build Coastguard Worker                 cstring_view::npos);
702*6777b538SAndroid Build Coastguard Worker   static_assert(cstring_view("hello").find_first_of('\0', 5u) ==
703*6777b538SAndroid Build Coastguard Worker                 cstring_view::npos);
704*6777b538SAndroid Build Coastguard Worker 
705*6777b538SAndroid Build Coastguard Worker   // Searching for a Char.
706*6777b538SAndroid Build Coastguard Worker   static_assert(cstring_view("hello").find_first_of('e') == 1u);
707*6777b538SAndroid Build Coastguard Worker   static_assert(cstring_view("hello").find_first_of('z') == cstring_view::npos);
708*6777b538SAndroid Build Coastguard Worker   static_assert(cstring_view("hello").find_first_of('l') == 2u);
709*6777b538SAndroid Build Coastguard Worker   static_assert(cstring_view("hello").find_first_of('l', 3u) == 3u);
710*6777b538SAndroid Build Coastguard Worker 
711*6777b538SAndroid Build Coastguard Worker   static_assert(u16cstring_view(u"hello").find_first_of(u'e') == 1u);
712*6777b538SAndroid Build Coastguard Worker   static_assert(u16cstring_view(u"hello").find_first_of(u'z') ==
713*6777b538SAndroid Build Coastguard Worker                 cstring_view::npos);
714*6777b538SAndroid Build Coastguard Worker   static_assert(u16cstring_view(u"hello").find_first_of(u'l') == 2u);
715*6777b538SAndroid Build Coastguard Worker   static_assert(u16cstring_view(u"hello").find_first_of(u'l', 3u) == 3u);
716*6777b538SAndroid Build Coastguard Worker 
717*6777b538SAndroid Build Coastguard Worker   static_assert(u32cstring_view(U"hello").find_first_of(U'e') == 1u);
718*6777b538SAndroid Build Coastguard Worker   static_assert(u32cstring_view(U"hello").find_first_of(U'z') ==
719*6777b538SAndroid Build Coastguard Worker                 cstring_view::npos);
720*6777b538SAndroid Build Coastguard Worker   static_assert(u32cstring_view(U"hello").find_first_of(U'l') == 2u);
721*6777b538SAndroid Build Coastguard Worker   static_assert(u32cstring_view(U"hello").find_first_of(U'l', 3u) == 3u);
722*6777b538SAndroid Build Coastguard Worker 
723*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_WIN)
724*6777b538SAndroid Build Coastguard Worker   static_assert(wcstring_view(L"hello").find_first_of(L'e') == 1u);
725*6777b538SAndroid Build Coastguard Worker   static_assert(wcstring_view(L"hello").find_first_of(L'z') ==
726*6777b538SAndroid Build Coastguard Worker                 cstring_view::npos);
727*6777b538SAndroid Build Coastguard Worker   static_assert(wcstring_view(L"hello").find_first_of(L'l') == 2u);
728*6777b538SAndroid Build Coastguard Worker   static_assert(wcstring_view(L"hello").find_first_of(L'l', 3u) == 3u);
729*6777b538SAndroid Build Coastguard Worker #endif
730*6777b538SAndroid Build Coastguard Worker 
731*6777b538SAndroid Build Coastguard Worker   // Searching for a string.
732*6777b538SAndroid Build Coastguard Worker   static_assert(cstring_view("hello hello").find_first_of("ol") == 2u);
733*6777b538SAndroid Build Coastguard Worker   static_assert(cstring_view("hello hello").find_first_of("zz") ==
734*6777b538SAndroid Build Coastguard Worker                 cstring_view::npos);
735*6777b538SAndroid Build Coastguard Worker   static_assert(u16cstring_view(u"hello hello").find_first_of(u"ol") == 2u);
736*6777b538SAndroid Build Coastguard Worker   static_assert(u16cstring_view(u"hello hello").find_first_of(u"zz") ==
737*6777b538SAndroid Build Coastguard Worker                 cstring_view::npos);
738*6777b538SAndroid Build Coastguard Worker   static_assert(u32cstring_view(U"hello hello").find_first_of(U"ol") == 2u);
739*6777b538SAndroid Build Coastguard Worker   static_assert(u32cstring_view(U"hello hello").find_first_of(U"zz") ==
740*6777b538SAndroid Build Coastguard Worker                 cstring_view::npos);
741*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_WIN)
742*6777b538SAndroid Build Coastguard Worker   static_assert(wcstring_view(L"hello hello").find_first_of(L"ol") == 2u);
743*6777b538SAndroid Build Coastguard Worker   static_assert(wcstring_view(L"hello hello").find_first_of(L"zz") ==
744*6777b538SAndroid Build Coastguard Worker                 cstring_view::npos);
745*6777b538SAndroid Build Coastguard Worker #endif
746*6777b538SAndroid Build Coastguard Worker }
747*6777b538SAndroid Build Coastguard Worker 
TEST(CStringViewTest,FindLastOf)748*6777b538SAndroid Build Coastguard Worker TEST(CStringViewTest, FindLastOf) {
749*6777b538SAndroid Build Coastguard Worker   // OOB `pos` will clamp to the end of the view. The NUL is never searched.
750*6777b538SAndroid Build Coastguard Worker   static_assert(cstring_view("hello").find_last_of('h', 0u) == 0u);
751*6777b538SAndroid Build Coastguard Worker   static_assert(cstring_view("hello").find_last_of('h', 1000u) == 0u);
752*6777b538SAndroid Build Coastguard Worker   static_assert(cstring_view("hello").find_last_of('\0', 5u) ==
753*6777b538SAndroid Build Coastguard Worker                 cstring_view::npos);
754*6777b538SAndroid Build Coastguard Worker 
755*6777b538SAndroid Build Coastguard Worker   // Searching for a Char.
756*6777b538SAndroid Build Coastguard Worker   static_assert(cstring_view("hello").find_last_of('e') == 1u);
757*6777b538SAndroid Build Coastguard Worker   static_assert(cstring_view("hello").find_last_of('z') == cstring_view::npos);
758*6777b538SAndroid Build Coastguard Worker   static_assert(cstring_view("hello").find_last_of('l') == 3u);
759*6777b538SAndroid Build Coastguard Worker   static_assert(cstring_view("hello").find_last_of('l', 2u) == 2u);
760*6777b538SAndroid Build Coastguard Worker 
761*6777b538SAndroid Build Coastguard Worker   static_assert(u16cstring_view(u"hello").find_last_of(u'e') == 1u);
762*6777b538SAndroid Build Coastguard Worker   static_assert(u16cstring_view(u"hello").find_last_of(u'z') ==
763*6777b538SAndroid Build Coastguard Worker                 cstring_view::npos);
764*6777b538SAndroid Build Coastguard Worker   static_assert(u16cstring_view(u"hello").find_last_of(u'l') == 3u);
765*6777b538SAndroid Build Coastguard Worker   static_assert(u16cstring_view(u"hello").find_last_of(u'l', 2u) == 2u);
766*6777b538SAndroid Build Coastguard Worker 
767*6777b538SAndroid Build Coastguard Worker   static_assert(u32cstring_view(U"hello").find_last_of(U'e') == 1u);
768*6777b538SAndroid Build Coastguard Worker   static_assert(u32cstring_view(U"hello").find_last_of(U'z') ==
769*6777b538SAndroid Build Coastguard Worker                 cstring_view::npos);
770*6777b538SAndroid Build Coastguard Worker   static_assert(u32cstring_view(U"hello").find_last_of(U'l') == 3u);
771*6777b538SAndroid Build Coastguard Worker   static_assert(u32cstring_view(U"hello").find_last_of(U'l', 2u) == 2u);
772*6777b538SAndroid Build Coastguard Worker 
773*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_WIN)
774*6777b538SAndroid Build Coastguard Worker   static_assert(wcstring_view(L"hello").find_last_of(L'e') == 1u);
775*6777b538SAndroid Build Coastguard Worker   static_assert(wcstring_view(L"hello").find_last_of(L'z') ==
776*6777b538SAndroid Build Coastguard Worker                 cstring_view::npos);
777*6777b538SAndroid Build Coastguard Worker   static_assert(wcstring_view(L"hello").find_last_of(L'l') == 3u);
778*6777b538SAndroid Build Coastguard Worker   static_assert(wcstring_view(L"hello").find_last_of(L'l', 2u) == 2u);
779*6777b538SAndroid Build Coastguard Worker #endif
780*6777b538SAndroid Build Coastguard Worker 
781*6777b538SAndroid Build Coastguard Worker   // Searching for a string.
782*6777b538SAndroid Build Coastguard Worker   static_assert(cstring_view("hello hello").find_last_of("lo") == 10u);
783*6777b538SAndroid Build Coastguard Worker   static_assert(cstring_view("hello hello").find_last_of("zz") ==
784*6777b538SAndroid Build Coastguard Worker                 cstring_view::npos);
785*6777b538SAndroid Build Coastguard Worker   static_assert(u16cstring_view(u"hello hello").find_last_of(u"lo") == 10u);
786*6777b538SAndroid Build Coastguard Worker   static_assert(u16cstring_view(u"hello hello").find_last_of(u"zz") ==
787*6777b538SAndroid Build Coastguard Worker                 cstring_view::npos);
788*6777b538SAndroid Build Coastguard Worker   static_assert(u32cstring_view(U"hello hello").find_last_of(U"lo") == 10u);
789*6777b538SAndroid Build Coastguard Worker   static_assert(u32cstring_view(U"hello hello").find_last_of(U"zz") ==
790*6777b538SAndroid Build Coastguard Worker                 cstring_view::npos);
791*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_WIN)
792*6777b538SAndroid Build Coastguard Worker   static_assert(wcstring_view(L"hello hello").find_last_of(L"lo") == 10u);
793*6777b538SAndroid Build Coastguard Worker   static_assert(wcstring_view(L"hello hello").find_last_of(L"zz") ==
794*6777b538SAndroid Build Coastguard Worker                 cstring_view::npos);
795*6777b538SAndroid Build Coastguard Worker #endif
796*6777b538SAndroid Build Coastguard Worker }
797*6777b538SAndroid Build Coastguard Worker 
TEST(CStringViewTest,FindFirstNotOf)798*6777b538SAndroid Build Coastguard Worker TEST(CStringViewTest, FindFirstNotOf) {
799*6777b538SAndroid Build Coastguard Worker   // OOB `pos` will return npos. The NUL is never searched.
800*6777b538SAndroid Build Coastguard Worker   static_assert(cstring_view("hello").find_first_not_of('a', 1000u) ==
801*6777b538SAndroid Build Coastguard Worker                 cstring_view::npos);
802*6777b538SAndroid Build Coastguard Worker   static_assert(cstring_view("hello").find_first_not_of('a', 5u) ==
803*6777b538SAndroid Build Coastguard Worker                 cstring_view::npos);
804*6777b538SAndroid Build Coastguard Worker 
805*6777b538SAndroid Build Coastguard Worker   // Searching for a Char.
806*6777b538SAndroid Build Coastguard Worker   static_assert(cstring_view("hello").find_first_not_of('h') == 1u);
807*6777b538SAndroid Build Coastguard Worker   static_assert(cstring_view("hello").find_first_not_of('e') == 0u);
808*6777b538SAndroid Build Coastguard Worker   static_assert(cstring_view("hello").find_first_not_of("eloh") ==
809*6777b538SAndroid Build Coastguard Worker                 cstring_view::npos);
810*6777b538SAndroid Build Coastguard Worker 
811*6777b538SAndroid Build Coastguard Worker   static_assert(u16cstring_view(u"hello").find_first_not_of(u'h') == 1u);
812*6777b538SAndroid Build Coastguard Worker   static_assert(u16cstring_view(u"hello").find_first_not_of(u'e') == 0u);
813*6777b538SAndroid Build Coastguard Worker   static_assert(u16cstring_view(u"hello").find_first_not_of(u"eloh") ==
814*6777b538SAndroid Build Coastguard Worker                 cstring_view::npos);
815*6777b538SAndroid Build Coastguard Worker 
816*6777b538SAndroid Build Coastguard Worker   static_assert(u32cstring_view(U"hello").find_first_not_of(U'h') == 1u);
817*6777b538SAndroid Build Coastguard Worker   static_assert(u32cstring_view(U"hello").find_first_not_of(U'e') == 0u);
818*6777b538SAndroid Build Coastguard Worker   static_assert(u32cstring_view(U"hello").find_first_not_of(U"eloh") ==
819*6777b538SAndroid Build Coastguard Worker                 cstring_view::npos);
820*6777b538SAndroid Build Coastguard Worker 
821*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_WIN)
822*6777b538SAndroid Build Coastguard Worker   static_assert(wcstring_view(L"hello").find_first_not_of(L'h') == 1u);
823*6777b538SAndroid Build Coastguard Worker   static_assert(wcstring_view(L"hello").find_first_not_of(L'e') == 0u);
824*6777b538SAndroid Build Coastguard Worker   static_assert(wcstring_view(L"hello").find_first_not_of(L"eloh") ==
825*6777b538SAndroid Build Coastguard Worker                 cstring_view::npos);
826*6777b538SAndroid Build Coastguard Worker #endif
827*6777b538SAndroid Build Coastguard Worker 
828*6777b538SAndroid Build Coastguard Worker   // Searching for a string.
829*6777b538SAndroid Build Coastguard Worker   static_assert(cstring_view("hello hello").find_first_not_of("eh") == 2u);
830*6777b538SAndroid Build Coastguard Worker   static_assert(cstring_view("hello hello").find_first_not_of("hello ") ==
831*6777b538SAndroid Build Coastguard Worker                 cstring_view::npos);
832*6777b538SAndroid Build Coastguard Worker   static_assert(u16cstring_view(u"hello hello").find_first_not_of(u"eh") == 2u);
833*6777b538SAndroid Build Coastguard Worker   static_assert(u16cstring_view(u"hello hello").find_first_not_of(u"hello ") ==
834*6777b538SAndroid Build Coastguard Worker                 cstring_view::npos);
835*6777b538SAndroid Build Coastguard Worker   static_assert(u32cstring_view(U"hello hello").find_first_not_of(U"eh") == 2u);
836*6777b538SAndroid Build Coastguard Worker   static_assert(u32cstring_view(U"hello hello").find_first_not_of(U"hello ") ==
837*6777b538SAndroid Build Coastguard Worker                 cstring_view::npos);
838*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_WIN)
839*6777b538SAndroid Build Coastguard Worker   static_assert(wcstring_view(L"hello hello").find_first_not_of(L"eh") == 2u);
840*6777b538SAndroid Build Coastguard Worker   static_assert(wcstring_view(L"hello hello").find_first_not_of(L"hello ") ==
841*6777b538SAndroid Build Coastguard Worker                 cstring_view::npos);
842*6777b538SAndroid Build Coastguard Worker #endif
843*6777b538SAndroid Build Coastguard Worker }
844*6777b538SAndroid Build Coastguard Worker 
TEST(CStringViewTest,FindLastNotOf)845*6777b538SAndroid Build Coastguard Worker TEST(CStringViewTest, FindLastNotOf) {
846*6777b538SAndroid Build Coastguard Worker   // OOB `pos` will clamp to the end of the view. The NUL is never searched.
847*6777b538SAndroid Build Coastguard Worker   static_assert(cstring_view("hello").find_last_not_of('a', 1000u) == 4u);
848*6777b538SAndroid Build Coastguard Worker   static_assert(cstring_view("hello").find_last_not_of('a', 5u) == 4u);
849*6777b538SAndroid Build Coastguard Worker 
850*6777b538SAndroid Build Coastguard Worker   // Searching for a Char.
851*6777b538SAndroid Build Coastguard Worker   static_assert(cstring_view("hello").find_last_not_of('l') == 4u);
852*6777b538SAndroid Build Coastguard Worker   static_assert(cstring_view("hello").find_last_not_of('o') == 3u);
853*6777b538SAndroid Build Coastguard Worker   static_assert(cstring_view("hello").find_last_not_of("eloh") ==
854*6777b538SAndroid Build Coastguard Worker                 cstring_view::npos);
855*6777b538SAndroid Build Coastguard Worker 
856*6777b538SAndroid Build Coastguard Worker   static_assert(u16cstring_view(u"hello").find_last_not_of(u'l') == 4u);
857*6777b538SAndroid Build Coastguard Worker   static_assert(u16cstring_view(u"hello").find_last_not_of(u'o') == 3u);
858*6777b538SAndroid Build Coastguard Worker   static_assert(u16cstring_view(u"hello").find_last_not_of(u"eloh") ==
859*6777b538SAndroid Build Coastguard Worker                 cstring_view::npos);
860*6777b538SAndroid Build Coastguard Worker 
861*6777b538SAndroid Build Coastguard Worker   static_assert(u32cstring_view(U"hello").find_last_not_of(U'l') == 4u);
862*6777b538SAndroid Build Coastguard Worker   static_assert(u32cstring_view(U"hello").find_last_not_of(U'o') == 3u);
863*6777b538SAndroid Build Coastguard Worker   static_assert(u32cstring_view(U"hello").find_last_not_of(U"eloh") ==
864*6777b538SAndroid Build Coastguard Worker                 cstring_view::npos);
865*6777b538SAndroid Build Coastguard Worker 
866*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_WIN)
867*6777b538SAndroid Build Coastguard Worker   static_assert(wcstring_view(L"hello").find_last_not_of(L'l') == 4u);
868*6777b538SAndroid Build Coastguard Worker   static_assert(wcstring_view(L"hello").find_last_not_of(L'o') == 3u);
869*6777b538SAndroid Build Coastguard Worker   static_assert(wcstring_view(L"hello").find_last_not_of(L"eloh") ==
870*6777b538SAndroid Build Coastguard Worker                 cstring_view::npos);
871*6777b538SAndroid Build Coastguard Worker #endif
872*6777b538SAndroid Build Coastguard Worker 
873*6777b538SAndroid Build Coastguard Worker   // Searching for a string.
874*6777b538SAndroid Build Coastguard Worker   static_assert(cstring_view("hello hello").find_last_not_of("lo") == 7u);
875*6777b538SAndroid Build Coastguard Worker   static_assert(cstring_view("hello hello").find_last_not_of("hello ") ==
876*6777b538SAndroid Build Coastguard Worker                 cstring_view::npos);
877*6777b538SAndroid Build Coastguard Worker   static_assert(u16cstring_view(u"hello hello").find_last_not_of(u"lo") == 7u);
878*6777b538SAndroid Build Coastguard Worker   static_assert(u16cstring_view(u"hello hello").find_last_not_of(u"hello ") ==
879*6777b538SAndroid Build Coastguard Worker                 cstring_view::npos);
880*6777b538SAndroid Build Coastguard Worker   static_assert(u32cstring_view(U"hello hello").find_last_not_of(U"lo") == 7u);
881*6777b538SAndroid Build Coastguard Worker   static_assert(u32cstring_view(U"hello hello").find_last_not_of(U"hello ") ==
882*6777b538SAndroid Build Coastguard Worker                 cstring_view::npos);
883*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_WIN)
884*6777b538SAndroid Build Coastguard Worker   static_assert(wcstring_view(L"hello hello").find_last_not_of(L"lo") == 7u);
885*6777b538SAndroid Build Coastguard Worker   static_assert(wcstring_view(L"hello hello").find_last_not_of(L"hello ") ==
886*6777b538SAndroid Build Coastguard Worker                 cstring_view::npos);
887*6777b538SAndroid Build Coastguard Worker #endif
888*6777b538SAndroid Build Coastguard Worker }
889*6777b538SAndroid Build Coastguard Worker 
TEST(CStringViewTest,ToString)890*6777b538SAndroid Build Coastguard Worker TEST(CStringViewTest, ToString) {
891*6777b538SAndroid Build Coastguard Worker   // Streaming support like std::string_view.
892*6777b538SAndroid Build Coastguard Worker   std::ostringstream s;
893*6777b538SAndroid Build Coastguard Worker   s << cstring_view("hello");
894*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(s.str(), "hello");
895*6777b538SAndroid Build Coastguard Worker 
896*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_WIN)
897*6777b538SAndroid Build Coastguard Worker   std::wostringstream sw;
898*6777b538SAndroid Build Coastguard Worker   sw << wcstring_view(L"hello");
899*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(sw.str(), L"hello");
900*6777b538SAndroid Build Coastguard Worker #endif
901*6777b538SAndroid Build Coastguard Worker 
902*6777b538SAndroid Build Coastguard Worker   // Gtest printing support.
903*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(testing::PrintToString(cstring_view("hello")), "hello");
904*6777b538SAndroid Build Coastguard Worker }
905*6777b538SAndroid Build Coastguard Worker 
TEST(CStringViewTest,Hash)906*6777b538SAndroid Build Coastguard Worker TEST(CStringViewTest, Hash) {
907*6777b538SAndroid Build Coastguard Worker   [[maybe_unused]] auto s = std::hash<cstring_view>()(cstring_view("hello"));
908*6777b538SAndroid Build Coastguard Worker   static_assert(std::same_as<size_t, decltype(s)>);
909*6777b538SAndroid Build Coastguard Worker 
910*6777b538SAndroid Build Coastguard Worker   [[maybe_unused]] auto s16 =
911*6777b538SAndroid Build Coastguard Worker       std::hash<u16cstring_view>()(u16cstring_view(u"hello"));
912*6777b538SAndroid Build Coastguard Worker   static_assert(std::same_as<size_t, decltype(s)>);
913*6777b538SAndroid Build Coastguard Worker 
914*6777b538SAndroid Build Coastguard Worker   [[maybe_unused]] auto s32 =
915*6777b538SAndroid Build Coastguard Worker       std::hash<u32cstring_view>()(u32cstring_view(U"hello"));
916*6777b538SAndroid Build Coastguard Worker   static_assert(std::same_as<size_t, decltype(s)>);
917*6777b538SAndroid Build Coastguard Worker 
918*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_WIN)
919*6777b538SAndroid Build Coastguard Worker   [[maybe_unused]] auto sw =
920*6777b538SAndroid Build Coastguard Worker       std::hash<wcstring_view>()(wcstring_view(L"hello"));
921*6777b538SAndroid Build Coastguard Worker   static_assert(std::same_as<size_t, decltype(s)>);
922*6777b538SAndroid Build Coastguard Worker #endif
923*6777b538SAndroid Build Coastguard Worker }
924*6777b538SAndroid Build Coastguard Worker 
TEST(CStringViewTest,IntoStdStringView)925*6777b538SAndroid Build Coastguard Worker TEST(CStringViewTest, IntoStdStringView) {
926*6777b538SAndroid Build Coastguard Worker   // string_view implicitly constructs from const char*, and so also from
927*6777b538SAndroid Build Coastguard Worker   // cstring_view.
928*6777b538SAndroid Build Coastguard Worker   std::string_view sc = "hello";
929*6777b538SAndroid Build Coastguard Worker   std::string_view s = cstring_view("hello");
930*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(s, sc);
931*6777b538SAndroid Build Coastguard Worker 
932*6777b538SAndroid Build Coastguard Worker   static_assert(std::string_view(cstring_view("hello")) == "hello");
933*6777b538SAndroid Build Coastguard Worker }
934*6777b538SAndroid Build Coastguard Worker 
TEST(CStringViewTest,IntoStdString)935*6777b538SAndroid Build Coastguard Worker TEST(CStringViewTest, IntoStdString) {
936*6777b538SAndroid Build Coastguard Worker   // string implicitly constructs from const char*, but not from
937*6777b538SAndroid Build Coastguard Worker   // std::string_view or cstring_view.
938*6777b538SAndroid Build Coastguard Worker   static_assert(std::convertible_to<const char*, std::string>);
939*6777b538SAndroid Build Coastguard Worker   static_assert(!std::convertible_to<std::string_view, std::string>);
940*6777b538SAndroid Build Coastguard Worker   static_assert(!std::convertible_to<cstring_view, std::string>);
941*6777b538SAndroid Build Coastguard Worker 
942*6777b538SAndroid Build Coastguard Worker   static_assert(std::constructible_from<std::string, const char*>);
943*6777b538SAndroid Build Coastguard Worker   static_assert(std::constructible_from<std::string, std::string_view>);
944*6777b538SAndroid Build Coastguard Worker   static_assert(std::constructible_from<std::string, cstring_view>);
945*6777b538SAndroid Build Coastguard Worker 
946*6777b538SAndroid Build Coastguard Worker   auto sv = std::string(std::string_view("hello"));
947*6777b538SAndroid Build Coastguard Worker   auto cs = std::string(cstring_view("hello"));
948*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(cs, sv);
949*6777b538SAndroid Build Coastguard Worker 
950*6777b538SAndroid Build Coastguard Worker   static_assert(std::string(cstring_view("hello")) == "hello");
951*6777b538SAndroid Build Coastguard Worker }
952*6777b538SAndroid Build Coastguard Worker 
TEST(CStringViewTest,StringPlus)953*6777b538SAndroid Build Coastguard Worker TEST(CStringViewTest, StringPlus) {
954*6777b538SAndroid Build Coastguard Worker   {
955*6777b538SAndroid Build Coastguard Worker     auto s = cstring_view("hello") + std::string("world");
956*6777b538SAndroid Build Coastguard Worker     static_assert(std::same_as<std::string, decltype(s)>);
957*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(s, "helloworld");
958*6777b538SAndroid Build Coastguard Worker   }
959*6777b538SAndroid Build Coastguard Worker   {
960*6777b538SAndroid Build Coastguard Worker     auto s = std::string("hello") + cstring_view("world");
961*6777b538SAndroid Build Coastguard Worker     static_assert(std::same_as<std::string, decltype(s)>);
962*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(s, "helloworld");
963*6777b538SAndroid Build Coastguard Worker   }
964*6777b538SAndroid Build Coastguard Worker   {
965*6777b538SAndroid Build Coastguard Worker     auto s = std::u16string(u"hello") + u16cstring_view(u"world");
966*6777b538SAndroid Build Coastguard Worker     static_assert(std::same_as<std::u16string, decltype(s)>);
967*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(s, u"helloworld");
968*6777b538SAndroid Build Coastguard Worker   }
969*6777b538SAndroid Build Coastguard Worker   {
970*6777b538SAndroid Build Coastguard Worker     auto s = std::u32string(U"hello") + u32cstring_view(U"world");
971*6777b538SAndroid Build Coastguard Worker     static_assert(std::same_as<std::u32string, decltype(s)>);
972*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(s, U"helloworld");
973*6777b538SAndroid Build Coastguard Worker   }
974*6777b538SAndroid Build Coastguard Worker   {
975*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_WIN)
976*6777b538SAndroid Build Coastguard Worker     auto s = std::wstring(L"hello") + wcstring_view(L"world");
977*6777b538SAndroid Build Coastguard Worker     static_assert(std::same_as<std::wstring, decltype(s)>);
978*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(s, L"helloworld");
979*6777b538SAndroid Build Coastguard Worker #endif
980*6777b538SAndroid Build Coastguard Worker   }
981*6777b538SAndroid Build Coastguard Worker 
982*6777b538SAndroid Build Coastguard Worker   // From lvalues.
983*6777b538SAndroid Build Coastguard Worker   {
984*6777b538SAndroid Build Coastguard Worker     auto h = cstring_view("hello");
985*6777b538SAndroid Build Coastguard Worker     auto w = std::string("world");
986*6777b538SAndroid Build Coastguard Worker     auto s = h + w;
987*6777b538SAndroid Build Coastguard Worker     static_assert(std::same_as<std::string, decltype(s)>);
988*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(s, "helloworld");
989*6777b538SAndroid Build Coastguard Worker   }
990*6777b538SAndroid Build Coastguard Worker 
991*6777b538SAndroid Build Coastguard Worker   static_assert(cstring_view("hello") + std::string("world") == "helloworld");
992*6777b538SAndroid Build Coastguard Worker   static_assert(std::string("hello") + cstring_view("world") == "helloworld");
993*6777b538SAndroid Build Coastguard Worker }
994*6777b538SAndroid Build Coastguard Worker 
TEST(CStringViewTest,StringAppend)995*6777b538SAndroid Build Coastguard Worker TEST(CStringViewTest, StringAppend) {
996*6777b538SAndroid Build Coastguard Worker   std::string s = "hello";
997*6777b538SAndroid Build Coastguard Worker   // string::append() can accept cstring_view like const char*.
998*6777b538SAndroid Build Coastguard Worker   s.append(cstring_view("world"));
999*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(s, "helloworld");
1000*6777b538SAndroid Build Coastguard Worker }
1001*6777b538SAndroid Build Coastguard Worker 
TEST(CStringViewTest,StringInsert)1002*6777b538SAndroid Build Coastguard Worker TEST(CStringViewTest, StringInsert) {
1003*6777b538SAndroid Build Coastguard Worker   std::string s = "world";
1004*6777b538SAndroid Build Coastguard Worker   // string::insert() can accept cstring_view like const char*.
1005*6777b538SAndroid Build Coastguard Worker   s.insert(0u, cstring_view("hello"));
1006*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(s, "helloworld");
1007*6777b538SAndroid Build Coastguard Worker }
1008*6777b538SAndroid Build Coastguard Worker 
TEST(CStringViewTest,StringReplace)1009*6777b538SAndroid Build Coastguard Worker TEST(CStringViewTest, StringReplace) {
1010*6777b538SAndroid Build Coastguard Worker   std::string s = "goodbyeworld";
1011*6777b538SAndroid Build Coastguard Worker   // string::replace() can accept cstring_view like const char*.
1012*6777b538SAndroid Build Coastguard Worker   s.replace(0u, 7u, cstring_view("hello"));
1013*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(s, "helloworld");
1014*6777b538SAndroid Build Coastguard Worker }
1015*6777b538SAndroid Build Coastguard Worker 
TEST(CStringViewTest,StringFind)1016*6777b538SAndroid Build Coastguard Worker TEST(CStringViewTest, StringFind) {
1017*6777b538SAndroid Build Coastguard Worker   const std::string s = "helloworld";
1018*6777b538SAndroid Build Coastguard Worker   // string::find() can accept cstring_view like const char*.
1019*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(s.find(cstring_view("owo")), 4u);
1020*6777b538SAndroid Build Coastguard Worker }
1021*6777b538SAndroid Build Coastguard Worker 
TEST(CStringViewTest,StringCompare)1022*6777b538SAndroid Build Coastguard Worker TEST(CStringViewTest, StringCompare) {
1023*6777b538SAndroid Build Coastguard Worker   const std::string s = "hello";
1024*6777b538SAndroid Build Coastguard Worker   // string::compare() can accept cstring_view like const char*.
1025*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(s.compare(cstring_view("hello")), 0);
1026*6777b538SAndroid Build Coastguard Worker   // string::operator== can accept cstring_view like const char*.
1027*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(s, cstring_view("hello"));
1028*6777b538SAndroid Build Coastguard Worker   // string::operator<=> can accept cstring_view like const char*.
1029*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(s <=> cstring_view("hello"), std::weak_ordering::equivalent);
1030*6777b538SAndroid Build Coastguard Worker   // string::operator<= etc can accept cstring_view like const char*. This
1031*6777b538SAndroid Build Coastguard Worker   // follows from <=> normally but std::string has more overloads.
1032*6777b538SAndroid Build Coastguard Worker   EXPECT_LE(s, cstring_view("hello"));
1033*6777b538SAndroid Build Coastguard Worker }
1034*6777b538SAndroid Build Coastguard Worker 
TEST(CStringViewTest,StringStartsEndsWith)1035*6777b538SAndroid Build Coastguard Worker TEST(CStringViewTest, StringStartsEndsWith) {
1036*6777b538SAndroid Build Coastguard Worker   const std::string s = "hello";
1037*6777b538SAndroid Build Coastguard Worker   // string::starts_with() can accept cstring_view like const char*.
1038*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(s.starts_with(cstring_view("hel")), true);
1039*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(s.starts_with(cstring_view("lo")), false);
1040*6777b538SAndroid Build Coastguard Worker   // string::ends_with() can accept cstring_view like const char*.
1041*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(s.ends_with(cstring_view("hel")), false);
1042*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(s.ends_with(cstring_view("lo")), true);
1043*6777b538SAndroid Build Coastguard Worker }
1044*6777b538SAndroid Build Coastguard Worker 
TEST(CStringViewTest,StrCat)1045*6777b538SAndroid Build Coastguard Worker TEST(CStringViewTest, StrCat) {
1046*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(base::StrCat({cstring_view("hello"), std::string_view("world")}),
1047*6777b538SAndroid Build Coastguard Worker             "helloworld");
1048*6777b538SAndroid Build Coastguard Worker }
1049*6777b538SAndroid Build Coastguard Worker 
TEST(CStringViewTest,Example_CtorLiteral)1050*6777b538SAndroid Build Coastguard Worker TEST(CStringViewTest, Example_CtorLiteral) {
1051*6777b538SAndroid Build Coastguard Worker   const char kLiteral[] = "hello world";
1052*6777b538SAndroid Build Coastguard Worker   auto s = base::cstring_view(kLiteral);
1053*6777b538SAndroid Build Coastguard Worker   CHECK(s == "hello world");
1054*6777b538SAndroid Build Coastguard Worker   auto s2 = base::cstring_view("this works too");
1055*6777b538SAndroid Build Coastguard Worker   CHECK(s2 == "this works too");
1056*6777b538SAndroid Build Coastguard Worker }
1057*6777b538SAndroid Build Coastguard Worker 
1058*6777b538SAndroid Build Coastguard Worker }  // namespace
1059*6777b538SAndroid Build Coastguard Worker }  // namespace base
1060