1 //===-- Unittests for StringView ------------------------------------------===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8
9 #include "src/__support/CPP/StringView.h"
10 #include "utils/UnitTest/Test.h"
11
12 using __llvm_libc::cpp::StringView;
13
TEST(LlvmLibcStringViewTest,InitializeCheck)14 TEST(LlvmLibcStringViewTest, InitializeCheck) {
15 StringView v;
16 ASSERT_EQ(v.size(), size_t(0));
17 ASSERT_TRUE(v.data() == nullptr);
18
19 v = StringView("");
20 ASSERT_EQ(v.size(), size_t(0));
21 ASSERT_TRUE(v.data() == nullptr);
22
23 v = StringView(nullptr);
24 ASSERT_EQ(v.size(), size_t(0));
25 ASSERT_TRUE(v.data() == nullptr);
26
27 v = StringView(nullptr, 10);
28 ASSERT_EQ(v.size(), size_t(0));
29 ASSERT_TRUE(v.data() == nullptr);
30
31 v = StringView("abc", 0);
32 ASSERT_EQ(v.size(), size_t(0));
33 ASSERT_TRUE(v.data() == nullptr);
34
35 v = StringView("123456789");
36 ASSERT_EQ(v.size(), size_t(9));
37 }
38
TEST(LlvmLibcStringViewTest,Equals)39 TEST(LlvmLibcStringViewTest, Equals) {
40 StringView v("abc");
41 ASSERT_TRUE(v.equals(StringView("abc")));
42 ASSERT_FALSE(v.equals(StringView()));
43 ASSERT_FALSE(v.equals(StringView("")));
44 ASSERT_FALSE(v.equals(StringView("123")));
45 ASSERT_FALSE(v.equals(StringView("abd")));
46 ASSERT_FALSE(v.equals(StringView("aaa")));
47 ASSERT_FALSE(v.equals(StringView("abcde")));
48 }
49
TEST(LlvmLibcStringViewTest,startsWith)50 TEST(LlvmLibcStringViewTest, startsWith) {
51 StringView v("abc");
52 ASSERT_TRUE(v.starts_with('a'));
53 ASSERT_TRUE(v.starts_with(StringView("a")));
54 ASSERT_TRUE(v.starts_with(StringView("ab")));
55 ASSERT_TRUE(v.starts_with(StringView("abc")));
56 ASSERT_TRUE(v.starts_with(StringView()));
57 ASSERT_TRUE(v.starts_with(StringView("")));
58 ASSERT_FALSE(v.starts_with('1'));
59 ASSERT_FALSE(v.starts_with(StringView("123")));
60 ASSERT_FALSE(v.starts_with(StringView("abd")));
61 ASSERT_FALSE(v.starts_with(StringView("aaa")));
62 ASSERT_FALSE(v.starts_with(StringView("abcde")));
63 }
64
TEST(LlvmLibcStringViewTest,endsWith)65 TEST(LlvmLibcStringViewTest, endsWith) {
66 StringView v("abc");
67 ASSERT_TRUE(v.ends_with('c'));
68 ASSERT_TRUE(v.ends_with(StringView("c")));
69 ASSERT_TRUE(v.ends_with(StringView("bc")));
70 ASSERT_TRUE(v.ends_with(StringView("abc")));
71 ASSERT_TRUE(v.ends_with(StringView()));
72 ASSERT_TRUE(v.ends_with(StringView("")));
73 ASSERT_FALSE(v.ends_with('1'));
74 ASSERT_FALSE(v.ends_with(StringView("123")));
75 ASSERT_FALSE(v.ends_with(StringView("abd")));
76 ASSERT_FALSE(v.ends_with(StringView("aaa")));
77 ASSERT_FALSE(v.ends_with(StringView("abcde")));
78 }
79
TEST(LlvmLibcStringViewTest,RemovePrefix)80 TEST(LlvmLibcStringViewTest, RemovePrefix) {
81 StringView a("123456789");
82 a.remove_prefix(0);
83 ASSERT_EQ(a.size(), size_t(9));
84 ASSERT_TRUE(a.equals(StringView("123456789")));
85
86 StringView b("123456789");
87 b.remove_prefix(4);
88 ASSERT_EQ(b.size(), size_t(5));
89 ASSERT_TRUE(b.equals(StringView("56789")));
90
91 StringView c("123456789");
92 c.remove_prefix(9);
93 ASSERT_EQ(c.size(), size_t(0));
94 }
95
TEST(LlvmLibcStringViewTest,RemoveSuffix)96 TEST(LlvmLibcStringViewTest, RemoveSuffix) {
97 StringView a("123456789");
98 a.remove_suffix(0);
99 ASSERT_EQ(a.size(), size_t(9));
100 ASSERT_TRUE(a.equals(StringView("123456789")));
101
102 StringView b("123456789");
103 b.remove_suffix(4);
104 ASSERT_EQ(b.size(), size_t(5));
105 ASSERT_TRUE(b.equals(StringView("12345")));
106
107 StringView c("123456789");
108 c.remove_suffix(9);
109 ASSERT_EQ(c.size(), size_t(0));
110 }
111
TEST(LlvmLibcStringViewTest,TrimSingleChar)112 TEST(LlvmLibcStringViewTest, TrimSingleChar) {
113 StringView v(" 123456789 ");
114 auto t = v.trim(' ');
115 ASSERT_EQ(t.size(), size_t(9));
116 ASSERT_TRUE(t.equals(StringView("123456789")));
117
118 v = StringView("====12345==");
119 t = v.trim(' ');
120 ASSERT_EQ(v.size(), size_t(11));
121 ASSERT_TRUE(t.equals(StringView("====12345==")));
122
123 t = v.trim('=');
124 ASSERT_EQ(t.size(), size_t(5));
125 ASSERT_TRUE(t.equals(StringView("12345")));
126
127 v = StringView("12345===");
128 t = v.trim('=');
129 ASSERT_EQ(t.size(), size_t(5));
130 ASSERT_TRUE(t.equals(StringView("12345")));
131
132 v = StringView("===========12345");
133 t = v.trim('=');
134 ASSERT_EQ(t.size(), size_t(5));
135 ASSERT_TRUE(t.equals(StringView("12345")));
136
137 v = StringView("============");
138 t = v.trim('=');
139 ASSERT_EQ(t.size(), size_t(0));
140 ASSERT_TRUE(t.data() == nullptr);
141
142 v = StringView();
143 t = v.trim(' ');
144 ASSERT_EQ(t.size(), size_t(0));
145 ASSERT_TRUE(t.data() == nullptr);
146
147 v = StringView("");
148 t = v.trim(' ');
149 ASSERT_EQ(t.size(), size_t(0));
150 ASSERT_TRUE(t.data() == nullptr);
151 }
152
TEST(LlvmLibcStringViewTest,Observer)153 TEST(LlvmLibcStringViewTest, Observer) {
154 StringView ABC("abc");
155 ASSERT_EQ(ABC.size(), size_t(3));
156 ASSERT_FALSE(ABC.empty());
157 ASSERT_EQ(ABC.front(), 'a');
158 ASSERT_EQ(ABC.back(), 'c');
159 }
160
isDigit(char c)161 bool isDigit(char c) { return c >= '0' && c <= '9'; }
162
TEST(LlvmLibcStringViewTest,Transform)163 TEST(LlvmLibcStringViewTest, Transform) {
164 ASSERT_TRUE(StringView("123abc").drop_back(3).equals("123"));
165 ASSERT_TRUE(StringView("123abc").drop_front(3).equals("abc"));
166 ASSERT_TRUE(StringView("123abc").take_back(3).equals("abc"));
167 ASSERT_TRUE(StringView("123abc").take_front(3).equals("123"));
168
169 ASSERT_TRUE(StringView("123abc").take_while(&isDigit).equals("123"));
170 ASSERT_TRUE(StringView("abc123").take_until(&isDigit).equals("abc"));
171 ASSERT_TRUE(StringView("123abc").drop_while(&isDigit).equals("abc"));
172 ASSERT_TRUE(StringView("abc123").drop_until(&isDigit).equals("123"));
173 }
174
TEST(LlvmLibcStringViewTest,ConsumeFront)175 TEST(LlvmLibcStringViewTest, ConsumeFront) {
176 StringView Tmp("abc");
177 ASSERT_FALSE(Tmp.consume_front("###"));
178 ASSERT_TRUE(Tmp.consume_front("ab"));
179 ASSERT_TRUE(Tmp.equals("c"));
180 }
181
TEST(LlvmLibcStringViewTest,ConsumeBack)182 TEST(LlvmLibcStringViewTest, ConsumeBack) {
183 StringView Tmp("abc");
184 ASSERT_FALSE(Tmp.consume_back("###"));
185 ASSERT_TRUE(Tmp.consume_back("bc"));
186 ASSERT_TRUE(Tmp.equals("a"));
187 }
188
TEST(LlvmLibcStringViewTest,FindFirstOf)189 TEST(LlvmLibcStringViewTest, FindFirstOf) {
190 StringView Tmp("abca");
191 ASSERT_TRUE(Tmp.find_first_of('a') == 0);
192 ASSERT_TRUE(Tmp.find_first_of('d') == StringView::npos);
193 ASSERT_TRUE(Tmp.find_first_of('b') == 1);
194 ASSERT_TRUE(Tmp.find_first_of('a', 0) == 0);
195 ASSERT_TRUE(Tmp.find_first_of('b', 1) == 1);
196 ASSERT_TRUE(Tmp.find_first_of('a', 1) == 3);
197 ASSERT_TRUE(Tmp.find_first_of('a', 42) == StringView::npos);
198 ASSERT_FALSE(Tmp.find_first_of('c') == 1);
199 ASSERT_FALSE(Tmp.find_first_of('c', 0) == 1);
200 ASSERT_FALSE(Tmp.find_first_of('c', 1) == 1);
201 }
202
TEST(LlvmLibcStringViewTest,FindLastOf)203 TEST(LlvmLibcStringViewTest, FindLastOf) {
204 StringView Tmp("abada");
205
206 ASSERT_EQ(Tmp.find_last_of('a'), size_t(4));
207 ASSERT_EQ(Tmp.find_last_of('a', 123), size_t(4));
208 ASSERT_EQ(Tmp.find_last_of('a', 5), size_t(4));
209 ASSERT_EQ(Tmp.find_last_of('a', 4), size_t(4));
210 ASSERT_EQ(Tmp.find_last_of('a', 3), size_t(2));
211 ASSERT_EQ(Tmp.find_last_of('a', 2), size_t(2));
212 ASSERT_EQ(Tmp.find_last_of('a', 1), size_t(0));
213 ASSERT_EQ(Tmp.find_last_of('a', 0), size_t(0));
214
215 ASSERT_EQ(Tmp.find_last_of('b'), size_t(1));
216 ASSERT_EQ(Tmp.find_last_of('b', 123), size_t(1));
217 ASSERT_EQ(Tmp.find_last_of('b', 5), size_t(1));
218 ASSERT_EQ(Tmp.find_last_of('b', 4), size_t(1));
219 ASSERT_EQ(Tmp.find_last_of('b', 3), size_t(1));
220 ASSERT_EQ(Tmp.find_last_of('b', 2), size_t(1));
221 ASSERT_EQ(Tmp.find_last_of('b', 1), size_t(1));
222 ASSERT_EQ(Tmp.find_last_of('b', 0), StringView::npos);
223
224 ASSERT_EQ(Tmp.find_last_of('d'), size_t(3));
225 ASSERT_EQ(Tmp.find_last_of('d', 123), size_t(3));
226 ASSERT_EQ(Tmp.find_last_of('d', 5), size_t(3));
227 ASSERT_EQ(Tmp.find_last_of('d', 4), size_t(3));
228 ASSERT_EQ(Tmp.find_last_of('d', 3), size_t(3));
229 ASSERT_EQ(Tmp.find_last_of('d', 2), StringView::npos);
230 ASSERT_EQ(Tmp.find_last_of('d', 1), StringView::npos);
231 ASSERT_EQ(Tmp.find_last_of('d', 0), StringView::npos);
232
233 ASSERT_EQ(Tmp.find_last_of('e'), StringView::npos);
234 ASSERT_EQ(Tmp.find_last_of('e', 123), StringView::npos);
235 ASSERT_EQ(Tmp.find_last_of('e', 5), StringView::npos);
236 ASSERT_EQ(Tmp.find_last_of('e', 4), StringView::npos);
237 ASSERT_EQ(Tmp.find_last_of('e', 3), StringView::npos);
238 ASSERT_EQ(Tmp.find_last_of('e', 2), StringView::npos);
239 ASSERT_EQ(Tmp.find_last_of('e', 1), StringView::npos);
240 ASSERT_EQ(Tmp.find_last_of('e', 0), StringView::npos);
241
242 StringView Empty;
243 ASSERT_EQ(Empty.find_last_of('a'), StringView::npos);
244 ASSERT_EQ(Empty.find_last_of('a', 0), StringView::npos);
245 ASSERT_EQ(Empty.find_last_of('a', 123), StringView::npos);
246
247 StringView Empty1("");
248 ASSERT_EQ(Empty1.find_last_of('a'), StringView::npos);
249 ASSERT_EQ(Empty1.find_last_of('a', 0), StringView::npos);
250 ASSERT_EQ(Empty1.find_last_of('a', 123), StringView::npos);
251 }
252