blob: b22749cfef8447406ad78d63da85e78209ae176b [file] [log] [blame]
Ewout van Bekkumc2e9d882021-04-29 16:01:27 -07001// Copyright 2021 The Pigweed Authors
Wyatt Heplerce9b9522019-11-11 10:45:48 -08002//
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 Heplerce9b9522019-11-11 10:45:48 -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 Heplerce9b9522019-11-11 10:45:48 -080014
15#include "pw_string/util.h"
16
17#include "gtest/gtest.h"
18
19namespace pw::string {
20namespace {
21
Ewout van Bekkumf89f1372021-05-03 11:15:54 -070022using namespace std::literals::string_view_literals;
Wyatt Heplerce9b9522019-11-11 10:45:48 -080023
Ewout van Bekkumf89f1372021-05-03 11:15:54 -070024TEST(ClampedLength, Nullptr_Returns0) {
25 EXPECT_EQ(0u, internal::ClampedLength(nullptr, 100));
Wyatt Heplerce9b9522019-11-11 10:45:48 -080026}
27
Ewout van Bekkumf89f1372021-05-03 11:15:54 -070028TEST(ClampedLength, EmptyString_Returns0) {
29 EXPECT_EQ(0u, internal::ClampedLength("", 0));
30 EXPECT_EQ(0u, internal::ClampedLength("", 100));
Wyatt Heplerce9b9522019-11-11 10:45:48 -080031}
32
Ewout van Bekkumf89f1372021-05-03 11:15:54 -070033TEST(ClampedLength, MaxLongerThanString_ReturnsStrlen) {
34 EXPECT_EQ(5u, internal::ClampedLength("12345", 100));
Wyatt Heplerce9b9522019-11-11 10:45:48 -080035}
36
Ewout van Bekkumf89f1372021-05-03 11:15:54 -070037TEST(ClampedLength, StringMaxLongerThanMax_ReturnsMax) {
38 EXPECT_EQ(0u, internal::ClampedLength("12345", 0));
39 EXPECT_EQ(4u, internal::ClampedLength("12345", 4));
40}
41
42TEST(ClampedLength, LengthEqualsMax) {
43 EXPECT_EQ(5u, internal::ClampedLength("12345", 5));
44}
45
46TEST(ClampedCString, NullPtr_ReturnsEmpty) {
47 EXPECT_TRUE(ClampedCString(nullptr, 100).empty());
48}
49
50TEST(ClampedCString, EmptyString_Returns0) {
51 EXPECT_TRUE(ClampedCString("", 0).empty());
52 EXPECT_TRUE(ClampedCString("", 100).empty());
53}
54
55TEST(ClampedCString, MaxLongerThanString_ReturnsStr) {
56 static constexpr char kInput[] = "12345";
57 const std::string_view result = ClampedCString(kInput, 100);
58 EXPECT_EQ(result.size(), strlen(kInput));
59 EXPECT_EQ(result.data(), &kInput[0]);
60}
61
62TEST(ClampedCString, StringMaxLongerThanMax_ClampsView) {
63 static constexpr char kInput[] = "12345";
64
65 EXPECT_TRUE(ClampedCString(kInput, 0).empty());
66
67 const std::string_view result = ClampedCString(kInput, 4);
68 EXPECT_EQ(result.size(), 4u);
69 EXPECT_EQ(result.data(), &kInput[0]);
70}
71
72TEST(ClampedCString, FullStringView) {
73 static constexpr char kInput[] = "12345";
74 const std::string_view result = ClampedCString(kInput);
75 EXPECT_EQ(result.size(), strlen(kInput));
76 EXPECT_EQ(result.data(), &kInput[0]);
77}
78
79TEST(NullTerminatedLength, EmptyString_RequiresNullTerminator) {
80 EXPECT_TRUE(NullTerminatedLength("", 0).status().IsOutOfRange());
81
82 ASSERT_TRUE(NullTerminatedLength("", 100).status().ok());
83 EXPECT_EQ(0u, NullTerminatedLength("", 100).value());
84}
85
86TEST(NullTerminatedLength, MaxLongerThanString_ReturnsStrlen) {
87 ASSERT_TRUE(NullTerminatedLength("12345", 100).status().ok());
88 EXPECT_EQ(5u, NullTerminatedLength("12345", 100).value());
89}
90
91TEST(NullTerminatedLength, StringMaxLongerThanMax_Fails) {
92 EXPECT_TRUE(NullTerminatedLength("12345", 0).status().IsOutOfRange());
93 EXPECT_TRUE(NullTerminatedLength("12345", 4).status().IsOutOfRange());
94}
95
96TEST(NullTerminatedLength, LengthEqualsMax) {
97 static constexpr char kInput[] = "12345";
98 ASSERT_TRUE(NullTerminatedLength(kInput).ok());
99 EXPECT_EQ(5u, NullTerminatedLength(kInput).value());
100}
Wyatt Heplerce9b9522019-11-11 10:45:48 -0800101
Ewout van Bekkumc2e9d882021-04-29 16:01:27 -0700102class TestWithBuffer : public ::testing::Test {
103 protected:
104 static constexpr char kStartingString[] = "!@#$%^&*()!@#$%^&*()";
105
106 TestWithBuffer() { std::memcpy(buffer_, kStartingString, sizeof(buffer_)); }
107
108 char buffer_[sizeof(kStartingString)];
109};
110
111class CopyTest : public TestWithBuffer {};
112
Ewout van Bekkumc2e9d882021-04-29 16:01:27 -0700113TEST_F(CopyTest, EmptyStringView_WritesNullTerminator) {
114 EXPECT_EQ(0u, Copy("", buffer_).size());
115 EXPECT_EQ('\0', buffer_[0]);
116}
117
118TEST_F(CopyTest, EmptyBuffer_WritesNothing) {
119 auto result = Copy("Hello", std::span(buffer_, 0));
120 EXPECT_EQ(0u, result.size());
121 EXPECT_FALSE(result.ok());
122 EXPECT_STREQ(kStartingString, buffer_);
123}
124
125TEST_F(CopyTest, TooSmall_Truncates) {
126 auto result = Copy("Hi!", std::span(buffer_, 3));
127 EXPECT_EQ(2u, result.size());
128 EXPECT_FALSE(result.ok());
129 EXPECT_STREQ("Hi", buffer_);
130}
131
132TEST_F(CopyTest, ExactFit) {
133 auto result = Copy("Hi!", std::span(buffer_, 4));
134 EXPECT_EQ(3u, result.size());
135 EXPECT_TRUE(result.ok());
136 EXPECT_STREQ("Hi!", buffer_);
137}
138
139TEST_F(CopyTest, NullTerminatorsInString) {
140 ASSERT_EQ(4u, Copy("\0!\0\0"sv, std::span(buffer_, 5)).size());
141 EXPECT_EQ("\0!\0\0"sv, std::string_view(buffer_, 4));
142}
143
Wyatt Heplerce9b9522019-11-11 10:45:48 -0800144} // namespace
145} // namespace pw::string