1*61c4878aSAndroid Build Coastguard Worker // Copyright 2020 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/string.h"
16*61c4878aSAndroid Build Coastguard Worker
17*61c4878aSAndroid Build Coastguard Worker #include <cstddef>
18*61c4878aSAndroid Build Coastguard Worker #include <iterator>
19*61c4878aSAndroid Build Coastguard Worker #include <type_traits>
20*61c4878aSAndroid Build Coastguard Worker
21*61c4878aSAndroid Build Coastguard Worker #include "pw_compilation_testing/negative_compilation.h"
22*61c4878aSAndroid Build Coastguard Worker #include "pw_unit_test/framework.h"
23*61c4878aSAndroid Build Coastguard Worker
24*61c4878aSAndroid Build Coastguard Worker namespace pw {
25*61c4878aSAndroid Build Coastguard Worker namespace {
26*61c4878aSAndroid Build Coastguard Worker
27*61c4878aSAndroid Build Coastguard Worker using namespace std::string_view_literals;
28*61c4878aSAndroid Build Coastguard Worker
29*61c4878aSAndroid Build Coastguard Worker template <typename T>
30*61c4878aSAndroid Build Coastguard Worker class StringViewLike {
31*61c4878aSAndroid Build Coastguard Worker public:
StringViewLike(const T * data,size_t size)32*61c4878aSAndroid Build Coastguard Worker constexpr StringViewLike(const T* data, size_t size) : value_(data, size) {}
33*61c4878aSAndroid Build Coastguard Worker
operator std::basic_string_view<T>() const34*61c4878aSAndroid Build Coastguard Worker constexpr operator std::basic_string_view<T>() const { return value_; }
35*61c4878aSAndroid Build Coastguard Worker
36*61c4878aSAndroid Build Coastguard Worker private:
37*61c4878aSAndroid Build Coastguard Worker std::basic_string_view<T> value_;
38*61c4878aSAndroid Build Coastguard Worker };
39*61c4878aSAndroid Build Coastguard Worker
40*61c4878aSAndroid Build Coastguard Worker // The StringView overload ignores types that convert to const T* to avoid
41*61c4878aSAndroid Build Coastguard Worker // ambiguity with the existing const T* overload.
42*61c4878aSAndroid Build Coastguard Worker template <typename T>
43*61c4878aSAndroid Build Coastguard Worker class StringViewLikeButConvertsToPointer : public StringViewLike<T> {
44*61c4878aSAndroid Build Coastguard Worker public:
45*61c4878aSAndroid Build Coastguard Worker using StringViewLike<T>::StringViewLike;
46*61c4878aSAndroid Build Coastguard Worker
operator std::basic_string_view<T>() const47*61c4878aSAndroid Build Coastguard Worker constexpr operator std::basic_string_view<T>() const { return value_; }
operator const T*() const48*61c4878aSAndroid Build Coastguard Worker constexpr operator const T*() const { return value_.data(); }
49*61c4878aSAndroid Build Coastguard Worker
50*61c4878aSAndroid Build Coastguard Worker private:
51*61c4878aSAndroid Build Coastguard Worker std::basic_string_view<T> value_;
52*61c4878aSAndroid Build Coastguard Worker };
53*61c4878aSAndroid Build Coastguard Worker
54*61c4878aSAndroid Build Coastguard Worker template <typename T>
55*61c4878aSAndroid Build Coastguard Worker class EvenNumberIterator {
56*61c4878aSAndroid Build Coastguard Worker public:
57*61c4878aSAndroid Build Coastguard Worker using difference_type = std::ptrdiff_t;
58*61c4878aSAndroid Build Coastguard Worker using value_type = T;
59*61c4878aSAndroid Build Coastguard Worker using pointer = const T*;
60*61c4878aSAndroid Build Coastguard Worker using reference = const T&;
61*61c4878aSAndroid Build Coastguard Worker using iterator_category = std::input_iterator_tag;
62*61c4878aSAndroid Build Coastguard Worker
63*61c4878aSAndroid Build Coastguard Worker // Rounds down to nearest even.
EvenNumberIterator(value_type value)64*61c4878aSAndroid Build Coastguard Worker explicit constexpr EvenNumberIterator(value_type value)
65*61c4878aSAndroid Build Coastguard Worker : value_(static_cast<value_type>(value & ~static_cast<value_type>(1))) {}
66*61c4878aSAndroid Build Coastguard Worker
operator ++()67*61c4878aSAndroid Build Coastguard Worker constexpr EvenNumberIterator& operator++() {
68*61c4878aSAndroid Build Coastguard Worker value_ += 2;
69*61c4878aSAndroid Build Coastguard Worker return *this;
70*61c4878aSAndroid Build Coastguard Worker }
71*61c4878aSAndroid Build Coastguard Worker
operator *() const72*61c4878aSAndroid Build Coastguard Worker constexpr const T& operator*() const { return value_; }
73*61c4878aSAndroid Build Coastguard Worker
operator ==(const EvenNumberIterator & rhs) const74*61c4878aSAndroid Build Coastguard Worker constexpr bool operator==(const EvenNumberIterator& rhs) const {
75*61c4878aSAndroid Build Coastguard Worker return value_ == rhs.value_;
76*61c4878aSAndroid Build Coastguard Worker }
77*61c4878aSAndroid Build Coastguard Worker
operator !=(const EvenNumberIterator & rhs) const78*61c4878aSAndroid Build Coastguard Worker constexpr bool operator!=(const EvenNumberIterator& rhs) const {
79*61c4878aSAndroid Build Coastguard Worker return value_ != rhs.value_;
80*61c4878aSAndroid Build Coastguard Worker }
81*61c4878aSAndroid Build Coastguard Worker
82*61c4878aSAndroid Build Coastguard Worker private:
83*61c4878aSAndroid Build Coastguard Worker value_type value_;
84*61c4878aSAndroid Build Coastguard Worker };
85*61c4878aSAndroid Build Coastguard Worker
86*61c4878aSAndroid Build Coastguard Worker #ifdef __cpp_deduction_guides
87*61c4878aSAndroid Build Coastguard Worker
TEST(InlineString,DeduceBasicString_Char)88*61c4878aSAndroid Build Coastguard Worker TEST(InlineString, DeduceBasicString_Char) {
89*61c4878aSAndroid Build Coastguard Worker InlineBasicString string_10("1234567890");
90*61c4878aSAndroid Build Coastguard Worker static_assert(std::is_same_v<decltype(string_10), InlineString<10>>);
91*61c4878aSAndroid Build Coastguard Worker
92*61c4878aSAndroid Build Coastguard Worker InlineBasicString string_3 = "abc";
93*61c4878aSAndroid Build Coastguard Worker static_assert(std::is_same_v<decltype(string_3), InlineString<3>>);
94*61c4878aSAndroid Build Coastguard Worker
95*61c4878aSAndroid Build Coastguard Worker string_10.resize(6);
96*61c4878aSAndroid Build Coastguard Worker EXPECT_STREQ(
97*61c4878aSAndroid Build Coastguard Worker string_10.append(string_3).append(InlineBasicString("?")).c_str(),
98*61c4878aSAndroid Build Coastguard Worker "123456abc?");
99*61c4878aSAndroid Build Coastguard Worker }
100*61c4878aSAndroid Build Coastguard Worker
TEST(InlineString,DeduceBasicString_Int)101*61c4878aSAndroid Build Coastguard Worker TEST(InlineString, DeduceBasicString_Int) {
102*61c4878aSAndroid Build Coastguard Worker constexpr char kCharArray[4] = {0, 1, 2, 0};
103*61c4878aSAndroid Build Coastguard Worker InlineBasicString string_3 = kCharArray;
104*61c4878aSAndroid Build Coastguard Worker static_assert(std::is_same_v<decltype(string_3), InlineBasicString<char, 3>>);
105*61c4878aSAndroid Build Coastguard Worker
106*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(string_3, InlineBasicString(kCharArray));
107*61c4878aSAndroid Build Coastguard Worker }
108*61c4878aSAndroid Build Coastguard Worker
109*61c4878aSAndroid Build Coastguard Worker // Test CTAD on the InlineString alias, if supported.
110*61c4878aSAndroid Build Coastguard Worker #if __cpp_deduction_guides >= 201907L
111*61c4878aSAndroid Build Coastguard Worker
TEST(InlineString,DeduceString)112*61c4878aSAndroid Build Coastguard Worker TEST(InlineString, DeduceString) {
113*61c4878aSAndroid Build Coastguard Worker InlineString string("123456789");
114*61c4878aSAndroid Build Coastguard Worker static_assert(std::is_same_v<decltype(string), InlineString<10>>);
115*61c4878aSAndroid Build Coastguard Worker
116*61c4878aSAndroid Build Coastguard Worker EXPECT_STREQ("123456789", string.c_str());
117*61c4878aSAndroid Build Coastguard Worker }
118*61c4878aSAndroid Build Coastguard Worker
119*61c4878aSAndroid Build Coastguard Worker #endif // __cpp_deduction_guides >= 201907L
120*61c4878aSAndroid Build Coastguard Worker #endif // __cpp_deduction_guides
121*61c4878aSAndroid Build Coastguard Worker
122*61c4878aSAndroid Build Coastguard Worker template <typename T, size_t kExpectedSize>
TestEqual(const T * string,const T (& expected)[kExpectedSize])123*61c4878aSAndroid Build Coastguard Worker constexpr bool TestEqual(const T* string, const T (&expected)[kExpectedSize]) {
124*61c4878aSAndroid Build Coastguard Worker for (size_t i = 0; i < kExpectedSize; ++i) {
125*61c4878aSAndroid Build Coastguard Worker if (string[i] != expected[i]) {
126*61c4878aSAndroid Build Coastguard Worker return false;
127*61c4878aSAndroid Build Coastguard Worker }
128*61c4878aSAndroid Build Coastguard Worker }
129*61c4878aSAndroid Build Coastguard Worker return true;
130*61c4878aSAndroid Build Coastguard Worker }
131*61c4878aSAndroid Build Coastguard Worker
132*61c4878aSAndroid Build Coastguard Worker // Compares a pw::InlineBasicString to a null-terminated array of characters.
133*61c4878aSAndroid Build Coastguard Worker #define EXPECT_PW_STRING(pw_string, array) \
134*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(pw_string.size(), sizeof(array) / sizeof(array[0]) - 1); \
135*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(pw_string.c_str()[pw_string.size()], decltype(array[0]){0}); \
136*61c4878aSAndroid Build Coastguard Worker EXPECT_TRUE(TestEqual(pw_string.c_str(), array))
137*61c4878aSAndroid Build Coastguard Worker
138*61c4878aSAndroid Build Coastguard Worker #define EXPECT_CONSTEXPR_PW_STRING(string, array) \
139*61c4878aSAndroid Build Coastguard Worker static_assert(string.size() == sizeof(array) / sizeof(array[0]) - 1, \
140*61c4878aSAndroid Build Coastguard Worker #string ".size() == sizeof(" #array ") - 1 FAILED"); \
141*61c4878aSAndroid Build Coastguard Worker static_assert(string.c_str()[string.size()] == decltype(array[0]){0}, \
142*61c4878aSAndroid Build Coastguard Worker #string " must be null terminated"); \
143*61c4878aSAndroid Build Coastguard Worker static_assert(TestEqual(string.c_str(), array), \
144*61c4878aSAndroid Build Coastguard Worker #string " == " #array " FAILED")
145*61c4878aSAndroid Build Coastguard Worker
146*61c4878aSAndroid Build Coastguard Worker // This macro performs operations on a string and checks the result.
147*61c4878aSAndroid Build Coastguard Worker //
148*61c4878aSAndroid Build Coastguard Worker // 1. Declare a string variable named fixed_str using the provided
149*61c4878aSAndroid Build Coastguard Worker // initialization statement. fixed_str can be used in tests that
150*61c4878aSAndroid Build Coastguard Worker // specifically want a known-capacity string.
151*61c4878aSAndroid Build Coastguard Worker // 2. Declare a generic-capacity generic_str reference for use in tests that
152*61c4878aSAndroid Build Coastguard Worker // specifically want to use a generic-capacity string.
153*61c4878aSAndroid Build Coastguard Worker // 3. Declare a str reference for use in tests. It is fixed-capacity in
154*61c4878aSAndroid Build Coastguard Worker // constexpr tests and known-capacity in runtime tests.
155*61c4878aSAndroid Build Coastguard Worker // 4. Execute the provided statements.
156*61c4878aSAndroid Build Coastguard Worker // 5. Check that str equals the provided string literal.
157*61c4878aSAndroid Build Coastguard Worker //
158*61c4878aSAndroid Build Coastguard Worker // The test is executed twice:
159*61c4878aSAndroid Build Coastguard Worker // - At compile time (with constexpr and static_assert) on a known-length
160*61c4878aSAndroid Build Coastguard Worker // string (InlineString<kLength>).
161*61c4878aSAndroid Build Coastguard Worker // - At runtime a generic reference (InlineString<>&) at runtime.
162*61c4878aSAndroid Build Coastguard Worker #if __cpp_constexpr >= 201603L // constexpr lambdas are required
163*61c4878aSAndroid Build Coastguard Worker #define TEST_CONSTEXPR_STRING(create_string, statements, expected) \
164*61c4878aSAndroid Build Coastguard Worker do { \
165*61c4878aSAndroid Build Coastguard Worker constexpr auto constexpr_str = [] { \
166*61c4878aSAndroid Build Coastguard Worker [[maybe_unused]] auto fixed_str = create_string; \
167*61c4878aSAndroid Build Coastguard Worker [[maybe_unused]] auto& str = fixed_str; \
168*61c4878aSAndroid Build Coastguard Worker [[maybe_unused]] auto& generic_str = Generic(fixed_str); \
169*61c4878aSAndroid Build Coastguard Worker statements; \
170*61c4878aSAndroid Build Coastguard Worker return str; \
171*61c4878aSAndroid Build Coastguard Worker }(); \
172*61c4878aSAndroid Build Coastguard Worker EXPECT_CONSTEXPR_PW_STRING(constexpr_str, expected); \
173*61c4878aSAndroid Build Coastguard Worker } while (0)
174*61c4878aSAndroid Build Coastguard Worker #else // Skip constexpr tests in C++14.
175*61c4878aSAndroid Build Coastguard Worker #define TEST_CONSTEXPR_STRING(create_string, statements, expected) \
176*61c4878aSAndroid Build Coastguard Worker do { \
177*61c4878aSAndroid Build Coastguard Worker constexpr auto str = create_string; \
178*61c4878aSAndroid Build Coastguard Worker EXPECT_NE(str.data(), nullptr); \
179*61c4878aSAndroid Build Coastguard Worker } while (0)
180*61c4878aSAndroid Build Coastguard Worker #endif //__cpp_constexpr >= 201603L
181*61c4878aSAndroid Build Coastguard Worker
182*61c4878aSAndroid Build Coastguard Worker #define TEST_RUNTIME_STRING(create_string, statements, expected) \
183*61c4878aSAndroid Build Coastguard Worker do { \
184*61c4878aSAndroid Build Coastguard Worker [[maybe_unused]] auto fixed_str = create_string; \
185*61c4878aSAndroid Build Coastguard Worker [[maybe_unused]] auto& generic_str = Generic(fixed_str); \
186*61c4878aSAndroid Build Coastguard Worker [[maybe_unused]] auto& str = generic_str; \
187*61c4878aSAndroid Build Coastguard Worker statements; \
188*61c4878aSAndroid Build Coastguard Worker EXPECT_PW_STRING(str, expected); \
189*61c4878aSAndroid Build Coastguard Worker } while (0)
190*61c4878aSAndroid Build Coastguard Worker
191*61c4878aSAndroid Build Coastguard Worker #define TEST_STRING(create_string, statements, expected) \
192*61c4878aSAndroid Build Coastguard Worker TEST_CONSTEXPR_STRING(create_string, statements, expected); \
193*61c4878aSAndroid Build Coastguard Worker TEST_RUNTIME_STRING(create_string, statements, expected)
194*61c4878aSAndroid Build Coastguard Worker
195*61c4878aSAndroid Build Coastguard Worker // Casts any pw::InlineString to a generic (runtime-capacity) reference.
196*61c4878aSAndroid Build Coastguard Worker template <typename T>
Generic(const InlineBasicString<T> & str)197*61c4878aSAndroid Build Coastguard Worker constexpr const InlineBasicString<T>& Generic(const InlineBasicString<T>& str) {
198*61c4878aSAndroid Build Coastguard Worker return str;
199*61c4878aSAndroid Build Coastguard Worker }
200*61c4878aSAndroid Build Coastguard Worker
201*61c4878aSAndroid Build Coastguard Worker template <typename T>
Generic(InlineBasicString<T> & str)202*61c4878aSAndroid Build Coastguard Worker constexpr InlineBasicString<T>& Generic(InlineBasicString<T>& str) {
203*61c4878aSAndroid Build Coastguard Worker return str;
204*61c4878aSAndroid Build Coastguard Worker }
205*61c4878aSAndroid Build Coastguard Worker
206*61c4878aSAndroid Build Coastguard Worker constexpr InlineString<0> kEmptyCapacity0;
207*61c4878aSAndroid Build Coastguard Worker constexpr InlineString<10> kEmptyCapacity10;
208*61c4878aSAndroid Build Coastguard Worker
209*61c4878aSAndroid Build Coastguard Worker constexpr InlineString<10> kSize5Capacity10 = "12345";
210*61c4878aSAndroid Build Coastguard Worker constexpr InlineString<10> kSize10Capacity10("1234567890", 10);
211*61c4878aSAndroid Build Coastguard Worker
212*61c4878aSAndroid Build Coastguard Worker constexpr const char* kPointer0 = "";
213*61c4878aSAndroid Build Coastguard Worker constexpr const char* kPointer10 = "9876543210";
214*61c4878aSAndroid Build Coastguard Worker
215*61c4878aSAndroid Build Coastguard Worker constexpr const char kArrayNull1[1] = {'\0'};
216*61c4878aSAndroid Build Coastguard Worker constexpr const char kArray5[5] = {'1', '2', '3', '4', '\0'};
217*61c4878aSAndroid Build Coastguard Worker
218*61c4878aSAndroid Build Coastguard Worker // Invalid, non-terminated arrays used in negative compilation tests.
219*61c4878aSAndroid Build Coastguard Worker [[maybe_unused]] constexpr const char kArrayNonNull1[1] = {'?'};
220*61c4878aSAndroid Build Coastguard Worker [[maybe_unused]] constexpr const char kArrayNonNull5[5] = {
221*61c4878aSAndroid Build Coastguard Worker '1', '2', '3', '4', '5'};
222*61c4878aSAndroid Build Coastguard Worker
223*61c4878aSAndroid Build Coastguard Worker constexpr EvenNumberIterator<char> kEvenNumbers0(0);
224*61c4878aSAndroid Build Coastguard Worker constexpr EvenNumberIterator<char> kEvenNumbers2(2);
225*61c4878aSAndroid Build Coastguard Worker constexpr EvenNumberIterator<char> kEvenNumbers8(8);
226*61c4878aSAndroid Build Coastguard Worker
227*61c4878aSAndroid Build Coastguard Worker constexpr std::string_view kView0;
228*61c4878aSAndroid Build Coastguard Worker constexpr std::string_view kView5 = "12345"sv;
229*61c4878aSAndroid Build Coastguard Worker constexpr std::string_view kView10 = "1234567890"sv;
230*61c4878aSAndroid Build Coastguard Worker
231*61c4878aSAndroid Build Coastguard Worker constexpr StringViewLike<char> kStringViewLike10("0123456789", 10);
232*61c4878aSAndroid Build Coastguard Worker
233*61c4878aSAndroid Build Coastguard Worker //
234*61c4878aSAndroid Build Coastguard Worker // Construction and assignment
235*61c4878aSAndroid Build Coastguard Worker //
236*61c4878aSAndroid Build Coastguard Worker
237*61c4878aSAndroid Build Coastguard Worker // Constructor
238*61c4878aSAndroid Build Coastguard Worker
TEST(InlineString,Construct_Default)239*61c4878aSAndroid Build Coastguard Worker TEST(InlineString, Construct_Default) {
240*61c4878aSAndroid Build Coastguard Worker constexpr InlineString<0> kEmpty0;
241*61c4878aSAndroid Build Coastguard Worker static_assert(kEmpty0.empty(), "Must be empty");
242*61c4878aSAndroid Build Coastguard Worker static_assert(kEmpty0.c_str()[0] == '\0', "Must be null terminated");
243*61c4878aSAndroid Build Coastguard Worker
244*61c4878aSAndroid Build Coastguard Worker constexpr InlineString<10> kEmpty10;
245*61c4878aSAndroid Build Coastguard Worker static_assert(kEmpty10.empty(), "Must be empty");
246*61c4878aSAndroid Build Coastguard Worker static_assert(kEmpty10.c_str()[0] == '\0', "Must be null terminated");
247*61c4878aSAndroid Build Coastguard Worker }
248*61c4878aSAndroid Build Coastguard Worker
TEST(InlineString,Construct_Characters)249*61c4878aSAndroid Build Coastguard Worker TEST(InlineString, Construct_Characters) {
250*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<0>(0, 'a'), , "");
251*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>(0, 'a'), , "");
252*61c4878aSAndroid Build Coastguard Worker
253*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<1>(1, 'a'), , "a");
254*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>(1, 'a'), , "a");
255*61c4878aSAndroid Build Coastguard Worker
256*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>(10, 'a'), , "aaaaaaaaaa");
257*61c4878aSAndroid Build Coastguard Worker
258*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>(0, '\0'), , "");
259*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>(1, '\0'), , "\0");
260*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>(5, '\0'), , "\0\0\0\0\0");
261*61c4878aSAndroid Build Coastguard Worker
262*61c4878aSAndroid Build Coastguard Worker #if PW_NC_TEST(Construct_Char_TooMany_0)
263*61c4878aSAndroid Build Coastguard Worker PW_NC_EXPECT("PW_ASSERT\(new_size <= max_size\(\)\)");
264*61c4878aSAndroid Build Coastguard Worker [[maybe_unused]] constexpr InlineString<0> too_large(1, 'A');
265*61c4878aSAndroid Build Coastguard Worker #elif PW_NC_TEST(Construct_Char_TooMany_10)
266*61c4878aSAndroid Build Coastguard Worker PW_NC_EXPECT("PW_ASSERT\(new_size <= max_size\(\)\)");
267*61c4878aSAndroid Build Coastguard Worker [[maybe_unused]] constexpr InlineString<10> too_large(11, 'A');
268*61c4878aSAndroid Build Coastguard Worker #endif // PW_NC_TEST
269*61c4878aSAndroid Build Coastguard Worker }
270*61c4878aSAndroid Build Coastguard Worker // NOLINTNEXTLINE(google-readability-function-size)
TEST(InlineString,Construct_Substr)271*61c4878aSAndroid Build Coastguard Worker TEST(InlineString, Construct_Substr) {
272*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>(kEmptyCapacity0, 0), , "");
273*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>(kEmptyCapacity0, 0, 0), , "");
274*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>(Generic(kEmptyCapacity0), 0), , "");
275*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>(Generic(kEmptyCapacity0), 0, 0), , "");
276*61c4878aSAndroid Build Coastguard Worker
277*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<0>(kEmptyCapacity10, 0), , "");
278*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<0>(kEmptyCapacity10, 0, 0), , "");
279*61c4878aSAndroid Build Coastguard Worker TEST_RUNTIME_STRING(InlineString<0>(Generic(kEmptyCapacity10), 0), , "");
280*61c4878aSAndroid Build Coastguard Worker TEST_RUNTIME_STRING(InlineString<0>(Generic(kEmptyCapacity10), 0, 0), , "");
281*61c4878aSAndroid Build Coastguard Worker
282*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>(kSize5Capacity10, 0), , "12345");
283*61c4878aSAndroid Build Coastguard Worker TEST_RUNTIME_STRING(
284*61c4878aSAndroid Build Coastguard Worker InlineString<10>(Generic(kSize5Capacity10), 0), , "12345");
285*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>(kSize5Capacity10, 1), , "2345");
286*61c4878aSAndroid Build Coastguard Worker TEST_RUNTIME_STRING(InlineString<10>(Generic(kSize5Capacity10), 1), , "2345");
287*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>(kSize5Capacity10, 4), , "5");
288*61c4878aSAndroid Build Coastguard Worker TEST_RUNTIME_STRING(InlineString<10>(Generic(kSize5Capacity10), 4), , "5");
289*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>(kSize5Capacity10, 5), , "");
290*61c4878aSAndroid Build Coastguard Worker TEST_RUNTIME_STRING(InlineString<10>(Generic(kSize5Capacity10), 5), , "");
291*61c4878aSAndroid Build Coastguard Worker
292*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>(kSize5Capacity10, 0, 0), , "");
293*61c4878aSAndroid Build Coastguard Worker TEST_RUNTIME_STRING(InlineString<10>(Generic(kSize5Capacity10), 0, 0), , "");
294*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>(kSize5Capacity10, 0, 1), , "1");
295*61c4878aSAndroid Build Coastguard Worker TEST_RUNTIME_STRING(InlineString<10>(Generic(kSize5Capacity10), 0, 1), , "1");
296*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>(kSize5Capacity10, 1, 0), , "");
297*61c4878aSAndroid Build Coastguard Worker TEST_RUNTIME_STRING(InlineString<10>(Generic(kSize5Capacity10), 1, 0), , "");
298*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>(kSize5Capacity10, 1, 1), , "2");
299*61c4878aSAndroid Build Coastguard Worker TEST_RUNTIME_STRING(InlineString<10>(Generic(kSize5Capacity10), 1, 1), , "2");
300*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>(kSize5Capacity10, 1, 4), , "2345");
301*61c4878aSAndroid Build Coastguard Worker TEST_RUNTIME_STRING(
302*61c4878aSAndroid Build Coastguard Worker InlineString<10>(Generic(kSize5Capacity10), 1, 4), , "2345");
303*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>(kSize5Capacity10, 1, 5), , "2345");
304*61c4878aSAndroid Build Coastguard Worker TEST_RUNTIME_STRING(
305*61c4878aSAndroid Build Coastguard Worker InlineString<10>(Generic(kSize5Capacity10), 1, 4), , "2345");
306*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>(kSize5Capacity10, 1, 9000), , "2345");
307*61c4878aSAndroid Build Coastguard Worker TEST_RUNTIME_STRING(
308*61c4878aSAndroid Build Coastguard Worker InlineString<10>(Generic(kSize5Capacity10), 1, 9000), , "2345");
309*61c4878aSAndroid Build Coastguard Worker
310*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>(kSize5Capacity10, 4, 9000), , "5");
311*61c4878aSAndroid Build Coastguard Worker TEST_RUNTIME_STRING(
312*61c4878aSAndroid Build Coastguard Worker InlineString<10>(Generic(kSize5Capacity10), 4, 9000), , "5");
313*61c4878aSAndroid Build Coastguard Worker
314*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>(kSize5Capacity10, 5, 0), , "");
315*61c4878aSAndroid Build Coastguard Worker TEST_RUNTIME_STRING(InlineString<10>(Generic(kSize5Capacity10), 5, 0), , "");
316*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>(kSize5Capacity10, 5, 1), , "");
317*61c4878aSAndroid Build Coastguard Worker TEST_RUNTIME_STRING(InlineString<10>(Generic(kSize5Capacity10), 5, 1), , "");
318*61c4878aSAndroid Build Coastguard Worker
319*61c4878aSAndroid Build Coastguard Worker #if PW_NC_TEST(Construct_Substr_IndexPastEnd)
320*61c4878aSAndroid Build Coastguard Worker PW_NC_EXPECT("PW_ASSERT\(index <= source_size\)");
321*61c4878aSAndroid Build Coastguard Worker [[maybe_unused]] constexpr InlineString<10> bad_string(kSize5Capacity10, 6);
322*61c4878aSAndroid Build Coastguard Worker #endif // PW_NC_TEST
323*61c4878aSAndroid Build Coastguard Worker }
324*61c4878aSAndroid Build Coastguard Worker
TEST(InlineString,Construct_PointerLength)325*61c4878aSAndroid Build Coastguard Worker TEST(InlineString, Construct_PointerLength) {
326*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<0>(static_cast<const char*>(nullptr), 0), , "");
327*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>(static_cast<const char*>(nullptr), 0), , "");
328*61c4878aSAndroid Build Coastguard Worker
329*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<0>(kPointer0, 0), , "");
330*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<0>(kPointer10, 0), , "");
331*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>(kPointer10, 0), , "");
332*61c4878aSAndroid Build Coastguard Worker
333*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<1>(kPointer10, 1), , "9");
334*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<5>(kPointer10, 1), , "9");
335*61c4878aSAndroid Build Coastguard Worker
336*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<5>(kPointer10, 4), , "9876");
337*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<5>(kPointer10 + 1, 4), , "8765");
338*61c4878aSAndroid Build Coastguard Worker
339*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<5>(kPointer10, 5), , "98765");
340*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<5>(kPointer10 + 1, 5), , "87654");
341*61c4878aSAndroid Build Coastguard Worker
342*61c4878aSAndroid Build Coastguard Worker #if PW_NC_TEST(Construct_PointerLength_LengthLargerThanCapacity)
343*61c4878aSAndroid Build Coastguard Worker PW_NC_EXPECT("PW_ASSERT\(new_size <= max_size\(\)\)");
344*61c4878aSAndroid Build Coastguard Worker [[maybe_unused]] constexpr InlineString<5> bad_string(kPointer10, 6);
345*61c4878aSAndroid Build Coastguard Worker #elif PW_NC_TEST(Construct_PointerLength_LengthLargerThanInputString)
346*61c4878aSAndroid Build Coastguard Worker PW_NC_EXPECT_CLANG(
347*61c4878aSAndroid Build Coastguard Worker "constexpr variable 'bad_string' must be initialized by a constant "
348*61c4878aSAndroid Build Coastguard Worker "expression");
349*61c4878aSAndroid Build Coastguard Worker PW_NC_EXPECT_GCC("outside the bounds of array type");
350*61c4878aSAndroid Build Coastguard Worker [[maybe_unused]] constexpr InlineString<10> bad_string(kPointer10 + 6, 7);
351*61c4878aSAndroid Build Coastguard Worker #endif // PW_NC_TEST
352*61c4878aSAndroid Build Coastguard Worker }
353*61c4878aSAndroid Build Coastguard Worker
TEST(InlineString,Construct_Pointer)354*61c4878aSAndroid Build Coastguard Worker TEST(InlineString, Construct_Pointer) {
355*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>(static_cast<const char*>("")), , "");
356*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>(kPointer10), , "9876543210");
357*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>(kPointer10 + 5), , "43210");
358*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>(kPointer10 + 10), , "");
359*61c4878aSAndroid Build Coastguard Worker
360*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>(static_cast<const char*>("ab\0cde")), , "ab");
361*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<2>(static_cast<const char*>("ab\0cde")), , "ab");
362*61c4878aSAndroid Build Coastguard Worker
363*61c4878aSAndroid Build Coastguard Worker #if PW_NC_TEST(Construct_Pointer_LargerThanCapacity)
364*61c4878aSAndroid Build Coastguard Worker PW_NC_EXPECT("PW_ASSERT\(new_size <= max_size\(\)\)");
365*61c4878aSAndroid Build Coastguard Worker [[maybe_unused]] constexpr InlineString<5> bad_string(kPointer10);
366*61c4878aSAndroid Build Coastguard Worker #endif // PW_NC_TEST
367*61c4878aSAndroid Build Coastguard Worker }
368*61c4878aSAndroid Build Coastguard Worker
TEST(InlineString,Construct_Array)369*61c4878aSAndroid Build Coastguard Worker TEST(InlineString, Construct_Array) {
370*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<0>(""), , "");
371*61c4878aSAndroid Build Coastguard Worker
372*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<1>(""), , "");
373*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>(""), , "");
374*61c4878aSAndroid Build Coastguard Worker
375*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<2>("A"), , "A");
376*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>("A"), , "A");
377*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>("123456789"), , "123456789");
378*61c4878aSAndroid Build Coastguard Worker
379*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<2>("\0"), , "");
380*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>(""), , "");
381*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>("12\000456789"), , "12");
382*61c4878aSAndroid Build Coastguard Worker
383*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<1>(kArrayNull1), , "");
384*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<5>(kArray5), , "1234");
385*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>(kArray5), , "1234");
386*61c4878aSAndroid Build Coastguard Worker
387*61c4878aSAndroid Build Coastguard Worker #if PW_NC_TEST(Construct_Array_NullTerminationIsRequiredFillsCapacity)
388*61c4878aSAndroid Build Coastguard Worker PW_NC_EXPECT("PW_ASSERT\(.*The array is not null terminated");
389*61c4878aSAndroid Build Coastguard Worker [[maybe_unused]] constexpr InlineString<1> bad_string(kArrayNonNull1);
390*61c4878aSAndroid Build Coastguard Worker #elif PW_NC_TEST(Construct_Array_NullTerminationIsRequiredExtraCapacity)
391*61c4878aSAndroid Build Coastguard Worker PW_NC_EXPECT("PW_ASSERT\(.*The array is not null terminated");
392*61c4878aSAndroid Build Coastguard Worker [[maybe_unused]] constexpr InlineString<10> bad_string(kArrayNonNull5);
393*61c4878aSAndroid Build Coastguard Worker #elif PW_NC_TEST(Construct_Array_NonTerminatedArrayDoesNotFit)
394*61c4878aSAndroid Build Coastguard Worker PW_NC_EXPECT(
395*61c4878aSAndroid Build Coastguard Worker "InlineString's capacity is too small to hold the assigned string");
396*61c4878aSAndroid Build Coastguard Worker [[maybe_unused]] constexpr InlineString<3> bad_string(kArrayNonNull5);
397*61c4878aSAndroid Build Coastguard Worker #elif PW_NC_TEST(Construct_Array_SingleCharLiteralRequiresCapacityOfAtLeast1)
398*61c4878aSAndroid Build Coastguard Worker PW_NC_EXPECT(
399*61c4878aSAndroid Build Coastguard Worker "InlineString's capacity is too small to hold the assigned string");
400*61c4878aSAndroid Build Coastguard Worker [[maybe_unused]] constexpr InlineString<0> bad_string("A");
401*61c4878aSAndroid Build Coastguard Worker #elif PW_NC_TEST(Construct_Array_5CharLiteralRequiresCapacityOfAtLeast5)
402*61c4878aSAndroid Build Coastguard Worker PW_NC_EXPECT(
403*61c4878aSAndroid Build Coastguard Worker "InlineString's capacity is too small to hold the assigned string");
404*61c4878aSAndroid Build Coastguard Worker [[maybe_unused]] constexpr InlineString<4> bad_string("ACDEF");
405*61c4878aSAndroid Build Coastguard Worker #elif PW_NC_TEST(Construct_Array_TooManyNulls)
406*61c4878aSAndroid Build Coastguard Worker PW_NC_EXPECT(
407*61c4878aSAndroid Build Coastguard Worker "InlineString's capacity is too small to hold the assigned string");
408*61c4878aSAndroid Build Coastguard Worker [[maybe_unused]] constexpr InlineString<3> bad_string(kArray5);
409*61c4878aSAndroid Build Coastguard Worker #endif // PW_NC_TEST
410*61c4878aSAndroid Build Coastguard Worker }
411*61c4878aSAndroid Build Coastguard Worker
TEST(InlineString,Construct_Iterator)412*61c4878aSAndroid Build Coastguard Worker TEST(InlineString, Construct_Iterator) {
413*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<0>(kView0.begin(), kView0.end()), , "");
414*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<0>(kView5.end(), kView5.end()), , "");
415*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<5>(kView0.begin(), kView0.end()), , "");
416*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<5>(kView5.end(), kView5.end()), , "");
417*61c4878aSAndroid Build Coastguard Worker
418*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<5>(kView5.begin(), kView5.end()), , "12345");
419*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>(kView5.begin(), kView5.end()), , "12345");
420*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>(kView10.begin(), kView10.end()), , "1234567890");
421*61c4878aSAndroid Build Coastguard Worker
422*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<0>(kEvenNumbers0, kEvenNumbers0), , "");
423*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>(kEvenNumbers2, kEvenNumbers2), , "");
424*61c4878aSAndroid Build Coastguard Worker
425*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<4>(kEvenNumbers0, kEvenNumbers2), , "\0");
426*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<4>(kEvenNumbers0, kEvenNumbers8), , "\0\2\4\6");
427*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>(kEvenNumbers0, kEvenNumbers8), , "\0\2\4\6");
428*61c4878aSAndroid Build Coastguard Worker
429*61c4878aSAndroid Build Coastguard Worker #if PW_NC_TEST(Construct_Iterator_DoesNotFit)
430*61c4878aSAndroid Build Coastguard Worker PW_NC_EXPECT("PW_ASSERT\(current_position != string_end\)");
431*61c4878aSAndroid Build Coastguard Worker [[maybe_unused]] constexpr InlineString<3> str(kEvenNumbers0, kEvenNumbers8);
432*61c4878aSAndroid Build Coastguard Worker #endif // PW_NC_TEST
433*61c4878aSAndroid Build Coastguard Worker }
434*61c4878aSAndroid Build Coastguard Worker
TEST(InlineString,Construct_CopySameCapacity)435*61c4878aSAndroid Build Coastguard Worker TEST(InlineString, Construct_CopySameCapacity) {
436*61c4878aSAndroid Build Coastguard Worker static_assert(std::is_trivially_copyable<InlineString<0>>(), "Copy");
437*61c4878aSAndroid Build Coastguard Worker static_assert(std::is_trivially_copyable<InlineString<10>>(), "Copy");
438*61c4878aSAndroid Build Coastguard Worker static_assert(std::is_trivially_copyable<InlineBasicString<char, 10>>(),
439*61c4878aSAndroid Build Coastguard Worker "Copy");
440*61c4878aSAndroid Build Coastguard Worker
441*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<0>(kEmptyCapacity0), , "");
442*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>(kEmptyCapacity10), , "");
443*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>(kSize5Capacity10), , "12345");
444*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>(kSize10Capacity10), , "1234567890");
445*61c4878aSAndroid Build Coastguard Worker }
446*61c4878aSAndroid Build Coastguard Worker
TEST(InlineString,Construct_CopyDifferentCapacity)447*61c4878aSAndroid Build Coastguard Worker TEST(InlineString, Construct_CopyDifferentCapacity) {
448*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<1>(kEmptyCapacity0), , "");
449*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<5>(kEmptyCapacity0), , "");
450*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<11>(kEmptyCapacity10), , "");
451*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<11>(kSize5Capacity10), , "12345");
452*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<11>(kSize10Capacity10), , "1234567890");
453*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<30>(kSize10Capacity10), , "1234567890");
454*61c4878aSAndroid Build Coastguard Worker
455*61c4878aSAndroid Build Coastguard Worker #if PW_NC_TEST(Construct_CopyDifferentCapacity_DoesNotFit)
456*61c4878aSAndroid Build Coastguard Worker PW_NC_EXPECT(
457*61c4878aSAndroid Build Coastguard Worker "pw::InlineString must be at least as large as the source string");
458*61c4878aSAndroid Build Coastguard Worker [[maybe_unused]] InlineString<5> bad_string(kEmptyCapacity10);
459*61c4878aSAndroid Build Coastguard Worker #elif PW_NC_TEST(Construct_CopyDifferentCapacity_DoesNotFitConstexpr)
460*61c4878aSAndroid Build Coastguard Worker PW_NC_EXPECT(
461*61c4878aSAndroid Build Coastguard Worker "pw::InlineString must be at least as large as the source string");
462*61c4878aSAndroid Build Coastguard Worker constexpr [[maybe_unused]] InlineString<5> bad_string(kEmptyCapacity10);
463*61c4878aSAndroid Build Coastguard Worker #endif // PW_NC_TEST
464*61c4878aSAndroid Build Coastguard Worker }
465*61c4878aSAndroid Build Coastguard Worker
TEST(InlineString,Construct_CopyGenericCapacity)466*61c4878aSAndroid Build Coastguard Worker TEST(InlineString, Construct_CopyGenericCapacity) {
467*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>(Generic(kEmptyCapacity0)), , "");
468*61c4878aSAndroid Build Coastguard Worker TEST_RUNTIME_STRING(InlineString<10>(Generic(kEmptyCapacity10)), , "");
469*61c4878aSAndroid Build Coastguard Worker TEST_RUNTIME_STRING(InlineString<10>(Generic(kSize5Capacity10)), , "12345");
470*61c4878aSAndroid Build Coastguard Worker TEST_RUNTIME_STRING(
471*61c4878aSAndroid Build Coastguard Worker InlineString<10>(Generic(kSize10Capacity10)), , "1234567890");
472*61c4878aSAndroid Build Coastguard Worker TEST_RUNTIME_STRING(
473*61c4878aSAndroid Build Coastguard Worker InlineString<20>(Generic(kSize10Capacity10)), , "1234567890");
474*61c4878aSAndroid Build Coastguard Worker }
475*61c4878aSAndroid Build Coastguard Worker
TEST(InlineString,Construct_InitializerList)476*61c4878aSAndroid Build Coastguard Worker TEST(InlineString, Construct_InitializerList) {
477*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<0>({}), , "");
478*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<1>({}), , "");
479*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>({}), , "");
480*61c4878aSAndroid Build Coastguard Worker
481*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<1>({'\0'}), , "\0");
482*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<1>({'?'}), , "?");
483*61c4878aSAndroid Build Coastguard Worker
484*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<5>({'A'}), , "A");
485*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<5>({'\0', '\0', '\0'}), , "\0\0\0");
486*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<5>({'5', '4', '3', '2', '1'}), , "54321");
487*61c4878aSAndroid Build Coastguard Worker
488*61c4878aSAndroid Build Coastguard Worker #if PW_NC_TEST(Construct_InitializerList_DoesNotFit)
489*61c4878aSAndroid Build Coastguard Worker PW_NC_EXPECT("PW_ASSERT\(new_size <= max_size\(\)\)");
490*61c4878aSAndroid Build Coastguard Worker [[maybe_unused]] constexpr InlineString<3> bad_string({'1', '2', '3', '\0'});
491*61c4878aSAndroid Build Coastguard Worker #endif // PW_NC_TEST
492*61c4878aSAndroid Build Coastguard Worker }
493*61c4878aSAndroid Build Coastguard Worker
TakesInlineString(const InlineString<16> & str)494*61c4878aSAndroid Build Coastguard Worker constexpr InlineString<16> TakesInlineString(const InlineString<16>& str) {
495*61c4878aSAndroid Build Coastguard Worker return str;
496*61c4878aSAndroid Build Coastguard Worker }
497*61c4878aSAndroid Build Coastguard Worker
498*61c4878aSAndroid Build Coastguard Worker struct HoldsString {
499*61c4878aSAndroid Build Coastguard Worker InlineString<16> value;
500*61c4878aSAndroid Build Coastguard Worker };
501*61c4878aSAndroid Build Coastguard Worker
TEST(InlineString,Construct_StringView)502*61c4878aSAndroid Build Coastguard Worker TEST(InlineString, Construct_StringView) {
503*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<0>(""sv), , "");
504*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>(""sv), , "");
505*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>("01234"sv), , "01234");
506*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>("0123456789"sv), , "0123456789");
507*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<20>("0123456789"sv), , "0123456789");
508*61c4878aSAndroid Build Coastguard Worker
509*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>(StringViewLike<char>("01234", 5)), , "01234");
510*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>(kStringViewLike10), , "0123456789");
511*61c4878aSAndroid Build Coastguard Worker
512*61c4878aSAndroid Build Coastguard Worker // pw::InlineString supports implicit conversion from std::string_view.
513*61c4878aSAndroid Build Coastguard Worker constexpr InlineString<16> implicit_call = TakesInlineString("1234"sv);
514*61c4878aSAndroid Build Coastguard Worker EXPECT_CONSTEXPR_PW_STRING(implicit_call, "1234");
515*61c4878aSAndroid Build Coastguard Worker
516*61c4878aSAndroid Build Coastguard Worker constexpr HoldsString implicit_initialize_1{.value = "1234"sv};
517*61c4878aSAndroid Build Coastguard Worker EXPECT_CONSTEXPR_PW_STRING(implicit_initialize_1.value, "1234");
518*61c4878aSAndroid Build Coastguard Worker
519*61c4878aSAndroid Build Coastguard Worker constexpr HoldsString implicit_initialize_2{.value{"1234"sv}};
520*61c4878aSAndroid Build Coastguard Worker EXPECT_CONSTEXPR_PW_STRING(implicit_initialize_2.value, "1234");
521*61c4878aSAndroid Build Coastguard Worker
522*61c4878aSAndroid Build Coastguard Worker constexpr HoldsString implicit_initialize_3{"1234"sv};
523*61c4878aSAndroid Build Coastguard Worker EXPECT_CONSTEXPR_PW_STRING(implicit_initialize_3.value, "1234");
524*61c4878aSAndroid Build Coastguard Worker
525*61c4878aSAndroid Build Coastguard Worker #if PW_NC_TEST(Construct_StringView_DoesNotFit)
526*61c4878aSAndroid Build Coastguard Worker PW_NC_EXPECT(
527*61c4878aSAndroid Build Coastguard Worker "pw::InlineString must be at least as large as the source string");
528*61c4878aSAndroid Build Coastguard Worker [[maybe_unused]] InlineString<5> bad_string(kEmptyCapacity10);
529*61c4878aSAndroid Build Coastguard Worker #elif PW_NC_TEST(Construct_StringView_DoesNotFitConstexpr)
530*61c4878aSAndroid Build Coastguard Worker PW_NC_EXPECT(
531*61c4878aSAndroid Build Coastguard Worker "pw::InlineString must be at least as large as the source string");
532*61c4878aSAndroid Build Coastguard Worker constexpr [[maybe_unused]] InlineString<5> bad_string(kEmptyCapacity10);
533*61c4878aSAndroid Build Coastguard Worker #elif PW_NC_TEST(Construct_StringView_NoConversionFromAmbiguousClass)
534*61c4878aSAndroid Build Coastguard Worker PW_NC_EXPECT_CLANG("no matching constructor");
535*61c4878aSAndroid Build Coastguard Worker PW_NC_EXPECT_GCC("no matching function for call to");
536*61c4878aSAndroid Build Coastguard Worker [[maybe_unused]] InlineString<10> fail(
537*61c4878aSAndroid Build Coastguard Worker StringViewLikeButConvertsToPointer<char>("1", 1));
538*61c4878aSAndroid Build Coastguard Worker #elif PW_NC_TEST(Construct_StringView_NoImplicitConversionFromStringViewLike)
539*61c4878aSAndroid Build Coastguard Worker PW_NC_EXPECT_CLANG("no matching function for call to 'TakesInlineString'");
540*61c4878aSAndroid Build Coastguard Worker PW_NC_EXPECT_GCC(
541*61c4878aSAndroid Build Coastguard Worker "invalid initialization of reference of type .* from expression of type "
542*61c4878aSAndroid Build Coastguard Worker "'const pw::.*StringViewLike<char>'");
543*61c4878aSAndroid Build Coastguard Worker TakesInlineString(kStringViewLike10);
544*61c4878aSAndroid Build Coastguard Worker #elif PW_NC_TEST(Construct_StringView_NoImplicitConvFromStringViewLikeInInit1)
545*61c4878aSAndroid Build Coastguard Worker PW_NC_EXPECT_GCC("could not convert 'pw::.*kStringViewLike10'");
546*61c4878aSAndroid Build Coastguard Worker PW_NC_EXPECT_CLANG("no viable conversion from 'const StringViewLike<char>'");
547*61c4878aSAndroid Build Coastguard Worker (void)HoldsString{.value = kStringViewLike10};
548*61c4878aSAndroid Build Coastguard Worker #elif PW_NC_TEST(Construct_StringView_NoImplicitConvFromStringViewLikeInInit2)
549*61c4878aSAndroid Build Coastguard Worker PW_NC_EXPECT_GCC("could not convert 'pw::.*kStringViewLike10'");
550*61c4878aSAndroid Build Coastguard Worker PW_NC_EXPECT_CLANG("no viable conversion from 'const StringViewLike<char>'");
551*61c4878aSAndroid Build Coastguard Worker (void)HoldsString{kStringViewLike10};
552*61c4878aSAndroid Build Coastguard Worker #endif // PW_NC_TEST
553*61c4878aSAndroid Build Coastguard Worker }
554*61c4878aSAndroid Build Coastguard Worker
TEST(InlineString,Construct_StringViewSubstr)555*61c4878aSAndroid Build Coastguard Worker TEST(InlineString, Construct_StringViewSubstr) {
556*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<0>(""sv, 0, 0), , "");
557*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<5>(""sv, 0, 0), , "");
558*61c4878aSAndroid Build Coastguard Worker
559*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<5>("0123456789"sv, 5, 0), , "");
560*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<5>("0123456789"sv, 10, 0), , "");
561*61c4878aSAndroid Build Coastguard Worker
562*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<5>("0123456789"sv, 0, 5), , "01234");
563*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<5>("0123456789"sv, 1, 5), , "12345");
564*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<5>("0123456789"sv, 8, 2), , "89");
565*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<5>("0123456789"sv, 8, 10), , "89");
566*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<5>("0123456789"sv, 10, 100), , "");
567*61c4878aSAndroid Build Coastguard Worker
568*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>("0123456789"sv, 0, 10), , "0123456789");
569*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>("0123456789"sv, 0, 100), , "0123456789");
570*61c4878aSAndroid Build Coastguard Worker
571*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>(kStringViewLike10, 0, 100), , "0123456789");
572*61c4878aSAndroid Build Coastguard Worker
573*61c4878aSAndroid Build Coastguard Worker #if PW_NC_TEST(Construct_StringViewSubstr_DoesNotFit)
574*61c4878aSAndroid Build Coastguard Worker PW_NC_EXPECT("PW_ASSERT\(new_size <= max_size\(\)\)");
575*61c4878aSAndroid Build Coastguard Worker [[maybe_unused]] constexpr InlineString<10> bad_string(
576*61c4878aSAndroid Build Coastguard Worker "0123456789?"sv, 0, 11);
577*61c4878aSAndroid Build Coastguard Worker #elif PW_NC_TEST(Construct_StringViewSubstr_IndexTooFar)
578*61c4878aSAndroid Build Coastguard Worker PW_NC_EXPECT_CLANG("must be initialized by a constant expression");
579*61c4878aSAndroid Build Coastguard Worker PW_NC_EXPECT_GCC("call to non-'constexpr' function");
580*61c4878aSAndroid Build Coastguard Worker [[maybe_unused]] constexpr InlineString<10> bad_string("12345"sv, 6, 0);
581*61c4878aSAndroid Build Coastguard Worker #endif // PW_NC_TEST
582*61c4878aSAndroid Build Coastguard Worker }
583*61c4878aSAndroid Build Coastguard Worker
TEST(InlineString,Construct_Nullptr)584*61c4878aSAndroid Build Coastguard Worker TEST(InlineString, Construct_Nullptr) {
585*61c4878aSAndroid Build Coastguard Worker #if PW_NC_TEST(Construct_Nullptr)
586*61c4878aSAndroid Build Coastguard Worker PW_NC_EXPECT("Cannot construct from nullptr");
587*61c4878aSAndroid Build Coastguard Worker [[maybe_unused]] constexpr InlineString<0> bad_string(nullptr);
588*61c4878aSAndroid Build Coastguard Worker #endif // PW_NC_TEST
589*61c4878aSAndroid Build Coastguard Worker }
590*61c4878aSAndroid Build Coastguard Worker
591*61c4878aSAndroid Build Coastguard Worker // operator=
592*61c4878aSAndroid Build Coastguard Worker
TEST(InlineString,AssignOperator_Copy)593*61c4878aSAndroid Build Coastguard Worker TEST(InlineString, AssignOperator_Copy) {
594*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<0>(), fixed_str = InlineString<0>(), "");
595*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>("something"),
596*61c4878aSAndroid Build Coastguard Worker fixed_str = InlineString<9>("el\0se"),
597*61c4878aSAndroid Build Coastguard Worker "el");
598*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>("0_o"), fixed_str = InlineString<10>(), "");
599*61c4878aSAndroid Build Coastguard Worker
600*61c4878aSAndroid Build Coastguard Worker #if PW_NC_TEST(AssignOperator_Copy_DoesNotFit)
601*61c4878aSAndroid Build Coastguard Worker PW_NC_EXPECT(
602*61c4878aSAndroid Build Coastguard Worker "pw::InlineString must be at least as large as the source string");
603*61c4878aSAndroid Build Coastguard Worker [[maybe_unused]] constexpr auto fail = [] {
604*61c4878aSAndroid Build Coastguard Worker InlineString<5> str;
605*61c4878aSAndroid Build Coastguard Worker return str = InlineString<6>("2big");
606*61c4878aSAndroid Build Coastguard Worker }();
607*61c4878aSAndroid Build Coastguard Worker #elif PW_NC_TEST(AssignOperator_Copy_NotSupportedByGeneric)
608*61c4878aSAndroid Build Coastguard Worker PW_NC_EXPECT("operator=.*protected");
609*61c4878aSAndroid Build Coastguard Worker [[maybe_unused]] constexpr auto fail = [] {
610*61c4878aSAndroid Build Coastguard Worker InlineString<5> str;
611*61c4878aSAndroid Build Coastguard Worker return Generic(str) = InlineString<0>();
612*61c4878aSAndroid Build Coastguard Worker }();
613*61c4878aSAndroid Build Coastguard Worker #endif // PW_NC_TEST
614*61c4878aSAndroid Build Coastguard Worker }
615*61c4878aSAndroid Build Coastguard Worker
TEST(InlineString,AssignOperator_Array)616*61c4878aSAndroid Build Coastguard Worker TEST(InlineString, AssignOperator_Array) {
617*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<1>({'a'}), fixed_str = "", "");
618*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>("hey"), fixed_str = "wow", "wow");
619*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>("hey"), fixed_str = "123456789", "123456789");
620*61c4878aSAndroid Build Coastguard Worker
621*61c4878aSAndroid Build Coastguard Worker #if PW_NC_TEST(AssignOperator_Array_DoesNotFit)
622*61c4878aSAndroid Build Coastguard Worker PW_NC_EXPECT(
623*61c4878aSAndroid Build Coastguard Worker "InlineString's capacity is too small to hold the assigned string");
624*61c4878aSAndroid Build Coastguard Worker [[maybe_unused]] constexpr auto fail = [] {
625*61c4878aSAndroid Build Coastguard Worker InlineString<4> str("abc");
626*61c4878aSAndroid Build Coastguard Worker return str = "12345";
627*61c4878aSAndroid Build Coastguard Worker }();
628*61c4878aSAndroid Build Coastguard Worker #elif PW_NC_TEST(AssignOperator_Array_NotSupportedByGeneric)
629*61c4878aSAndroid Build Coastguard Worker PW_NC_EXPECT("operator=");
630*61c4878aSAndroid Build Coastguard Worker [[maybe_unused]] constexpr auto fail = [] {
631*61c4878aSAndroid Build Coastguard Worker InlineString<5> str("abc");
632*61c4878aSAndroid Build Coastguard Worker return Generic(str) = "";
633*61c4878aSAndroid Build Coastguard Worker }();
634*61c4878aSAndroid Build Coastguard Worker #endif // PW_NC_TEST
635*61c4878aSAndroid Build Coastguard Worker }
636*61c4878aSAndroid Build Coastguard Worker
TEST(InlineString,AssignOperator_Pointer)637*61c4878aSAndroid Build Coastguard Worker TEST(InlineString, AssignOperator_Pointer) {
638*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<1>({'a'}), fixed_str = kPointer0, "");
639*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>("hey"),
640*61c4878aSAndroid Build Coastguard Worker fixed_str = static_cast<const char*>("wow"),
641*61c4878aSAndroid Build Coastguard Worker "wow");
642*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>("hey"), fixed_str = kPointer10, "9876543210");
643*61c4878aSAndroid Build Coastguard Worker
644*61c4878aSAndroid Build Coastguard Worker #if PW_NC_TEST(AssignOperator_Pointer_DoesNotFit)
645*61c4878aSAndroid Build Coastguard Worker PW_NC_EXPECT("PW_ASSERT\(new_size <= max_size\(\)\)");
646*61c4878aSAndroid Build Coastguard Worker [[maybe_unused]] constexpr auto fail = [] {
647*61c4878aSAndroid Build Coastguard Worker InlineString<5> str("abc");
648*61c4878aSAndroid Build Coastguard Worker return str = static_cast<const char*>("123456");
649*61c4878aSAndroid Build Coastguard Worker }();
650*61c4878aSAndroid Build Coastguard Worker #elif PW_NC_TEST(AssignPointer_Pointer_NotSupportedByGeneric)
651*61c4878aSAndroid Build Coastguard Worker PW_NC_EXPECT("operator=");
652*61c4878aSAndroid Build Coastguard Worker [[maybe_unused]] constexpr auto fail = [] {
653*61c4878aSAndroid Build Coastguard Worker InlineString<5> str("abc");
654*61c4878aSAndroid Build Coastguard Worker return Generic(str) = kPointer0;
655*61c4878aSAndroid Build Coastguard Worker }();
656*61c4878aSAndroid Build Coastguard Worker #endif // PW_NC_TEST
657*61c4878aSAndroid Build Coastguard Worker }
658*61c4878aSAndroid Build Coastguard Worker
TEST(InlineString,AssignOperator_Character)659*61c4878aSAndroid Build Coastguard Worker TEST(InlineString, AssignOperator_Character) {
660*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<1>(), fixed_str = '\0', "\0");
661*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<1>({'a'}), fixed_str = '\0', "\0");
662*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>("hey"), fixed_str = '?', "?");
663*61c4878aSAndroid Build Coastguard Worker
664*61c4878aSAndroid Build Coastguard Worker #if PW_NC_TEST(AssignPointer_Character_DoesNotFit)
665*61c4878aSAndroid Build Coastguard Worker PW_NC_EXPECT("Cannot assign a character to pw::InlineString<0>");
666*61c4878aSAndroid Build Coastguard Worker [[maybe_unused]] constexpr auto fail = [] {
667*61c4878aSAndroid Build Coastguard Worker InlineString<0> str;
668*61c4878aSAndroid Build Coastguard Worker return str = 'a';
669*61c4878aSAndroid Build Coastguard Worker }();
670*61c4878aSAndroid Build Coastguard Worker #endif // PW_NC_TEST
671*61c4878aSAndroid Build Coastguard Worker }
672*61c4878aSAndroid Build Coastguard Worker
TEST(InlineString,AssignOperator_InitializerList)673*61c4878aSAndroid Build Coastguard Worker TEST(InlineString, AssignOperator_InitializerList) {
674*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<1>(), fixed_str = {'\0'}, "\0");
675*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<1>({'a'}), fixed_str = {'\0'}, "\0");
676*61c4878aSAndroid Build Coastguard Worker TEST_STRING(
677*61c4878aSAndroid Build Coastguard Worker InlineString<10>("hey"), (fixed_str = {'W', 'h', 'y', '?'}), "Why?");
678*61c4878aSAndroid Build Coastguard Worker
679*61c4878aSAndroid Build Coastguard Worker #if PW_NC_TEST(AssignPointer_InitializerList_DoesNotFit)
680*61c4878aSAndroid Build Coastguard Worker PW_NC_EXPECT("PW_ASSERT\(new_size <= max_size\(\)\)");
681*61c4878aSAndroid Build Coastguard Worker [[maybe_unused]] constexpr auto fail = [] {
682*61c4878aSAndroid Build Coastguard Worker InlineString<2> str;
683*61c4878aSAndroid Build Coastguard Worker return str = {'1', '2', '3'};
684*61c4878aSAndroid Build Coastguard Worker }();
685*61c4878aSAndroid Build Coastguard Worker #endif // PW_NC_TEST
686*61c4878aSAndroid Build Coastguard Worker }
687*61c4878aSAndroid Build Coastguard Worker
TEST(InlineString,AssignOperator_StringView)688*61c4878aSAndroid Build Coastguard Worker TEST(InlineString, AssignOperator_StringView) {
689*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<1>(), fixed_str = "\0"sv, "\0");
690*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<1>({'a'}), fixed_str = "\0"sv, "\0");
691*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>("hey"), fixed_str = "Why?"sv, "Why?");
692*61c4878aSAndroid Build Coastguard Worker
693*61c4878aSAndroid Build Coastguard Worker #if PW_NC_TEST(AssignPointer_StringView_DoesNotFit)
694*61c4878aSAndroid Build Coastguard Worker PW_NC_EXPECT("PW_ASSERT\(new_size <= max_size\(\)\)");
695*61c4878aSAndroid Build Coastguard Worker [[maybe_unused]] constexpr auto fail = [] {
696*61c4878aSAndroid Build Coastguard Worker InlineString<2> str;
697*61c4878aSAndroid Build Coastguard Worker return str = "123"sv;
698*61c4878aSAndroid Build Coastguard Worker }();
699*61c4878aSAndroid Build Coastguard Worker #endif // PW_NC_TEST
700*61c4878aSAndroid Build Coastguard Worker }
701*61c4878aSAndroid Build Coastguard Worker
702*61c4878aSAndroid Build Coastguard Worker // assign
703*61c4878aSAndroid Build Coastguard Worker
TEST(InlineString,Assign_Characters)704*61c4878aSAndroid Build Coastguard Worker TEST(InlineString, Assign_Characters) {
705*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<0>(), str.assign(0, 'a'), "");
706*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>(), str.assign(0, 'a'), "");
707*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>("hey"), str.assign(0, 'a'), "");
708*61c4878aSAndroid Build Coastguard Worker
709*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<1>(), str.assign(1, 'a'), "a");
710*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>(), str.assign(10, 'a'), "aaaaaaaaaa");
711*61c4878aSAndroid Build Coastguard Worker
712*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<1>({'?'}), str.assign(1, 'a'), "a");
713*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>("1"), str.assign(1, 'a'), "a");
714*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>("123456789"), str.assign(1, 'a'), "a");
715*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>("?"), str.assign(10, 'a'), "aaaaaaaaaa");
716*61c4878aSAndroid Build Coastguard Worker
717*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<5>("?"), str.assign(0, '\0'), "");
718*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<5>("?"), str.assign(1, '\0'), "\0");
719*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<5>("?"), str.assign(5, '\0'), "\0\0\0\0\0");
720*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>("???"), str.assign(5, '\0'), "\0\0\0\0\0");
721*61c4878aSAndroid Build Coastguard Worker
722*61c4878aSAndroid Build Coastguard Worker #if PW_NC_TEST(Assign_Characters_TooMany)
723*61c4878aSAndroid Build Coastguard Worker PW_NC_EXPECT("PW_ASSERT\(new_size <= max_size\(\)\)");
724*61c4878aSAndroid Build Coastguard Worker [[maybe_unused]] constexpr auto value = [] {
725*61c4878aSAndroid Build Coastguard Worker InlineString<6> str;
726*61c4878aSAndroid Build Coastguard Worker return str.assign(7, '?');
727*61c4878aSAndroid Build Coastguard Worker }();
728*61c4878aSAndroid Build Coastguard Worker #endif // PW_NC_TEST
729*61c4878aSAndroid Build Coastguard Worker }
730*61c4878aSAndroid Build Coastguard Worker
TEST(InlineString,Assign_CopySameCapacity)731*61c4878aSAndroid Build Coastguard Worker TEST(InlineString, Assign_CopySameCapacity) {
732*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<0>(), str.assign(kEmptyCapacity0), "");
733*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>(), str.assign(kEmptyCapacity10), "");
734*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>(), str.assign(kSize5Capacity10), "12345");
735*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>(), str.assign(kSize10Capacity10), "1234567890");
736*61c4878aSAndroid Build Coastguard Worker }
737*61c4878aSAndroid Build Coastguard Worker
TEST(InlineString,Assign_CopyDifferentCapacity)738*61c4878aSAndroid Build Coastguard Worker TEST(InlineString, Assign_CopyDifferentCapacity) {
739*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<1>(), str.assign(kEmptyCapacity0), "");
740*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<5>(), str.assign(kEmptyCapacity0), "");
741*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<11>(), str.assign(kEmptyCapacity10), "");
742*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<11>(), str.assign(kSize5Capacity10), "12345");
743*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<11>(), str.assign(kSize10Capacity10), "1234567890");
744*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<30>(), str.assign(kSize10Capacity10), "1234567890");
745*61c4878aSAndroid Build Coastguard Worker
746*61c4878aSAndroid Build Coastguard Worker #if PW_NC_TEST(Assign_CopyDifferentCapacity_DoesNotFit)
747*61c4878aSAndroid Build Coastguard Worker PW_NC_EXPECT(
748*61c4878aSAndroid Build Coastguard Worker "pw::InlineString must be at least as large as the source string");
749*61c4878aSAndroid Build Coastguard Worker [[maybe_unused]] InlineString<5> bad_string;
750*61c4878aSAndroid Build Coastguard Worker bad_string.assign(kEmptyCapacity10);
751*61c4878aSAndroid Build Coastguard Worker #elif PW_NC_TEST(Assign_CopyDifferentCapacity_DoesNotFitConstexpr)
752*61c4878aSAndroid Build Coastguard Worker PW_NC_EXPECT(
753*61c4878aSAndroid Build Coastguard Worker "pw::InlineString must be at least as large as the source string");
754*61c4878aSAndroid Build Coastguard Worker [[maybe_unused]] InlineString<5> bad_string;
755*61c4878aSAndroid Build Coastguard Worker bad_string.assign(kEmptyCapacity10);
756*61c4878aSAndroid Build Coastguard Worker #endif // PW_NC_TEST
757*61c4878aSAndroid Build Coastguard Worker }
758*61c4878aSAndroid Build Coastguard Worker
TEST(InlineString,Assign_CopyGenericCapacity)759*61c4878aSAndroid Build Coastguard Worker TEST(InlineString, Assign_CopyGenericCapacity) {
760*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>(), str.assign(Generic(kEmptyCapacity0)), "");
761*61c4878aSAndroid Build Coastguard Worker TEST_RUNTIME_STRING(
762*61c4878aSAndroid Build Coastguard Worker InlineString<10>(), str.assign(Generic(kEmptyCapacity10)), "");
763*61c4878aSAndroid Build Coastguard Worker TEST_RUNTIME_STRING(
764*61c4878aSAndroid Build Coastguard Worker InlineString<10>(), str.assign(Generic(kSize5Capacity10)), "12345");
765*61c4878aSAndroid Build Coastguard Worker TEST_RUNTIME_STRING(
766*61c4878aSAndroid Build Coastguard Worker InlineString<10>(), str.assign(Generic(kSize10Capacity10)), "1234567890");
767*61c4878aSAndroid Build Coastguard Worker TEST_RUNTIME_STRING(
768*61c4878aSAndroid Build Coastguard Worker InlineString<20>(), str.assign(Generic(kSize10Capacity10)), "1234567890");
769*61c4878aSAndroid Build Coastguard Worker }
770*61c4878aSAndroid Build Coastguard Worker
TEST(InlineString,Assign_Substr)771*61c4878aSAndroid Build Coastguard Worker TEST(InlineString, Assign_Substr) { // NOLINT(google-readability-function-size)
772*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>(), str.assign(kEmptyCapacity0, 0), "");
773*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>(), str.assign(kEmptyCapacity0, 0, 0), "");
774*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>(), str.assign(Generic(kEmptyCapacity0), 0), "");
775*61c4878aSAndroid Build Coastguard Worker TEST_STRING(
776*61c4878aSAndroid Build Coastguard Worker InlineString<10>(), str.assign(Generic(kEmptyCapacity0), 0, 0), "");
777*61c4878aSAndroid Build Coastguard Worker
778*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<0>(), str.assign(kEmptyCapacity10, 0), "");
779*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<0>(), str.assign(kEmptyCapacity10, 0, 0), "");
780*61c4878aSAndroid Build Coastguard Worker TEST_RUNTIME_STRING(
781*61c4878aSAndroid Build Coastguard Worker InlineString<0>(), str.assign(Generic(kEmptyCapacity10), 0), "");
782*61c4878aSAndroid Build Coastguard Worker TEST_RUNTIME_STRING(
783*61c4878aSAndroid Build Coastguard Worker InlineString<0>(), str.assign(Generic(kEmptyCapacity10), 0, 0), "");
784*61c4878aSAndroid Build Coastguard Worker
785*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>(), str.assign(kSize5Capacity10, 0), "12345");
786*61c4878aSAndroid Build Coastguard Worker TEST_RUNTIME_STRING(
787*61c4878aSAndroid Build Coastguard Worker InlineString<10>(), str.assign(Generic(kSize5Capacity10), 0), "12345");
788*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>(), str.assign(kSize5Capacity10, 1), "2345");
789*61c4878aSAndroid Build Coastguard Worker TEST_RUNTIME_STRING(
790*61c4878aSAndroid Build Coastguard Worker InlineString<10>(), str.assign(Generic(kSize5Capacity10), 1), "2345");
791*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>(), str.assign(kSize5Capacity10, 4), "5");
792*61c4878aSAndroid Build Coastguard Worker TEST_RUNTIME_STRING(
793*61c4878aSAndroid Build Coastguard Worker InlineString<10>(), str.assign(Generic(kSize5Capacity10), 4), "5");
794*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>(), str.assign(kSize5Capacity10, 5), "");
795*61c4878aSAndroid Build Coastguard Worker TEST_RUNTIME_STRING(
796*61c4878aSAndroid Build Coastguard Worker InlineString<10>(), str.assign(Generic(kSize5Capacity10), 5), "");
797*61c4878aSAndroid Build Coastguard Worker
798*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>(), str.assign(kSize5Capacity10, 0, 0), "");
799*61c4878aSAndroid Build Coastguard Worker TEST_RUNTIME_STRING(
800*61c4878aSAndroid Build Coastguard Worker InlineString<10>(), str.assign(Generic(kSize5Capacity10), 0, 0), "");
801*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>(), str.assign(kSize5Capacity10, 0, 1), "1");
802*61c4878aSAndroid Build Coastguard Worker TEST_RUNTIME_STRING(
803*61c4878aSAndroid Build Coastguard Worker InlineString<10>(), str.assign(Generic(kSize5Capacity10), 0, 1), "1");
804*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>(), str.assign(kSize5Capacity10, 1, 0), "");
805*61c4878aSAndroid Build Coastguard Worker TEST_RUNTIME_STRING(
806*61c4878aSAndroid Build Coastguard Worker InlineString<10>(), str.assign(Generic(kSize5Capacity10), 1, 0), "");
807*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>(), str.assign(kSize5Capacity10, 1, 1), "2");
808*61c4878aSAndroid Build Coastguard Worker TEST_RUNTIME_STRING(
809*61c4878aSAndroid Build Coastguard Worker InlineString<10>(), str.assign(Generic(kSize5Capacity10), 1, 1), "2");
810*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>(), str.assign(kSize5Capacity10, 1, 4), "2345");
811*61c4878aSAndroid Build Coastguard Worker TEST_RUNTIME_STRING(
812*61c4878aSAndroid Build Coastguard Worker InlineString<10>(), str.assign(Generic(kSize5Capacity10), 1, 4), "2345");
813*61c4878aSAndroid Build Coastguard Worker
814*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>(), str.assign(kSize5Capacity10, 4, 9000), "5");
815*61c4878aSAndroid Build Coastguard Worker TEST_RUNTIME_STRING(
816*61c4878aSAndroid Build Coastguard Worker InlineString<10>(), str.assign(Generic(kSize5Capacity10), 4, 9000), "5");
817*61c4878aSAndroid Build Coastguard Worker
818*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>(), str.assign(kSize5Capacity10, 5, 0), "");
819*61c4878aSAndroid Build Coastguard Worker TEST_RUNTIME_STRING(
820*61c4878aSAndroid Build Coastguard Worker InlineString<10>(), str.assign(Generic(kSize5Capacity10), 5, 0), "");
821*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>(), str.assign(kSize5Capacity10, 5, 1), "");
822*61c4878aSAndroid Build Coastguard Worker TEST_RUNTIME_STRING(
823*61c4878aSAndroid Build Coastguard Worker InlineString<10>(), str.assign(Generic(kSize5Capacity10), 5, 1), "");
824*61c4878aSAndroid Build Coastguard Worker
825*61c4878aSAndroid Build Coastguard Worker #if PW_NC_TEST(Assign_Substr_IndexPastEnd)
826*61c4878aSAndroid Build Coastguard Worker PW_NC_EXPECT("PW_ASSERT\(index <= source_size\)");
827*61c4878aSAndroid Build Coastguard Worker [[maybe_unused]] constexpr auto bad_string = [] {
828*61c4878aSAndroid Build Coastguard Worker InlineString<10> str;
829*61c4878aSAndroid Build Coastguard Worker return str.assign(kSize5Capacity10, 6);
830*61c4878aSAndroid Build Coastguard Worker }();
831*61c4878aSAndroid Build Coastguard Worker #endif // PW_NC_TEST
832*61c4878aSAndroid Build Coastguard Worker }
833*61c4878aSAndroid Build Coastguard Worker
TEST(InlineString,Assign_PointerLength)834*61c4878aSAndroid Build Coastguard Worker TEST(InlineString, Assign_PointerLength) {
835*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<0>(), str.assign(nullptr, 0), "");
836*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>(), str.assign(nullptr, 0), "");
837*61c4878aSAndroid Build Coastguard Worker
838*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<0>(), str.assign(kPointer0, 0), "");
839*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<0>(), str.assign(kPointer10, 0), "");
840*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>("abc"), str.assign(kPointer10, 0), "");
841*61c4878aSAndroid Build Coastguard Worker
842*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<1>(), str.assign(kPointer10, 1), "9");
843*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<5>("?"), str.assign(kPointer10, 1), "9");
844*61c4878aSAndroid Build Coastguard Worker
845*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<5>("?"), str.assign(kPointer10, 4), "9876");
846*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<5>("?"), str.assign(kPointer10 + 1, 4), "8765");
847*61c4878aSAndroid Build Coastguard Worker
848*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<5>("?"), str.assign(kPointer10, 5), "98765");
849*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<5>("?"), str.assign(kPointer10 + 1, 5), "87654");
850*61c4878aSAndroid Build Coastguard Worker
851*61c4878aSAndroid Build Coastguard Worker #if PW_NC_TEST(Assign_PointerLength_LengthLargerThanCapacity)
852*61c4878aSAndroid Build Coastguard Worker PW_NC_EXPECT("PW_ASSERT\(new_size <= max_size\(\)\)");
853*61c4878aSAndroid Build Coastguard Worker [[maybe_unused]] constexpr auto bad_string = [] {
854*61c4878aSAndroid Build Coastguard Worker InlineString<5> str;
855*61c4878aSAndroid Build Coastguard Worker return str.assign(kPointer10, 6);
856*61c4878aSAndroid Build Coastguard Worker }();
857*61c4878aSAndroid Build Coastguard Worker #elif PW_NC_TEST(Assign_PointerLength_LengthLargerThanInputString)
858*61c4878aSAndroid Build Coastguard Worker PW_NC_EXPECT_CLANG(
859*61c4878aSAndroid Build Coastguard Worker "constexpr variable 'bad_string' must be initialized by a constant "
860*61c4878aSAndroid Build Coastguard Worker "expression");
861*61c4878aSAndroid Build Coastguard Worker PW_NC_EXPECT_GCC("outside the bounds of array type");
862*61c4878aSAndroid Build Coastguard Worker [[maybe_unused]] constexpr auto bad_string = [] {
863*61c4878aSAndroid Build Coastguard Worker InlineString<10> str;
864*61c4878aSAndroid Build Coastguard Worker return str.assign(kPointer10 + 6, 7);
865*61c4878aSAndroid Build Coastguard Worker }();
866*61c4878aSAndroid Build Coastguard Worker #endif // PW_NC_TEST
867*61c4878aSAndroid Build Coastguard Worker }
868*61c4878aSAndroid Build Coastguard Worker
TEST(InlineString,Assign_Pointer)869*61c4878aSAndroid Build Coastguard Worker TEST(InlineString, Assign_Pointer) {
870*61c4878aSAndroid Build Coastguard Worker TEST_STRING(
871*61c4878aSAndroid Build Coastguard Worker InlineString<10>("\0"), str.assign(static_cast<const char*>("")), "");
872*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>("abc"), str.assign(kPointer10), "9876543210");
873*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>("abc"), str.assign(kPointer10 + 5), "43210");
874*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>("abc"), str.assign(kPointer10 + 10), "");
875*61c4878aSAndroid Build Coastguard Worker
876*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>(),
877*61c4878aSAndroid Build Coastguard Worker str.assign(static_cast<const char*>("ab\0cde")),
878*61c4878aSAndroid Build Coastguard Worker "ab");
879*61c4878aSAndroid Build Coastguard Worker TEST_STRING(
880*61c4878aSAndroid Build Coastguard Worker InlineString<2>(), str.assign(static_cast<const char*>("ab\0cde")), "ab");
881*61c4878aSAndroid Build Coastguard Worker
882*61c4878aSAndroid Build Coastguard Worker #if PW_NC_TEST(Assign_Pointer_LargerThanCapacity)
883*61c4878aSAndroid Build Coastguard Worker PW_NC_EXPECT("PW_ASSERT\(new_size <= max_size\(\)\)");
884*61c4878aSAndroid Build Coastguard Worker [[maybe_unused]] constexpr auto bad_string = [] {
885*61c4878aSAndroid Build Coastguard Worker InlineString<5> str;
886*61c4878aSAndroid Build Coastguard Worker return str.assign(kPointer10);
887*61c4878aSAndroid Build Coastguard Worker }();
888*61c4878aSAndroid Build Coastguard Worker #endif // PW_NC_TEST
889*61c4878aSAndroid Build Coastguard Worker }
890*61c4878aSAndroid Build Coastguard Worker
TEST(InlineString,Assign_Array)891*61c4878aSAndroid Build Coastguard Worker TEST(InlineString, Assign_Array) {
892*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<0>(), str.assign(""), "");
893*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<1>(), str.assign(""), "");
894*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>("a"), str.assign(""), "");
895*61c4878aSAndroid Build Coastguard Worker
896*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<1>(), str.assign("A"), "A");
897*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>(), str.assign("A"), "A");
898*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>(), str.assign("123456789"), "123456789");
899*61c4878aSAndroid Build Coastguard Worker
900*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<1>(), str.assign("\0"), "");
901*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>(), str.assign("\0"), "");
902*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>(), str.assign("12\000456789"), "12");
903*61c4878aSAndroid Build Coastguard Worker
904*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<1>(""), str.assign(kArrayNull1), "");
905*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<5>(), str.assign(kArray5), "1234");
906*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>(), str.assign(kArray5), "1234");
907*61c4878aSAndroid Build Coastguard Worker
908*61c4878aSAndroid Build Coastguard Worker TEST_RUNTIME_STRING(InlineString<1>(), Generic(str).assign("?"), "?");
909*61c4878aSAndroid Build Coastguard Worker TEST_RUNTIME_STRING(
910*61c4878aSAndroid Build Coastguard Worker InlineString<5>("abcd"), Generic(str).assign("12345"), "12345");
911*61c4878aSAndroid Build Coastguard Worker
912*61c4878aSAndroid Build Coastguard Worker #if 0 // Triggers PW_ASSERT
913*61c4878aSAndroid Build Coastguard Worker [[maybe_unused]] InlineString<5> too_small("abcd");
914*61c4878aSAndroid Build Coastguard Worker Generic(too_small).assign("123456");
915*61c4878aSAndroid Build Coastguard Worker #endif // 0
916*61c4878aSAndroid Build Coastguard Worker
917*61c4878aSAndroid Build Coastguard Worker #if PW_NC_TEST(Assign_Array_NullTerminationIsRequiredFillsCapacity)
918*61c4878aSAndroid Build Coastguard Worker PW_NC_EXPECT("PW_ASSERT\(.*The array is not null terminated");
919*61c4878aSAndroid Build Coastguard Worker [[maybe_unused]] constexpr auto fail = [] {
920*61c4878aSAndroid Build Coastguard Worker InlineString<1> bad_string;
921*61c4878aSAndroid Build Coastguard Worker return bad_string.assign(kArrayNonNull1);
922*61c4878aSAndroid Build Coastguard Worker }();
923*61c4878aSAndroid Build Coastguard Worker #elif PW_NC_TEST(Assign_Array_NullTerminationIsRequiredExtraCapacity)
924*61c4878aSAndroid Build Coastguard Worker PW_NC_EXPECT("PW_ASSERT\(.*The array is not null terminated");
925*61c4878aSAndroid Build Coastguard Worker [[maybe_unused]] constexpr auto fail = [] {
926*61c4878aSAndroid Build Coastguard Worker InlineString<10> bad_string;
927*61c4878aSAndroid Build Coastguard Worker return bad_string.assign(kArrayNonNull5);
928*61c4878aSAndroid Build Coastguard Worker }();
929*61c4878aSAndroid Build Coastguard Worker #elif PW_NC_TEST(Assign_Array_NonTerminatedArrayDoesNotFit)
930*61c4878aSAndroid Build Coastguard Worker PW_NC_EXPECT(
931*61c4878aSAndroid Build Coastguard Worker "InlineString's capacity is too small to hold the assigned string");
932*61c4878aSAndroid Build Coastguard Worker [[maybe_unused]] constexpr auto fail = [] {
933*61c4878aSAndroid Build Coastguard Worker InlineString<3> bad_string;
934*61c4878aSAndroid Build Coastguard Worker return bad_string.assign(kArrayNonNull5);
935*61c4878aSAndroid Build Coastguard Worker }();
936*61c4878aSAndroid Build Coastguard Worker #elif PW_NC_TEST(Assign_Array_SingleCharLiteralRequiresCapacityOfAtLeast1)
937*61c4878aSAndroid Build Coastguard Worker PW_NC_EXPECT(
938*61c4878aSAndroid Build Coastguard Worker "InlineString's capacity is too small to hold the assigned string");
939*61c4878aSAndroid Build Coastguard Worker [[maybe_unused]] constexpr auto fail = [] {
940*61c4878aSAndroid Build Coastguard Worker InlineString<0> str;
941*61c4878aSAndroid Build Coastguard Worker return str.assign("?");
942*61c4878aSAndroid Build Coastguard Worker }();
943*61c4878aSAndroid Build Coastguard Worker #endif // PW_NC_TEST
944*61c4878aSAndroid Build Coastguard Worker }
945*61c4878aSAndroid Build Coastguard Worker
TEST(InlineString,Assign_Iterator)946*61c4878aSAndroid Build Coastguard Worker TEST(InlineString, Assign_Iterator) {
947*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<0>(), str.assign(kView0.begin(), kView0.end()), "");
948*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<0>(), str.assign(kView5.end(), kView5.end()), "");
949*61c4878aSAndroid Build Coastguard Worker TEST_STRING(
950*61c4878aSAndroid Build Coastguard Worker InlineString<5>("abc"), str.assign(kView0.begin(), kView0.end()), "");
951*61c4878aSAndroid Build Coastguard Worker TEST_STRING(
952*61c4878aSAndroid Build Coastguard Worker InlineString<5>("abc"), str.assign(kView5.end(), kView5.end()), "");
953*61c4878aSAndroid Build Coastguard Worker
954*61c4878aSAndroid Build Coastguard Worker TEST_STRING(
955*61c4878aSAndroid Build Coastguard Worker InlineString<5>(), str.assign(kView5.begin(), kView5.end()), "12345");
956*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>("abc"),
957*61c4878aSAndroid Build Coastguard Worker str.assign(kView5.begin(), kView5.end()),
958*61c4878aSAndroid Build Coastguard Worker "12345");
959*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>("abc"),
960*61c4878aSAndroid Build Coastguard Worker str.assign(kView10.begin(), kView10.end()),
961*61c4878aSAndroid Build Coastguard Worker "1234567890");
962*61c4878aSAndroid Build Coastguard Worker
963*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<0>(), str.assign(kEvenNumbers0, kEvenNumbers0), "");
964*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>(), str.assign(kEvenNumbers2, kEvenNumbers2), "");
965*61c4878aSAndroid Build Coastguard Worker
966*61c4878aSAndroid Build Coastguard Worker TEST_STRING(
967*61c4878aSAndroid Build Coastguard Worker InlineString<4>("abc"), str.assign(kEvenNumbers0, kEvenNumbers2), "\0");
968*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<4>("abc"),
969*61c4878aSAndroid Build Coastguard Worker str.assign(kEvenNumbers0, kEvenNumbers8),
970*61c4878aSAndroid Build Coastguard Worker "\0\2\4\6");
971*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>("abc"),
972*61c4878aSAndroid Build Coastguard Worker str.assign(kEvenNumbers0, kEvenNumbers8),
973*61c4878aSAndroid Build Coastguard Worker "\0\2\4\6");
974*61c4878aSAndroid Build Coastguard Worker
975*61c4878aSAndroid Build Coastguard Worker #if PW_NC_TEST(Assign_Iterator_DoesNotFit)
976*61c4878aSAndroid Build Coastguard Worker PW_NC_EXPECT("PW_ASSERT\(current_position != string_end\)");
977*61c4878aSAndroid Build Coastguard Worker [[maybe_unused]] constexpr auto bad_string = [] {
978*61c4878aSAndroid Build Coastguard Worker InlineString<3> str;
979*61c4878aSAndroid Build Coastguard Worker return str.assign(kEvenNumbers0, kEvenNumbers8);
980*61c4878aSAndroid Build Coastguard Worker }();
981*61c4878aSAndroid Build Coastguard Worker #endif // PW_NC_TEST
982*61c4878aSAndroid Build Coastguard Worker }
983*61c4878aSAndroid Build Coastguard Worker
TEST(InlineString,Assign_InitializerList)984*61c4878aSAndroid Build Coastguard Worker TEST(InlineString, Assign_InitializerList) {
985*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<0>(), str.assign({}), "");
986*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<1>(), str.assign({}), "");
987*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>("abc"), str.assign({}), "");
988*61c4878aSAndroid Build Coastguard Worker
989*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<1>(), str.assign({'\0'}), "\0");
990*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<1>(), str.assign({'?'}), "?");
991*61c4878aSAndroid Build Coastguard Worker
992*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<5>("abc"), str.assign({'A'}), "A");
993*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<5>("abc"), str.assign({'\0', '\0', '\0'}), "\0\0\0");
994*61c4878aSAndroid Build Coastguard Worker TEST_STRING(
995*61c4878aSAndroid Build Coastguard Worker InlineString<5>("abc"), str.assign({'5', '4', '3', '2', '1'}), "54321");
996*61c4878aSAndroid Build Coastguard Worker
997*61c4878aSAndroid Build Coastguard Worker #if PW_NC_TEST(Assign_InitializerList_DoesNotFit)
998*61c4878aSAndroid Build Coastguard Worker PW_NC_EXPECT("PW_ASSERT\(new_size <= max_size\(\)\)");
999*61c4878aSAndroid Build Coastguard Worker [[maybe_unused]] constexpr auto bad_string = [] {
1000*61c4878aSAndroid Build Coastguard Worker InlineString<3> str;
1001*61c4878aSAndroid Build Coastguard Worker return str.assign({'1', '2', '3', '\0'});
1002*61c4878aSAndroid Build Coastguard Worker }();
1003*61c4878aSAndroid Build Coastguard Worker #endif // PW_NC_TEST
1004*61c4878aSAndroid Build Coastguard Worker }
1005*61c4878aSAndroid Build Coastguard Worker
TEST(InlineString,Assign_StringView)1006*61c4878aSAndroid Build Coastguard Worker TEST(InlineString, Assign_StringView) {
1007*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<0>(), str.assign(""sv), "");
1008*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>("abc"), str.assign(""sv), "");
1009*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>("abc"), str.assign("01234"sv), "01234");
1010*61c4878aSAndroid Build Coastguard Worker TEST_STRING(
1011*61c4878aSAndroid Build Coastguard Worker InlineString<10>("abc"), str.assign("0123456789"sv), "0123456789");
1012*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<20>(), str.assign("0123456789"sv), "0123456789");
1013*61c4878aSAndroid Build Coastguard Worker
1014*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>("abc"),
1015*61c4878aSAndroid Build Coastguard Worker str.assign(StringViewLike<char>("01234", 5)),
1016*61c4878aSAndroid Build Coastguard Worker "01234");
1017*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>(), str.assign(kStringViewLike10), "0123456789");
1018*61c4878aSAndroid Build Coastguard Worker
1019*61c4878aSAndroid Build Coastguard Worker #if PW_NC_TEST(Assign_StringView_DoesNotFit)
1020*61c4878aSAndroid Build Coastguard Worker PW_NC_EXPECT(
1021*61c4878aSAndroid Build Coastguard Worker "pw::InlineString must be at least as large as the source string");
1022*61c4878aSAndroid Build Coastguard Worker [[maybe_unused]] InlineString<5> bad_string;
1023*61c4878aSAndroid Build Coastguard Worker bad_string.assign(kEmptyCapacity10);
1024*61c4878aSAndroid Build Coastguard Worker #elif PW_NC_TEST(Assign_StringView_DoesNotFitConstexpr)
1025*61c4878aSAndroid Build Coastguard Worker PW_NC_EXPECT(
1026*61c4878aSAndroid Build Coastguard Worker "pw::InlineString must be at least as large as the source string");
1027*61c4878aSAndroid Build Coastguard Worker [[maybe_unused]] constexpr auto bad_string = [] {
1028*61c4878aSAndroid Build Coastguard Worker InlineString<5> str;
1029*61c4878aSAndroid Build Coastguard Worker str.assign(kEmptyCapacity10);
1030*61c4878aSAndroid Build Coastguard Worker return str;
1031*61c4878aSAndroid Build Coastguard Worker }();
1032*61c4878aSAndroid Build Coastguard Worker #elif PW_NC_TEST(Assign_StringView_NoAssignmentFromAmbiguousClass)
1033*61c4878aSAndroid Build Coastguard Worker PW_NC_EXPECT_CLANG("no matching member function for call to");
1034*61c4878aSAndroid Build Coastguard Worker PW_NC_EXPECT_GCC("no matching function for call to");
1035*61c4878aSAndroid Build Coastguard Worker [[maybe_unused]] InlineString<10> fail;
1036*61c4878aSAndroid Build Coastguard Worker fail.assign(StringViewLikeButConvertsToPointer<char>("1", 1));
1037*61c4878aSAndroid Build Coastguard Worker #endif // PW_NC_TEST
1038*61c4878aSAndroid Build Coastguard Worker }
1039*61c4878aSAndroid Build Coastguard Worker
1040*61c4878aSAndroid Build Coastguard Worker // NOLINTNEXTLINE(google-readability-function-size)
TEST(InlineString,Assign_StringViewSubstr)1041*61c4878aSAndroid Build Coastguard Worker TEST(InlineString, Assign_StringViewSubstr) {
1042*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<0>(), str.assign(""sv, 0, 0), "");
1043*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<5>(), str.assign(""sv, 0, 0), "");
1044*61c4878aSAndroid Build Coastguard Worker
1045*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<5>(), str.assign("0123456789"sv, 5, 0), "");
1046*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<5>(), str.assign("0123456789"sv, 10, 0), "");
1047*61c4878aSAndroid Build Coastguard Worker
1048*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<5>(), str.assign("0123456789"sv, 0, 5), "01234");
1049*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<5>(), str.assign("0123456789"sv, 1, 5), "12345");
1050*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<5>(), str.assign("0123456789"sv, 8, 2), "89");
1051*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<5>(), str.assign("0123456789"sv, 8, 10), "89");
1052*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<5>(), str.assign("0123456789"sv, 10, 10), "");
1053*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<5>(), str.assign("0123456789"sv, 10, 100), "");
1054*61c4878aSAndroid Build Coastguard Worker
1055*61c4878aSAndroid Build Coastguard Worker TEST_STRING(
1056*61c4878aSAndroid Build Coastguard Worker InlineString<10>(), str.assign("0123456789"sv, 0, 10), "0123456789");
1057*61c4878aSAndroid Build Coastguard Worker TEST_STRING(
1058*61c4878aSAndroid Build Coastguard Worker InlineString<10>(), str.assign("0123456789"sv, 0, 100), "0123456789");
1059*61c4878aSAndroid Build Coastguard Worker
1060*61c4878aSAndroid Build Coastguard Worker TEST_STRING(
1061*61c4878aSAndroid Build Coastguard Worker InlineString<10>(), str.assign(kStringViewLike10, 0, 100), "0123456789");
1062*61c4878aSAndroid Build Coastguard Worker
1063*61c4878aSAndroid Build Coastguard Worker #if PW_NC_TEST(Assign_StringViewSubstr_DoesNotFit)
1064*61c4878aSAndroid Build Coastguard Worker PW_NC_EXPECT("PW_ASSERT\(new_size <= max_size\(\)\)");
1065*61c4878aSAndroid Build Coastguard Worker [[maybe_unused]] constexpr auto bad_string = [] {
1066*61c4878aSAndroid Build Coastguard Worker InlineString<10> str;
1067*61c4878aSAndroid Build Coastguard Worker return str.assign("0123456789?"sv, 0, 11);
1068*61c4878aSAndroid Build Coastguard Worker }();
1069*61c4878aSAndroid Build Coastguard Worker #elif PW_NC_TEST(Assign_StringViewSubstr_IndexTooFar)
1070*61c4878aSAndroid Build Coastguard Worker PW_NC_EXPECT_CLANG("must be initialized by a constant expression");
1071*61c4878aSAndroid Build Coastguard Worker PW_NC_EXPECT_GCC("call to non-'constexpr' function");
1072*61c4878aSAndroid Build Coastguard Worker [[maybe_unused]] constexpr auto bad_string = [] {
1073*61c4878aSAndroid Build Coastguard Worker InlineString<10> str;
1074*61c4878aSAndroid Build Coastguard Worker return str.assign("12345"sv, 6, 0);
1075*61c4878aSAndroid Build Coastguard Worker }();
1076*61c4878aSAndroid Build Coastguard Worker #endif // PW_NC_TEST
1077*61c4878aSAndroid Build Coastguard Worker }
1078*61c4878aSAndroid Build Coastguard Worker
1079*61c4878aSAndroid Build Coastguard Worker //
1080*61c4878aSAndroid Build Coastguard Worker // Element access
1081*61c4878aSAndroid Build Coastguard Worker //
1082*61c4878aSAndroid Build Coastguard Worker
TEST(InlineString,At)1083*61c4878aSAndroid Build Coastguard Worker TEST(InlineString, At) {
1084*61c4878aSAndroid Build Coastguard Worker static_assert(kSize5Capacity10.at(0) == '1', "1");
1085*61c4878aSAndroid Build Coastguard Worker static_assert(kSize5Capacity10.at(1) == '2', "2");
1086*61c4878aSAndroid Build Coastguard Worker static_assert(kSize5Capacity10.at(2) == '3', "3");
1087*61c4878aSAndroid Build Coastguard Worker static_assert(kSize5Capacity10.at(3) == '4', "4");
1088*61c4878aSAndroid Build Coastguard Worker static_assert(kSize5Capacity10.at(4) == '5', "5");
1089*61c4878aSAndroid Build Coastguard Worker
1090*61c4878aSAndroid Build Coastguard Worker static_assert(kSize10Capacity10.at(9) == '0', "null");
1091*61c4878aSAndroid Build Coastguard Worker
1092*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(Generic(kSize5Capacity10).at(0), '1');
1093*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(Generic(kSize5Capacity10).at(1), '2');
1094*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(Generic(kSize5Capacity10).at(2), '3');
1095*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(Generic(kSize5Capacity10).at(3), '4');
1096*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(Generic(kSize5Capacity10).at(4), '5');
1097*61c4878aSAndroid Build Coastguard Worker
1098*61c4878aSAndroid Build Coastguard Worker #if PW_NC_TEST(At_OutOfBounds)
1099*61c4878aSAndroid Build Coastguard Worker PW_NC_EXPECT("PW_ASSERT\(index < length\(\)\);");
1100*61c4878aSAndroid Build Coastguard Worker [[maybe_unused]] constexpr char out_of_bounds = kSize5Capacity10.at(5);
1101*61c4878aSAndroid Build Coastguard Worker #endif // PW_NC_TEST
1102*61c4878aSAndroid Build Coastguard Worker }
1103*61c4878aSAndroid Build Coastguard Worker
TEST(InlineString,SubscriptOperator)1104*61c4878aSAndroid Build Coastguard Worker TEST(InlineString, SubscriptOperator) {
1105*61c4878aSAndroid Build Coastguard Worker static_assert(kSize5Capacity10[0] == '1', "1");
1106*61c4878aSAndroid Build Coastguard Worker static_assert(kSize5Capacity10[1] == '2', "2");
1107*61c4878aSAndroid Build Coastguard Worker static_assert(kSize5Capacity10[2] == '3', "3");
1108*61c4878aSAndroid Build Coastguard Worker static_assert(kSize5Capacity10[3] == '4', "4");
1109*61c4878aSAndroid Build Coastguard Worker static_assert(kSize5Capacity10[4] == '5', "5");
1110*61c4878aSAndroid Build Coastguard Worker
1111*61c4878aSAndroid Build Coastguard Worker static_assert(kSize10Capacity10[9] == '0', "null");
1112*61c4878aSAndroid Build Coastguard Worker
1113*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(Generic(kSize5Capacity10)[0], '1');
1114*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(Generic(kSize5Capacity10)[1], '2');
1115*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(Generic(kSize5Capacity10)[2], '3');
1116*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(Generic(kSize5Capacity10)[3], '4');
1117*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(Generic(kSize5Capacity10)[4], '5');
1118*61c4878aSAndroid Build Coastguard Worker
1119*61c4878aSAndroid Build Coastguard Worker static_assert(kSize5Capacity10[5] == '\0', "No range checking");
1120*61c4878aSAndroid Build Coastguard Worker static_assert(kSize5Capacity10[6] == '\0', "No range checking");
1121*61c4878aSAndroid Build Coastguard Worker }
1122*61c4878aSAndroid Build Coastguard Worker
TEST(InlineString,FrontBack)1123*61c4878aSAndroid Build Coastguard Worker TEST(InlineString, FrontBack) {
1124*61c4878aSAndroid Build Coastguard Worker static_assert(kSize10Capacity10.front() == '1', "1");
1125*61c4878aSAndroid Build Coastguard Worker static_assert(kSize10Capacity10.back() == '0', "0");
1126*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(Generic(kSize10Capacity10).front(), '1');
1127*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(Generic(kSize10Capacity10).back(), '0');
1128*61c4878aSAndroid Build Coastguard Worker }
1129*61c4878aSAndroid Build Coastguard Worker
TEST(InlineString,DataCStr)1130*61c4878aSAndroid Build Coastguard Worker TEST(InlineString, DataCStr) {
1131*61c4878aSAndroid Build Coastguard Worker static_assert(kSize10Capacity10.data() == kSize10Capacity10.c_str(),
1132*61c4878aSAndroid Build Coastguard Worker "data() and c_str()");
1133*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(Generic(kSize10Capacity10).data(),
1134*61c4878aSAndroid Build Coastguard Worker Generic(kSize10Capacity10).c_str());
1135*61c4878aSAndroid Build Coastguard Worker
1136*61c4878aSAndroid Build Coastguard Worker EXPECT_STREQ(kSize10Capacity10.data(), "1234567890");
1137*61c4878aSAndroid Build Coastguard Worker EXPECT_STREQ(kSize10Capacity10.c_str(), "1234567890");
1138*61c4878aSAndroid Build Coastguard Worker }
1139*61c4878aSAndroid Build Coastguard Worker
TEST(InlineString,ConvertsToStringView)1140*61c4878aSAndroid Build Coastguard Worker TEST(InlineString, ConvertsToStringView) {
1141*61c4878aSAndroid Build Coastguard Worker static_assert(std::string_view(kSize5Capacity10) == "12345"sv);
1142*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(std::string_view(Generic(kSize5Capacity10)), "12345"sv);
1143*61c4878aSAndroid Build Coastguard Worker }
1144*61c4878aSAndroid Build Coastguard Worker
1145*61c4878aSAndroid Build Coastguard Worker //
1146*61c4878aSAndroid Build Coastguard Worker // Iterators
1147*61c4878aSAndroid Build Coastguard Worker //
1148*61c4878aSAndroid Build Coastguard Worker
TEST(InlineString,Iterators)1149*61c4878aSAndroid Build Coastguard Worker TEST(InlineString, Iterators) {
1150*61c4878aSAndroid Build Coastguard Worker static_assert(kEmptyCapacity10.begin() == kEmptyCapacity10.end());
1151*61c4878aSAndroid Build Coastguard Worker static_assert(kSize5Capacity10.end() - kSize5Capacity10.begin() == 5u);
1152*61c4878aSAndroid Build Coastguard Worker static_assert(kSize5Capacity10.begin() + 5 == kSize5Capacity10.end());
1153*61c4878aSAndroid Build Coastguard Worker
1154*61c4878aSAndroid Build Coastguard Worker static_assert(*kSize5Capacity10.begin() == '1');
1155*61c4878aSAndroid Build Coastguard Worker static_assert(*(kSize5Capacity10.begin() + 1) == '2');
1156*61c4878aSAndroid Build Coastguard Worker
1157*61c4878aSAndroid Build Coastguard Worker static_assert(kEmptyCapacity10.rbegin() == kEmptyCapacity10.rend());
1158*61c4878aSAndroid Build Coastguard Worker static_assert(kSize5Capacity10.rend() - kSize5Capacity10.rbegin() == 5u);
1159*61c4878aSAndroid Build Coastguard Worker static_assert(kSize5Capacity10.rbegin() + 5 == kSize5Capacity10.rend());
1160*61c4878aSAndroid Build Coastguard Worker
1161*61c4878aSAndroid Build Coastguard Worker static_assert(*kSize5Capacity10.rbegin() == '5');
1162*61c4878aSAndroid Build Coastguard Worker static_assert(*(kSize5Capacity10.rbegin() + 1) == '4');
1163*61c4878aSAndroid Build Coastguard Worker
1164*61c4878aSAndroid Build Coastguard Worker static_assert(kSize5Capacity10.begin() == kSize5Capacity10.cbegin());
1165*61c4878aSAndroid Build Coastguard Worker static_assert(kSize5Capacity10.end() == kSize5Capacity10.cend());
1166*61c4878aSAndroid Build Coastguard Worker static_assert(kSize5Capacity10.rbegin() == kSize5Capacity10.crbegin());
1167*61c4878aSAndroid Build Coastguard Worker static_assert(kSize5Capacity10.rend() == kSize5Capacity10.crend());
1168*61c4878aSAndroid Build Coastguard Worker
1169*61c4878aSAndroid Build Coastguard Worker static_assert([] {
1170*61c4878aSAndroid Build Coastguard Worker char expected = '1';
1171*61c4878aSAndroid Build Coastguard Worker for (char ch : kSize5Capacity10) {
1172*61c4878aSAndroid Build Coastguard Worker if (ch != expected) {
1173*61c4878aSAndroid Build Coastguard Worker return false;
1174*61c4878aSAndroid Build Coastguard Worker }
1175*61c4878aSAndroid Build Coastguard Worker expected += 1;
1176*61c4878aSAndroid Build Coastguard Worker }
1177*61c4878aSAndroid Build Coastguard Worker return true;
1178*61c4878aSAndroid Build Coastguard Worker }());
1179*61c4878aSAndroid Build Coastguard Worker }
1180*61c4878aSAndroid Build Coastguard Worker
1181*61c4878aSAndroid Build Coastguard Worker //
1182*61c4878aSAndroid Build Coastguard Worker // Capacity
1183*61c4878aSAndroid Build Coastguard Worker //
1184*61c4878aSAndroid Build Coastguard Worker
TEST(InlineString,Size)1185*61c4878aSAndroid Build Coastguard Worker TEST(InlineString, Size) {
1186*61c4878aSAndroid Build Coastguard Worker static_assert(kEmptyCapacity0.empty(), "empty");
1187*61c4878aSAndroid Build Coastguard Worker static_assert(kEmptyCapacity10.empty(), "empty");
1188*61c4878aSAndroid Build Coastguard Worker
1189*61c4878aSAndroid Build Coastguard Worker static_assert(kEmptyCapacity10.size() == 0u, "0"); // NOLINT
1190*61c4878aSAndroid Build Coastguard Worker static_assert(kSize5Capacity10.size() == 5u, "5");
1191*61c4878aSAndroid Build Coastguard Worker static_assert(kEmptyCapacity10.length() == 0u, "0"); // NOLINT
1192*61c4878aSAndroid Build Coastguard Worker static_assert(kSize5Capacity10.length() == 5u, "5");
1193*61c4878aSAndroid Build Coastguard Worker }
1194*61c4878aSAndroid Build Coastguard Worker
TEST(InlineString,MaxSize)1195*61c4878aSAndroid Build Coastguard Worker TEST(InlineString, MaxSize) {
1196*61c4878aSAndroid Build Coastguard Worker static_assert(InlineString<0>().max_size() == 0u, "0");
1197*61c4878aSAndroid Build Coastguard Worker static_assert(InlineString<1>().max_size() == 1u, "1");
1198*61c4878aSAndroid Build Coastguard Worker static_assert(InlineString<10>().max_size() == 10u, "10");
1199*61c4878aSAndroid Build Coastguard Worker static_assert(InlineString<10>("123").max_size() == 10u, "10");
1200*61c4878aSAndroid Build Coastguard Worker static_assert(Generic(InlineString<10>("123")).max_size() == 10u, "10");
1201*61c4878aSAndroid Build Coastguard Worker
1202*61c4878aSAndroid Build Coastguard Worker static_assert(InlineString<0>().capacity() == 0u, "0");
1203*61c4878aSAndroid Build Coastguard Worker static_assert(InlineString<10>().capacity() == 10u, "10");
1204*61c4878aSAndroid Build Coastguard Worker }
1205*61c4878aSAndroid Build Coastguard Worker
1206*61c4878aSAndroid Build Coastguard Worker //
1207*61c4878aSAndroid Build Coastguard Worker // Operations
1208*61c4878aSAndroid Build Coastguard Worker //
1209*61c4878aSAndroid Build Coastguard Worker
1210*61c4878aSAndroid Build Coastguard Worker // clear
1211*61c4878aSAndroid Build Coastguard Worker
TEST(InlineString,Clear)1212*61c4878aSAndroid Build Coastguard Worker TEST(InlineString, Clear) {
1213*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<0>(), str.clear(), "");
1214*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<8>(), str.clear(), "");
1215*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<8>("stuff"), str.clear(), "");
1216*61c4878aSAndroid Build Coastguard Worker TEST_RUNTIME_STRING(InlineString<8>("stuff"), generic_str.clear(), "");
1217*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<8>("!!"), str.clear(); str.assign("?"), "?");
1218*61c4878aSAndroid Build Coastguard Worker }
1219*61c4878aSAndroid Build Coastguard Worker
1220*61c4878aSAndroid Build Coastguard Worker // insert
1221*61c4878aSAndroid Build Coastguard Worker
TEST(InlineString,Insert_CharactersAtIndex)1222*61c4878aSAndroid Build Coastguard Worker TEST(InlineString, Insert_CharactersAtIndex) {
1223*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<1>(), str.insert(0, 0, 'b'), "");
1224*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<1>("a"), str.insert(0, 0, 'b'), "a");
1225*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>("a"), str.insert(0, 2, 'b'), "bba");
1226*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>("a"), str.insert(1, 2, 'b'), "abb");
1227*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>(), str.insert(0, 10, 'b'), "bbbbbbbbbb");
1228*61c4878aSAndroid Build Coastguard Worker }
1229*61c4878aSAndroid Build Coastguard Worker #if PW_NC_TEST(Insert_CharactersAtIndex_DoesNotFit)
1230*61c4878aSAndroid Build Coastguard Worker PW_NC_EXPECT("PW_ASSERT\(size\(\) - index <= max_size\(\) - new_index\)");
__anon055724311a02null1231*61c4878aSAndroid Build Coastguard Worker [[maybe_unused]] constexpr auto fail = [] {
1232*61c4878aSAndroid Build Coastguard Worker InlineString<3> str({0, 1});
1233*61c4878aSAndroid Build Coastguard Worker return str.insert(1, 2, '?');
1234*61c4878aSAndroid Build Coastguard Worker }();
1235*61c4878aSAndroid Build Coastguard Worker #endif // PW_NC_TEST
1236*61c4878aSAndroid Build Coastguard Worker
TEST(InlineString,Insert_PointerSizeAtIndex)1237*61c4878aSAndroid Build Coastguard Worker TEST(InlineString, Insert_PointerSizeAtIndex) {
1238*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<1>(), str.insert(0, "", 0), "");
1239*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<1>("a"), str.insert(0, "b", 0), "a");
1240*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>("a"), str.insert(0, "bb", 2), "bba");
1241*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>("a"), str.insert(1, "bb", 2), "abb");
1242*61c4878aSAndroid Build Coastguard Worker TEST_STRING(
1243*61c4878aSAndroid Build Coastguard Worker InlineString<10>(), str.insert(0, "bbbbbbbbbb", 10), "bbbbbbbbbb");
1244*61c4878aSAndroid Build Coastguard Worker }
1245*61c4878aSAndroid Build Coastguard Worker #if PW_NC_TEST(Insert_PointerSizeAtIndex_DoesNotFit)
1246*61c4878aSAndroid Build Coastguard Worker PW_NC_EXPECT("PW_ASSERT\(size\(\) - index <= max_size\(\) - new_index\)");
__anon055724311b02null1247*61c4878aSAndroid Build Coastguard Worker [[maybe_unused]] constexpr auto fail = [] {
1248*61c4878aSAndroid Build Coastguard Worker InlineString<3> str({0, 1});
1249*61c4878aSAndroid Build Coastguard Worker return str.insert(1, "23", 2);
1250*61c4878aSAndroid Build Coastguard Worker }();
1251*61c4878aSAndroid Build Coastguard Worker #endif // PW_NC_TEST
1252*61c4878aSAndroid Build Coastguard Worker
TEST(InlineString,Insert_ArrayAtIndex)1253*61c4878aSAndroid Build Coastguard Worker TEST(InlineString, Insert_ArrayAtIndex) {
1254*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<1>(), fixed_str.insert(0, ""), "");
1255*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<2>(), fixed_str.insert(0, "a"), "a");
1256*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<6>(), fixed_str.insert(0, "12345"), "12345");
1257*61c4878aSAndroid Build Coastguard Worker
1258*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<1>({'a'}), fixed_str.insert(1, ""), "a");
1259*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<2>("a"), fixed_str.insert(1, "a"), "aa");
1260*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<6>("a"), fixed_str.insert(1, "12345"), "a12345");
1261*61c4878aSAndroid Build Coastguard Worker }
1262*61c4878aSAndroid Build Coastguard Worker #if PW_NC_TEST(Insert_ArrayAtIndex_DoesNotFit)
1263*61c4878aSAndroid Build Coastguard Worker PW_NC_EXPECT("PW_ASSERT\(size\(\) - index <= max_size\(\) - new_index\)");
__anon055724311c02null1264*61c4878aSAndroid Build Coastguard Worker [[maybe_unused]] constexpr auto fail = [] {
1265*61c4878aSAndroid Build Coastguard Worker InlineString<4> str({0, 1});
1266*61c4878aSAndroid Build Coastguard Worker return str.insert(1, "123");
1267*61c4878aSAndroid Build Coastguard Worker }();
1268*61c4878aSAndroid Build Coastguard Worker #endif // PW_NC_TEST
1269*61c4878aSAndroid Build Coastguard Worker
TEST(InlineString,Insert_PointerAtIndex)1270*61c4878aSAndroid Build Coastguard Worker TEST(InlineString, Insert_PointerAtIndex) {
1271*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<0>(), str.insert(0, kPointer0), "");
1272*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>(), str.insert(0, kPointer10), "9876543210");
1273*61c4878aSAndroid Build Coastguard Worker TEST_STRING(
1274*61c4878aSAndroid Build Coastguard Worker InlineString<10>("abc"), str.insert(1, kPointer10 + 5), "a43210bc");
1275*61c4878aSAndroid Build Coastguard Worker TEST_STRING(
1276*61c4878aSAndroid Build Coastguard Worker InlineString<13>("abc"), str.insert(3, kPointer10), "abc9876543210");
1277*61c4878aSAndroid Build Coastguard Worker }
1278*61c4878aSAndroid Build Coastguard Worker #if PW_NC_TEST(Insert_PointerAtIndex_DoesNotFit)
1279*61c4878aSAndroid Build Coastguard Worker PW_NC_EXPECT("PW_ASSERT\(size\(\) - index <= max_size\(\) - new_index\)");
__anon055724311d02null1280*61c4878aSAndroid Build Coastguard Worker [[maybe_unused]] constexpr auto fail = [] {
1281*61c4878aSAndroid Build Coastguard Worker InlineString<3> str({0, 1});
1282*61c4878aSAndroid Build Coastguard Worker return str.insert(1, kPointer10 + 8);
1283*61c4878aSAndroid Build Coastguard Worker }();
1284*61c4878aSAndroid Build Coastguard Worker #endif // PW_NC_TEST
1285*61c4878aSAndroid Build Coastguard Worker
TEST(InlineString,Insert_BasicStringAtIndex)1286*61c4878aSAndroid Build Coastguard Worker TEST(InlineString, Insert_BasicStringAtIndex) {
1287*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<0>(), str.insert(0, kEmptyCapacity0), "");
1288*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>(), str.insert(0, kEmptyCapacity10), "");
1289*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>(), str.insert(0, kSize5Capacity10), "12345");
1290*61c4878aSAndroid Build Coastguard Worker TEST_STRING(
1291*61c4878aSAndroid Build Coastguard Worker InlineString<10>(), str.insert(0, kSize10Capacity10), "1234567890");
1292*61c4878aSAndroid Build Coastguard Worker
1293*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<1>({'a'}), str.insert(0, kEmptyCapacity0), "a");
1294*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<11>("a"), str.insert(1, kEmptyCapacity10), "a");
1295*61c4878aSAndroid Build Coastguard Worker TEST_STRING(
1296*61c4878aSAndroid Build Coastguard Worker InlineString<12>("aa"), str.insert(1, kSize5Capacity10), "a12345a");
1297*61c4878aSAndroid Build Coastguard Worker TEST_STRING(
1298*61c4878aSAndroid Build Coastguard Worker InlineString<12>("aa"), str.insert(2, kSize10Capacity10), "aa1234567890");
1299*61c4878aSAndroid Build Coastguard Worker }
1300*61c4878aSAndroid Build Coastguard Worker
1301*61c4878aSAndroid Build Coastguard Worker #if PW_NC_TEST(Insert_BasicStringAtIndex_DoesNotFit)
1302*61c4878aSAndroid Build Coastguard Worker PW_NC_EXPECT("PW_ASSERT\(new_index <= max_size\(\)\)");
__anon055724311e02null1303*61c4878aSAndroid Build Coastguard Worker [[maybe_unused]] constexpr auto fail = [] {
1304*61c4878aSAndroid Build Coastguard Worker InlineString<3> str({0, 1});
1305*61c4878aSAndroid Build Coastguard Worker return str.insert(1, kSize5Capacity10);
1306*61c4878aSAndroid Build Coastguard Worker }();
1307*61c4878aSAndroid Build Coastguard Worker #endif // PW_NC_TEST
1308*61c4878aSAndroid Build Coastguard Worker
TEST(InlineString,Insert_BasicStringSubstrAtIndex)1309*61c4878aSAndroid Build Coastguard Worker TEST(InlineString, Insert_BasicStringSubstrAtIndex) {
1310*61c4878aSAndroid Build Coastguard Worker TEST_STRING(
1311*61c4878aSAndroid Build Coastguard Worker InlineString<1>({'a'}), str.insert(0, kEmptyCapacity0, 0, 0), "a");
1312*61c4878aSAndroid Build Coastguard Worker TEST_STRING(
1313*61c4878aSAndroid Build Coastguard Worker InlineString<11>("a"), str.insert(1, kSize10Capacity10, 10, 0), "a");
1314*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<12>("aa"),
1315*61c4878aSAndroid Build Coastguard Worker str.insert(1, kSize10Capacity10, 3, 5),
1316*61c4878aSAndroid Build Coastguard Worker "a45678a");
1317*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<12>("aa"),
1318*61c4878aSAndroid Build Coastguard Worker str.insert(2, kSize10Capacity10, 0, 10),
1319*61c4878aSAndroid Build Coastguard Worker "aa1234567890");
1320*61c4878aSAndroid Build Coastguard Worker }
1321*61c4878aSAndroid Build Coastguard Worker #if PW_NC_TEST(Insert_BasicStringSubstrAtIndex_DoesNotFit)
1322*61c4878aSAndroid Build Coastguard Worker PW_NC_EXPECT("PW_ASSERT\(size\(\) - index <= max_size\(\) - new_index\)");
__anon055724311f02null1323*61c4878aSAndroid Build Coastguard Worker [[maybe_unused]] constexpr auto fail = [] {
1324*61c4878aSAndroid Build Coastguard Worker InlineString<3> str({0, 1});
1325*61c4878aSAndroid Build Coastguard Worker return str.insert(1, kSize5Capacity10, 1, 2);
1326*61c4878aSAndroid Build Coastguard Worker }();
1327*61c4878aSAndroid Build Coastguard Worker #endif // PW_NC_TEST
1328*61c4878aSAndroid Build Coastguard Worker
TEST(InlineString,Insert_CharactersAtPosition)1329*61c4878aSAndroid Build Coastguard Worker TEST(InlineString, Insert_CharactersAtPosition) {
1330*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<1>(), str.insert(str.begin(), 0, 'b'), "");
1331*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<1>("a"), str.insert(str.begin(), 0, 'b'), "a");
1332*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>("a"), str.insert(str.begin(), 2, 'b'), "bba");
1333*61c4878aSAndroid Build Coastguard Worker TEST_STRING(
1334*61c4878aSAndroid Build Coastguard Worker InlineString<10>("a"), str.insert(str.begin() + 1, 2, 'b'), "abb");
1335*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>(), str.insert(str.end(), 10, 'b'), "bbbbbbbbbb");
1336*61c4878aSAndroid Build Coastguard Worker }
1337*61c4878aSAndroid Build Coastguard Worker
1338*61c4878aSAndroid Build Coastguard Worker #if PW_NC_TEST(Insert_CharactersAtPosition_DoesNotFit)
1339*61c4878aSAndroid Build Coastguard Worker PW_NC_EXPECT("PW_ASSERT\(size\(\) - index <= max_size\(\) - new_index\)");
__anon055724312002null1340*61c4878aSAndroid Build Coastguard Worker [[maybe_unused]] constexpr auto fail = [] {
1341*61c4878aSAndroid Build Coastguard Worker InlineString<3> str({0, 1});
1342*61c4878aSAndroid Build Coastguard Worker return str.insert(str.begin() + 1, 2, '?');
1343*61c4878aSAndroid Build Coastguard Worker }();
1344*61c4878aSAndroid Build Coastguard Worker #endif // PW_NC_TEST
1345*61c4878aSAndroid Build Coastguard Worker
TEST(InlineString,Insert_CharacterAtPosition)1346*61c4878aSAndroid Build Coastguard Worker TEST(InlineString, Insert_CharacterAtPosition) {
1347*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<1>(), str.insert(str.begin(), 'b'), "b");
1348*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>("aa"), str.insert(str.begin(), 'b'), "baa");
1349*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>("aa"), str.insert(str.begin() + 1, 'b'), "aba");
1350*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>("aa"), str.insert(str.begin() + 2, 'b'), "aab");
1351*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>("aa"), str.insert(str.end(), 'b'), "aab");
1352*61c4878aSAndroid Build Coastguard Worker }
1353*61c4878aSAndroid Build Coastguard Worker #if PW_NC_TEST(Insert_CharacterAtPosition_DoesNotFit)
1354*61c4878aSAndroid Build Coastguard Worker PW_NC_EXPECT("PW_ASSERT\(size\(\) - index <= max_size\(\) - new_index\)");
__anon055724312102null1355*61c4878aSAndroid Build Coastguard Worker [[maybe_unused]] constexpr auto fail = [] {
1356*61c4878aSAndroid Build Coastguard Worker InlineString<2> str({0, 1});
1357*61c4878aSAndroid Build Coastguard Worker return str.insert(str.begin() + 1, '?');
1358*61c4878aSAndroid Build Coastguard Worker }();
1359*61c4878aSAndroid Build Coastguard Worker #endif // PW_NC_TEST
1360*61c4878aSAndroid Build Coastguard Worker
TEST(InlineString,Insert_IteratorsAtPosition)1361*61c4878aSAndroid Build Coastguard Worker TEST(InlineString, Insert_IteratorsAtPosition) {
1362*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<0>(),
1363*61c4878aSAndroid Build Coastguard Worker str.insert(str.begin(), kEvenNumbers0, kEvenNumbers0),
1364*61c4878aSAndroid Build Coastguard Worker "");
1365*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>(),
1366*61c4878aSAndroid Build Coastguard Worker str.insert(str.end(), kEvenNumbers0, kEvenNumbers0),
1367*61c4878aSAndroid Build Coastguard Worker "");
1368*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>(),
1369*61c4878aSAndroid Build Coastguard Worker str.insert(str.end(), kEvenNumbers0, kEvenNumbers0),
1370*61c4878aSAndroid Build Coastguard Worker "");
1371*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>(),
1372*61c4878aSAndroid Build Coastguard Worker str.insert(str.begin(), kEvenNumbers0, kEvenNumbers8),
1373*61c4878aSAndroid Build Coastguard Worker "\0\2\4\6");
1374*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>(),
1375*61c4878aSAndroid Build Coastguard Worker str.insert(str.end(), kEvenNumbers0, kEvenNumbers8),
1376*61c4878aSAndroid Build Coastguard Worker "\0\2\4\6");
1377*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>("aa"),
1378*61c4878aSAndroid Build Coastguard Worker str.insert(str.begin(), kEvenNumbers0, kEvenNumbers8),
1379*61c4878aSAndroid Build Coastguard Worker "\0\2\4\6aa");
1380*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>("aa"),
1381*61c4878aSAndroid Build Coastguard Worker str.insert(str.begin() + 1, kEvenNumbers0, kEvenNumbers8),
1382*61c4878aSAndroid Build Coastguard Worker "a\0\2\4\6a");
1383*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>("aa"),
1384*61c4878aSAndroid Build Coastguard Worker str.insert(str.begin() + 2, kEvenNumbers0, kEvenNumbers8),
1385*61c4878aSAndroid Build Coastguard Worker "aa\0\2\4\6");
1386*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>("aa"),
1387*61c4878aSAndroid Build Coastguard Worker str.insert(str.end(), kEvenNumbers0, kEvenNumbers8),
1388*61c4878aSAndroid Build Coastguard Worker "aa\0\2\4\6");
1389*61c4878aSAndroid Build Coastguard Worker }
1390*61c4878aSAndroid Build Coastguard Worker #if PW_NC_TEST(Insert_IteratorsAtPosition_DoesNotFit)
1391*61c4878aSAndroid Build Coastguard Worker PW_NC_EXPECT("PW_ASSERT\(count < max_size\(\)\)");
__anon055724312202null1392*61c4878aSAndroid Build Coastguard Worker [[maybe_unused]] constexpr auto fail = [] {
1393*61c4878aSAndroid Build Coastguard Worker InlineString<3> str({0, 1});
1394*61c4878aSAndroid Build Coastguard Worker return str.insert(str.begin() + 1, kEvenNumbers0, kEvenNumbers8);
1395*61c4878aSAndroid Build Coastguard Worker }();
1396*61c4878aSAndroid Build Coastguard Worker #endif // PW_NC_TEST
1397*61c4878aSAndroid Build Coastguard Worker
TEST(InlineString,Insert_InitializerListAtPosition)1398*61c4878aSAndroid Build Coastguard Worker TEST(InlineString, Insert_InitializerListAtPosition) {
1399*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<0>(), str.insert(str.begin(), {}), "");
1400*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>(), str.insert(str.end(), {1, 2, 3}), "\1\2\3");
1401*61c4878aSAndroid Build Coastguard Worker TEST_STRING(
1402*61c4878aSAndroid Build Coastguard Worker InlineString<10>("abc"), str.insert(str.begin(), {1, 2, 3}), "\1\2\3abc");
1403*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>("abc"),
1404*61c4878aSAndroid Build Coastguard Worker str.insert(str.begin() + 1, {1, 2, 3}),
1405*61c4878aSAndroid Build Coastguard Worker "a\1\2\3bc");
1406*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>("abc"),
1407*61c4878aSAndroid Build Coastguard Worker str.insert(str.begin() + 3, {1, 2, 3}),
1408*61c4878aSAndroid Build Coastguard Worker "abc\1\2\3");
1409*61c4878aSAndroid Build Coastguard Worker TEST_STRING(
1410*61c4878aSAndroid Build Coastguard Worker InlineString<5>("abc"), str.insert(str.end(), {'4', '5'}), "abc45");
1411*61c4878aSAndroid Build Coastguard Worker }
1412*61c4878aSAndroid Build Coastguard Worker #if PW_NC_TEST(Insert_InitializerListAtPosition_DoesNotFit)
1413*61c4878aSAndroid Build Coastguard Worker PW_NC_EXPECT("PW_ASSERT\(size\(\) - index <= max_size\(\) - new_index\)");
__anon055724312302null1414*61c4878aSAndroid Build Coastguard Worker [[maybe_unused]] constexpr auto fail = [] {
1415*61c4878aSAndroid Build Coastguard Worker InlineString<3> str({0, 1, 2});
1416*61c4878aSAndroid Build Coastguard Worker return str.insert(str.begin() + 1, {3});
1417*61c4878aSAndroid Build Coastguard Worker }();
1418*61c4878aSAndroid Build Coastguard Worker #endif // PW_NC_TEST
1419*61c4878aSAndroid Build Coastguard Worker
TEST(InlineString,Insert_StringViewAtIndex)1420*61c4878aSAndroid Build Coastguard Worker TEST(InlineString, Insert_StringViewAtIndex) {
1421*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<0>(), str.insert(0, ""sv), "");
1422*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>("a"), str.insert(0, ""sv), "a");
1423*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>("abc"), str.insert(0, "123"sv), "123abc");
1424*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>("abc"), str.insert(1, "123"sv), "a123bc");
1425*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<5>("abc"), str.insert(3, "45"sv), "abc45");
1426*61c4878aSAndroid Build Coastguard Worker }
1427*61c4878aSAndroid Build Coastguard Worker #if PW_NC_TEST(Insert_StringViewAtIndex_DoesNotFit)
1428*61c4878aSAndroid Build Coastguard Worker PW_NC_EXPECT("PW_ASSERT\(size\(\) - index <= max_size\(\) - new_index\)");
__anon055724312402null1429*61c4878aSAndroid Build Coastguard Worker [[maybe_unused]] constexpr auto fail = [] {
1430*61c4878aSAndroid Build Coastguard Worker InlineString<3> str({0, 1, 2});
1431*61c4878aSAndroid Build Coastguard Worker return str.insert(1, "3"sv);
1432*61c4878aSAndroid Build Coastguard Worker }();
1433*61c4878aSAndroid Build Coastguard Worker #endif // PW_NC_TEST
1434*61c4878aSAndroid Build Coastguard Worker
TEST(InlineString,Insert_StringViewSubstrAtIndex)1435*61c4878aSAndroid Build Coastguard Worker TEST(InlineString, Insert_StringViewSubstrAtIndex) {
1436*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<0>(), str.insert(0, ""sv, 0), "");
1437*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<0>(), str.insert(0, ""sv, 0, 0), "");
1438*61c4878aSAndroid Build Coastguard Worker TEST_RUNTIME_STRING(
1439*61c4878aSAndroid Build Coastguard Worker InlineString<5>("aa"), str.insert(0, "123"sv, 0), "123aa");
1440*61c4878aSAndroid Build Coastguard Worker TEST_RUNTIME_STRING(
1441*61c4878aSAndroid Build Coastguard Worker InlineString<10>("aa"), str.insert(1, "123"sv, 1, 0), "aa");
1442*61c4878aSAndroid Build Coastguard Worker TEST_RUNTIME_STRING(
1443*61c4878aSAndroid Build Coastguard Worker InlineString<10>("aa"), str.insert(1, "123"sv, 1, 1), "a2a");
1444*61c4878aSAndroid Build Coastguard Worker TEST_RUNTIME_STRING(
1445*61c4878aSAndroid Build Coastguard Worker InlineString<10>("aa"), str.insert(1, "123"sv, 1, 99), "a23a");
1446*61c4878aSAndroid Build Coastguard Worker TEST_RUNTIME_STRING(
1447*61c4878aSAndroid Build Coastguard Worker InlineString<10>("aa"), str.insert(2, "123"sv, 1, 99), "aa23");
1448*61c4878aSAndroid Build Coastguard Worker TEST_RUNTIME_STRING(
1449*61c4878aSAndroid Build Coastguard Worker InlineString<10>("aa"), str.insert(2, "123"sv, 3, 99), "aa");
1450*61c4878aSAndroid Build Coastguard Worker }
1451*61c4878aSAndroid Build Coastguard Worker #if PW_NC_TEST(Insert_StringViewSubstrAtIndex_DoesNotFit)
1452*61c4878aSAndroid Build Coastguard Worker PW_NC_EXPECT("PW_ASSERT\(size\(\) - index <= max_size\(\) - new_index\)");
__anon055724312502null1453*61c4878aSAndroid Build Coastguard Worker [[maybe_unused]] constexpr auto fail = [] {
1454*61c4878aSAndroid Build Coastguard Worker InlineString<3> str({0, 1, 2});
1455*61c4878aSAndroid Build Coastguard Worker return str.insert(1, "34"sv, 1);
1456*61c4878aSAndroid Build Coastguard Worker }();
1457*61c4878aSAndroid Build Coastguard Worker #endif // PW_NC_TEST
1458*61c4878aSAndroid Build Coastguard Worker
1459*61c4878aSAndroid Build Coastguard Worker // erase.
1460*61c4878aSAndroid Build Coastguard Worker
TEST(InlineString,Erase_CharactersAtIndex)1461*61c4878aSAndroid Build Coastguard Worker TEST(InlineString, Erase_CharactersAtIndex) {
1462*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<0>(), str.erase(), "");
1463*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>("abc"), str.erase(), "");
1464*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>("abc"), str.erase(0), "");
1465*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>("abc"), str.erase(1), "a");
1466*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>("abc"), str.erase(1, 1), "ac");
1467*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>("abc"), str.erase(1, 10), "a");
1468*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>("abc"), str.erase(3, 10), "abc");
1469*61c4878aSAndroid Build Coastguard Worker }
1470*61c4878aSAndroid Build Coastguard Worker #if PW_NC_TEST(Erase_IndexOutOfRange)
1471*61c4878aSAndroid Build Coastguard Worker PW_NC_EXPECT("PW_ASSERT\(index <= size\(\)\)");
__anon055724312602null1472*61c4878aSAndroid Build Coastguard Worker [[maybe_unused]] constexpr auto fail = [] {
1473*61c4878aSAndroid Build Coastguard Worker InlineString<3> str("abc");
1474*61c4878aSAndroid Build Coastguard Worker return str.erase(4, 2);
1475*61c4878aSAndroid Build Coastguard Worker }();
1476*61c4878aSAndroid Build Coastguard Worker #endif // PW_NC_TEST
1477*61c4878aSAndroid Build Coastguard Worker
TEST(InlineString,Erase_CharacterAtPosition)1478*61c4878aSAndroid Build Coastguard Worker TEST(InlineString, Erase_CharacterAtPosition) {
1479*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<3>(), str.erase(str.begin()), "");
1480*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<3>(), str.erase(str.end()), "");
1481*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<3>("abc"), str.erase(str.begin()), "bc");
1482*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<3>("abc"), str.erase(str.begin() + 1), "ac");
1483*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<3>("abc"), str.erase(str.begin() + 2), "ab");
1484*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<3>("abc"), str.erase(str.end()), "abc");
1485*61c4878aSAndroid Build Coastguard Worker }
1486*61c4878aSAndroid Build Coastguard Worker
TEST(InlineString,Erase_CharactersInRange)1487*61c4878aSAndroid Build Coastguard Worker TEST(InlineString, Erase_CharactersInRange) {
1488*61c4878aSAndroid Build Coastguard Worker TEST_STRING(
1489*61c4878aSAndroid Build Coastguard Worker InlineString<3>("abc"), str.erase(str.begin(), str.begin()), "abc");
1490*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<3>("abc"), str.erase(str.end(), str.end()), "abc");
1491*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<3>("abc"), str.erase(str.begin(), str.end()), "");
1492*61c4878aSAndroid Build Coastguard Worker TEST_STRING(
1493*61c4878aSAndroid Build Coastguard Worker InlineString<3>("abc"), str.erase(str.begin(), str.begin() + 1), "bc");
1494*61c4878aSAndroid Build Coastguard Worker TEST_STRING(
1495*61c4878aSAndroid Build Coastguard Worker InlineString<3>("abc"), str.erase(str.begin() + 1, str.end()), "a");
1496*61c4878aSAndroid Build Coastguard Worker }
1497*61c4878aSAndroid Build Coastguard Worker
TEST(InlineString,PushBack)1498*61c4878aSAndroid Build Coastguard Worker TEST(InlineString, PushBack) {
1499*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<1>(), str.push_back('#'), "#");
1500*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<5>("abc"), str.push_back('d');
1501*61c4878aSAndroid Build Coastguard Worker str.push_back('e'), "abcde");
1502*61c4878aSAndroid Build Coastguard Worker
1503*61c4878aSAndroid Build Coastguard Worker #if PW_NC_TEST(PushBack_DoesNotFit)
1504*61c4878aSAndroid Build Coastguard Worker PW_NC_EXPECT("PW_ASSERT\(size\(\) < max_size\(\)\)");
1505*61c4878aSAndroid Build Coastguard Worker [[maybe_unused]] constexpr auto fail = [] {
1506*61c4878aSAndroid Build Coastguard Worker InlineString<1> str("?", 1);
1507*61c4878aSAndroid Build Coastguard Worker str.push_back('a');
1508*61c4878aSAndroid Build Coastguard Worker return str;
1509*61c4878aSAndroid Build Coastguard Worker }();
1510*61c4878aSAndroid Build Coastguard Worker #endif // PW_NC_TEST
1511*61c4878aSAndroid Build Coastguard Worker }
1512*61c4878aSAndroid Build Coastguard Worker
TEST(InlineString,PopBack)1513*61c4878aSAndroid Build Coastguard Worker TEST(InlineString, PopBack) {
1514*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<1>("?", 1), str.pop_back(), "");
1515*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<1>(), str.push_back('?'); str.pop_back(), "");
1516*61c4878aSAndroid Build Coastguard Worker
1517*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<5>("abc"), str.pop_back(), "ab");
1518*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<5>("abcde", 5), str.pop_back(), "abcd");
1519*61c4878aSAndroid Build Coastguard Worker
1520*61c4878aSAndroid Build Coastguard Worker #if PW_NC_TEST(PopBack_Empty)
1521*61c4878aSAndroid Build Coastguard Worker PW_NC_EXPECT("PW_ASSERT\(!empty\(\)\)");
1522*61c4878aSAndroid Build Coastguard Worker [[maybe_unused]] constexpr auto fail = [] {
1523*61c4878aSAndroid Build Coastguard Worker InlineString<0> str;
1524*61c4878aSAndroid Build Coastguard Worker str.pop_back();
1525*61c4878aSAndroid Build Coastguard Worker return str;
1526*61c4878aSAndroid Build Coastguard Worker }();
1527*61c4878aSAndroid Build Coastguard Worker #endif // PW_NC_TEST
1528*61c4878aSAndroid Build Coastguard Worker }
1529*61c4878aSAndroid Build Coastguard Worker
1530*61c4878aSAndroid Build Coastguard Worker // append
1531*61c4878aSAndroid Build Coastguard Worker
TEST(InlineString,Append_BasicString)1532*61c4878aSAndroid Build Coastguard Worker TEST(InlineString, Append_BasicString) {
1533*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<0>(), str.append(kEmptyCapacity0), "");
1534*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>(), str.append(kEmptyCapacity10), "");
1535*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>(), str.append(kSize5Capacity10), "12345");
1536*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>(), str.append(kSize10Capacity10), "1234567890");
1537*61c4878aSAndroid Build Coastguard Worker
1538*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<1>({'a'}), str.append(kEmptyCapacity0), "a");
1539*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<11>("a"), str.append(kEmptyCapacity10), "a");
1540*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<11>("a"), str.append(kSize5Capacity10), "a12345");
1541*61c4878aSAndroid Build Coastguard Worker TEST_STRING(
1542*61c4878aSAndroid Build Coastguard Worker InlineString<11>("a"), str.append(kSize10Capacity10), "a1234567890");
1543*61c4878aSAndroid Build Coastguard Worker
1544*61c4878aSAndroid Build Coastguard Worker #if PW_NC_TEST(Append_BasicString_DoesNotFit)
1545*61c4878aSAndroid Build Coastguard Worker PW_NC_EXPECT("PW_ASSERT\(count <= max_size\(\) - index");
1546*61c4878aSAndroid Build Coastguard Worker [[maybe_unused]] constexpr auto fail = [] {
1547*61c4878aSAndroid Build Coastguard Worker InlineString<3> str({0, 1});
1548*61c4878aSAndroid Build Coastguard Worker return str.append(kSize5Capacity10);
1549*61c4878aSAndroid Build Coastguard Worker }();
1550*61c4878aSAndroid Build Coastguard Worker #endif // PW_NC_TEST
1551*61c4878aSAndroid Build Coastguard Worker }
1552*61c4878aSAndroid Build Coastguard Worker
TEST(InlineString,Append_Characters)1553*61c4878aSAndroid Build Coastguard Worker TEST(InlineString, Append_Characters) {
1554*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<1>(), str.append(0, '1'), "");
1555*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<1>(), str.append(1, '1'), "1");
1556*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>(), str.append(2, '1'), "11");
1557*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>(), str.append(10, '1'), "1111111111");
1558*61c4878aSAndroid Build Coastguard Worker
1559*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<4>("Hi"), str.append(0, '!'), "Hi");
1560*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<4>("Hi"), str.append(1, '!'), "Hi!");
1561*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<6>("Hi"), str.append(2, '!'), "Hi!!");
1562*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<6>("Hi"), str.append(4, '!'), "Hi!!!!");
1563*61c4878aSAndroid Build Coastguard Worker
1564*61c4878aSAndroid Build Coastguard Worker #if PW_NC_TEST(Append_Characters_DoesNotFit)
1565*61c4878aSAndroid Build Coastguard Worker PW_NC_EXPECT("PW_ASSERT\(count <= max_size\(\) - index\)");
1566*61c4878aSAndroid Build Coastguard Worker [[maybe_unused]] constexpr auto fail = [] {
1567*61c4878aSAndroid Build Coastguard Worker InlineString<3> str({0, 1});
1568*61c4878aSAndroid Build Coastguard Worker return str.append(2, '?');
1569*61c4878aSAndroid Build Coastguard Worker }();
1570*61c4878aSAndroid Build Coastguard Worker #endif // PW_NC_TEST
1571*61c4878aSAndroid Build Coastguard Worker }
1572*61c4878aSAndroid Build Coastguard Worker
TEST(InlineString,Append_PointerSize)1573*61c4878aSAndroid Build Coastguard Worker TEST(InlineString, Append_PointerSize) {
1574*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<0>(), str.append("", 0), "");
1575*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>(), str.append("", 0), "");
1576*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<1>(), str.append("?", 1), "?");
1577*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>("abc"), str.append("", 0), "abc");
1578*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>(), str.append("1234567", 1), "1");
1579*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>("abc"), str.append("1234567", 3), "abc123");
1580*61c4878aSAndroid Build Coastguard Worker
1581*61c4878aSAndroid Build Coastguard Worker #if PW_NC_TEST(Append_PointerSize_DoesNotFit)
1582*61c4878aSAndroid Build Coastguard Worker PW_NC_EXPECT("PW_ASSERT\(count <= max_size\(\) - index");
1583*61c4878aSAndroid Build Coastguard Worker [[maybe_unused]] constexpr auto fail = [] {
1584*61c4878aSAndroid Build Coastguard Worker InlineString<3> str({0, 1});
1585*61c4878aSAndroid Build Coastguard Worker return str.append("23", 2);
1586*61c4878aSAndroid Build Coastguard Worker }();
1587*61c4878aSAndroid Build Coastguard Worker #endif // PW_NC_TEST
1588*61c4878aSAndroid Build Coastguard Worker }
1589*61c4878aSAndroid Build Coastguard Worker
TEST(InlineString,Append_Array)1590*61c4878aSAndroid Build Coastguard Worker TEST(InlineString, Append_Array) {
1591*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<1>(), fixed_str.append(""), "");
1592*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<2>(), fixed_str.append("a"), "a");
1593*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<6>(), fixed_str.append("12345"), "12345");
1594*61c4878aSAndroid Build Coastguard Worker
1595*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<1>({'a'}), fixed_str.append(""), "a");
1596*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<2>("a"), fixed_str.append("a"), "aa");
1597*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<6>("a"), fixed_str.append("12345"), "a12345");
1598*61c4878aSAndroid Build Coastguard Worker
1599*61c4878aSAndroid Build Coastguard Worker #if PW_NC_TEST(Append_Array_DoesNotFit)
1600*61c4878aSAndroid Build Coastguard Worker PW_NC_EXPECT(
1601*61c4878aSAndroid Build Coastguard Worker "InlineString's capacity is too small to hold the assigned string");
1602*61c4878aSAndroid Build Coastguard Worker [[maybe_unused]] constexpr auto fail = [] {
1603*61c4878aSAndroid Build Coastguard Worker InlineString<2> str;
1604*61c4878aSAndroid Build Coastguard Worker return str.append("123");
1605*61c4878aSAndroid Build Coastguard Worker }();
1606*61c4878aSAndroid Build Coastguard Worker #endif // PW_NC_TEST
1607*61c4878aSAndroid Build Coastguard Worker }
1608*61c4878aSAndroid Build Coastguard Worker
TEST(InlineString,Append_Pointer)1609*61c4878aSAndroid Build Coastguard Worker TEST(InlineString, Append_Pointer) {
1610*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<0>(), str.append(kPointer0), "");
1611*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>(), str.append(kPointer10), "9876543210");
1612*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>("abc"), str.append(kPointer10 + 5), "abc43210");
1613*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<13>("abc"), str.append(kPointer10), "abc9876543210");
1614*61c4878aSAndroid Build Coastguard Worker
1615*61c4878aSAndroid Build Coastguard Worker #if PW_NC_TEST(Append_Pointer_DoesNotFit)
1616*61c4878aSAndroid Build Coastguard Worker PW_NC_EXPECT("PW_ASSERT\(count <= max_size\(\) - index");
1617*61c4878aSAndroid Build Coastguard Worker [[maybe_unused]] constexpr auto fail = [] {
1618*61c4878aSAndroid Build Coastguard Worker InlineString<3> str({0, 1});
1619*61c4878aSAndroid Build Coastguard Worker return str.append(kPointer10 + 8);
1620*61c4878aSAndroid Build Coastguard Worker }();
1621*61c4878aSAndroid Build Coastguard Worker #endif // PW_NC_TEST
1622*61c4878aSAndroid Build Coastguard Worker }
1623*61c4878aSAndroid Build Coastguard Worker
TEST(InlineString,Append_Iterator)1624*61c4878aSAndroid Build Coastguard Worker TEST(InlineString, Append_Iterator) {
1625*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<0>(), str.append(kEvenNumbers0, kEvenNumbers0), "");
1626*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>(), str.append(kEvenNumbers0, kEvenNumbers0), "");
1627*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>(), str.append(kEvenNumbers0, kEvenNumbers0), "");
1628*61c4878aSAndroid Build Coastguard Worker TEST_STRING(
1629*61c4878aSAndroid Build Coastguard Worker InlineString<10>(), str.append(kEvenNumbers0, kEvenNumbers8), "\0\2\4\6");
1630*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>("a"),
1631*61c4878aSAndroid Build Coastguard Worker str.append(kEvenNumbers0, kEvenNumbers8),
1632*61c4878aSAndroid Build Coastguard Worker "a\0\2\4\6");
1633*61c4878aSAndroid Build Coastguard Worker
1634*61c4878aSAndroid Build Coastguard Worker #if PW_NC_TEST(Append_Iterator_DoesNotFit)
1635*61c4878aSAndroid Build Coastguard Worker PW_NC_EXPECT("PW_ASSERT\(current_position != string_end\)");
1636*61c4878aSAndroid Build Coastguard Worker [[maybe_unused]] constexpr auto fail = [] {
1637*61c4878aSAndroid Build Coastguard Worker InlineString<3> str;
1638*61c4878aSAndroid Build Coastguard Worker return str.append(kEvenNumbers0, kEvenNumbers8);
1639*61c4878aSAndroid Build Coastguard Worker }();
1640*61c4878aSAndroid Build Coastguard Worker #endif // PW_NC_TEST
1641*61c4878aSAndroid Build Coastguard Worker }
1642*61c4878aSAndroid Build Coastguard Worker
TEST(InlineString,Append_InitializerList)1643*61c4878aSAndroid Build Coastguard Worker TEST(InlineString, Append_InitializerList) {
1644*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<0>(), str.append({}), "");
1645*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>(), str.append({1, 2, 3}), "\1\2\3");
1646*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>("abc"), str.append({1, 2, 3}), "abc\1\2\3");
1647*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<5>("abc"), str.append({'4', '5'}), "abc45");
1648*61c4878aSAndroid Build Coastguard Worker
1649*61c4878aSAndroid Build Coastguard Worker #if PW_NC_TEST(Append_InitializerList_DoesNotFit)
1650*61c4878aSAndroid Build Coastguard Worker PW_NC_EXPECT("PW_ASSERT\(count <= max_size\(\) - index");
1651*61c4878aSAndroid Build Coastguard Worker [[maybe_unused]] constexpr auto fail = [] {
1652*61c4878aSAndroid Build Coastguard Worker InlineString<3> str({0, 1, 2});
1653*61c4878aSAndroid Build Coastguard Worker return str.append({3});
1654*61c4878aSAndroid Build Coastguard Worker }();
1655*61c4878aSAndroid Build Coastguard Worker #endif // PW_NC_TEST
1656*61c4878aSAndroid Build Coastguard Worker }
1657*61c4878aSAndroid Build Coastguard Worker
TEST(InlineString,Append_StringView)1658*61c4878aSAndroid Build Coastguard Worker TEST(InlineString, Append_StringView) {
1659*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<0>(), str.append(""sv), "");
1660*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>("a"), str.append(""sv), "a");
1661*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>("abc"), str.append("123"sv), "abc123");
1662*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<5>("abc"), str.append("45"sv), "abc45");
1663*61c4878aSAndroid Build Coastguard Worker
1664*61c4878aSAndroid Build Coastguard Worker #if PW_NC_TEST(Append_StringView_DoesNotFit)
1665*61c4878aSAndroid Build Coastguard Worker PW_NC_EXPECT("PW_ASSERT\(count <= max_size\(\) - index");
1666*61c4878aSAndroid Build Coastguard Worker [[maybe_unused]] constexpr auto fail = [] {
1667*61c4878aSAndroid Build Coastguard Worker InlineString<3> str({0, 1, 2});
1668*61c4878aSAndroid Build Coastguard Worker return str.append("3"sv);
1669*61c4878aSAndroid Build Coastguard Worker }();
1670*61c4878aSAndroid Build Coastguard Worker #endif // PW_NC_TEST
1671*61c4878aSAndroid Build Coastguard Worker }
1672*61c4878aSAndroid Build Coastguard Worker
TEST(InlineString,Append_StringViewSubstr)1673*61c4878aSAndroid Build Coastguard Worker TEST(InlineString, Append_StringViewSubstr) {
1674*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<0>(), str.append(""sv, 0), "");
1675*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<0>(), str.append(""sv, 0, 0), "");
1676*61c4878aSAndroid Build Coastguard Worker TEST_RUNTIME_STRING(InlineString<4>("a"), str.append("123"sv, 0), "a123");
1677*61c4878aSAndroid Build Coastguard Worker TEST_RUNTIME_STRING(InlineString<4>("a"), str.append("123"sv, 1, 0), "a");
1678*61c4878aSAndroid Build Coastguard Worker TEST_RUNTIME_STRING(InlineString<4>("a"), str.append("123"sv, 1, 1), "a2");
1679*61c4878aSAndroid Build Coastguard Worker TEST_RUNTIME_STRING(InlineString<4>("a"), str.append("123"sv, 1, 99), "a23");
1680*61c4878aSAndroid Build Coastguard Worker TEST_RUNTIME_STRING(InlineString<4>("a"), str.append("123"sv, 3, 99), "a");
1681*61c4878aSAndroid Build Coastguard Worker
1682*61c4878aSAndroid Build Coastguard Worker #if PW_NC_TEST(Append_StringViewSubstr_DoesNotFit)
1683*61c4878aSAndroid Build Coastguard Worker PW_NC_EXPECT("PW_ASSERT\(count <= max_size\(\) - index");
1684*61c4878aSAndroid Build Coastguard Worker [[maybe_unused]] constexpr auto fail = [] {
1685*61c4878aSAndroid Build Coastguard Worker InlineString<3> str({0, 1, 2});
1686*61c4878aSAndroid Build Coastguard Worker return str.append("34"sv, 1);
1687*61c4878aSAndroid Build Coastguard Worker }();
1688*61c4878aSAndroid Build Coastguard Worker #endif // PW_NC_TEST
1689*61c4878aSAndroid Build Coastguard Worker }
1690*61c4878aSAndroid Build Coastguard Worker
1691*61c4878aSAndroid Build Coastguard Worker // operator+=
1692*61c4878aSAndroid Build Coastguard Worker
TEST(InlineString,AppendOperator_BasicString)1693*61c4878aSAndroid Build Coastguard Worker TEST(InlineString, AppendOperator_BasicString) {
1694*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<1>(), str.append(0, '1'), "");
1695*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<1>(), str.append(1, '1'), "1");
1696*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>(), str.append(2, '1'), "11");
1697*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>(), str.append(10, '1'), "1111111111");
1698*61c4878aSAndroid Build Coastguard Worker
1699*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<4>("Hi"), str.append(0, '!'), "Hi");
1700*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<4>("Hi"), str.append(1, '!'), "Hi!");
1701*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<6>("Hi"), str.append(2, '!'), "Hi!!");
1702*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<6>("Hi"), str.append(4, '!'), "Hi!!!!");
1703*61c4878aSAndroid Build Coastguard Worker
1704*61c4878aSAndroid Build Coastguard Worker #if PW_NC_TEST(AppendOperator_BasicString_DoesNotFit)
1705*61c4878aSAndroid Build Coastguard Worker PW_NC_EXPECT("PW_ASSERT\(count <= max_size\(\) - index");
1706*61c4878aSAndroid Build Coastguard Worker [[maybe_unused]] constexpr auto fail = [] {
1707*61c4878aSAndroid Build Coastguard Worker InlineString<3> str({0, 1});
1708*61c4878aSAndroid Build Coastguard Worker return str.append(kSize5Capacity10);
1709*61c4878aSAndroid Build Coastguard Worker }();
1710*61c4878aSAndroid Build Coastguard Worker #endif // PW_NC_TEST
1711*61c4878aSAndroid Build Coastguard Worker }
1712*61c4878aSAndroid Build Coastguard Worker
TEST(InlineString,AppendOperator_Character)1713*61c4878aSAndroid Build Coastguard Worker TEST(InlineString, AppendOperator_Character) {
1714*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<1>(), fixed_str += '1', "1");
1715*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>(), fixed_str += '\0', "\0");
1716*61c4878aSAndroid Build Coastguard Worker
1717*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<3>("Hi"), fixed_str += '!', "Hi!");
1718*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>("Hi"), fixed_str += '!', "Hi!");
1719*61c4878aSAndroid Build Coastguard Worker
1720*61c4878aSAndroid Build Coastguard Worker #if PW_NC_TEST(AppendOperator_Characters_DoesNotFit)
1721*61c4878aSAndroid Build Coastguard Worker PW_NC_EXPECT("PW_ASSERT\(size\(\) < max_size\(\)\);");
1722*61c4878aSAndroid Build Coastguard Worker [[maybe_unused]] constexpr auto fail = [] {
1723*61c4878aSAndroid Build Coastguard Worker InlineString<3> str({0, 1, 2});
1724*61c4878aSAndroid Build Coastguard Worker return str += '?';
1725*61c4878aSAndroid Build Coastguard Worker }();
1726*61c4878aSAndroid Build Coastguard Worker #endif // PW_NC_TEST
1727*61c4878aSAndroid Build Coastguard Worker }
1728*61c4878aSAndroid Build Coastguard Worker
TEST(InlineString,AppendOperator_Array)1729*61c4878aSAndroid Build Coastguard Worker TEST(InlineString, AppendOperator_Array) {
1730*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<1>(), fixed_str += "", "");
1731*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<2>(), fixed_str += "a", "a");
1732*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<6>(), fixed_str += "12345", "12345");
1733*61c4878aSAndroid Build Coastguard Worker
1734*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<1>({'a'}), fixed_str += "", "a");
1735*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<2>("a"), fixed_str += "a", "aa");
1736*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<6>("a"), fixed_str += "12345", "a12345");
1737*61c4878aSAndroid Build Coastguard Worker
1738*61c4878aSAndroid Build Coastguard Worker #if PW_NC_TEST(AppendOperator_Array_DoesNotFit)
1739*61c4878aSAndroid Build Coastguard Worker PW_NC_EXPECT(
1740*61c4878aSAndroid Build Coastguard Worker "InlineString's capacity is too small to hold the assigned string");
1741*61c4878aSAndroid Build Coastguard Worker [[maybe_unused]] constexpr auto fail = [] {
1742*61c4878aSAndroid Build Coastguard Worker InlineString<3> str;
1743*61c4878aSAndroid Build Coastguard Worker return str += "1234";
1744*61c4878aSAndroid Build Coastguard Worker }();
1745*61c4878aSAndroid Build Coastguard Worker #endif // PW_NC_TEST
1746*61c4878aSAndroid Build Coastguard Worker }
1747*61c4878aSAndroid Build Coastguard Worker
TEST(InlineString,AppendOperator_Pointer)1748*61c4878aSAndroid Build Coastguard Worker TEST(InlineString, AppendOperator_Pointer) {
1749*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<0>(), fixed_str += kPointer0, "");
1750*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>(), fixed_str += kPointer10, "9876543210");
1751*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>("abc"), fixed_str += kPointer10 + 5, "abc43210");
1752*61c4878aSAndroid Build Coastguard Worker TEST_STRING(
1753*61c4878aSAndroid Build Coastguard Worker InlineString<13>("abc"), fixed_str += kPointer10, "abc9876543210");
1754*61c4878aSAndroid Build Coastguard Worker
1755*61c4878aSAndroid Build Coastguard Worker #if PW_NC_TEST(AppendOperator_Pointer_DoesNotFit)
1756*61c4878aSAndroid Build Coastguard Worker PW_NC_EXPECT("PW_ASSERT\(count <= max_size\(\) - index");
1757*61c4878aSAndroid Build Coastguard Worker [[maybe_unused]] constexpr auto fail = [] {
1758*61c4878aSAndroid Build Coastguard Worker InlineString<3> str({0, 1});
1759*61c4878aSAndroid Build Coastguard Worker return str.append(kPointer10 + 8);
1760*61c4878aSAndroid Build Coastguard Worker }();
1761*61c4878aSAndroid Build Coastguard Worker #endif // PW_NC_TEST
1762*61c4878aSAndroid Build Coastguard Worker }
1763*61c4878aSAndroid Build Coastguard Worker
TEST(InlineString,AppendOperator_InitializerList)1764*61c4878aSAndroid Build Coastguard Worker TEST(InlineString, AppendOperator_InitializerList) {
1765*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<0>(), fixed_str += {}, "");
1766*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>(), (fixed_str += {1, 2, 3}), "\1\2\3");
1767*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>("abc"), (fixed_str += {1, 2, 3}), "abc\1\2\3");
1768*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<5>("abc"), (fixed_str += {'4', '5'}), "abc45");
1769*61c4878aSAndroid Build Coastguard Worker
1770*61c4878aSAndroid Build Coastguard Worker #if PW_NC_TEST(AppendOperator_InitializerList_DoesNotFit)
1771*61c4878aSAndroid Build Coastguard Worker PW_NC_EXPECT("PW_ASSERT\(count <= max_size\(\) - index");
1772*61c4878aSAndroid Build Coastguard Worker [[maybe_unused]] constexpr auto fail = [] {
1773*61c4878aSAndroid Build Coastguard Worker InlineString<3> str({0, 1, 2});
1774*61c4878aSAndroid Build Coastguard Worker return str.append({3});
1775*61c4878aSAndroid Build Coastguard Worker }();
1776*61c4878aSAndroid Build Coastguard Worker #endif // PW_NC_TEST
1777*61c4878aSAndroid Build Coastguard Worker }
1778*61c4878aSAndroid Build Coastguard Worker
TEST(InlineString,AppendOperator_StringView)1779*61c4878aSAndroid Build Coastguard Worker TEST(InlineString, AppendOperator_StringView) {
1780*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<0>(), fixed_str += ""sv, "");
1781*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>("a"), fixed_str += ""sv, "a");
1782*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>("abc"), fixed_str += "123"sv, "abc123");
1783*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<5>("abc"), fixed_str += "45"sv, "abc45");
1784*61c4878aSAndroid Build Coastguard Worker
1785*61c4878aSAndroid Build Coastguard Worker #if PW_NC_TEST(AppendOperator_StringView_DoesNotFit)
1786*61c4878aSAndroid Build Coastguard Worker PW_NC_EXPECT("PW_ASSERT\(count <= max_size\(\) - index");
1787*61c4878aSAndroid Build Coastguard Worker [[maybe_unused]] constexpr auto fail = [] {
1788*61c4878aSAndroid Build Coastguard Worker InlineString<3> str({0, 1, 2});
1789*61c4878aSAndroid Build Coastguard Worker return str.append("3"sv);
1790*61c4878aSAndroid Build Coastguard Worker }();
1791*61c4878aSAndroid Build Coastguard Worker #endif // PW_NC_TEST
1792*61c4878aSAndroid Build Coastguard Worker }
1793*61c4878aSAndroid Build Coastguard Worker
TEST(InlineString,Compare)1794*61c4878aSAndroid Build Coastguard Worker TEST(InlineString, Compare) {
1795*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(InlineString<10>("abb").compare(InlineString<5>("abb")), 0);
1796*61c4878aSAndroid Build Coastguard Worker EXPECT_LT(InlineString<10>("abb").compare(InlineString<5>("bbb")), 0);
1797*61c4878aSAndroid Build Coastguard Worker EXPECT_LT(InlineString<10>("bb").compare(InlineString<5>("bbb")), 0);
1798*61c4878aSAndroid Build Coastguard Worker
1799*61c4878aSAndroid Build Coastguard Worker static_assert(InlineString<10>("bbb").compare(InlineString<5>("bbb")) == 0,
1800*61c4878aSAndroid Build Coastguard Worker "equal");
1801*61c4878aSAndroid Build Coastguard Worker static_assert(InlineString<10>("abb").compare(InlineString<5>("bbb")) < 0,
1802*61c4878aSAndroid Build Coastguard Worker "less");
1803*61c4878aSAndroid Build Coastguard Worker static_assert(InlineString<10>("bbb").compare(InlineString<5>("abb")) > 0,
1804*61c4878aSAndroid Build Coastguard Worker "greater");
1805*61c4878aSAndroid Build Coastguard Worker
1806*61c4878aSAndroid Build Coastguard Worker static_assert(InlineString<10>("bb").compare(InlineString<5>("bbb")) < 0,
1807*61c4878aSAndroid Build Coastguard Worker "less");
1808*61c4878aSAndroid Build Coastguard Worker static_assert(InlineString<10>("bbb").compare(InlineString<5>("bb")) > 0,
1809*61c4878aSAndroid Build Coastguard Worker "greater");
1810*61c4878aSAndroid Build Coastguard Worker
1811*61c4878aSAndroid Build Coastguard Worker static_assert(InlineString<10>("bb").compare(InlineString<5>("abb")) > 0,
1812*61c4878aSAndroid Build Coastguard Worker "less");
1813*61c4878aSAndroid Build Coastguard Worker static_assert(InlineString<10>("abb").compare(InlineString<5>("bb")) < 0,
1814*61c4878aSAndroid Build Coastguard Worker "greater");
1815*61c4878aSAndroid Build Coastguard Worker
1816*61c4878aSAndroid Build Coastguard Worker static_assert(InlineString<5>("").compare(InlineString<5>("")) == 0, "equal");
1817*61c4878aSAndroid Build Coastguard Worker static_assert(InlineString<5>("").compare(InlineString<5>("abc")) < 0,
1818*61c4878aSAndroid Build Coastguard Worker "less");
1819*61c4878aSAndroid Build Coastguard Worker static_assert(InlineString<5>("abc").compare(InlineString<5>("")) > 0,
1820*61c4878aSAndroid Build Coastguard Worker "greater");
1821*61c4878aSAndroid Build Coastguard Worker }
1822*61c4878aSAndroid Build Coastguard Worker
1823*61c4878aSAndroid Build Coastguard Worker // TODO: b/239996007 - Test other pw::InlineString functions:
1824*61c4878aSAndroid Build Coastguard Worker //
1825*61c4878aSAndroid Build Coastguard Worker // - starts_with
1826*61c4878aSAndroid Build Coastguard Worker // - ends_with
1827*61c4878aSAndroid Build Coastguard Worker // - contains
1828*61c4878aSAndroid Build Coastguard Worker // - replace
1829*61c4878aSAndroid Build Coastguard Worker // - substr
1830*61c4878aSAndroid Build Coastguard Worker // - copy
1831*61c4878aSAndroid Build Coastguard Worker
TEST(InlineString,Resize)1832*61c4878aSAndroid Build Coastguard Worker TEST(InlineString, Resize) {
1833*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>(), str.resize(0), "");
1834*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>(), str.resize(5), "\0\0\0\0\0");
1835*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>(), str.resize(10), "\0\0\0\0\0\0\0\0\0\0");
1836*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>(), str.resize(0, 'a'), "");
1837*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>(), str.resize(5, 'a'), "aaaaa");
1838*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>(), str.resize(10, 'a'), "aaaaaaaaaa");
1839*61c4878aSAndroid Build Coastguard Worker
1840*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>("ABCDE"), str.resize(0), "");
1841*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>("ABCDE"), str.resize(4), "ABCD");
1842*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>("ABCDE"), str.resize(5), "ABCDE");
1843*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>("ABCDE"), str.resize(10), "ABCDE\0\0\0\0\0");
1844*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>("ABCDE"), str.resize(0, 'a'), "");
1845*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>("ABCDE"), str.resize(3, 'a'), "ABC");
1846*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>("ABCDE"), str.resize(5, 'a'), "ABCDE");
1847*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>("ABCDE"), str.resize(10, 'a'), "ABCDEaaaaa");
1848*61c4878aSAndroid Build Coastguard Worker
1849*61c4878aSAndroid Build Coastguard Worker #if PW_NC_TEST(Resize_LargerThanCapacity)
1850*61c4878aSAndroid Build Coastguard Worker PW_NC_EXPECT("PW_ASSERT\(new_size <= max_size\(\)\)");
1851*61c4878aSAndroid Build Coastguard Worker [[maybe_unused]] constexpr auto fail = [] {
1852*61c4878aSAndroid Build Coastguard Worker InlineString<4> str("123");
1853*61c4878aSAndroid Build Coastguard Worker str.resize(5);
1854*61c4878aSAndroid Build Coastguard Worker return str;
1855*61c4878aSAndroid Build Coastguard Worker }();
1856*61c4878aSAndroid Build Coastguard Worker #endif // PW_NC_TEST
1857*61c4878aSAndroid Build Coastguard Worker }
1858*61c4878aSAndroid Build Coastguard Worker
TEST(InlineString,ResizeAndOverwrite)1859*61c4878aSAndroid Build Coastguard Worker TEST(InlineString, ResizeAndOverwrite) {
1860*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<2>(),
1861*61c4878aSAndroid Build Coastguard Worker str.resize_and_overwrite([](char* out, size_t) {
1862*61c4878aSAndroid Build Coastguard Worker out[0] = '\0';
1863*61c4878aSAndroid Build Coastguard Worker out[1] = '?';
1864*61c4878aSAndroid Build Coastguard Worker return 2;
1865*61c4878aSAndroid Build Coastguard Worker }),
1866*61c4878aSAndroid Build Coastguard Worker "\0?");
1867*61c4878aSAndroid Build Coastguard Worker TEST_STRING(InlineString<10>("ABCDE"),
1868*61c4878aSAndroid Build Coastguard Worker str.resize_and_overwrite([](char* out, size_t size) {
1869*61c4878aSAndroid Build Coastguard Worker out[1] = '?';
1870*61c4878aSAndroid Build Coastguard Worker for (size_t i = 5; i < size; ++i) {
1871*61c4878aSAndroid Build Coastguard Worker out[i] = static_cast<char>('0' + i);
1872*61c4878aSAndroid Build Coastguard Worker }
1873*61c4878aSAndroid Build Coastguard Worker return size - 1; // chop off the last character
1874*61c4878aSAndroid Build Coastguard Worker }),
1875*61c4878aSAndroid Build Coastguard Worker "A?CDE5678");
1876*61c4878aSAndroid Build Coastguard Worker
1877*61c4878aSAndroid Build Coastguard Worker #if PW_NC_TEST(ResizeAndOverwrite_LargerThanCapacity)
1878*61c4878aSAndroid Build Coastguard Worker PW_NC_EXPECT("PW_ASSERT\(new_size <= max_size\(\)\)");
1879*61c4878aSAndroid Build Coastguard Worker [[maybe_unused]] constexpr auto fail = [] {
1880*61c4878aSAndroid Build Coastguard Worker InlineString<4> str("123");
1881*61c4878aSAndroid Build Coastguard Worker str.resize_and_overwrite([](char*, size_t) { return 5; });
1882*61c4878aSAndroid Build Coastguard Worker return str;
1883*61c4878aSAndroid Build Coastguard Worker }();
1884*61c4878aSAndroid Build Coastguard Worker #elif PW_NC_TEST(ResizeAndOverwrite_NegativeSize)
1885*61c4878aSAndroid Build Coastguard Worker PW_NC_EXPECT("PW_ASSERT\(new_size <= max_size\(\)\)");
1886*61c4878aSAndroid Build Coastguard Worker [[maybe_unused]] constexpr auto fail = [] {
1887*61c4878aSAndroid Build Coastguard Worker InlineString<4> str("123");
1888*61c4878aSAndroid Build Coastguard Worker str.resize_and_overwrite([](char*, size_t) { return -1; });
1889*61c4878aSAndroid Build Coastguard Worker return str;
1890*61c4878aSAndroid Build Coastguard Worker }();
1891*61c4878aSAndroid Build Coastguard Worker #endif // PW_NC_TEST
1892*61c4878aSAndroid Build Coastguard Worker }
1893*61c4878aSAndroid Build Coastguard Worker
1894*61c4878aSAndroid Build Coastguard Worker // TODO: b/239996007 - Test other pw::InlineString functions:
1895*61c4878aSAndroid Build Coastguard Worker // - swap
1896*61c4878aSAndroid Build Coastguard Worker
1897*61c4878aSAndroid Build Coastguard Worker //
1898*61c4878aSAndroid Build Coastguard Worker // Search
1899*61c4878aSAndroid Build Coastguard Worker //
1900*61c4878aSAndroid Build Coastguard Worker
1901*61c4878aSAndroid Build Coastguard Worker // TODO: b/239996007 - Test search functions.
1902*61c4878aSAndroid Build Coastguard Worker
1903*61c4878aSAndroid Build Coastguard Worker // TODO: b/239996007 - Test operator+.
1904*61c4878aSAndroid Build Coastguard Worker
TEST(InlineString,ComparisonOperators_InlineString)1905*61c4878aSAndroid Build Coastguard Worker TEST(InlineString, ComparisonOperators_InlineString) {
1906*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(InlineString<10>("a"), InlineString<10>("a"));
1907*61c4878aSAndroid Build Coastguard Worker EXPECT_NE(InlineString<10>("a"), InlineString<10>("b"));
1908*61c4878aSAndroid Build Coastguard Worker EXPECT_LT(InlineString<10>("a"), InlineString<10>("b"));
1909*61c4878aSAndroid Build Coastguard Worker EXPECT_LE(InlineString<10>("a"), InlineString<10>("b"));
1910*61c4878aSAndroid Build Coastguard Worker EXPECT_GT(InlineString<10>("b"), InlineString<10>("a"));
1911*61c4878aSAndroid Build Coastguard Worker EXPECT_GE(InlineString<10>("b"), InlineString<10>("a"));
1912*61c4878aSAndroid Build Coastguard Worker
1913*61c4878aSAndroid Build Coastguard Worker static_assert(InlineString<10>() == InlineString<10>(), "equal"); // NOLINT
1914*61c4878aSAndroid Build Coastguard Worker static_assert(InlineString<10>("abc") == InlineString<5>("abc"), "equal");
1915*61c4878aSAndroid Build Coastguard Worker static_assert(InlineString<1>({'a'}) == InlineString<10>("a"), "equal");
1916*61c4878aSAndroid Build Coastguard Worker static_assert(!(InlineString<10>("?") == InlineString<10>()), // NOLINT
1917*61c4878aSAndroid Build Coastguard Worker "equal");
1918*61c4878aSAndroid Build Coastguard Worker
1919*61c4878aSAndroid Build Coastguard Worker static_assert(InlineString<10>() != InlineString<10>("a"), // NOLINT
1920*61c4878aSAndroid Build Coastguard Worker "not equal");
1921*61c4878aSAndroid Build Coastguard Worker static_assert(InlineString<10>("") != InlineString<5>("abc"), "not equal");
1922*61c4878aSAndroid Build Coastguard Worker static_assert(InlineString<1>({'\0'}) != InlineString<10>(""), "not equal");
1923*61c4878aSAndroid Build Coastguard Worker static_assert(!(InlineString<1>({'\0'}) != InlineString<10>("\0"sv)),
1924*61c4878aSAndroid Build Coastguard Worker "not equal");
1925*61c4878aSAndroid Build Coastguard Worker
1926*61c4878aSAndroid Build Coastguard Worker static_assert(InlineString<10>() < InlineString<10>("a"), "less");
1927*61c4878aSAndroid Build Coastguard Worker static_assert(InlineString<10>("ab") < InlineString<5>("abc"), "less");
1928*61c4878aSAndroid Build Coastguard Worker static_assert(InlineString<1>({'\0'}) < InlineString<10>("\1\0"), "less");
1929*61c4878aSAndroid Build Coastguard Worker static_assert(!(InlineString<1>({'\2'}) < InlineString<10>("\1\0")), "less");
1930*61c4878aSAndroid Build Coastguard Worker
1931*61c4878aSAndroid Build Coastguard Worker static_assert(InlineString<10>() <= InlineString<10>("a"), "less equal");
1932*61c4878aSAndroid Build Coastguard Worker static_assert(InlineString<10>("a") <= InlineString<10>("a"), "less equal");
1933*61c4878aSAndroid Build Coastguard Worker static_assert(InlineString<10>("ab") <= InlineString<5>("abc"), "less equal");
1934*61c4878aSAndroid Build Coastguard Worker static_assert(InlineString<10>("abc") <= InlineString<5>("abc"),
1935*61c4878aSAndroid Build Coastguard Worker "less equal");
1936*61c4878aSAndroid Build Coastguard Worker static_assert(InlineString<1>({'\0'}) <= InlineString<10>("\1\0"),
1937*61c4878aSAndroid Build Coastguard Worker "less equal");
1938*61c4878aSAndroid Build Coastguard Worker static_assert(InlineString<2>({'\1', '\0'}) <= InlineString<10>("\1\0"sv),
1939*61c4878aSAndroid Build Coastguard Worker "less equal");
1940*61c4878aSAndroid Build Coastguard Worker static_assert(!(InlineString<2>({'\2', '\0'}) <= InlineString<10>("\1\0"sv)),
1941*61c4878aSAndroid Build Coastguard Worker "less equal");
1942*61c4878aSAndroid Build Coastguard Worker
1943*61c4878aSAndroid Build Coastguard Worker static_assert(InlineString<10>("?") > InlineString<10>(""), "greater");
1944*61c4878aSAndroid Build Coastguard Worker static_assert(InlineString<10>("abc") > InlineString<5>("ab"), "greater");
1945*61c4878aSAndroid Build Coastguard Worker static_assert(InlineString<2>({'\1', '\0'}) > InlineString<10>("\1"),
1946*61c4878aSAndroid Build Coastguard Worker "greater");
1947*61c4878aSAndroid Build Coastguard Worker static_assert(!(InlineString<2>({'\1', '\0'}) > InlineString<10>("\2")),
1948*61c4878aSAndroid Build Coastguard Worker "greater");
1949*61c4878aSAndroid Build Coastguard Worker
1950*61c4878aSAndroid Build Coastguard Worker static_assert(InlineString<10>("?") >= InlineString<10>(""), "greater equal");
1951*61c4878aSAndroid Build Coastguard Worker static_assert(InlineString<10>("?") >= InlineString<10>("?"),
1952*61c4878aSAndroid Build Coastguard Worker "greater equal");
1953*61c4878aSAndroid Build Coastguard Worker static_assert(InlineString<10>("abc") >= InlineString<5>("ab"),
1954*61c4878aSAndroid Build Coastguard Worker "greater equal");
1955*61c4878aSAndroid Build Coastguard Worker static_assert(InlineString<10>("abc") >= InlineString<5>("abc"),
1956*61c4878aSAndroid Build Coastguard Worker "greater equal");
1957*61c4878aSAndroid Build Coastguard Worker static_assert(InlineString<2>({'\1', '\0'}) >= InlineString<10>("\1"),
1958*61c4878aSAndroid Build Coastguard Worker "greater equal");
1959*61c4878aSAndroid Build Coastguard Worker static_assert(InlineString<2>({'\1', '\0'}) >= InlineString<10>("\1\0"),
1960*61c4878aSAndroid Build Coastguard Worker "greater equal");
1961*61c4878aSAndroid Build Coastguard Worker static_assert(!(InlineString<3>("\0\0") >= InlineString<10>("\1\0")),
1962*61c4878aSAndroid Build Coastguard Worker "greater equal");
1963*61c4878aSAndroid Build Coastguard Worker }
1964*61c4878aSAndroid Build Coastguard Worker
TEST(InlineString,ComparisonOperators_NullTerminatedString)1965*61c4878aSAndroid Build Coastguard Worker TEST(InlineString, ComparisonOperators_NullTerminatedString) {
1966*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(InlineString<10>("a"), "a");
1967*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ("a", InlineString<10>("a"));
1968*61c4878aSAndroid Build Coastguard Worker
1969*61c4878aSAndroid Build Coastguard Worker EXPECT_NE(InlineString<10>("a"), "b");
1970*61c4878aSAndroid Build Coastguard Worker EXPECT_NE("a", InlineString<10>("b"));
1971*61c4878aSAndroid Build Coastguard Worker
1972*61c4878aSAndroid Build Coastguard Worker EXPECT_LT(InlineString<10>("a"), "b");
1973*61c4878aSAndroid Build Coastguard Worker EXPECT_LT("a", InlineString<10>("b"));
1974*61c4878aSAndroid Build Coastguard Worker
1975*61c4878aSAndroid Build Coastguard Worker EXPECT_LE(InlineString<10>("a"), "b");
1976*61c4878aSAndroid Build Coastguard Worker EXPECT_LE("a", InlineString<10>("b"));
1977*61c4878aSAndroid Build Coastguard Worker EXPECT_LE(InlineString<10>("a"), "a");
1978*61c4878aSAndroid Build Coastguard Worker EXPECT_LE("a", InlineString<10>("a"));
1979*61c4878aSAndroid Build Coastguard Worker
1980*61c4878aSAndroid Build Coastguard Worker EXPECT_GT(InlineString<10>("b"), "a");
1981*61c4878aSAndroid Build Coastguard Worker EXPECT_GT("b", InlineString<10>("a"));
1982*61c4878aSAndroid Build Coastguard Worker
1983*61c4878aSAndroid Build Coastguard Worker EXPECT_GE(InlineString<10>("b"), "a");
1984*61c4878aSAndroid Build Coastguard Worker EXPECT_GE("b", InlineString<10>("a"));
1985*61c4878aSAndroid Build Coastguard Worker EXPECT_GE(InlineString<10>("a"), "a");
1986*61c4878aSAndroid Build Coastguard Worker EXPECT_GE("a", InlineString<10>("a"));
1987*61c4878aSAndroid Build Coastguard Worker
1988*61c4878aSAndroid Build Coastguard Worker static_assert(InlineString<10>() == "", "equal"); // NOLINT
1989*61c4878aSAndroid Build Coastguard Worker static_assert("" == InlineString<10>(), "equal"); // NOLINT
1990*61c4878aSAndroid Build Coastguard Worker static_assert(InlineString<10>("abc") == "abc", "equal");
1991*61c4878aSAndroid Build Coastguard Worker static_assert("abc" == InlineString<5>("abc"), "equal");
1992*61c4878aSAndroid Build Coastguard Worker
1993*61c4878aSAndroid Build Coastguard Worker static_assert("" != InlineString<10>("a"), "not equal"); // NOLINT
1994*61c4878aSAndroid Build Coastguard Worker static_assert(InlineString<10>("a") != "", "not equal"); // NOLINT
1995*61c4878aSAndroid Build Coastguard Worker static_assert(InlineString<10>("") != "abc", "not equal"); // NOLINT
1996*61c4878aSAndroid Build Coastguard Worker static_assert("" != InlineString<5>("abc"), "not equal"); // NOLINT
1997*61c4878aSAndroid Build Coastguard Worker
1998*61c4878aSAndroid Build Coastguard Worker static_assert(InlineString<10>() < "a", "less");
1999*61c4878aSAndroid Build Coastguard Worker static_assert("" < InlineString<10>("a"), "less");
2000*61c4878aSAndroid Build Coastguard Worker static_assert(InlineString<10>("ab") < "abc", "less");
2001*61c4878aSAndroid Build Coastguard Worker static_assert("ab" < InlineString<5>("abc"), "less");
2002*61c4878aSAndroid Build Coastguard Worker
2003*61c4878aSAndroid Build Coastguard Worker static_assert(InlineString<10>() <= "a", "less equal");
2004*61c4878aSAndroid Build Coastguard Worker static_assert("" <= InlineString<10>("a"), "less equal");
2005*61c4878aSAndroid Build Coastguard Worker static_assert(InlineString<10>("a") <= "a", "less equal");
2006*61c4878aSAndroid Build Coastguard Worker static_assert("a" <= InlineString<10>("a"), "less equal");
2007*61c4878aSAndroid Build Coastguard Worker
2008*61c4878aSAndroid Build Coastguard Worker static_assert(InlineString<10>("ab") <= "abc", "less equal");
2009*61c4878aSAndroid Build Coastguard Worker static_assert("ab" <= InlineString<5>("abc"), "less equal");
2010*61c4878aSAndroid Build Coastguard Worker static_assert(InlineString<10>("abc") <= "abc", "less equal");
2011*61c4878aSAndroid Build Coastguard Worker static_assert("abc" <= InlineString<5>("abc"), "less equal");
2012*61c4878aSAndroid Build Coastguard Worker
2013*61c4878aSAndroid Build Coastguard Worker static_assert(InlineString<10>("?") > "", "greater");
2014*61c4878aSAndroid Build Coastguard Worker static_assert("?" > InlineString<10>(""), "greater");
2015*61c4878aSAndroid Build Coastguard Worker static_assert(InlineString<10>("abc") > "ab", "greater");
2016*61c4878aSAndroid Build Coastguard Worker static_assert("abc" > InlineString<5>("ab"), "greater");
2017*61c4878aSAndroid Build Coastguard Worker
2018*61c4878aSAndroid Build Coastguard Worker static_assert(InlineString<10>("?") >= "", "greater equal");
2019*61c4878aSAndroid Build Coastguard Worker static_assert("?" >= InlineString<10>(""), "greater equal");
2020*61c4878aSAndroid Build Coastguard Worker static_assert(InlineString<10>("abc") >= "ab", "greater equal");
2021*61c4878aSAndroid Build Coastguard Worker static_assert("abc" >= InlineString<5>("ab"), "greater equal");
2022*61c4878aSAndroid Build Coastguard Worker static_assert(InlineString<10>("abc") >= "abc", "greater equal");
2023*61c4878aSAndroid Build Coastguard Worker static_assert("abc" >= InlineString<5>("abc"), "greater equal");
2024*61c4878aSAndroid Build Coastguard Worker }
2025*61c4878aSAndroid Build Coastguard Worker
2026*61c4878aSAndroid Build Coastguard Worker // Test instantiating an InlineBasicString with different character types.
2027*61c4878aSAndroid Build Coastguard Worker
2028*61c4878aSAndroid Build Coastguard Worker #if __cpp_constexpr >= 201603L // constexpr lambdas are required
2029*61c4878aSAndroid Build Coastguard Worker #define PW_STRING_WRAP_TEST_EXPANSION(expr) \
2030*61c4878aSAndroid Build Coastguard Worker do { \
2031*61c4878aSAndroid Build Coastguard Worker expr; \
2032*61c4878aSAndroid Build Coastguard Worker } while (0)
2033*61c4878aSAndroid Build Coastguard Worker #else
2034*61c4878aSAndroid Build Coastguard Worker #define PW_STRING_WRAP_TEST_EXPANSION(expr)
2035*61c4878aSAndroid Build Coastguard Worker #endif // __cpp_constexpr >= 201603L
2036*61c4878aSAndroid Build Coastguard Worker #ifdef _LIBCPP_HAS_NO_WIDE_CHARACTERS
2037*61c4878aSAndroid Build Coastguard Worker #define TEST_FOR_TYPES_BASE(test_macro, ...) \
2038*61c4878aSAndroid Build Coastguard Worker PW_STRING_WRAP_TEST_EXPANSION(test_macro(char, __VA_ARGS__)); \
2039*61c4878aSAndroid Build Coastguard Worker PW_STRING_WRAP_TEST_EXPANSION(test_macro(char16_t, __VA_ARGS__)); \
2040*61c4878aSAndroid Build Coastguard Worker PW_STRING_WRAP_TEST_EXPANSION(test_macro(char32_t, __VA_ARGS__));
2041*61c4878aSAndroid Build Coastguard Worker #else
2042*61c4878aSAndroid Build Coastguard Worker #define TEST_FOR_TYPES_BASE(test_macro, ...) \
2043*61c4878aSAndroid Build Coastguard Worker PW_STRING_WRAP_TEST_EXPANSION(test_macro(char, __VA_ARGS__)); \
2044*61c4878aSAndroid Build Coastguard Worker PW_STRING_WRAP_TEST_EXPANSION(test_macro(wchar_t, __VA_ARGS__)); \
2045*61c4878aSAndroid Build Coastguard Worker PW_STRING_WRAP_TEST_EXPANSION(test_macro(char16_t, __VA_ARGS__)); \
2046*61c4878aSAndroid Build Coastguard Worker PW_STRING_WRAP_TEST_EXPANSION(test_macro(char32_t, __VA_ARGS__));
2047*61c4878aSAndroid Build Coastguard Worker #endif // _LIBCPP_HAS_NO_WIDE_CHARACTERS
2048*61c4878aSAndroid Build Coastguard Worker
2049*61c4878aSAndroid Build Coastguard Worker #ifdef __cpp_char8_t
2050*61c4878aSAndroid Build Coastguard Worker #define TEST_FOR_TYPES(test_macro, ...) \
2051*61c4878aSAndroid Build Coastguard Worker TEST_FOR_TYPES_BASE(test_macro, __VA_ARGS__) \
2052*61c4878aSAndroid Build Coastguard Worker PW_STRING_WRAP_TEST_EXPANSION(test_macro(char8_t, __VA_ARGS__));
2053*61c4878aSAndroid Build Coastguard Worker #else
2054*61c4878aSAndroid Build Coastguard Worker #define TEST_FOR_TYPES(test_macro, ...) \
2055*61c4878aSAndroid Build Coastguard Worker TEST_FOR_TYPES_BASE(test_macro, __VA_ARGS__)
2056*61c4878aSAndroid Build Coastguard Worker #endif // __cpp_char8_t
2057*61c4878aSAndroid Build Coastguard Worker
TEST(BasicStrings,Empty)2058*61c4878aSAndroid Build Coastguard Worker TEST(BasicStrings, Empty) {
2059*61c4878aSAndroid Build Coastguard Worker #define BASIC_STRINGS_EMPTY(type, capacity) \
2060*61c4878aSAndroid Build Coastguard Worker constexpr InlineBasicString<type, capacity> string; \
2061*61c4878aSAndroid Build Coastguard Worker static_assert(string.empty(), "empty"); \
2062*61c4878aSAndroid Build Coastguard Worker static_assert(string.size() == 0u, "size 0"); /* NOLINT */ \
2063*61c4878aSAndroid Build Coastguard Worker static_assert(string.c_str()[0] == static_cast<type>(0), "null"); \
2064*61c4878aSAndroid Build Coastguard Worker static_assert(std::basic_string_view<type>(string).empty())
2065*61c4878aSAndroid Build Coastguard Worker
2066*61c4878aSAndroid Build Coastguard Worker TEST_FOR_TYPES(BASIC_STRINGS_EMPTY, 0);
2067*61c4878aSAndroid Build Coastguard Worker TEST_FOR_TYPES(BASIC_STRINGS_EMPTY, 1);
2068*61c4878aSAndroid Build Coastguard Worker TEST_FOR_TYPES(BASIC_STRINGS_EMPTY, 50);
2069*61c4878aSAndroid Build Coastguard Worker
2070*61c4878aSAndroid Build Coastguard Worker #undef BASIC_STRINGS_EMPTY
2071*61c4878aSAndroid Build Coastguard Worker }
2072*61c4878aSAndroid Build Coastguard Worker
TEST(BasicStrings,InitializerList)2073*61c4878aSAndroid Build Coastguard Worker TEST(BasicStrings, InitializerList) {
2074*61c4878aSAndroid Build Coastguard Worker #define BASIC_STRINGS_INITIALIZER_LIST(type, capacity) \
2075*61c4878aSAndroid Build Coastguard Worker constexpr InlineBasicString<type, capacity> string({0, 1, 2, 3, 4}); \
2076*61c4878aSAndroid Build Coastguard Worker static_assert(string.size() == 5u, "size 5"); \
2077*61c4878aSAndroid Build Coastguard Worker static_assert(string[0] == static_cast<type>(0), "0"); \
2078*61c4878aSAndroid Build Coastguard Worker static_assert(string[1] == static_cast<type>(1), "1"); \
2079*61c4878aSAndroid Build Coastguard Worker static_assert(string[2] == static_cast<type>(2), "2"); \
2080*61c4878aSAndroid Build Coastguard Worker static_assert(string[3] == static_cast<type>(3), "3"); \
2081*61c4878aSAndroid Build Coastguard Worker static_assert(string[4] == static_cast<type>(4), "4"); \
2082*61c4878aSAndroid Build Coastguard Worker static_assert(string.c_str()[0] == static_cast<type>(0), "null"); \
2083*61c4878aSAndroid Build Coastguard Worker static_assert(std::basic_string_view<type>(string).size() == 5)
2084*61c4878aSAndroid Build Coastguard Worker
2085*61c4878aSAndroid Build Coastguard Worker TEST_FOR_TYPES(BASIC_STRINGS_INITIALIZER_LIST, 5);
2086*61c4878aSAndroid Build Coastguard Worker TEST_FOR_TYPES(BASIC_STRINGS_INITIALIZER_LIST, 10);
2087*61c4878aSAndroid Build Coastguard Worker TEST_FOR_TYPES(BASIC_STRINGS_INITIALIZER_LIST, 50);
2088*61c4878aSAndroid Build Coastguard Worker
2089*61c4878aSAndroid Build Coastguard Worker #undef BASIC_STRINGS_INITIALIZER_LIST
2090*61c4878aSAndroid Build Coastguard Worker }
2091*61c4878aSAndroid Build Coastguard Worker
TEST(BasicStrings,VariousOperations)2092*61c4878aSAndroid Build Coastguard Worker TEST(BasicStrings, VariousOperations) {
2093*61c4878aSAndroid Build Coastguard Worker #define BASIC_STRINGS_VARIOUS_OPERATIONS(type, capacity) \
2094*61c4878aSAndroid Build Coastguard Worker static constexpr type kOne[2] = {1, 0}; \
2095*61c4878aSAndroid Build Coastguard Worker constexpr auto string = [] { \
2096*61c4878aSAndroid Build Coastguard Worker InlineBasicString<type, capacity> str({0}); \
2097*61c4878aSAndroid Build Coastguard Worker str.append(kOne); \
2098*61c4878aSAndroid Build Coastguard Worker str.append({2, 10, 99}); \
2099*61c4878aSAndroid Build Coastguard Worker str.resize(3); \
2100*61c4878aSAndroid Build Coastguard Worker str.push_back(static_cast<int>(3)); \
2101*61c4878aSAndroid Build Coastguard Worker str.append(InlineBasicString<type, 2>({4})); \
2102*61c4878aSAndroid Build Coastguard Worker return str; \
2103*61c4878aSAndroid Build Coastguard Worker }(); \
2104*61c4878aSAndroid Build Coastguard Worker static_assert(string.size() == 5); \
2105*61c4878aSAndroid Build Coastguard Worker static_assert(string[0] == static_cast<type>(0), "0"); \
2106*61c4878aSAndroid Build Coastguard Worker static_assert(string[1] == static_cast<type>(1), "1"); \
2107*61c4878aSAndroid Build Coastguard Worker static_assert(string[2] == static_cast<type>(2), "2"); \
2108*61c4878aSAndroid Build Coastguard Worker static_assert(string[3] == static_cast<type>(3), "3"); \
2109*61c4878aSAndroid Build Coastguard Worker static_assert(string[4] == static_cast<type>(4), "4"); \
2110*61c4878aSAndroid Build Coastguard Worker static_assert(string.c_str()[0] == static_cast<type>(0), "null")
2111*61c4878aSAndroid Build Coastguard Worker
2112*61c4878aSAndroid Build Coastguard Worker TEST_FOR_TYPES(BASIC_STRINGS_VARIOUS_OPERATIONS, 5);
2113*61c4878aSAndroid Build Coastguard Worker TEST_FOR_TYPES(BASIC_STRINGS_VARIOUS_OPERATIONS, 10);
2114*61c4878aSAndroid Build Coastguard Worker TEST_FOR_TYPES(BASIC_STRINGS_VARIOUS_OPERATIONS, 50);
2115*61c4878aSAndroid Build Coastguard Worker
2116*61c4878aSAndroid Build Coastguard Worker #undef BASIC_STRINGS_VARIOUS_OPERATIONS
2117*61c4878aSAndroid Build Coastguard Worker }
2118*61c4878aSAndroid Build Coastguard Worker
TEST(BasicStrings,ByteString)2119*61c4878aSAndroid Build Coastguard Worker TEST(BasicStrings, ByteString) {
2120*61c4878aSAndroid Build Coastguard Worker InlineByteString<5> bytes;
2121*61c4878aSAndroid Build Coastguard Worker bytes.push_back(std::byte{1});
2122*61c4878aSAndroid Build Coastguard Worker bytes.push_back(std::byte{2});
2123*61c4878aSAndroid Build Coastguard Worker
2124*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(bytes.size(), 2u);
2125*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(bytes[0], std::byte{1});
2126*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(bytes[1], std::byte{2});
2127*61c4878aSAndroid Build Coastguard Worker
2128*61c4878aSAndroid Build Coastguard Worker InlineByteString<5> higher_bytes({std::byte{99}, std::byte{100}});
2129*61c4878aSAndroid Build Coastguard Worker EXPECT_LT(bytes, higher_bytes);
2130*61c4878aSAndroid Build Coastguard Worker }
2131*61c4878aSAndroid Build Coastguard Worker
2132*61c4878aSAndroid Build Coastguard Worker } // namespace
2133*61c4878aSAndroid Build Coastguard Worker } // namespace pw
2134