1*61c4878aSAndroid Build Coastguard Worker // Copyright 2021 The Pigweed Authors
2*61c4878aSAndroid Build Coastguard Worker //
3*61c4878aSAndroid Build Coastguard Worker // Licensed under the Apache License, Version 2.0 (the "License"); you may not
4*61c4878aSAndroid Build Coastguard Worker // use this file except in compliance with the License. You may obtain a copy of
5*61c4878aSAndroid Build Coastguard Worker // the License at
6*61c4878aSAndroid Build Coastguard Worker //
7*61c4878aSAndroid Build Coastguard Worker // https://www.apache.org/licenses/LICENSE-2.0
8*61c4878aSAndroid Build Coastguard Worker //
9*61c4878aSAndroid Build Coastguard Worker // Unless required by applicable law or agreed to in writing, software
10*61c4878aSAndroid Build Coastguard Worker // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
11*61c4878aSAndroid Build Coastguard Worker // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
12*61c4878aSAndroid Build Coastguard Worker // License for the specific language governing permissions and limitations under
13*61c4878aSAndroid Build Coastguard Worker // the License.
14*61c4878aSAndroid Build Coastguard Worker
15*61c4878aSAndroid Build Coastguard Worker #include "pw_string/util.h"
16*61c4878aSAndroid Build Coastguard Worker
17*61c4878aSAndroid Build Coastguard Worker #include <cstring>
18*61c4878aSAndroid Build Coastguard Worker
19*61c4878aSAndroid Build Coastguard Worker #include "pw_unit_test/framework.h"
20*61c4878aSAndroid Build Coastguard Worker
21*61c4878aSAndroid Build Coastguard Worker namespace pw::string {
22*61c4878aSAndroid Build Coastguard Worker namespace {
23*61c4878aSAndroid Build Coastguard Worker
24*61c4878aSAndroid Build Coastguard Worker using namespace std::literals::string_view_literals;
25*61c4878aSAndroid Build Coastguard Worker
TEST(ClampedLength,Nullptr_Returns0)26*61c4878aSAndroid Build Coastguard Worker TEST(ClampedLength, Nullptr_Returns0) {
27*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(0u, internal::ClampedLength(nullptr, 100));
28*61c4878aSAndroid Build Coastguard Worker }
29*61c4878aSAndroid Build Coastguard Worker
TEST(ClampedLength,EmptyString_Returns0)30*61c4878aSAndroid Build Coastguard Worker TEST(ClampedLength, EmptyString_Returns0) {
31*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(0u, internal::ClampedLength("", 0));
32*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(0u, internal::ClampedLength("", 100));
33*61c4878aSAndroid Build Coastguard Worker }
34*61c4878aSAndroid Build Coastguard Worker
TEST(ClampedLength,MaxLongerThanString_ReturnsStrlen)35*61c4878aSAndroid Build Coastguard Worker TEST(ClampedLength, MaxLongerThanString_ReturnsStrlen) {
36*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(5u, internal::ClampedLength("12345", 100));
37*61c4878aSAndroid Build Coastguard Worker }
38*61c4878aSAndroid Build Coastguard Worker
TEST(ClampedLength,StringMaxLongerThanMax_ReturnsMax)39*61c4878aSAndroid Build Coastguard Worker TEST(ClampedLength, StringMaxLongerThanMax_ReturnsMax) {
40*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(0u, internal::ClampedLength("12345", 0));
41*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(4u, internal::ClampedLength("12345", 4));
42*61c4878aSAndroid Build Coastguard Worker }
43*61c4878aSAndroid Build Coastguard Worker
TEST(ClampedLength,LengthEqualsMax)44*61c4878aSAndroid Build Coastguard Worker TEST(ClampedLength, LengthEqualsMax) {
45*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(5u, internal::ClampedLength("12345", 5));
46*61c4878aSAndroid Build Coastguard Worker }
47*61c4878aSAndroid Build Coastguard Worker
TEST(ClampedCString,NullPtr_ReturnsEmpty)48*61c4878aSAndroid Build Coastguard Worker TEST(ClampedCString, NullPtr_ReturnsEmpty) {
49*61c4878aSAndroid Build Coastguard Worker EXPECT_TRUE(ClampedCString(nullptr, 100).empty());
50*61c4878aSAndroid Build Coastguard Worker }
51*61c4878aSAndroid Build Coastguard Worker
TEST(ClampedCString,EmptyString_Returns0)52*61c4878aSAndroid Build Coastguard Worker TEST(ClampedCString, EmptyString_Returns0) {
53*61c4878aSAndroid Build Coastguard Worker EXPECT_TRUE(ClampedCString("", 0).empty());
54*61c4878aSAndroid Build Coastguard Worker EXPECT_TRUE(ClampedCString("", 100).empty());
55*61c4878aSAndroid Build Coastguard Worker }
56*61c4878aSAndroid Build Coastguard Worker
TEST(ClampedCString,MaxLongerThanString_ReturnsStr)57*61c4878aSAndroid Build Coastguard Worker TEST(ClampedCString, MaxLongerThanString_ReturnsStr) {
58*61c4878aSAndroid Build Coastguard Worker static constexpr char kInput[] = "12345";
59*61c4878aSAndroid Build Coastguard Worker const std::string_view result = ClampedCString(kInput, 100);
60*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(result.size(), strlen(kInput));
61*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(result.data(), &kInput[0]);
62*61c4878aSAndroid Build Coastguard Worker }
63*61c4878aSAndroid Build Coastguard Worker
TEST(ClampedCString,StringMaxLongerThanMax_ClampsView)64*61c4878aSAndroid Build Coastguard Worker TEST(ClampedCString, StringMaxLongerThanMax_ClampsView) {
65*61c4878aSAndroid Build Coastguard Worker static constexpr char kInput[] = "12345";
66*61c4878aSAndroid Build Coastguard Worker
67*61c4878aSAndroid Build Coastguard Worker EXPECT_TRUE(ClampedCString(kInput, 0).empty());
68*61c4878aSAndroid Build Coastguard Worker
69*61c4878aSAndroid Build Coastguard Worker const std::string_view result = ClampedCString(kInput, 4);
70*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(result.size(), 4u);
71*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(result.data(), &kInput[0]);
72*61c4878aSAndroid Build Coastguard Worker }
73*61c4878aSAndroid Build Coastguard Worker
TEST(ClampedCString,FullStringView)74*61c4878aSAndroid Build Coastguard Worker TEST(ClampedCString, FullStringView) {
75*61c4878aSAndroid Build Coastguard Worker static constexpr char kInput[] = "12345";
76*61c4878aSAndroid Build Coastguard Worker const std::string_view result = ClampedCString(kInput);
77*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(result.size(), strlen(kInput));
78*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(result.data(), &kInput[0]);
79*61c4878aSAndroid Build Coastguard Worker }
80*61c4878aSAndroid Build Coastguard Worker
TEST(NullTerminatedLength,EmptyString_RequiresNullTerminator)81*61c4878aSAndroid Build Coastguard Worker TEST(NullTerminatedLength, EmptyString_RequiresNullTerminator) {
82*61c4878aSAndroid Build Coastguard Worker EXPECT_TRUE(NullTerminatedLength("", 0).status().IsOutOfRange());
83*61c4878aSAndroid Build Coastguard Worker
84*61c4878aSAndroid Build Coastguard Worker ASSERT_TRUE(NullTerminatedLength("", 100).status().ok());
85*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(0u, NullTerminatedLength("", 100).value());
86*61c4878aSAndroid Build Coastguard Worker }
87*61c4878aSAndroid Build Coastguard Worker
TEST(NullTerminatedLength,MaxLongerThanString_ReturnsStrlen)88*61c4878aSAndroid Build Coastguard Worker TEST(NullTerminatedLength, MaxLongerThanString_ReturnsStrlen) {
89*61c4878aSAndroid Build Coastguard Worker ASSERT_TRUE(NullTerminatedLength("12345", 100).status().ok());
90*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(5u, NullTerminatedLength("12345", 100).value());
91*61c4878aSAndroid Build Coastguard Worker }
92*61c4878aSAndroid Build Coastguard Worker
TEST(NullTerminatedLength,StringMaxLongerThanMax_Fails)93*61c4878aSAndroid Build Coastguard Worker TEST(NullTerminatedLength, StringMaxLongerThanMax_Fails) {
94*61c4878aSAndroid Build Coastguard Worker EXPECT_TRUE(NullTerminatedLength("12345", 0).status().IsOutOfRange());
95*61c4878aSAndroid Build Coastguard Worker EXPECT_TRUE(NullTerminatedLength("12345", 4).status().IsOutOfRange());
96*61c4878aSAndroid Build Coastguard Worker }
97*61c4878aSAndroid Build Coastguard Worker
TEST(NullTerminatedLength,LengthEqualsMax)98*61c4878aSAndroid Build Coastguard Worker TEST(NullTerminatedLength, LengthEqualsMax) {
99*61c4878aSAndroid Build Coastguard Worker static constexpr char kInput[] = "12345";
100*61c4878aSAndroid Build Coastguard Worker ASSERT_TRUE(NullTerminatedLength(kInput).ok());
101*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(5u, NullTerminatedLength(kInput).value());
102*61c4878aSAndroid Build Coastguard Worker }
103*61c4878aSAndroid Build Coastguard Worker
104*61c4878aSAndroid Build Coastguard Worker class TestWithBuffer : public ::testing::Test {
105*61c4878aSAndroid Build Coastguard Worker protected:
106*61c4878aSAndroid Build Coastguard Worker static constexpr char kStartingString[] = "!@#$%^&*()!@#$%^&*()";
107*61c4878aSAndroid Build Coastguard Worker
TestWithBuffer()108*61c4878aSAndroid Build Coastguard Worker TestWithBuffer() { std::memcpy(buffer_, kStartingString, sizeof(buffer_)); }
109*61c4878aSAndroid Build Coastguard Worker
110*61c4878aSAndroid Build Coastguard Worker char buffer_[sizeof(kStartingString)];
111*61c4878aSAndroid Build Coastguard Worker };
112*61c4878aSAndroid Build Coastguard Worker
113*61c4878aSAndroid Build Coastguard Worker class CopyTest : public TestWithBuffer {};
114*61c4878aSAndroid Build Coastguard Worker
TEST_F(CopyTest,EmptyStringView_WritesNullTerminator)115*61c4878aSAndroid Build Coastguard Worker TEST_F(CopyTest, EmptyStringView_WritesNullTerminator) {
116*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(0u, Copy("", buffer_).size());
117*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ('\0', buffer_[0]);
118*61c4878aSAndroid Build Coastguard Worker }
119*61c4878aSAndroid Build Coastguard Worker
TEST_F(CopyTest,EmptyBuffer_WritesNothing)120*61c4878aSAndroid Build Coastguard Worker TEST_F(CopyTest, EmptyBuffer_WritesNothing) {
121*61c4878aSAndroid Build Coastguard Worker auto result = Copy("Hello", span(buffer_, 0));
122*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(0u, result.size());
123*61c4878aSAndroid Build Coastguard Worker EXPECT_FALSE(result.ok());
124*61c4878aSAndroid Build Coastguard Worker EXPECT_STREQ(kStartingString, buffer_);
125*61c4878aSAndroid Build Coastguard Worker }
126*61c4878aSAndroid Build Coastguard Worker
TEST_F(CopyTest,TooSmall_Truncates)127*61c4878aSAndroid Build Coastguard Worker TEST_F(CopyTest, TooSmall_Truncates) {
128*61c4878aSAndroid Build Coastguard Worker auto result = Copy("Hi!", span(buffer_, 3));
129*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(2u, result.size());
130*61c4878aSAndroid Build Coastguard Worker EXPECT_FALSE(result.ok());
131*61c4878aSAndroid Build Coastguard Worker EXPECT_STREQ("Hi", buffer_);
132*61c4878aSAndroid Build Coastguard Worker }
133*61c4878aSAndroid Build Coastguard Worker
TEST_F(CopyTest,ExactFit)134*61c4878aSAndroid Build Coastguard Worker TEST_F(CopyTest, ExactFit) {
135*61c4878aSAndroid Build Coastguard Worker auto result = Copy("Hi!", span(buffer_, 4));
136*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(3u, result.size());
137*61c4878aSAndroid Build Coastguard Worker EXPECT_TRUE(result.ok());
138*61c4878aSAndroid Build Coastguard Worker EXPECT_STREQ("Hi!", buffer_);
139*61c4878aSAndroid Build Coastguard Worker }
140*61c4878aSAndroid Build Coastguard Worker
TEST_F(CopyTest,NullTerminatorsInString)141*61c4878aSAndroid Build Coastguard Worker TEST_F(CopyTest, NullTerminatorsInString) {
142*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(4u, Copy("\0!\0\0"sv, span(buffer_, 5)).size());
143*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ("\0!\0\0"sv, std::string_view(buffer_, 4));
144*61c4878aSAndroid Build Coastguard Worker }
145*61c4878aSAndroid Build Coastguard Worker
146*61c4878aSAndroid Build Coastguard Worker class InlineStringUtilTest : public ::testing::Test {
147*61c4878aSAndroid Build Coastguard Worker protected:
148*61c4878aSAndroid Build Coastguard Worker InlineString<5> string_;
149*61c4878aSAndroid Build Coastguard Worker };
150*61c4878aSAndroid Build Coastguard Worker
TEST_F(InlineStringUtilTest,Assign_EmptyStringView_WritesNullTerminator)151*61c4878aSAndroid Build Coastguard Worker TEST_F(InlineStringUtilTest, Assign_EmptyStringView_WritesNullTerminator) {
152*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(OkStatus(), Assign(string_, ""));
153*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(string_, "");
154*61c4878aSAndroid Build Coastguard Worker }
155*61c4878aSAndroid Build Coastguard Worker
TEST_F(InlineStringUtilTest,Assign_EmptyBuffer_WritesNothing)156*61c4878aSAndroid Build Coastguard Worker TEST_F(InlineStringUtilTest, Assign_EmptyBuffer_WritesNothing) {
157*61c4878aSAndroid Build Coastguard Worker InlineString<0> zero_capacity;
158*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(Status::ResourceExhausted(), Assign(zero_capacity, "Hello"));
159*61c4878aSAndroid Build Coastguard Worker EXPECT_TRUE(zero_capacity.empty());
160*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(zero_capacity.c_str()[0], '\0');
161*61c4878aSAndroid Build Coastguard Worker }
162*61c4878aSAndroid Build Coastguard Worker
TEST_F(InlineStringUtilTest,Assign_TooSmall_Truncates)163*61c4878aSAndroid Build Coastguard Worker TEST_F(InlineStringUtilTest, Assign_TooSmall_Truncates) {
164*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(Status::ResourceExhausted(), Assign(string_, "12345HELLO?"));
165*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ("12345", string_);
166*61c4878aSAndroid Build Coastguard Worker }
167*61c4878aSAndroid Build Coastguard Worker
TEST_F(InlineStringUtilTest,Assign_ExactFit)168*61c4878aSAndroid Build Coastguard Worker TEST_F(InlineStringUtilTest, Assign_ExactFit) {
169*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(OkStatus(), Assign(string_, "12345"));
170*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ("12345", string_);
171*61c4878aSAndroid Build Coastguard Worker }
172*61c4878aSAndroid Build Coastguard Worker
TEST_F(InlineStringUtilTest,Assign_NullTerminatorsInString)173*61c4878aSAndroid Build Coastguard Worker TEST_F(InlineStringUtilTest, Assign_NullTerminatorsInString) {
174*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(OkStatus(), Assign(string_, "\0!\0\0\0"sv));
175*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ("\0!\0\0\0"sv, string_);
176*61c4878aSAndroid Build Coastguard Worker }
177*61c4878aSAndroid Build Coastguard Worker
TEST_F(InlineStringUtilTest,Assign_ExistingContent_Replaces)178*61c4878aSAndroid Build Coastguard Worker TEST_F(InlineStringUtilTest, Assign_ExistingContent_Replaces) {
179*61c4878aSAndroid Build Coastguard Worker string_ = "12345";
180*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(OkStatus(), Assign(string_, ""));
181*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ("", string_);
182*61c4878aSAndroid Build Coastguard Worker }
183*61c4878aSAndroid Build Coastguard Worker
TEST_F(InlineStringUtilTest,Assign_ExistingContent_ExactFit)184*61c4878aSAndroid Build Coastguard Worker TEST_F(InlineStringUtilTest, Assign_ExistingContent_ExactFit) {
185*61c4878aSAndroid Build Coastguard Worker string_.append("yo");
186*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(OkStatus(), Assign(string_, "12345"));
187*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ("12345", string_);
188*61c4878aSAndroid Build Coastguard Worker }
189*61c4878aSAndroid Build Coastguard Worker
TEST_F(InlineStringUtilTest,Assign_ExistingContent_Truncates)190*61c4878aSAndroid Build Coastguard Worker TEST_F(InlineStringUtilTest, Assign_ExistingContent_Truncates) {
191*61c4878aSAndroid Build Coastguard Worker string_.append("yo");
192*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(Status::ResourceExhausted(), Assign(string_, "1234567"));
193*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ("12345", string_);
194*61c4878aSAndroid Build Coastguard Worker }
195*61c4878aSAndroid Build Coastguard Worker
TEST_F(InlineStringUtilTest,Append_EmptyStringView_WritesNullTerminator)196*61c4878aSAndroid Build Coastguard Worker TEST_F(InlineStringUtilTest, Append_EmptyStringView_WritesNullTerminator) {
197*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(OkStatus(), Append(string_, ""));
198*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(string_, "");
199*61c4878aSAndroid Build Coastguard Worker }
200*61c4878aSAndroid Build Coastguard Worker
TEST_F(InlineStringUtilTest,Append_EmptyBuffer_WritesNothing)201*61c4878aSAndroid Build Coastguard Worker TEST_F(InlineStringUtilTest, Append_EmptyBuffer_WritesNothing) {
202*61c4878aSAndroid Build Coastguard Worker InlineString<0> zero_capacity;
203*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(Status::ResourceExhausted(), Append(zero_capacity, "Hello"));
204*61c4878aSAndroid Build Coastguard Worker EXPECT_TRUE(zero_capacity.empty());
205*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(zero_capacity.c_str()[0], '\0');
206*61c4878aSAndroid Build Coastguard Worker }
207*61c4878aSAndroid Build Coastguard Worker
TEST_F(InlineStringUtilTest,Append_TooSmall_Truncates)208*61c4878aSAndroid Build Coastguard Worker TEST_F(InlineStringUtilTest, Append_TooSmall_Truncates) {
209*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(Status::ResourceExhausted(), Append(string_, "12345HELLO?"));
210*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ("12345", string_);
211*61c4878aSAndroid Build Coastguard Worker }
212*61c4878aSAndroid Build Coastguard Worker
TEST_F(InlineStringUtilTest,Append_ExactFit)213*61c4878aSAndroid Build Coastguard Worker TEST_F(InlineStringUtilTest, Append_ExactFit) {
214*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(OkStatus(), Append(string_, "12345"));
215*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ("12345", string_);
216*61c4878aSAndroid Build Coastguard Worker }
217*61c4878aSAndroid Build Coastguard Worker
TEST_F(InlineStringUtilTest,Append_NullTerminatorsInString)218*61c4878aSAndroid Build Coastguard Worker TEST_F(InlineStringUtilTest, Append_NullTerminatorsInString) {
219*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(OkStatus(), Append(string_, "\0!\0\0\0"sv));
220*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ("\0!\0\0\0"sv, string_);
221*61c4878aSAndroid Build Coastguard Worker }
222*61c4878aSAndroid Build Coastguard Worker
TEST_F(InlineStringUtilTest,Append_ExistingContent_AppendNothing)223*61c4878aSAndroid Build Coastguard Worker TEST_F(InlineStringUtilTest, Append_ExistingContent_AppendNothing) {
224*61c4878aSAndroid Build Coastguard Worker string_ = "12345";
225*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(OkStatus(), Append(string_, ""));
226*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ("12345", string_);
227*61c4878aSAndroid Build Coastguard Worker }
228*61c4878aSAndroid Build Coastguard Worker
TEST_F(InlineStringUtilTest,Append_ExistingContent_ExactFit)229*61c4878aSAndroid Build Coastguard Worker TEST_F(InlineStringUtilTest, Append_ExistingContent_ExactFit) {
230*61c4878aSAndroid Build Coastguard Worker string_.append("yo");
231*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(OkStatus(), Append(string_, "123"));
232*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ("yo123", string_);
233*61c4878aSAndroid Build Coastguard Worker }
234*61c4878aSAndroid Build Coastguard Worker
TEST_F(InlineStringUtilTest,Append_ExistingContent_Truncates)235*61c4878aSAndroid Build Coastguard Worker TEST_F(InlineStringUtilTest, Append_ExistingContent_Truncates) {
236*61c4878aSAndroid Build Coastguard Worker string_.append("yo");
237*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(Status::ResourceExhausted(), Append(string_, "12345"));
238*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ("yo123", string_);
239*61c4878aSAndroid Build Coastguard Worker }
240*61c4878aSAndroid Build Coastguard Worker
241*61c4878aSAndroid Build Coastguard Worker class PrintableCopyTest : public TestWithBuffer {};
242*61c4878aSAndroid Build Coastguard Worker
TEST_F(PrintableCopyTest,EmptyBuffer_WritesNothing)243*61c4878aSAndroid Build Coastguard Worker TEST_F(PrintableCopyTest, EmptyBuffer_WritesNothing) {
244*61c4878aSAndroid Build Coastguard Worker auto result = PrintableCopy("Hello", span(buffer_, 0));
245*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(0u, result.size());
246*61c4878aSAndroid Build Coastguard Worker EXPECT_FALSE(result.ok());
247*61c4878aSAndroid Build Coastguard Worker EXPECT_STREQ(kStartingString, buffer_);
248*61c4878aSAndroid Build Coastguard Worker }
249*61c4878aSAndroid Build Coastguard Worker
TEST_F(PrintableCopyTest,TooSmall_Truncates)250*61c4878aSAndroid Build Coastguard Worker TEST_F(PrintableCopyTest, TooSmall_Truncates) {
251*61c4878aSAndroid Build Coastguard Worker auto result = PrintableCopy("Hi!", span(buffer_, 3));
252*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(2u, result.size());
253*61c4878aSAndroid Build Coastguard Worker EXPECT_FALSE(result.ok());
254*61c4878aSAndroid Build Coastguard Worker EXPECT_STREQ("Hi", buffer_);
255*61c4878aSAndroid Build Coastguard Worker }
256*61c4878aSAndroid Build Coastguard Worker
TEST_F(PrintableCopyTest,ExactFit)257*61c4878aSAndroid Build Coastguard Worker TEST_F(PrintableCopyTest, ExactFit) {
258*61c4878aSAndroid Build Coastguard Worker auto result = PrintableCopy("Hi!", span(buffer_, 4));
259*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(3u, result.size());
260*61c4878aSAndroid Build Coastguard Worker EXPECT_TRUE(result.ok());
261*61c4878aSAndroid Build Coastguard Worker EXPECT_STREQ("Hi!", buffer_);
262*61c4878aSAndroid Build Coastguard Worker }
263*61c4878aSAndroid Build Coastguard Worker
TEST_F(PrintableCopyTest,StartingString)264*61c4878aSAndroid Build Coastguard Worker TEST_F(PrintableCopyTest, StartingString) {
265*61c4878aSAndroid Build Coastguard Worker memset(buffer_, '\0', sizeof(buffer_));
266*61c4878aSAndroid Build Coastguard Worker auto result = PrintableCopy(kStartingString, span(buffer_));
267*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(sizeof(kStartingString) - 1, result.size());
268*61c4878aSAndroid Build Coastguard Worker EXPECT_TRUE(result.ok());
269*61c4878aSAndroid Build Coastguard Worker EXPECT_STREQ(kStartingString, buffer_);
270*61c4878aSAndroid Build Coastguard Worker }
271*61c4878aSAndroid Build Coastguard Worker
TEST_F(PrintableCopyTest,NullTerminatorsInString)272*61c4878aSAndroid Build Coastguard Worker TEST_F(PrintableCopyTest, NullTerminatorsInString) {
273*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(4u, PrintableCopy("\0!\0\0"sv, span(buffer_, 5)).size());
274*61c4878aSAndroid Build Coastguard Worker EXPECT_STREQ(".!..", buffer_);
275*61c4878aSAndroid Build Coastguard Worker }
276*61c4878aSAndroid Build Coastguard Worker
TEST_F(PrintableCopyTest,ControlCharsInString)277*61c4878aSAndroid Build Coastguard Worker TEST_F(PrintableCopyTest, ControlCharsInString) {
278*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(
279*61c4878aSAndroid Build Coastguard Worker 14u,
280*61c4878aSAndroid Build Coastguard Worker PrintableCopy("\n!\t\n\x10\x7F\xFF\vabcd\b\r"sv, span(buffer_)).size());
281*61c4878aSAndroid Build Coastguard Worker EXPECT_STREQ(".!......abcd..", buffer_);
282*61c4878aSAndroid Build Coastguard Worker }
283*61c4878aSAndroid Build Coastguard Worker
284*61c4878aSAndroid Build Coastguard Worker } // namespace
285*61c4878aSAndroid Build Coastguard Worker } // namespace pw::string
286