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 // This file contains functions that remove a defined part from the string,
16*9356374aSAndroid Build Coastguard Worker // i.e., strip the string.
17*9356374aSAndroid Build Coastguard Worker
18*9356374aSAndroid Build Coastguard Worker #include "absl/strings/strip.h"
19*9356374aSAndroid Build Coastguard Worker
20*9356374aSAndroid Build Coastguard Worker #include <cassert>
21*9356374aSAndroid Build Coastguard Worker #include <cstdio>
22*9356374aSAndroid Build Coastguard Worker #include <cstring>
23*9356374aSAndroid Build Coastguard Worker
24*9356374aSAndroid Build Coastguard Worker #include "gmock/gmock.h"
25*9356374aSAndroid Build Coastguard Worker #include "gtest/gtest.h"
26*9356374aSAndroid Build Coastguard Worker #include "absl/strings/string_view.h"
27*9356374aSAndroid Build Coastguard Worker
28*9356374aSAndroid Build Coastguard Worker namespace {
29*9356374aSAndroid Build Coastguard Worker
TEST(Strip,ConsumePrefixOneChar)30*9356374aSAndroid Build Coastguard Worker TEST(Strip, ConsumePrefixOneChar) {
31*9356374aSAndroid Build Coastguard Worker absl::string_view input("abc");
32*9356374aSAndroid Build Coastguard Worker EXPECT_TRUE(absl::ConsumePrefix(&input, "a"));
33*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(input, "bc");
34*9356374aSAndroid Build Coastguard Worker
35*9356374aSAndroid Build Coastguard Worker EXPECT_FALSE(absl::ConsumePrefix(&input, "x"));
36*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(input, "bc");
37*9356374aSAndroid Build Coastguard Worker
38*9356374aSAndroid Build Coastguard Worker EXPECT_TRUE(absl::ConsumePrefix(&input, "b"));
39*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(input, "c");
40*9356374aSAndroid Build Coastguard Worker
41*9356374aSAndroid Build Coastguard Worker EXPECT_TRUE(absl::ConsumePrefix(&input, "c"));
42*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(input, "");
43*9356374aSAndroid Build Coastguard Worker
44*9356374aSAndroid Build Coastguard Worker EXPECT_FALSE(absl::ConsumePrefix(&input, "a"));
45*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(input, "");
46*9356374aSAndroid Build Coastguard Worker }
47*9356374aSAndroid Build Coastguard Worker
TEST(Strip,ConsumePrefix)48*9356374aSAndroid Build Coastguard Worker TEST(Strip, ConsumePrefix) {
49*9356374aSAndroid Build Coastguard Worker absl::string_view input("abcdef");
50*9356374aSAndroid Build Coastguard Worker EXPECT_FALSE(absl::ConsumePrefix(&input, "abcdefg"));
51*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(input, "abcdef");
52*9356374aSAndroid Build Coastguard Worker
53*9356374aSAndroid Build Coastguard Worker EXPECT_FALSE(absl::ConsumePrefix(&input, "abce"));
54*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(input, "abcdef");
55*9356374aSAndroid Build Coastguard Worker
56*9356374aSAndroid Build Coastguard Worker EXPECT_TRUE(absl::ConsumePrefix(&input, ""));
57*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(input, "abcdef");
58*9356374aSAndroid Build Coastguard Worker
59*9356374aSAndroid Build Coastguard Worker EXPECT_FALSE(absl::ConsumePrefix(&input, "abcdeg"));
60*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(input, "abcdef");
61*9356374aSAndroid Build Coastguard Worker
62*9356374aSAndroid Build Coastguard Worker EXPECT_TRUE(absl::ConsumePrefix(&input, "abcdef"));
63*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(input, "");
64*9356374aSAndroid Build Coastguard Worker
65*9356374aSAndroid Build Coastguard Worker input = "abcdef";
66*9356374aSAndroid Build Coastguard Worker EXPECT_TRUE(absl::ConsumePrefix(&input, "abcde"));
67*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(input, "f");
68*9356374aSAndroid Build Coastguard Worker }
69*9356374aSAndroid Build Coastguard Worker
TEST(Strip,ConsumeSuffix)70*9356374aSAndroid Build Coastguard Worker TEST(Strip, ConsumeSuffix) {
71*9356374aSAndroid Build Coastguard Worker absl::string_view input("abcdef");
72*9356374aSAndroid Build Coastguard Worker EXPECT_FALSE(absl::ConsumeSuffix(&input, "abcdefg"));
73*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(input, "abcdef");
74*9356374aSAndroid Build Coastguard Worker
75*9356374aSAndroid Build Coastguard Worker EXPECT_TRUE(absl::ConsumeSuffix(&input, ""));
76*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(input, "abcdef");
77*9356374aSAndroid Build Coastguard Worker
78*9356374aSAndroid Build Coastguard Worker EXPECT_TRUE(absl::ConsumeSuffix(&input, "def"));
79*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(input, "abc");
80*9356374aSAndroid Build Coastguard Worker
81*9356374aSAndroid Build Coastguard Worker input = "abcdef";
82*9356374aSAndroid Build Coastguard Worker EXPECT_FALSE(absl::ConsumeSuffix(&input, "abcdeg"));
83*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(input, "abcdef");
84*9356374aSAndroid Build Coastguard Worker
85*9356374aSAndroid Build Coastguard Worker EXPECT_TRUE(absl::ConsumeSuffix(&input, "f"));
86*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(input, "abcde");
87*9356374aSAndroid Build Coastguard Worker
88*9356374aSAndroid Build Coastguard Worker EXPECT_TRUE(absl::ConsumeSuffix(&input, "abcde"));
89*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(input, "");
90*9356374aSAndroid Build Coastguard Worker }
91*9356374aSAndroid Build Coastguard Worker
TEST(Strip,StripPrefix)92*9356374aSAndroid Build Coastguard Worker TEST(Strip, StripPrefix) {
93*9356374aSAndroid Build Coastguard Worker const absl::string_view null_str;
94*9356374aSAndroid Build Coastguard Worker
95*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(absl::StripPrefix("foobar", "foo"), "bar");
96*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(absl::StripPrefix("foobar", ""), "foobar");
97*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(absl::StripPrefix("foobar", null_str), "foobar");
98*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(absl::StripPrefix("foobar", "foobar"), "");
99*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(absl::StripPrefix("foobar", "bar"), "foobar");
100*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(absl::StripPrefix("foobar", "foobarr"), "foobar");
101*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(absl::StripPrefix("", ""), "");
102*9356374aSAndroid Build Coastguard Worker }
103*9356374aSAndroid Build Coastguard Worker
TEST(Strip,StripSuffix)104*9356374aSAndroid Build Coastguard Worker TEST(Strip, StripSuffix) {
105*9356374aSAndroid Build Coastguard Worker const absl::string_view null_str;
106*9356374aSAndroid Build Coastguard Worker
107*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(absl::StripSuffix("foobar", "bar"), "foo");
108*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(absl::StripSuffix("foobar", ""), "foobar");
109*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(absl::StripSuffix("foobar", null_str), "foobar");
110*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(absl::StripSuffix("foobar", "foobar"), "");
111*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(absl::StripSuffix("foobar", "foo"), "foobar");
112*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(absl::StripSuffix("foobar", "ffoobar"), "foobar");
113*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(absl::StripSuffix("", ""), "");
114*9356374aSAndroid Build Coastguard Worker }
115*9356374aSAndroid Build Coastguard Worker
TEST(Strip,RemoveExtraAsciiWhitespace)116*9356374aSAndroid Build Coastguard Worker TEST(Strip, RemoveExtraAsciiWhitespace) {
117*9356374aSAndroid Build Coastguard Worker const char* inputs[] = {
118*9356374aSAndroid Build Coastguard Worker "No extra space",
119*9356374aSAndroid Build Coastguard Worker " Leading whitespace",
120*9356374aSAndroid Build Coastguard Worker "Trailing whitespace ",
121*9356374aSAndroid Build Coastguard Worker " Leading and trailing ",
122*9356374aSAndroid Build Coastguard Worker " Whitespace \t in\v middle ",
123*9356374aSAndroid Build Coastguard Worker "'Eeeeep! \n Newlines!\n",
124*9356374aSAndroid Build Coastguard Worker "nospaces",
125*9356374aSAndroid Build Coastguard Worker };
126*9356374aSAndroid Build Coastguard Worker const char* outputs[] = {
127*9356374aSAndroid Build Coastguard Worker "No extra space",
128*9356374aSAndroid Build Coastguard Worker "Leading whitespace",
129*9356374aSAndroid Build Coastguard Worker "Trailing whitespace",
130*9356374aSAndroid Build Coastguard Worker "Leading and trailing",
131*9356374aSAndroid Build Coastguard Worker "Whitespace in middle",
132*9356374aSAndroid Build Coastguard Worker "'Eeeeep! Newlines!",
133*9356374aSAndroid Build Coastguard Worker "nospaces",
134*9356374aSAndroid Build Coastguard Worker };
135*9356374aSAndroid Build Coastguard Worker int NUM_TESTS = 7;
136*9356374aSAndroid Build Coastguard Worker
137*9356374aSAndroid Build Coastguard Worker for (int i = 0; i < NUM_TESTS; i++) {
138*9356374aSAndroid Build Coastguard Worker std::string s(inputs[i]);
139*9356374aSAndroid Build Coastguard Worker absl::RemoveExtraAsciiWhitespace(&s);
140*9356374aSAndroid Build Coastguard Worker EXPECT_STREQ(outputs[i], s.c_str());
141*9356374aSAndroid Build Coastguard Worker }
142*9356374aSAndroid Build Coastguard Worker
143*9356374aSAndroid Build Coastguard Worker // Test that absl::RemoveExtraAsciiWhitespace returns immediately for empty
144*9356374aSAndroid Build Coastguard Worker // strings (It was adding the \0 character to the C++ std::string, which broke
145*9356374aSAndroid Build Coastguard Worker // tests involving empty())
146*9356374aSAndroid Build Coastguard Worker std::string zero_string = "";
147*9356374aSAndroid Build Coastguard Worker assert(zero_string.empty());
148*9356374aSAndroid Build Coastguard Worker absl::RemoveExtraAsciiWhitespace(&zero_string);
149*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(zero_string.size(), 0);
150*9356374aSAndroid Build Coastguard Worker EXPECT_TRUE(zero_string.empty());
151*9356374aSAndroid Build Coastguard Worker }
152*9356374aSAndroid Build Coastguard Worker
TEST(Strip,StripTrailingAsciiWhitespace)153*9356374aSAndroid Build Coastguard Worker TEST(Strip, StripTrailingAsciiWhitespace) {
154*9356374aSAndroid Build Coastguard Worker std::string test = "foo ";
155*9356374aSAndroid Build Coastguard Worker absl::StripTrailingAsciiWhitespace(&test);
156*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(test, "foo");
157*9356374aSAndroid Build Coastguard Worker
158*9356374aSAndroid Build Coastguard Worker test = " ";
159*9356374aSAndroid Build Coastguard Worker absl::StripTrailingAsciiWhitespace(&test);
160*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(test, "");
161*9356374aSAndroid Build Coastguard Worker
162*9356374aSAndroid Build Coastguard Worker test = "";
163*9356374aSAndroid Build Coastguard Worker absl::StripTrailingAsciiWhitespace(&test);
164*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(test, "");
165*9356374aSAndroid Build Coastguard Worker
166*9356374aSAndroid Build Coastguard Worker test = " abc\t";
167*9356374aSAndroid Build Coastguard Worker absl::StripTrailingAsciiWhitespace(&test);
168*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(test, " abc");
169*9356374aSAndroid Build Coastguard Worker }
170*9356374aSAndroid Build Coastguard Worker
TEST(String,StripLeadingAsciiWhitespace)171*9356374aSAndroid Build Coastguard Worker TEST(String, StripLeadingAsciiWhitespace) {
172*9356374aSAndroid Build Coastguard Worker absl::string_view orig = "\t \n\f\r\n\vfoo";
173*9356374aSAndroid Build Coastguard Worker EXPECT_EQ("foo", absl::StripLeadingAsciiWhitespace(orig));
174*9356374aSAndroid Build Coastguard Worker orig = "\t \n\f\r\v\n\t \n\f\r\v\n";
175*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(absl::string_view(), absl::StripLeadingAsciiWhitespace(orig));
176*9356374aSAndroid Build Coastguard Worker }
177*9356374aSAndroid Build Coastguard Worker
TEST(Strip,StripAsciiWhitespace)178*9356374aSAndroid Build Coastguard Worker TEST(Strip, StripAsciiWhitespace) {
179*9356374aSAndroid Build Coastguard Worker std::string test2 = "\t \f\r\n\vfoo \t\f\r\v\n";
180*9356374aSAndroid Build Coastguard Worker absl::StripAsciiWhitespace(&test2);
181*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(test2, "foo");
182*9356374aSAndroid Build Coastguard Worker std::string test3 = "bar";
183*9356374aSAndroid Build Coastguard Worker absl::StripAsciiWhitespace(&test3);
184*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(test3, "bar");
185*9356374aSAndroid Build Coastguard Worker std::string test4 = "\t \f\r\n\vfoo";
186*9356374aSAndroid Build Coastguard Worker absl::StripAsciiWhitespace(&test4);
187*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(test4, "foo");
188*9356374aSAndroid Build Coastguard Worker std::string test5 = "foo \t\f\r\v\n";
189*9356374aSAndroid Build Coastguard Worker absl::StripAsciiWhitespace(&test5);
190*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(test5, "foo");
191*9356374aSAndroid Build Coastguard Worker absl::string_view test6("\t \f\r\n\vfoo \t\f\r\v\n");
192*9356374aSAndroid Build Coastguard Worker test6 = absl::StripAsciiWhitespace(test6);
193*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(test6, "foo");
194*9356374aSAndroid Build Coastguard Worker test6 = absl::StripAsciiWhitespace(test6);
195*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(test6, "foo"); // already stripped
196*9356374aSAndroid Build Coastguard Worker }
197*9356374aSAndroid Build Coastguard Worker
198*9356374aSAndroid Build Coastguard Worker } // namespace
199