xref: /aosp_15_r20/external/pigweed/pw_string/format_test.cc (revision 61c4878ac05f98d0ceed94b57d316916de578985)
1*61c4878aSAndroid Build Coastguard Worker // Copyright 2019 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/format.h"
16*61c4878aSAndroid Build Coastguard Worker 
17*61c4878aSAndroid Build Coastguard Worker #include <cstdarg>
18*61c4878aSAndroid Build Coastguard Worker 
19*61c4878aSAndroid Build Coastguard Worker #include "pw_span/span.h"
20*61c4878aSAndroid Build Coastguard Worker #include "pw_unit_test/framework.h"
21*61c4878aSAndroid Build Coastguard Worker 
22*61c4878aSAndroid Build Coastguard Worker namespace pw::string {
23*61c4878aSAndroid Build Coastguard Worker namespace {
24*61c4878aSAndroid Build Coastguard Worker 
TEST(Format,ValidFormatString_Succeeds)25*61c4878aSAndroid Build Coastguard Worker TEST(Format, ValidFormatString_Succeeds) {
26*61c4878aSAndroid Build Coastguard Worker   char buffer[32];
27*61c4878aSAndroid Build Coastguard Worker   auto result = Format(buffer, "-_-");
28*61c4878aSAndroid Build Coastguard Worker 
29*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(OkStatus(), result.status());
30*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(3u, result.size());
31*61c4878aSAndroid Build Coastguard Worker   EXPECT_STREQ("-_-", buffer);
32*61c4878aSAndroid Build Coastguard Worker }
33*61c4878aSAndroid Build Coastguard Worker 
TEST(Format,ValidFormatStringAndArguments_Succeeds)34*61c4878aSAndroid Build Coastguard Worker TEST(Format, ValidFormatStringAndArguments_Succeeds) {
35*61c4878aSAndroid Build Coastguard Worker   char buffer[32];
36*61c4878aSAndroid Build Coastguard Worker   auto result = Format(buffer, "%d4%s", 123, "5");
37*61c4878aSAndroid Build Coastguard Worker 
38*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(OkStatus(), result.status());
39*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(5u, result.size());
40*61c4878aSAndroid Build Coastguard Worker   EXPECT_STREQ("12345", buffer);
41*61c4878aSAndroid Build Coastguard Worker }
42*61c4878aSAndroid Build Coastguard Worker 
TEST(Format,EmptyBuffer_ReturnsResourceExhausted)43*61c4878aSAndroid Build Coastguard Worker TEST(Format, EmptyBuffer_ReturnsResourceExhausted) {
44*61c4878aSAndroid Build Coastguard Worker   auto result = Format(span<char>(), "?");
45*61c4878aSAndroid Build Coastguard Worker 
46*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(Status::ResourceExhausted(), result.status());
47*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(0u, result.size());
48*61c4878aSAndroid Build Coastguard Worker }
49*61c4878aSAndroid Build Coastguard Worker 
TEST(Format,FormatLargerThanBuffer_ReturnsResourceExhausted)50*61c4878aSAndroid Build Coastguard Worker TEST(Format, FormatLargerThanBuffer_ReturnsResourceExhausted) {
51*61c4878aSAndroid Build Coastguard Worker   char buffer[5];
52*61c4878aSAndroid Build Coastguard Worker   auto result = Format(buffer, "2big!");
53*61c4878aSAndroid Build Coastguard Worker 
54*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(Status::ResourceExhausted(), result.status());
55*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(4u, result.size());
56*61c4878aSAndroid Build Coastguard Worker   EXPECT_STREQ("2big", buffer);
57*61c4878aSAndroid Build Coastguard Worker }
58*61c4878aSAndroid Build Coastguard Worker 
TEST(Format,ArgumentLargerThanBuffer_ReturnsResourceExhausted)59*61c4878aSAndroid Build Coastguard Worker TEST(Format, ArgumentLargerThanBuffer_ReturnsResourceExhausted) {
60*61c4878aSAndroid Build Coastguard Worker   char buffer[5];
61*61c4878aSAndroid Build Coastguard Worker   auto result = Format(buffer, "%s", "2big!");
62*61c4878aSAndroid Build Coastguard Worker 
63*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(Status::ResourceExhausted(), result.status());
64*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(4u, result.size());
65*61c4878aSAndroid Build Coastguard Worker   EXPECT_STREQ("2big", buffer);
66*61c4878aSAndroid Build Coastguard Worker }
67*61c4878aSAndroid Build Coastguard Worker 
68*61c4878aSAndroid Build Coastguard Worker PW_PRINTF_FORMAT(2, 3)
CallFormatWithVaList(span<char> buffer,const char * fmt,...)69*61c4878aSAndroid Build Coastguard Worker StatusWithSize CallFormatWithVaList(span<char> buffer, const char* fmt, ...) {
70*61c4878aSAndroid Build Coastguard Worker   va_list args;
71*61c4878aSAndroid Build Coastguard Worker   va_start(args, fmt);
72*61c4878aSAndroid Build Coastguard Worker 
73*61c4878aSAndroid Build Coastguard Worker   StatusWithSize result = FormatVaList(buffer, fmt, args);
74*61c4878aSAndroid Build Coastguard Worker 
75*61c4878aSAndroid Build Coastguard Worker   va_end(args);
76*61c4878aSAndroid Build Coastguard Worker   return result;
77*61c4878aSAndroid Build Coastguard Worker }
78*61c4878aSAndroid Build Coastguard Worker 
TEST(Format,CallFormatWithVaList_CallsCorrectFormatOverload)79*61c4878aSAndroid Build Coastguard Worker TEST(Format, CallFormatWithVaList_CallsCorrectFormatOverload) {
80*61c4878aSAndroid Build Coastguard Worker   char buffer[8];
81*61c4878aSAndroid Build Coastguard Worker   auto result = CallFormatWithVaList(buffer, "Yo%s", "?!");
82*61c4878aSAndroid Build Coastguard Worker 
83*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(OkStatus(), result.status());
84*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(4u, result.size());
85*61c4878aSAndroid Build Coastguard Worker   EXPECT_STREQ("Yo?!", buffer);
86*61c4878aSAndroid Build Coastguard Worker }
87*61c4878aSAndroid Build Coastguard Worker 
TEST(FormatString,Append)88*61c4878aSAndroid Build Coastguard Worker TEST(FormatString, Append) {
89*61c4878aSAndroid Build Coastguard Worker   InlineString<6> string;
90*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(OkStatus(), Format(string, "-_-"));
91*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ("-_-", string);
92*61c4878aSAndroid Build Coastguard Worker 
93*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(OkStatus(), Format(string, "%d", 123));
94*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ("-_-123", string);
95*61c4878aSAndroid Build Coastguard Worker 
96*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(Status::ResourceExhausted(), Format(string, "%d", 1));
97*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ("-_-123", string);
98*61c4878aSAndroid Build Coastguard Worker }
99*61c4878aSAndroid Build Coastguard Worker 
TEST(FormatString,EmptyString)100*61c4878aSAndroid Build Coastguard Worker TEST(FormatString, EmptyString) {
101*61c4878aSAndroid Build Coastguard Worker   InlineString<0> string;
102*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(Status::ResourceExhausted(), Format(string, "-_-"));
103*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ("", string);
104*61c4878aSAndroid Build Coastguard Worker }
105*61c4878aSAndroid Build Coastguard Worker 
TEST(FormatString,Truncates)106*61c4878aSAndroid Build Coastguard Worker TEST(FormatString, Truncates) {
107*61c4878aSAndroid Build Coastguard Worker   InlineString<5> string;
108*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(Status::ResourceExhausted(), Format(string, "1%s", "23456"));
109*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ("12345", string);
110*61c4878aSAndroid Build Coastguard Worker }
111*61c4878aSAndroid Build Coastguard Worker 
TEST(FormatString,Overwrite)112*61c4878aSAndroid Build Coastguard Worker TEST(FormatString, Overwrite) {
113*61c4878aSAndroid Build Coastguard Worker   InlineString<6> string("???");
114*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(OkStatus(), FormatOverwrite(string, "-_-"));
115*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ("-_-", string);
116*61c4878aSAndroid Build Coastguard Worker }
117*61c4878aSAndroid Build Coastguard Worker 
118*61c4878aSAndroid Build Coastguard Worker template <Status (&kFunction)(InlineString<>&, const char*, va_list)>
119*61c4878aSAndroid Build Coastguard Worker PW_PRINTF_FORMAT(2, 3)
CallInlineString(InlineString<> & string,const char * fmt,...)120*61c4878aSAndroid Build Coastguard Worker Status CallInlineString(InlineString<>& string, const char* fmt, ...) {
121*61c4878aSAndroid Build Coastguard Worker   va_list args;
122*61c4878aSAndroid Build Coastguard Worker   va_start(args, fmt);
123*61c4878aSAndroid Build Coastguard Worker 
124*61c4878aSAndroid Build Coastguard Worker   Status result = kFunction(string, fmt, args);
125*61c4878aSAndroid Build Coastguard Worker 
126*61c4878aSAndroid Build Coastguard Worker   va_end(args);
127*61c4878aSAndroid Build Coastguard Worker   return result;
128*61c4878aSAndroid Build Coastguard Worker }
129*61c4878aSAndroid Build Coastguard Worker 
TEST(FormatString,CallFormatWithVaList_CallsCorrectFormatOverload)130*61c4878aSAndroid Build Coastguard Worker TEST(FormatString, CallFormatWithVaList_CallsCorrectFormatOverload) {
131*61c4878aSAndroid Build Coastguard Worker   InlineString<8> string;
132*61c4878aSAndroid Build Coastguard Worker   Status result = CallInlineString<FormatVaList>(string, "Yo%s %d", "?!", 5);
133*61c4878aSAndroid Build Coastguard Worker 
134*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(OkStatus(), result);
135*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(6u, string.size());
136*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ("Yo?! 5", string);
137*61c4878aSAndroid Build Coastguard Worker }
138*61c4878aSAndroid Build Coastguard Worker 
TEST(FormatString,OverwriteVaList)139*61c4878aSAndroid Build Coastguard Worker TEST(FormatString, OverwriteVaList) {
140*61c4878aSAndroid Build Coastguard Worker   InlineString<8> string("blah");
141*61c4878aSAndroid Build Coastguard Worker   Status result = CallInlineString<FormatOverwriteVaList>(string, "why%c", '?');
142*61c4878aSAndroid Build Coastguard Worker 
143*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(OkStatus(), result);
144*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(4u, string.size());
145*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ("why?", string);
146*61c4878aSAndroid Build Coastguard Worker }
147*61c4878aSAndroid Build Coastguard Worker 
148*61c4878aSAndroid Build Coastguard Worker }  // namespace
149*61c4878aSAndroid Build Coastguard Worker }  // namespace pw::string
150