xref: /aosp_15_r20/external/abseil-cpp/absl/strings/ascii_test.cc (revision 9356374a3709195abf420251b3e825997ff56c0f)
1*9356374aSAndroid Build Coastguard Worker // Copyright 2017 The Abseil Authors.
2*9356374aSAndroid Build Coastguard Worker //
3*9356374aSAndroid Build Coastguard Worker // Licensed under the Apache License, Version 2.0 (the "License");
4*9356374aSAndroid Build Coastguard Worker // you may not use this file except in compliance with the License.
5*9356374aSAndroid Build Coastguard Worker // You may obtain a copy of the License at
6*9356374aSAndroid Build Coastguard Worker //
7*9356374aSAndroid Build Coastguard Worker //      https://www.apache.org/licenses/LICENSE-2.0
8*9356374aSAndroid Build Coastguard Worker //
9*9356374aSAndroid Build Coastguard Worker // Unless required by applicable law or agreed to in writing, software
10*9356374aSAndroid Build Coastguard Worker // distributed under the License is distributed on an "AS IS" BASIS,
11*9356374aSAndroid Build Coastguard Worker // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*9356374aSAndroid Build Coastguard Worker // See the License for the specific language governing permissions and
13*9356374aSAndroid Build Coastguard Worker // limitations under the License.
14*9356374aSAndroid Build Coastguard Worker 
15*9356374aSAndroid Build Coastguard Worker #include "absl/strings/ascii.h"
16*9356374aSAndroid Build Coastguard Worker 
17*9356374aSAndroid Build Coastguard Worker #include <algorithm>
18*9356374aSAndroid Build Coastguard Worker #include <cctype>
19*9356374aSAndroid Build Coastguard Worker #include <clocale>
20*9356374aSAndroid Build Coastguard Worker #include <cstring>
21*9356374aSAndroid Build Coastguard Worker #include <string>
22*9356374aSAndroid Build Coastguard Worker 
23*9356374aSAndroid Build Coastguard Worker #include "gtest/gtest.h"
24*9356374aSAndroid Build Coastguard Worker #include "absl/base/macros.h"
25*9356374aSAndroid Build Coastguard Worker #include "absl/strings/string_view.h"
26*9356374aSAndroid Build Coastguard Worker 
27*9356374aSAndroid Build Coastguard Worker namespace {
28*9356374aSAndroid Build Coastguard Worker 
TEST(AsciiIsFoo,All)29*9356374aSAndroid Build Coastguard Worker TEST(AsciiIsFoo, All) {
30*9356374aSAndroid Build Coastguard Worker   for (int i = 0; i < 256; i++) {
31*9356374aSAndroid Build Coastguard Worker     const auto c = static_cast<unsigned char>(i);
32*9356374aSAndroid Build Coastguard Worker     if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z'))
33*9356374aSAndroid Build Coastguard Worker       EXPECT_TRUE(absl::ascii_isalpha(c)) << ": failed on " << c;
34*9356374aSAndroid Build Coastguard Worker     else
35*9356374aSAndroid Build Coastguard Worker       EXPECT_TRUE(!absl::ascii_isalpha(c)) << ": failed on " << c;
36*9356374aSAndroid Build Coastguard Worker   }
37*9356374aSAndroid Build Coastguard Worker   for (int i = 0; i < 256; i++) {
38*9356374aSAndroid Build Coastguard Worker     const auto c = static_cast<unsigned char>(i);
39*9356374aSAndroid Build Coastguard Worker     if ((c >= '0' && c <= '9'))
40*9356374aSAndroid Build Coastguard Worker       EXPECT_TRUE(absl::ascii_isdigit(c)) << ": failed on " << c;
41*9356374aSAndroid Build Coastguard Worker     else
42*9356374aSAndroid Build Coastguard Worker       EXPECT_TRUE(!absl::ascii_isdigit(c)) << ": failed on " << c;
43*9356374aSAndroid Build Coastguard Worker   }
44*9356374aSAndroid Build Coastguard Worker   for (int i = 0; i < 256; i++) {
45*9356374aSAndroid Build Coastguard Worker     const auto c = static_cast<unsigned char>(i);
46*9356374aSAndroid Build Coastguard Worker     if (absl::ascii_isalpha(c) || absl::ascii_isdigit(c))
47*9356374aSAndroid Build Coastguard Worker       EXPECT_TRUE(absl::ascii_isalnum(c)) << ": failed on " << c;
48*9356374aSAndroid Build Coastguard Worker     else
49*9356374aSAndroid Build Coastguard Worker       EXPECT_TRUE(!absl::ascii_isalnum(c)) << ": failed on " << c;
50*9356374aSAndroid Build Coastguard Worker   }
51*9356374aSAndroid Build Coastguard Worker   for (int i = 0; i < 256; i++) {
52*9356374aSAndroid Build Coastguard Worker     const auto c = static_cast<unsigned char>(i);
53*9356374aSAndroid Build Coastguard Worker     if (i != '\0' && strchr(" \r\n\t\v\f", i))
54*9356374aSAndroid Build Coastguard Worker       EXPECT_TRUE(absl::ascii_isspace(c)) << ": failed on " << c;
55*9356374aSAndroid Build Coastguard Worker     else
56*9356374aSAndroid Build Coastguard Worker       EXPECT_TRUE(!absl::ascii_isspace(c)) << ": failed on " << c;
57*9356374aSAndroid Build Coastguard Worker   }
58*9356374aSAndroid Build Coastguard Worker   for (int i = 0; i < 256; i++) {
59*9356374aSAndroid Build Coastguard Worker     const auto c = static_cast<unsigned char>(i);
60*9356374aSAndroid Build Coastguard Worker     if (i >= 32 && i < 127)
61*9356374aSAndroid Build Coastguard Worker       EXPECT_TRUE(absl::ascii_isprint(c)) << ": failed on " << c;
62*9356374aSAndroid Build Coastguard Worker     else
63*9356374aSAndroid Build Coastguard Worker       EXPECT_TRUE(!absl::ascii_isprint(c)) << ": failed on " << c;
64*9356374aSAndroid Build Coastguard Worker   }
65*9356374aSAndroid Build Coastguard Worker   for (int i = 0; i < 256; i++) {
66*9356374aSAndroid Build Coastguard Worker     const auto c = static_cast<unsigned char>(i);
67*9356374aSAndroid Build Coastguard Worker     if (absl::ascii_isprint(c) && !absl::ascii_isspace(c) &&
68*9356374aSAndroid Build Coastguard Worker         !absl::ascii_isalnum(c)) {
69*9356374aSAndroid Build Coastguard Worker       EXPECT_TRUE(absl::ascii_ispunct(c)) << ": failed on " << c;
70*9356374aSAndroid Build Coastguard Worker     } else {
71*9356374aSAndroid Build Coastguard Worker       EXPECT_TRUE(!absl::ascii_ispunct(c)) << ": failed on " << c;
72*9356374aSAndroid Build Coastguard Worker     }
73*9356374aSAndroid Build Coastguard Worker   }
74*9356374aSAndroid Build Coastguard Worker   for (int i = 0; i < 256; i++) {
75*9356374aSAndroid Build Coastguard Worker     const auto c = static_cast<unsigned char>(i);
76*9356374aSAndroid Build Coastguard Worker     if (i == ' ' || i == '\t')
77*9356374aSAndroid Build Coastguard Worker       EXPECT_TRUE(absl::ascii_isblank(c)) << ": failed on " << c;
78*9356374aSAndroid Build Coastguard Worker     else
79*9356374aSAndroid Build Coastguard Worker       EXPECT_TRUE(!absl::ascii_isblank(c)) << ": failed on " << c;
80*9356374aSAndroid Build Coastguard Worker   }
81*9356374aSAndroid Build Coastguard Worker   for (int i = 0; i < 256; i++) {
82*9356374aSAndroid Build Coastguard Worker     const auto c = static_cast<unsigned char>(i);
83*9356374aSAndroid Build Coastguard Worker     if (i < 32 || i == 127)
84*9356374aSAndroid Build Coastguard Worker       EXPECT_TRUE(absl::ascii_iscntrl(c)) << ": failed on " << c;
85*9356374aSAndroid Build Coastguard Worker     else
86*9356374aSAndroid Build Coastguard Worker       EXPECT_TRUE(!absl::ascii_iscntrl(c)) << ": failed on " << c;
87*9356374aSAndroid Build Coastguard Worker   }
88*9356374aSAndroid Build Coastguard Worker   for (int i = 0; i < 256; i++) {
89*9356374aSAndroid Build Coastguard Worker     const auto c = static_cast<unsigned char>(i);
90*9356374aSAndroid Build Coastguard Worker     if (absl::ascii_isdigit(c) || (i >= 'A' && i <= 'F') ||
91*9356374aSAndroid Build Coastguard Worker         (i >= 'a' && i <= 'f')) {
92*9356374aSAndroid Build Coastguard Worker       EXPECT_TRUE(absl::ascii_isxdigit(c)) << ": failed on " << c;
93*9356374aSAndroid Build Coastguard Worker     } else {
94*9356374aSAndroid Build Coastguard Worker       EXPECT_TRUE(!absl::ascii_isxdigit(c)) << ": failed on " << c;
95*9356374aSAndroid Build Coastguard Worker     }
96*9356374aSAndroid Build Coastguard Worker   }
97*9356374aSAndroid Build Coastguard Worker   for (int i = 0; i < 256; i++) {
98*9356374aSAndroid Build Coastguard Worker     const auto c = static_cast<unsigned char>(i);
99*9356374aSAndroid Build Coastguard Worker     if (i > 32 && i < 127)
100*9356374aSAndroid Build Coastguard Worker       EXPECT_TRUE(absl::ascii_isgraph(c)) << ": failed on " << c;
101*9356374aSAndroid Build Coastguard Worker     else
102*9356374aSAndroid Build Coastguard Worker       EXPECT_TRUE(!absl::ascii_isgraph(c)) << ": failed on " << c;
103*9356374aSAndroid Build Coastguard Worker   }
104*9356374aSAndroid Build Coastguard Worker   for (int i = 0; i < 256; i++) {
105*9356374aSAndroid Build Coastguard Worker     const auto c = static_cast<unsigned char>(i);
106*9356374aSAndroid Build Coastguard Worker     if (i >= 'A' && i <= 'Z')
107*9356374aSAndroid Build Coastguard Worker       EXPECT_TRUE(absl::ascii_isupper(c)) << ": failed on " << c;
108*9356374aSAndroid Build Coastguard Worker     else
109*9356374aSAndroid Build Coastguard Worker       EXPECT_TRUE(!absl::ascii_isupper(c)) << ": failed on " << c;
110*9356374aSAndroid Build Coastguard Worker   }
111*9356374aSAndroid Build Coastguard Worker   for (int i = 0; i < 256; i++) {
112*9356374aSAndroid Build Coastguard Worker     const auto c = static_cast<unsigned char>(i);
113*9356374aSAndroid Build Coastguard Worker     if (i >= 'a' && i <= 'z')
114*9356374aSAndroid Build Coastguard Worker       EXPECT_TRUE(absl::ascii_islower(c)) << ": failed on " << c;
115*9356374aSAndroid Build Coastguard Worker     else
116*9356374aSAndroid Build Coastguard Worker       EXPECT_TRUE(!absl::ascii_islower(c)) << ": failed on " << c;
117*9356374aSAndroid Build Coastguard Worker   }
118*9356374aSAndroid Build Coastguard Worker   for (unsigned char c = 0; c < 128; c++) {
119*9356374aSAndroid Build Coastguard Worker     EXPECT_TRUE(absl::ascii_isascii(c)) << ": failed on " << c;
120*9356374aSAndroid Build Coastguard Worker   }
121*9356374aSAndroid Build Coastguard Worker   for (int i = 128; i < 256; i++) {
122*9356374aSAndroid Build Coastguard Worker     const auto c = static_cast<unsigned char>(i);
123*9356374aSAndroid Build Coastguard Worker     EXPECT_TRUE(!absl::ascii_isascii(c)) << ": failed on " << c;
124*9356374aSAndroid Build Coastguard Worker   }
125*9356374aSAndroid Build Coastguard Worker }
126*9356374aSAndroid Build Coastguard Worker 
127*9356374aSAndroid Build Coastguard Worker // Checks that absl::ascii_isfoo returns the same value as isfoo in the C
128*9356374aSAndroid Build Coastguard Worker // locale.
TEST(AsciiIsFoo,SameAsIsFoo)129*9356374aSAndroid Build Coastguard Worker TEST(AsciiIsFoo, SameAsIsFoo) {
130*9356374aSAndroid Build Coastguard Worker #ifndef __ANDROID__
131*9356374aSAndroid Build Coastguard Worker   // temporarily change locale to C. It should already be C, but just for safety
132*9356374aSAndroid Build Coastguard Worker   const char* old_locale = setlocale(LC_CTYPE, "C");
133*9356374aSAndroid Build Coastguard Worker   ASSERT_TRUE(old_locale != nullptr);
134*9356374aSAndroid Build Coastguard Worker #endif
135*9356374aSAndroid Build Coastguard Worker 
136*9356374aSAndroid Build Coastguard Worker   for (int i = 0; i < 256; i++) {
137*9356374aSAndroid Build Coastguard Worker     const auto c = static_cast<unsigned char>(i);
138*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(isalpha(c) != 0, absl::ascii_isalpha(c)) << c;
139*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(isdigit(c) != 0, absl::ascii_isdigit(c)) << c;
140*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(isalnum(c) != 0, absl::ascii_isalnum(c)) << c;
141*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(isspace(c) != 0, absl::ascii_isspace(c)) << c;
142*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(ispunct(c) != 0, absl::ascii_ispunct(c)) << c;
143*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(isblank(c) != 0, absl::ascii_isblank(c)) << c;
144*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(iscntrl(c) != 0, absl::ascii_iscntrl(c)) << c;
145*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(isxdigit(c) != 0, absl::ascii_isxdigit(c)) << c;
146*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(isprint(c) != 0, absl::ascii_isprint(c)) << c;
147*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(isgraph(c) != 0, absl::ascii_isgraph(c)) << c;
148*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(isupper(c) != 0, absl::ascii_isupper(c)) << c;
149*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(islower(c) != 0, absl::ascii_islower(c)) << c;
150*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(isascii(c) != 0, absl::ascii_isascii(c)) << c;
151*9356374aSAndroid Build Coastguard Worker   }
152*9356374aSAndroid Build Coastguard Worker 
153*9356374aSAndroid Build Coastguard Worker #ifndef __ANDROID__
154*9356374aSAndroid Build Coastguard Worker   // restore the old locale.
155*9356374aSAndroid Build Coastguard Worker   ASSERT_TRUE(setlocale(LC_CTYPE, old_locale));
156*9356374aSAndroid Build Coastguard Worker #endif
157*9356374aSAndroid Build Coastguard Worker }
158*9356374aSAndroid Build Coastguard Worker 
TEST(AsciiToFoo,All)159*9356374aSAndroid Build Coastguard Worker TEST(AsciiToFoo, All) {
160*9356374aSAndroid Build Coastguard Worker #ifndef __ANDROID__
161*9356374aSAndroid Build Coastguard Worker   // temporarily change locale to C. It should already be C, but just for safety
162*9356374aSAndroid Build Coastguard Worker   const char* old_locale = setlocale(LC_CTYPE, "C");
163*9356374aSAndroid Build Coastguard Worker   ASSERT_TRUE(old_locale != nullptr);
164*9356374aSAndroid Build Coastguard Worker #endif
165*9356374aSAndroid Build Coastguard Worker 
166*9356374aSAndroid Build Coastguard Worker   for (int i = 0; i < 256; i++) {
167*9356374aSAndroid Build Coastguard Worker     const auto c = static_cast<unsigned char>(i);
168*9356374aSAndroid Build Coastguard Worker     if (absl::ascii_islower(c))
169*9356374aSAndroid Build Coastguard Worker       EXPECT_EQ(absl::ascii_toupper(c), 'A' + (i - 'a')) << c;
170*9356374aSAndroid Build Coastguard Worker     else
171*9356374aSAndroid Build Coastguard Worker       EXPECT_EQ(absl::ascii_toupper(c), static_cast<char>(i)) << c;
172*9356374aSAndroid Build Coastguard Worker 
173*9356374aSAndroid Build Coastguard Worker     if (absl::ascii_isupper(c))
174*9356374aSAndroid Build Coastguard Worker       EXPECT_EQ(absl::ascii_tolower(c), 'a' + (i - 'A')) << c;
175*9356374aSAndroid Build Coastguard Worker     else
176*9356374aSAndroid Build Coastguard Worker       EXPECT_EQ(absl::ascii_tolower(c), static_cast<char>(i)) << c;
177*9356374aSAndroid Build Coastguard Worker 
178*9356374aSAndroid Build Coastguard Worker     // These CHECKs only hold in a C locale.
179*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(static_cast<char>(tolower(i)), absl::ascii_tolower(c)) << c;
180*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(static_cast<char>(toupper(i)), absl::ascii_toupper(c)) << c;
181*9356374aSAndroid Build Coastguard Worker   }
182*9356374aSAndroid Build Coastguard Worker #ifndef __ANDROID__
183*9356374aSAndroid Build Coastguard Worker   // restore the old locale.
184*9356374aSAndroid Build Coastguard Worker   ASSERT_TRUE(setlocale(LC_CTYPE, old_locale));
185*9356374aSAndroid Build Coastguard Worker #endif
186*9356374aSAndroid Build Coastguard Worker }
187*9356374aSAndroid Build Coastguard Worker 
TEST(AsciiStrTo,Lower)188*9356374aSAndroid Build Coastguard Worker TEST(AsciiStrTo, Lower) {
189*9356374aSAndroid Build Coastguard Worker   const char buf[] = "ABCDEF";
190*9356374aSAndroid Build Coastguard Worker   const std::string str("GHIJKL");
191*9356374aSAndroid Build Coastguard Worker   const std::string str2("MNOPQR");
192*9356374aSAndroid Build Coastguard Worker   const absl::string_view sp(str2);
193*9356374aSAndroid Build Coastguard Worker   const std::string long_str("ABCDEFGHIJKLMNOPQRSTUVWXYZ1!a");
194*9356374aSAndroid Build Coastguard Worker   std::string mutable_str("_`?@[{AMNOPQRSTUVWXYZ");
195*9356374aSAndroid Build Coastguard Worker 
196*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("abcdef", absl::AsciiStrToLower(buf));
197*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("ghijkl", absl::AsciiStrToLower(str));
198*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("mnopqr", absl::AsciiStrToLower(sp));
199*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("abcdefghijklmnopqrstuvwxyz1!a", absl::AsciiStrToLower(long_str));
200*9356374aSAndroid Build Coastguard Worker 
201*9356374aSAndroid Build Coastguard Worker   absl::AsciiStrToLower(&mutable_str);
202*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("_`?@[{amnopqrstuvwxyz", mutable_str);
203*9356374aSAndroid Build Coastguard Worker 
204*9356374aSAndroid Build Coastguard Worker   char mutable_buf[] = "Mutable";
205*9356374aSAndroid Build Coastguard Worker   std::transform(mutable_buf, mutable_buf + strlen(mutable_buf),
206*9356374aSAndroid Build Coastguard Worker                  mutable_buf, absl::ascii_tolower);
207*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ("mutable", mutable_buf);
208*9356374aSAndroid Build Coastguard Worker }
209*9356374aSAndroid Build Coastguard Worker 
TEST(AsciiStrTo,Upper)210*9356374aSAndroid Build Coastguard Worker TEST(AsciiStrTo, Upper) {
211*9356374aSAndroid Build Coastguard Worker   const char buf[] = "abcdef";
212*9356374aSAndroid Build Coastguard Worker   const std::string str("ghijkl");
213*9356374aSAndroid Build Coastguard Worker   const std::string str2("_`?@[{amnopqrstuvwxyz");
214*9356374aSAndroid Build Coastguard Worker   const absl::string_view sp(str2);
215*9356374aSAndroid Build Coastguard Worker   const std::string long_str("abcdefghijklmnopqrstuvwxyz1!A");
216*9356374aSAndroid Build Coastguard Worker 
217*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("ABCDEF", absl::AsciiStrToUpper(buf));
218*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("GHIJKL", absl::AsciiStrToUpper(str));
219*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("_`?@[{AMNOPQRSTUVWXYZ", absl::AsciiStrToUpper(sp));
220*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("ABCDEFGHIJKLMNOPQRSTUVWXYZ1!A", absl::AsciiStrToUpper(long_str));
221*9356374aSAndroid Build Coastguard Worker 
222*9356374aSAndroid Build Coastguard Worker   char mutable_buf[] = "Mutable";
223*9356374aSAndroid Build Coastguard Worker   std::transform(mutable_buf, mutable_buf + strlen(mutable_buf),
224*9356374aSAndroid Build Coastguard Worker                  mutable_buf, absl::ascii_toupper);
225*9356374aSAndroid Build Coastguard Worker   EXPECT_STREQ("MUTABLE", mutable_buf);
226*9356374aSAndroid Build Coastguard Worker }
227*9356374aSAndroid Build Coastguard Worker 
TEST(StripLeadingAsciiWhitespace,FromStringView)228*9356374aSAndroid Build Coastguard Worker TEST(StripLeadingAsciiWhitespace, FromStringView) {
229*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::string_view{},
230*9356374aSAndroid Build Coastguard Worker             absl::StripLeadingAsciiWhitespace(absl::string_view{}));
231*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("foo", absl::StripLeadingAsciiWhitespace({"foo"}));
232*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("foo", absl::StripLeadingAsciiWhitespace({"\t  \n\f\r\n\vfoo"}));
233*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("foo foo\n ",
234*9356374aSAndroid Build Coastguard Worker             absl::StripLeadingAsciiWhitespace({"\t  \n\f\r\n\vfoo foo\n "}));
235*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::string_view{}, absl::StripLeadingAsciiWhitespace(
236*9356374aSAndroid Build Coastguard Worker                                      {"\t  \n\f\r\v\n\t  \n\f\r\v\n"}));
237*9356374aSAndroid Build Coastguard Worker }
238*9356374aSAndroid Build Coastguard Worker 
TEST(StripLeadingAsciiWhitespace,InPlace)239*9356374aSAndroid Build Coastguard Worker TEST(StripLeadingAsciiWhitespace, InPlace) {
240*9356374aSAndroid Build Coastguard Worker   std::string str;
241*9356374aSAndroid Build Coastguard Worker 
242*9356374aSAndroid Build Coastguard Worker   absl::StripLeadingAsciiWhitespace(&str);
243*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("", str);
244*9356374aSAndroid Build Coastguard Worker 
245*9356374aSAndroid Build Coastguard Worker   str = "foo";
246*9356374aSAndroid Build Coastguard Worker   absl::StripLeadingAsciiWhitespace(&str);
247*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("foo", str);
248*9356374aSAndroid Build Coastguard Worker 
249*9356374aSAndroid Build Coastguard Worker   str = "\t  \n\f\r\n\vfoo";
250*9356374aSAndroid Build Coastguard Worker   absl::StripLeadingAsciiWhitespace(&str);
251*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("foo", str);
252*9356374aSAndroid Build Coastguard Worker 
253*9356374aSAndroid Build Coastguard Worker   str = "\t  \n\f\r\n\vfoo foo\n ";
254*9356374aSAndroid Build Coastguard Worker   absl::StripLeadingAsciiWhitespace(&str);
255*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("foo foo\n ", str);
256*9356374aSAndroid Build Coastguard Worker 
257*9356374aSAndroid Build Coastguard Worker   str = "\t  \n\f\r\v\n\t  \n\f\r\v\n";
258*9356374aSAndroid Build Coastguard Worker   absl::StripLeadingAsciiWhitespace(&str);
259*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::string_view{}, str);
260*9356374aSAndroid Build Coastguard Worker }
261*9356374aSAndroid Build Coastguard Worker 
TEST(StripTrailingAsciiWhitespace,FromStringView)262*9356374aSAndroid Build Coastguard Worker TEST(StripTrailingAsciiWhitespace, FromStringView) {
263*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::string_view{},
264*9356374aSAndroid Build Coastguard Worker             absl::StripTrailingAsciiWhitespace(absl::string_view{}));
265*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("foo", absl::StripTrailingAsciiWhitespace({"foo"}));
266*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("foo", absl::StripTrailingAsciiWhitespace({"foo\t  \n\f\r\n\v"}));
267*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(" \nfoo foo",
268*9356374aSAndroid Build Coastguard Worker             absl::StripTrailingAsciiWhitespace({" \nfoo foo\t  \n\f\r\n\v"}));
269*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::string_view{}, absl::StripTrailingAsciiWhitespace(
270*9356374aSAndroid Build Coastguard Worker                                      {"\t  \n\f\r\v\n\t  \n\f\r\v\n"}));
271*9356374aSAndroid Build Coastguard Worker }
272*9356374aSAndroid Build Coastguard Worker 
TEST(StripTrailingAsciiWhitespace,InPlace)273*9356374aSAndroid Build Coastguard Worker TEST(StripTrailingAsciiWhitespace, InPlace) {
274*9356374aSAndroid Build Coastguard Worker   std::string str;
275*9356374aSAndroid Build Coastguard Worker 
276*9356374aSAndroid Build Coastguard Worker   absl::StripTrailingAsciiWhitespace(&str);
277*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("", str);
278*9356374aSAndroid Build Coastguard Worker 
279*9356374aSAndroid Build Coastguard Worker   str = "foo";
280*9356374aSAndroid Build Coastguard Worker   absl::StripTrailingAsciiWhitespace(&str);
281*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("foo", str);
282*9356374aSAndroid Build Coastguard Worker 
283*9356374aSAndroid Build Coastguard Worker   str = "foo\t  \n\f\r\n\v";
284*9356374aSAndroid Build Coastguard Worker   absl::StripTrailingAsciiWhitespace(&str);
285*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("foo", str);
286*9356374aSAndroid Build Coastguard Worker 
287*9356374aSAndroid Build Coastguard Worker   str = " \nfoo foo\t  \n\f\r\n\v";
288*9356374aSAndroid Build Coastguard Worker   absl::StripTrailingAsciiWhitespace(&str);
289*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(" \nfoo foo", str);
290*9356374aSAndroid Build Coastguard Worker 
291*9356374aSAndroid Build Coastguard Worker   str = "\t  \n\f\r\v\n\t  \n\f\r\v\n";
292*9356374aSAndroid Build Coastguard Worker   absl::StripTrailingAsciiWhitespace(&str);
293*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::string_view{}, str);
294*9356374aSAndroid Build Coastguard Worker }
295*9356374aSAndroid Build Coastguard Worker 
TEST(StripAsciiWhitespace,FromStringView)296*9356374aSAndroid Build Coastguard Worker TEST(StripAsciiWhitespace, FromStringView) {
297*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::string_view{},
298*9356374aSAndroid Build Coastguard Worker             absl::StripAsciiWhitespace(absl::string_view{}));
299*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("foo", absl::StripAsciiWhitespace({"foo"}));
300*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("foo",
301*9356374aSAndroid Build Coastguard Worker             absl::StripAsciiWhitespace({"\t  \n\f\r\n\vfoo\t  \n\f\r\n\v"}));
302*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("foo foo", absl::StripAsciiWhitespace(
303*9356374aSAndroid Build Coastguard Worker                            {"\t  \n\f\r\n\vfoo foo\t  \n\f\r\n\v"}));
304*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::string_view{},
305*9356374aSAndroid Build Coastguard Worker             absl::StripAsciiWhitespace({"\t  \n\f\r\v\n\t  \n\f\r\v\n"}));
306*9356374aSAndroid Build Coastguard Worker }
307*9356374aSAndroid Build Coastguard Worker 
TEST(StripAsciiWhitespace,InPlace)308*9356374aSAndroid Build Coastguard Worker TEST(StripAsciiWhitespace, InPlace) {
309*9356374aSAndroid Build Coastguard Worker   std::string str;
310*9356374aSAndroid Build Coastguard Worker 
311*9356374aSAndroid Build Coastguard Worker   absl::StripAsciiWhitespace(&str);
312*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("", str);
313*9356374aSAndroid Build Coastguard Worker 
314*9356374aSAndroid Build Coastguard Worker   str = "foo";
315*9356374aSAndroid Build Coastguard Worker   absl::StripAsciiWhitespace(&str);
316*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("foo", str);
317*9356374aSAndroid Build Coastguard Worker 
318*9356374aSAndroid Build Coastguard Worker   str = "\t  \n\f\r\n\vfoo\t  \n\f\r\n\v";
319*9356374aSAndroid Build Coastguard Worker   absl::StripAsciiWhitespace(&str);
320*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("foo", str);
321*9356374aSAndroid Build Coastguard Worker 
322*9356374aSAndroid Build Coastguard Worker   str = "\t  \n\f\r\n\vfoo foo\t  \n\f\r\n\v";
323*9356374aSAndroid Build Coastguard Worker   absl::StripAsciiWhitespace(&str);
324*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("foo foo", str);
325*9356374aSAndroid Build Coastguard Worker 
326*9356374aSAndroid Build Coastguard Worker   str = "\t  \n\f\r\v\n\t  \n\f\r\v\n";
327*9356374aSAndroid Build Coastguard Worker   absl::StripAsciiWhitespace(&str);
328*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::string_view{}, str);
329*9356374aSAndroid Build Coastguard Worker }
330*9356374aSAndroid Build Coastguard Worker 
TEST(RemoveExtraAsciiWhitespace,InPlace)331*9356374aSAndroid Build Coastguard Worker TEST(RemoveExtraAsciiWhitespace, InPlace) {
332*9356374aSAndroid Build Coastguard Worker   const char* inputs[] = {"No extra space",
333*9356374aSAndroid Build Coastguard Worker                           "  Leading whitespace",
334*9356374aSAndroid Build Coastguard Worker                           "Trailing whitespace  ",
335*9356374aSAndroid Build Coastguard Worker                           "  Leading and trailing  ",
336*9356374aSAndroid Build Coastguard Worker                           " Whitespace \t  in\v   middle  ",
337*9356374aSAndroid Build Coastguard Worker                           "'Eeeeep!  \n Newlines!\n",
338*9356374aSAndroid Build Coastguard Worker                           "nospaces",
339*9356374aSAndroid Build Coastguard Worker                           "",
340*9356374aSAndroid Build Coastguard Worker                           "\n\t a\t\n\nb \t\n"};
341*9356374aSAndroid Build Coastguard Worker 
342*9356374aSAndroid Build Coastguard Worker   const char* outputs[] = {
343*9356374aSAndroid Build Coastguard Worker       "No extra space",
344*9356374aSAndroid Build Coastguard Worker       "Leading whitespace",
345*9356374aSAndroid Build Coastguard Worker       "Trailing whitespace",
346*9356374aSAndroid Build Coastguard Worker       "Leading and trailing",
347*9356374aSAndroid Build Coastguard Worker       "Whitespace in middle",
348*9356374aSAndroid Build Coastguard Worker       "'Eeeeep! Newlines!",
349*9356374aSAndroid Build Coastguard Worker       "nospaces",
350*9356374aSAndroid Build Coastguard Worker       "",
351*9356374aSAndroid Build Coastguard Worker       "a\nb",
352*9356374aSAndroid Build Coastguard Worker   };
353*9356374aSAndroid Build Coastguard Worker   const int NUM_TESTS = ABSL_ARRAYSIZE(inputs);
354*9356374aSAndroid Build Coastguard Worker 
355*9356374aSAndroid Build Coastguard Worker   for (int i = 0; i < NUM_TESTS; i++) {
356*9356374aSAndroid Build Coastguard Worker     std::string s(inputs[i]);
357*9356374aSAndroid Build Coastguard Worker     absl::RemoveExtraAsciiWhitespace(&s);
358*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(outputs[i], s);
359*9356374aSAndroid Build Coastguard Worker   }
360*9356374aSAndroid Build Coastguard Worker }
361*9356374aSAndroid Build Coastguard Worker 
362*9356374aSAndroid Build Coastguard Worker }  // namespace
363