// Copyright 2019 The Pigweed Authors // // Licensed under the Apache License, Version 2.0 (the "License"); you may not // use this file except in compliance with the License. You may obtain a copy of // the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the // License for the specific language governing permissions and limitations under // the License. #include "pw_string/format.h" #include #include "pw_span/span.h" #include "pw_unit_test/framework.h" namespace pw::string { namespace { TEST(Format, ValidFormatString_Succeeds) { char buffer[32]; auto result = Format(buffer, "-_-"); EXPECT_EQ(OkStatus(), result.status()); EXPECT_EQ(3u, result.size()); EXPECT_STREQ("-_-", buffer); } TEST(Format, ValidFormatStringAndArguments_Succeeds) { char buffer[32]; auto result = Format(buffer, "%d4%s", 123, "5"); EXPECT_EQ(OkStatus(), result.status()); EXPECT_EQ(5u, result.size()); EXPECT_STREQ("12345", buffer); } TEST(Format, EmptyBuffer_ReturnsResourceExhausted) { auto result = Format(span(), "?"); EXPECT_EQ(Status::ResourceExhausted(), result.status()); EXPECT_EQ(0u, result.size()); } TEST(Format, FormatLargerThanBuffer_ReturnsResourceExhausted) { char buffer[5]; auto result = Format(buffer, "2big!"); EXPECT_EQ(Status::ResourceExhausted(), result.status()); EXPECT_EQ(4u, result.size()); EXPECT_STREQ("2big", buffer); } TEST(Format, ArgumentLargerThanBuffer_ReturnsResourceExhausted) { char buffer[5]; auto result = Format(buffer, "%s", "2big!"); EXPECT_EQ(Status::ResourceExhausted(), result.status()); EXPECT_EQ(4u, result.size()); EXPECT_STREQ("2big", buffer); } PW_PRINTF_FORMAT(2, 3) StatusWithSize CallFormatWithVaList(span buffer, const char* fmt, ...) { va_list args; va_start(args, fmt); StatusWithSize result = FormatVaList(buffer, fmt, args); va_end(args); return result; } TEST(Format, CallFormatWithVaList_CallsCorrectFormatOverload) { char buffer[8]; auto result = CallFormatWithVaList(buffer, "Yo%s", "?!"); EXPECT_EQ(OkStatus(), result.status()); EXPECT_EQ(4u, result.size()); EXPECT_STREQ("Yo?!", buffer); } TEST(FormatString, Append) { InlineString<6> string; EXPECT_EQ(OkStatus(), Format(string, "-_-")); EXPECT_EQ("-_-", string); EXPECT_EQ(OkStatus(), Format(string, "%d", 123)); EXPECT_EQ("-_-123", string); EXPECT_EQ(Status::ResourceExhausted(), Format(string, "%d", 1)); EXPECT_EQ("-_-123", string); } TEST(FormatString, EmptyString) { InlineString<0> string; EXPECT_EQ(Status::ResourceExhausted(), Format(string, "-_-")); EXPECT_EQ("", string); } TEST(FormatString, Truncates) { InlineString<5> string; EXPECT_EQ(Status::ResourceExhausted(), Format(string, "1%s", "23456")); EXPECT_EQ("12345", string); } TEST(FormatString, Overwrite) { InlineString<6> string("???"); EXPECT_EQ(OkStatus(), FormatOverwrite(string, "-_-")); EXPECT_EQ("-_-", string); } template &, const char*, va_list)> PW_PRINTF_FORMAT(2, 3) Status CallInlineString(InlineString<>& string, const char* fmt, ...) { va_list args; va_start(args, fmt); Status result = kFunction(string, fmt, args); va_end(args); return result; } TEST(FormatString, CallFormatWithVaList_CallsCorrectFormatOverload) { InlineString<8> string; Status result = CallInlineString(string, "Yo%s %d", "?!", 5); EXPECT_EQ(OkStatus(), result); EXPECT_EQ(6u, string.size()); EXPECT_EQ("Yo?! 5", string); } TEST(FormatString, OverwriteVaList) { InlineString<8> string("blah"); Status result = CallInlineString(string, "why%c", '?'); EXPECT_EQ(OkStatus(), result); EXPECT_EQ(4u, string.size()); EXPECT_EQ("why?", string); } } // namespace } // namespace pw::string