blob: 9aef4195b029d52d141bc107975ceb4f2ab1e3aa [file] [log] [blame]
Wyatt Heplere2dc6d12019-11-15 09:05:07 -08001// Copyright 2019 The Pigweed Authors
2//
3// Licensed under the Apache License, Version 2.0 (the "License"); you may not
Wyatt Hepler1a960942019-11-26 14:13:38 -08004// use this file except in compliance with the License. You may obtain a copy of
5// the License at
Wyatt Heplere2dc6d12019-11-15 09:05:07 -08006//
7// https://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
11// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
Wyatt Hepler1a960942019-11-26 14:13:38 -080012// License for the specific language governing permissions and limitations under
13// the License.
Wyatt Heplere2dc6d12019-11-15 09:05:07 -080014
15#include "pw_string/format.h"
16
17#include <cstdarg>
Wyatt Hepler6d1a6c62020-06-22 15:40:45 -070018#include <span>
Wyatt Heplere2dc6d12019-11-15 09:05:07 -080019
20#include "gtest/gtest.h"
Wyatt Heplere2dc6d12019-11-15 09:05:07 -080021
22namespace pw::string {
23namespace {
24
25TEST(Format, ValidFormatString_Succeeds) {
26 char buffer[32];
27 auto result = Format(buffer, "-_-");
28
Wyatt Hepler1b3da3a2021-01-07 13:26:57 -080029 EXPECT_EQ(OkStatus(), result.status());
Wyatt Heplere2dc6d12019-11-15 09:05:07 -080030 EXPECT_EQ(3u, result.size());
31 EXPECT_STREQ("-_-", buffer);
32}
33
34TEST(Format, ValidFormatStringAndArguments_Succeeds) {
35 char buffer[32];
36 auto result = Format(buffer, "%d4%s", 123, "5");
37
Wyatt Hepler1b3da3a2021-01-07 13:26:57 -080038 EXPECT_EQ(OkStatus(), result.status());
Wyatt Heplere2dc6d12019-11-15 09:05:07 -080039 EXPECT_EQ(5u, result.size());
40 EXPECT_STREQ("12345", buffer);
41}
42
Wyatt Heplere2dc6d12019-11-15 09:05:07 -080043TEST(Format, EmptyBuffer_ReturnsResourceExhausted) {
Wyatt Hepler6d1a6c62020-06-22 15:40:45 -070044 auto result = Format(std::span<char>(), "?");
Wyatt Heplere2dc6d12019-11-15 09:05:07 -080045
Wyatt Heplerd78f7c62020-09-28 14:27:32 -070046 EXPECT_EQ(Status::ResourceExhausted(), result.status());
Wyatt Heplere2dc6d12019-11-15 09:05:07 -080047 EXPECT_EQ(0u, result.size());
48}
49
50TEST(Format, FormatLargerThanBuffer_ReturnsResourceExhausted) {
51 char buffer[5];
52 auto result = Format(buffer, "2big!");
53
Wyatt Heplerd78f7c62020-09-28 14:27:32 -070054 EXPECT_EQ(Status::ResourceExhausted(), result.status());
Wyatt Heplere2dc6d12019-11-15 09:05:07 -080055 EXPECT_EQ(4u, result.size());
56 EXPECT_STREQ("2big", buffer);
57}
58
59TEST(Format, ArgumentLargerThanBuffer_ReturnsResourceExhausted) {
60 char buffer[5];
Wyatt Hepler2596fe52020-01-23 17:40:10 -080061 auto result = Format(buffer, "%s", "2big!");
Wyatt Heplere2dc6d12019-11-15 09:05:07 -080062
Wyatt Heplerd78f7c62020-09-28 14:27:32 -070063 EXPECT_EQ(Status::ResourceExhausted(), result.status());
Wyatt Heplere2dc6d12019-11-15 09:05:07 -080064 EXPECT_EQ(4u, result.size());
65 EXPECT_STREQ("2big", buffer);
66}
67
Wyatt Hepler6d1a6c62020-06-22 15:40:45 -070068StatusWithSize CallFormatWithVaList(std::span<char> buffer,
69 const char* fmt,
70 ...) {
Wyatt Heplere2dc6d12019-11-15 09:05:07 -080071 va_list args;
72 va_start(args, fmt);
73
Wyatt Hepler2596fe52020-01-23 17:40:10 -080074 StatusWithSize result = FormatVaList(buffer, fmt, args);
Wyatt Heplere2dc6d12019-11-15 09:05:07 -080075
76 va_end(args);
77 return result;
78}
79
80TEST(Format, CallFormatWithVaList_CallsCorrectFormatOverload) {
81 char buffer[8];
82 auto result = CallFormatWithVaList(buffer, "Yo%s", "?!");
83
Wyatt Hepler1b3da3a2021-01-07 13:26:57 -080084 EXPECT_EQ(OkStatus(), result.status());
Wyatt Heplere2dc6d12019-11-15 09:05:07 -080085 EXPECT_EQ(4u, result.size());
86 EXPECT_STREQ("Yo?!", buffer);
87}
88
89} // namespace
90} // namespace pw::string