1f5dcab0dSGuillaume Chatelet //===-- Unittests for string ----------------------------------------------===//
2f5dcab0dSGuillaume Chatelet //
3f5dcab0dSGuillaume Chatelet // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4f5dcab0dSGuillaume Chatelet // See https://llvm.org/LICENSE.txt for license information.
5f5dcab0dSGuillaume Chatelet // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6f5dcab0dSGuillaume Chatelet //
7f5dcab0dSGuillaume Chatelet //===----------------------------------------------------------------------===//
8f5dcab0dSGuillaume Chatelet
9f5dcab0dSGuillaume Chatelet #include "src/__support/CPP/string.h"
10f5dcab0dSGuillaume Chatelet #include "test/UnitTest/Test.h"
11f5dcab0dSGuillaume Chatelet
12*b6bc9d72SGuillaume Chatelet using LIBC_NAMESPACE::cpp::string;
13*b6bc9d72SGuillaume Chatelet using LIBC_NAMESPACE::cpp::string_view;
14*b6bc9d72SGuillaume Chatelet using LIBC_NAMESPACE::cpp::to_string;
15f5dcab0dSGuillaume Chatelet
TEST(LlvmLibcStringTest,InitializeEmpty)16f5dcab0dSGuillaume Chatelet TEST(LlvmLibcStringTest, InitializeEmpty) {
17f5dcab0dSGuillaume Chatelet const string s;
18f5dcab0dSGuillaume Chatelet ASSERT_EQ(s.size(), size_t(0));
19f5dcab0dSGuillaume Chatelet ASSERT_TRUE(s.empty());
20f5dcab0dSGuillaume Chatelet ASSERT_STREQ(s.data(), "");
21f5dcab0dSGuillaume Chatelet ASSERT_STREQ(s.c_str(), "");
22f5dcab0dSGuillaume Chatelet ASSERT_EQ(s.data(), s.c_str());
23f5dcab0dSGuillaume Chatelet ASSERT_EQ(s.capacity(), size_t(0));
24f5dcab0dSGuillaume Chatelet }
25f5dcab0dSGuillaume Chatelet
TEST(LlvmLibcStringTest,InitializeCString)26f5dcab0dSGuillaume Chatelet TEST(LlvmLibcStringTest, InitializeCString) {
27f5dcab0dSGuillaume Chatelet const char *const str = "abc";
28f5dcab0dSGuillaume Chatelet const string s(str);
29f5dcab0dSGuillaume Chatelet ASSERT_EQ(s.size(), size_t(3));
30f5dcab0dSGuillaume Chatelet ASSERT_FALSE(s.empty());
31f5dcab0dSGuillaume Chatelet ASSERT_NE(s.data(), &str[0]);
32f5dcab0dSGuillaume Chatelet ASSERT_EQ(s[0], 'a');
33f5dcab0dSGuillaume Chatelet ASSERT_EQ(s[1], 'b');
34f5dcab0dSGuillaume Chatelet ASSERT_EQ(s[2], 'c');
35f5dcab0dSGuillaume Chatelet ASSERT_EQ(s.front(), 'a');
36f5dcab0dSGuillaume Chatelet ASSERT_EQ(s.back(), 'c');
37f5dcab0dSGuillaume Chatelet ASSERT_EQ(s.data(), s.c_str());
38f5dcab0dSGuillaume Chatelet }
39f5dcab0dSGuillaume Chatelet
TEST(LlvmLibcStringTest,ToCString)40f5dcab0dSGuillaume Chatelet TEST(LlvmLibcStringTest, ToCString) {
41f5dcab0dSGuillaume Chatelet const char *const str = "abc";
42f5dcab0dSGuillaume Chatelet string s(str);
43f5dcab0dSGuillaume Chatelet const char *cstr = s.c_str();
44f5dcab0dSGuillaume Chatelet ASSERT_EQ(s.size(), size_t(3));
45f5dcab0dSGuillaume Chatelet ASSERT_STREQ(str, cstr);
46f5dcab0dSGuillaume Chatelet }
47f5dcab0dSGuillaume Chatelet
TEST(LlvmLibcStringTest,ToStringView)48f5dcab0dSGuillaume Chatelet TEST(LlvmLibcStringTest, ToStringView) {
49f5dcab0dSGuillaume Chatelet const char *const str = "abc";
50f5dcab0dSGuillaume Chatelet string s(str);
51f5dcab0dSGuillaume Chatelet string_view view = s;
52f5dcab0dSGuillaume Chatelet ASSERT_EQ(view, string_view(str));
53f5dcab0dSGuillaume Chatelet }
54f5dcab0dSGuillaume Chatelet
TEST(LlvmLibcStringTest,InitializeCStringWithSize)55f5dcab0dSGuillaume Chatelet TEST(LlvmLibcStringTest, InitializeCStringWithSize) {
56f5dcab0dSGuillaume Chatelet const char *const str = "abc";
57f5dcab0dSGuillaume Chatelet const string s(str, 2);
58f5dcab0dSGuillaume Chatelet ASSERT_EQ(s.size(), size_t(2));
59f5dcab0dSGuillaume Chatelet ASSERT_EQ(s[0], 'a');
60f5dcab0dSGuillaume Chatelet ASSERT_EQ(s[1], 'b');
61f5dcab0dSGuillaume Chatelet ASSERT_EQ(s.front(), 'a');
62f5dcab0dSGuillaume Chatelet ASSERT_EQ(s.back(), 'b');
63f5dcab0dSGuillaume Chatelet }
64f5dcab0dSGuillaume Chatelet
TEST(LlvmLibcStringTest,InitializeStringView)6551f91e10SGuillaume Chatelet TEST(LlvmLibcStringTest, InitializeStringView) {
6651f91e10SGuillaume Chatelet const string_view str = "ab";
6751f91e10SGuillaume Chatelet const string s(str);
6851f91e10SGuillaume Chatelet ASSERT_EQ(s.size(), size_t(2));
6951f91e10SGuillaume Chatelet ASSERT_EQ(s[0], 'a');
7051f91e10SGuillaume Chatelet ASSERT_EQ(s[1], 'b');
7151f91e10SGuillaume Chatelet ASSERT_EQ(s.front(), 'a');
7251f91e10SGuillaume Chatelet ASSERT_EQ(s.back(), 'b');
7351f91e10SGuillaume Chatelet }
7451f91e10SGuillaume Chatelet
TEST(LlvmLibcStringTest,InitializeRepeatedChar)75f5dcab0dSGuillaume Chatelet TEST(LlvmLibcStringTest, InitializeRepeatedChar) {
76f5dcab0dSGuillaume Chatelet const string s(4, '1');
77f5dcab0dSGuillaume Chatelet ASSERT_EQ(string_view(s), string_view("1111"));
78f5dcab0dSGuillaume Chatelet }
79f5dcab0dSGuillaume Chatelet
TEST(LlvmLibcStringTest,InitializeZeorChar)80f5dcab0dSGuillaume Chatelet TEST(LlvmLibcStringTest, InitializeZeorChar) {
81f5dcab0dSGuillaume Chatelet const string s(0, '1');
82f5dcab0dSGuillaume Chatelet ASSERT_TRUE(s.empty());
83f5dcab0dSGuillaume Chatelet }
84f5dcab0dSGuillaume Chatelet
TEST(LlvmLibcStringTest,CopyConstruct)85f5dcab0dSGuillaume Chatelet TEST(LlvmLibcStringTest, CopyConstruct) {
86f5dcab0dSGuillaume Chatelet const char *const str = "abc";
87f5dcab0dSGuillaume Chatelet string a(str);
88f5dcab0dSGuillaume Chatelet string b(a);
89f5dcab0dSGuillaume Chatelet // Same content
90f5dcab0dSGuillaume Chatelet ASSERT_STREQ(a.c_str(), str);
91f5dcab0dSGuillaume Chatelet ASSERT_STREQ(b.c_str(), str);
92f5dcab0dSGuillaume Chatelet // Different pointers
93f5dcab0dSGuillaume Chatelet ASSERT_NE(a.data(), b.data());
94f5dcab0dSGuillaume Chatelet }
95f5dcab0dSGuillaume Chatelet
move(string & value)96f5dcab0dSGuillaume Chatelet string &&move(string &value) { return static_cast<string &&>(value); }
97f5dcab0dSGuillaume Chatelet
TEST(LlvmLibcStringTest,CopyAssign)98f5dcab0dSGuillaume Chatelet TEST(LlvmLibcStringTest, CopyAssign) {
99f5dcab0dSGuillaume Chatelet const char *const str = "abc";
100f5dcab0dSGuillaume Chatelet string a(str);
101f5dcab0dSGuillaume Chatelet string b;
102f5dcab0dSGuillaume Chatelet b = a;
103f5dcab0dSGuillaume Chatelet // Same content
104f5dcab0dSGuillaume Chatelet ASSERT_STREQ(a.c_str(), str);
105f5dcab0dSGuillaume Chatelet ASSERT_STREQ(b.c_str(), str);
106f5dcab0dSGuillaume Chatelet // Different pointers
107f5dcab0dSGuillaume Chatelet ASSERT_NE(a.data(), b.data());
108f5dcab0dSGuillaume Chatelet }
109f5dcab0dSGuillaume Chatelet
TEST(LlvmLibcStringTest,MoveConstruct)110f5dcab0dSGuillaume Chatelet TEST(LlvmLibcStringTest, MoveConstruct) {
111f5dcab0dSGuillaume Chatelet const char *const str = "abc";
112f5dcab0dSGuillaume Chatelet string a(str);
113f5dcab0dSGuillaume Chatelet string b(move(a));
114f5dcab0dSGuillaume Chatelet ASSERT_STREQ(b.c_str(), str);
115f5dcab0dSGuillaume Chatelet ASSERT_STREQ(a.c_str(), "");
116f5dcab0dSGuillaume Chatelet }
117f5dcab0dSGuillaume Chatelet
TEST(LlvmLibcStringTest,MoveAssign)118f5dcab0dSGuillaume Chatelet TEST(LlvmLibcStringTest, MoveAssign) {
119f5dcab0dSGuillaume Chatelet const char *const str = "abc";
120f5dcab0dSGuillaume Chatelet string a(str);
121f5dcab0dSGuillaume Chatelet string b;
122f5dcab0dSGuillaume Chatelet b = move(a);
123f5dcab0dSGuillaume Chatelet ASSERT_STREQ(b.c_str(), str);
124f5dcab0dSGuillaume Chatelet ASSERT_STREQ(a.c_str(), "");
125f5dcab0dSGuillaume Chatelet }
126f5dcab0dSGuillaume Chatelet
TEST(LlvmLibcStringTest,StringViewAssign)12751f91e10SGuillaume Chatelet TEST(LlvmLibcStringTest, StringViewAssign) {
12851f91e10SGuillaume Chatelet const string_view str = "ab";
12951f91e10SGuillaume Chatelet string s;
13051f91e10SGuillaume Chatelet s = str;
13151f91e10SGuillaume Chatelet ASSERT_EQ(s.size(), size_t(2));
13251f91e10SGuillaume Chatelet ASSERT_EQ(s[0], 'a');
13351f91e10SGuillaume Chatelet ASSERT_EQ(s[1], 'b');
13451f91e10SGuillaume Chatelet ASSERT_EQ(s.front(), 'a');
13551f91e10SGuillaume Chatelet ASSERT_EQ(s.back(), 'b');
13651f91e10SGuillaume Chatelet }
13751f91e10SGuillaume Chatelet
TEST(LlvmLibcStringTest,Concat)138f5dcab0dSGuillaume Chatelet TEST(LlvmLibcStringTest, Concat) {
139f5dcab0dSGuillaume Chatelet const char *const str = "abc";
140f5dcab0dSGuillaume Chatelet string a(str);
141f5dcab0dSGuillaume Chatelet string b;
142f5dcab0dSGuillaume Chatelet b += a;
143f5dcab0dSGuillaume Chatelet ASSERT_STREQ(b.c_str(), "abc");
144f5dcab0dSGuillaume Chatelet b += a;
145f5dcab0dSGuillaume Chatelet ASSERT_STREQ(b.c_str(), "abcabc");
146f5dcab0dSGuillaume Chatelet }
147f5dcab0dSGuillaume Chatelet
TEST(LlvmLibcStringTest,AddChar)148f5dcab0dSGuillaume Chatelet TEST(LlvmLibcStringTest, AddChar) {
149f5dcab0dSGuillaume Chatelet string a;
150f5dcab0dSGuillaume Chatelet a += 'a';
151f5dcab0dSGuillaume Chatelet ASSERT_STREQ(a.c_str(), "a");
152f5dcab0dSGuillaume Chatelet a += 'b';
153f5dcab0dSGuillaume Chatelet ASSERT_STREQ(a.c_str(), "ab");
154f5dcab0dSGuillaume Chatelet }
155f5dcab0dSGuillaume Chatelet
TEST(LlvmLibcStringTest,ResizeCapacityAndNullTermination)156f5dcab0dSGuillaume Chatelet TEST(LlvmLibcStringTest, ResizeCapacityAndNullTermination) {
157f5dcab0dSGuillaume Chatelet string a;
158f5dcab0dSGuillaume Chatelet // Empty
159f5dcab0dSGuillaume Chatelet ASSERT_EQ(a.capacity(), size_t(0));
160f5dcab0dSGuillaume Chatelet ASSERT_EQ(a.data()[0], '\0');
161f5dcab0dSGuillaume Chatelet // Still empty
162f5dcab0dSGuillaume Chatelet a.resize(0);
163f5dcab0dSGuillaume Chatelet ASSERT_EQ(a.capacity(), size_t(0));
164f5dcab0dSGuillaume Chatelet ASSERT_EQ(a.data()[0], '\0');
165f5dcab0dSGuillaume Chatelet // One char
166f5dcab0dSGuillaume Chatelet a.resize(1);
167f5dcab0dSGuillaume Chatelet ASSERT_EQ(a.size(), size_t(1));
168f5dcab0dSGuillaume Chatelet ASSERT_GE(a.capacity(), size_t(2));
169f5dcab0dSGuillaume Chatelet ASSERT_EQ(a.data()[1], '\0');
170f5dcab0dSGuillaume Chatelet // Clear
171f5dcab0dSGuillaume Chatelet a.resize(0);
172f5dcab0dSGuillaume Chatelet ASSERT_EQ(a.size(), size_t(0));
173f5dcab0dSGuillaume Chatelet ASSERT_GE(a.capacity(), size_t(2));
174f5dcab0dSGuillaume Chatelet ASSERT_EQ(a.data()[0], '\0');
175f5dcab0dSGuillaume Chatelet // Resize and check zero initialized
176f5dcab0dSGuillaume Chatelet a.resize(10);
177f5dcab0dSGuillaume Chatelet ASSERT_EQ(a.size(), size_t(10));
178f5dcab0dSGuillaume Chatelet ASSERT_GE(a.capacity(), size_t(10));
179f5dcab0dSGuillaume Chatelet for (size_t i = 0; i < 10; ++i)
180f5dcab0dSGuillaume Chatelet ASSERT_EQ(a[i], '\0');
181f5dcab0dSGuillaume Chatelet }
182f5dcab0dSGuillaume Chatelet
TEST(LlvmLibcStringTest,ConcatWithCString)183f5dcab0dSGuillaume Chatelet TEST(LlvmLibcStringTest, ConcatWithCString) {
184f5dcab0dSGuillaume Chatelet ASSERT_STREQ((string("a") + string("b")).c_str(), "ab");
185f5dcab0dSGuillaume Chatelet ASSERT_STREQ((string("a") + "b").c_str(), "ab");
186f5dcab0dSGuillaume Chatelet ASSERT_STREQ(("a" + string("b")).c_str(), "ab");
187f5dcab0dSGuillaume Chatelet }
188f5dcab0dSGuillaume Chatelet
TEST(LlvmLibcStringTest,Comparison)189f5dcab0dSGuillaume Chatelet TEST(LlvmLibcStringTest, Comparison) {
190f5dcab0dSGuillaume Chatelet // Here we simply check that comparison of string and string_view have the
191f5dcab0dSGuillaume Chatelet // same semantic.
192f5dcab0dSGuillaume Chatelet struct CStringPair {
193f5dcab0dSGuillaume Chatelet const char *const a;
194f5dcab0dSGuillaume Chatelet const char *const b;
195f5dcab0dSGuillaume Chatelet } kTestPairs[] = {{"a", "b"}, {"", "xyz"}};
196f5dcab0dSGuillaume Chatelet for (const auto [pa, pb] : kTestPairs) {
197f5dcab0dSGuillaume Chatelet const string sa(pa);
198f5dcab0dSGuillaume Chatelet const string sb(pb);
199f5dcab0dSGuillaume Chatelet const string_view sva(pa);
200f5dcab0dSGuillaume Chatelet const string_view svb(pb);
201f5dcab0dSGuillaume Chatelet ASSERT_EQ(sa == sb, sva == svb);
202f5dcab0dSGuillaume Chatelet ASSERT_EQ(sa != sb, sva != svb);
203f5dcab0dSGuillaume Chatelet ASSERT_EQ(sa >= sb, sva >= svb);
204f5dcab0dSGuillaume Chatelet ASSERT_EQ(sa <= sb, sva <= svb);
205f5dcab0dSGuillaume Chatelet ASSERT_EQ(sa < sb, sva < svb);
206f5dcab0dSGuillaume Chatelet ASSERT_EQ(sa > sb, sva > svb);
207f5dcab0dSGuillaume Chatelet }
208f5dcab0dSGuillaume Chatelet }
209f5dcab0dSGuillaume Chatelet
TEST(LlvmLibcStringTest,ToString)210f5dcab0dSGuillaume Chatelet TEST(LlvmLibcStringTest, ToString) {
211f5dcab0dSGuillaume Chatelet struct CStringPair {
212f5dcab0dSGuillaume Chatelet const int value;
213f5dcab0dSGuillaume Chatelet const string str;
214f5dcab0dSGuillaume Chatelet } kTestPairs[] = {{123, "123"}, {0, "0"}, {-321, "-321"}};
215f5dcab0dSGuillaume Chatelet for (const auto &[value, str] : kTestPairs) {
216f5dcab0dSGuillaume Chatelet ASSERT_EQ(to_string((int)(value)), str);
217f5dcab0dSGuillaume Chatelet ASSERT_EQ(to_string((long)(value)), str);
218f5dcab0dSGuillaume Chatelet ASSERT_EQ(to_string((long long)(value)), str);
219f5dcab0dSGuillaume Chatelet if (value >= 0) {
220f5dcab0dSGuillaume Chatelet ASSERT_EQ(to_string((unsigned int)(value)), str);
221f5dcab0dSGuillaume Chatelet ASSERT_EQ(to_string((unsigned long)(value)), str);
222f5dcab0dSGuillaume Chatelet ASSERT_EQ(to_string((unsigned long long)(value)), str);
223f5dcab0dSGuillaume Chatelet }
224f5dcab0dSGuillaume Chatelet }
225f5dcab0dSGuillaume Chatelet }
226