12a7ed8fcSSiva Chandra Reddy //===-- Unittests for StringView ------------------------------------------===//
22a7ed8fcSSiva Chandra Reddy //
32a7ed8fcSSiva Chandra Reddy // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42a7ed8fcSSiva Chandra Reddy // See https://llvm.org/LICENSE.txt for license information.
52a7ed8fcSSiva Chandra Reddy // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
62a7ed8fcSSiva Chandra Reddy //
72a7ed8fcSSiva Chandra Reddy //===----------------------------------------------------------------------===//
82a7ed8fcSSiva Chandra Reddy 
92a7ed8fcSSiva Chandra Reddy #include "src/__support/CPP/StringView.h"
102a7ed8fcSSiva Chandra Reddy #include "utils/UnitTest/Test.h"
112a7ed8fcSSiva Chandra Reddy 
12e0aece27SGuillaume Chatelet using __llvm_libc::cpp::StringView;
13e0aece27SGuillaume Chatelet 
TEST(LlvmLibcStringViewTest,InitializeCheck)142a7ed8fcSSiva Chandra Reddy TEST(LlvmLibcStringViewTest, InitializeCheck) {
15e0aece27SGuillaume Chatelet   StringView v;
162a7ed8fcSSiva Chandra Reddy   ASSERT_EQ(v.size(), size_t(0));
172a7ed8fcSSiva Chandra Reddy   ASSERT_TRUE(v.data() == nullptr);
182a7ed8fcSSiva Chandra Reddy 
19e0aece27SGuillaume Chatelet   v = StringView("");
202a7ed8fcSSiva Chandra Reddy   ASSERT_EQ(v.size(), size_t(0));
212a7ed8fcSSiva Chandra Reddy   ASSERT_TRUE(v.data() == nullptr);
222a7ed8fcSSiva Chandra Reddy 
23e0aece27SGuillaume Chatelet   v = StringView(nullptr);
242a7ed8fcSSiva Chandra Reddy   ASSERT_EQ(v.size(), size_t(0));
252a7ed8fcSSiva Chandra Reddy   ASSERT_TRUE(v.data() == nullptr);
262a7ed8fcSSiva Chandra Reddy 
27e0aece27SGuillaume Chatelet   v = StringView(nullptr, 10);
282a7ed8fcSSiva Chandra Reddy   ASSERT_EQ(v.size(), size_t(0));
292a7ed8fcSSiva Chandra Reddy   ASSERT_TRUE(v.data() == nullptr);
302a7ed8fcSSiva Chandra Reddy 
31e0aece27SGuillaume Chatelet   v = StringView("abc", 0);
322a7ed8fcSSiva Chandra Reddy   ASSERT_EQ(v.size(), size_t(0));
332a7ed8fcSSiva Chandra Reddy   ASSERT_TRUE(v.data() == nullptr);
342a7ed8fcSSiva Chandra Reddy 
35e0aece27SGuillaume Chatelet   v = StringView("123456789");
362a7ed8fcSSiva Chandra Reddy   ASSERT_EQ(v.size(), size_t(9));
372a7ed8fcSSiva Chandra Reddy }
382a7ed8fcSSiva Chandra Reddy 
TEST(LlvmLibcStringViewTest,Equals)392a7ed8fcSSiva Chandra Reddy TEST(LlvmLibcStringViewTest, Equals) {
40e0aece27SGuillaume Chatelet   StringView v("abc");
41e0aece27SGuillaume Chatelet   ASSERT_TRUE(v.equals(StringView("abc")));
42e0aece27SGuillaume Chatelet   ASSERT_FALSE(v.equals(StringView()));
43e0aece27SGuillaume Chatelet   ASSERT_FALSE(v.equals(StringView("")));
44e0aece27SGuillaume Chatelet   ASSERT_FALSE(v.equals(StringView("123")));
45e0aece27SGuillaume Chatelet   ASSERT_FALSE(v.equals(StringView("abd")));
46e0aece27SGuillaume Chatelet   ASSERT_FALSE(v.equals(StringView("aaa")));
47e0aece27SGuillaume Chatelet   ASSERT_FALSE(v.equals(StringView("abcde")));
482a7ed8fcSSiva Chandra Reddy }
492a7ed8fcSSiva Chandra Reddy 
TEST(LlvmLibcStringViewTest,startsWith)50f2a7f835SRaman Tenneti TEST(LlvmLibcStringViewTest, startsWith) {
51e0aece27SGuillaume Chatelet   StringView v("abc");
52897b8014SJeff Bailey   ASSERT_TRUE(v.starts_with('a'));
53e0aece27SGuillaume Chatelet   ASSERT_TRUE(v.starts_with(StringView("a")));
54e0aece27SGuillaume Chatelet   ASSERT_TRUE(v.starts_with(StringView("ab")));
55e0aece27SGuillaume Chatelet   ASSERT_TRUE(v.starts_with(StringView("abc")));
56e0aece27SGuillaume Chatelet   ASSERT_TRUE(v.starts_with(StringView()));
57e0aece27SGuillaume Chatelet   ASSERT_TRUE(v.starts_with(StringView("")));
58897b8014SJeff Bailey   ASSERT_FALSE(v.starts_with('1'));
59e0aece27SGuillaume Chatelet   ASSERT_FALSE(v.starts_with(StringView("123")));
60e0aece27SGuillaume Chatelet   ASSERT_FALSE(v.starts_with(StringView("abd")));
61e0aece27SGuillaume Chatelet   ASSERT_FALSE(v.starts_with(StringView("aaa")));
62e0aece27SGuillaume Chatelet   ASSERT_FALSE(v.starts_with(StringView("abcde")));
63f2a7f835SRaman Tenneti }
64f2a7f835SRaman Tenneti 
TEST(LlvmLibcStringViewTest,endsWith)65897b8014SJeff Bailey TEST(LlvmLibcStringViewTest, endsWith) {
66897b8014SJeff Bailey   StringView v("abc");
67897b8014SJeff Bailey   ASSERT_TRUE(v.ends_with('c'));
68897b8014SJeff Bailey   ASSERT_TRUE(v.ends_with(StringView("c")));
69897b8014SJeff Bailey   ASSERT_TRUE(v.ends_with(StringView("bc")));
70897b8014SJeff Bailey   ASSERT_TRUE(v.ends_with(StringView("abc")));
71897b8014SJeff Bailey   ASSERT_TRUE(v.ends_with(StringView()));
72897b8014SJeff Bailey   ASSERT_TRUE(v.ends_with(StringView("")));
73897b8014SJeff Bailey   ASSERT_FALSE(v.ends_with('1'));
74897b8014SJeff Bailey   ASSERT_FALSE(v.ends_with(StringView("123")));
75897b8014SJeff Bailey   ASSERT_FALSE(v.ends_with(StringView("abd")));
76897b8014SJeff Bailey   ASSERT_FALSE(v.ends_with(StringView("aaa")));
77897b8014SJeff Bailey   ASSERT_FALSE(v.ends_with(StringView("abcde")));
78897b8014SJeff Bailey }
79897b8014SJeff Bailey 
TEST(LlvmLibcStringViewTest,RemovePrefix)802a7ed8fcSSiva Chandra Reddy TEST(LlvmLibcStringViewTest, RemovePrefix) {
818aad330eSJeff Bailey   StringView a("123456789");
828aad330eSJeff Bailey   a.remove_prefix(0);
838aad330eSJeff Bailey   ASSERT_EQ(a.size(), size_t(9));
848aad330eSJeff Bailey   ASSERT_TRUE(a.equals(StringView("123456789")));
852a7ed8fcSSiva Chandra Reddy 
868aad330eSJeff Bailey   StringView b("123456789");
878aad330eSJeff Bailey   b.remove_prefix(4);
888aad330eSJeff Bailey   ASSERT_EQ(b.size(), size_t(5));
898aad330eSJeff Bailey   ASSERT_TRUE(b.equals(StringView("56789")));
902a7ed8fcSSiva Chandra Reddy 
918aad330eSJeff Bailey   StringView c("123456789");
928aad330eSJeff Bailey   c.remove_prefix(9);
938aad330eSJeff Bailey   ASSERT_EQ(c.size(), size_t(0));
942a7ed8fcSSiva Chandra Reddy }
952a7ed8fcSSiva Chandra Reddy 
TEST(LlvmLibcStringViewTest,RemoveSuffix)962a7ed8fcSSiva Chandra Reddy TEST(LlvmLibcStringViewTest, RemoveSuffix) {
978aad330eSJeff Bailey   StringView a("123456789");
988aad330eSJeff Bailey   a.remove_suffix(0);
998aad330eSJeff Bailey   ASSERT_EQ(a.size(), size_t(9));
1008aad330eSJeff Bailey   ASSERT_TRUE(a.equals(StringView("123456789")));
1012a7ed8fcSSiva Chandra Reddy 
1028aad330eSJeff Bailey   StringView b("123456789");
1038aad330eSJeff Bailey   b.remove_suffix(4);
1048aad330eSJeff Bailey   ASSERT_EQ(b.size(), size_t(5));
1058aad330eSJeff Bailey   ASSERT_TRUE(b.equals(StringView("12345")));
1062a7ed8fcSSiva Chandra Reddy 
1078aad330eSJeff Bailey   StringView c("123456789");
1088aad330eSJeff Bailey   c.remove_suffix(9);
1098aad330eSJeff Bailey   ASSERT_EQ(c.size(), size_t(0));
1102a7ed8fcSSiva Chandra Reddy }
1112a7ed8fcSSiva Chandra Reddy 
TEST(LlvmLibcStringViewTest,TrimSingleChar)1122a7ed8fcSSiva Chandra Reddy TEST(LlvmLibcStringViewTest, TrimSingleChar) {
113e0aece27SGuillaume Chatelet   StringView v("     123456789   ");
1142a7ed8fcSSiva Chandra Reddy   auto t = v.trim(' ');
1152a7ed8fcSSiva Chandra Reddy   ASSERT_EQ(t.size(), size_t(9));
116e0aece27SGuillaume Chatelet   ASSERT_TRUE(t.equals(StringView("123456789")));
1172a7ed8fcSSiva Chandra Reddy 
118e0aece27SGuillaume Chatelet   v = StringView("====12345==");
1192a7ed8fcSSiva Chandra Reddy   t = v.trim(' ');
1202a7ed8fcSSiva Chandra Reddy   ASSERT_EQ(v.size(), size_t(11));
121e0aece27SGuillaume Chatelet   ASSERT_TRUE(t.equals(StringView("====12345==")));
1222a7ed8fcSSiva Chandra Reddy 
1232a7ed8fcSSiva Chandra Reddy   t = v.trim('=');
1242a7ed8fcSSiva Chandra Reddy   ASSERT_EQ(t.size(), size_t(5));
125e0aece27SGuillaume Chatelet   ASSERT_TRUE(t.equals(StringView("12345")));
1262a7ed8fcSSiva Chandra Reddy 
127e0aece27SGuillaume Chatelet   v = StringView("12345===");
1282a7ed8fcSSiva Chandra Reddy   t = v.trim('=');
1292a7ed8fcSSiva Chandra Reddy   ASSERT_EQ(t.size(), size_t(5));
130e0aece27SGuillaume Chatelet   ASSERT_TRUE(t.equals(StringView("12345")));
1312a7ed8fcSSiva Chandra Reddy 
132e0aece27SGuillaume Chatelet   v = StringView("===========12345");
1332a7ed8fcSSiva Chandra Reddy   t = v.trim('=');
1342a7ed8fcSSiva Chandra Reddy   ASSERT_EQ(t.size(), size_t(5));
135e0aece27SGuillaume Chatelet   ASSERT_TRUE(t.equals(StringView("12345")));
1362a7ed8fcSSiva Chandra Reddy 
137e0aece27SGuillaume Chatelet   v = StringView("============");
1382a7ed8fcSSiva Chandra Reddy   t = v.trim('=');
1392a7ed8fcSSiva Chandra Reddy   ASSERT_EQ(t.size(), size_t(0));
1402a7ed8fcSSiva Chandra Reddy   ASSERT_TRUE(t.data() == nullptr);
1412a7ed8fcSSiva Chandra Reddy 
142e0aece27SGuillaume Chatelet   v = StringView();
1432a7ed8fcSSiva Chandra Reddy   t = v.trim(' ');
1442a7ed8fcSSiva Chandra Reddy   ASSERT_EQ(t.size(), size_t(0));
1452a7ed8fcSSiva Chandra Reddy   ASSERT_TRUE(t.data() == nullptr);
1462a7ed8fcSSiva Chandra Reddy 
147e0aece27SGuillaume Chatelet   v = StringView("");
1482a7ed8fcSSiva Chandra Reddy   t = v.trim(' ');
1492a7ed8fcSSiva Chandra Reddy   ASSERT_EQ(t.size(), size_t(0));
1502a7ed8fcSSiva Chandra Reddy   ASSERT_TRUE(t.data() == nullptr);
1512a7ed8fcSSiva Chandra Reddy }
152e0aece27SGuillaume Chatelet 
TEST(LlvmLibcStringViewTest,Observer)153e0aece27SGuillaume Chatelet TEST(LlvmLibcStringViewTest, Observer) {
154e0aece27SGuillaume Chatelet   StringView ABC("abc");
155e0aece27SGuillaume Chatelet   ASSERT_EQ(ABC.size(), size_t(3));
156e0aece27SGuillaume Chatelet   ASSERT_FALSE(ABC.empty());
157e0aece27SGuillaume Chatelet   ASSERT_EQ(ABC.front(), 'a');
158e0aece27SGuillaume Chatelet   ASSERT_EQ(ABC.back(), 'c');
159e0aece27SGuillaume Chatelet }
160e0aece27SGuillaume Chatelet 
isDigit(char c)161e0aece27SGuillaume Chatelet bool isDigit(char c) { return c >= '0' && c <= '9'; }
162e0aece27SGuillaume Chatelet 
TEST(LlvmLibcStringViewTest,Transform)163e0aece27SGuillaume Chatelet TEST(LlvmLibcStringViewTest, Transform) {
164e0aece27SGuillaume Chatelet   ASSERT_TRUE(StringView("123abc").drop_back(3).equals("123"));
165e0aece27SGuillaume Chatelet   ASSERT_TRUE(StringView("123abc").drop_front(3).equals("abc"));
166e0aece27SGuillaume Chatelet   ASSERT_TRUE(StringView("123abc").take_back(3).equals("abc"));
167e0aece27SGuillaume Chatelet   ASSERT_TRUE(StringView("123abc").take_front(3).equals("123"));
168e0aece27SGuillaume Chatelet 
169e0aece27SGuillaume Chatelet   ASSERT_TRUE(StringView("123abc").take_while(&isDigit).equals("123"));
170e0aece27SGuillaume Chatelet   ASSERT_TRUE(StringView("abc123").take_until(&isDigit).equals("abc"));
171e0aece27SGuillaume Chatelet   ASSERT_TRUE(StringView("123abc").drop_while(&isDigit).equals("abc"));
172e0aece27SGuillaume Chatelet   ASSERT_TRUE(StringView("abc123").drop_until(&isDigit).equals("123"));
173e0aece27SGuillaume Chatelet }
174e0aece27SGuillaume Chatelet 
TEST(LlvmLibcStringViewTest,ConsumeFront)175e0aece27SGuillaume Chatelet TEST(LlvmLibcStringViewTest, ConsumeFront) {
176e0aece27SGuillaume Chatelet   StringView Tmp("abc");
177e0aece27SGuillaume Chatelet   ASSERT_FALSE(Tmp.consume_front("###"));
178e0aece27SGuillaume Chatelet   ASSERT_TRUE(Tmp.consume_front("ab"));
179e0aece27SGuillaume Chatelet   ASSERT_TRUE(Tmp.equals("c"));
180e0aece27SGuillaume Chatelet }
181e0aece27SGuillaume Chatelet 
TEST(LlvmLibcStringViewTest,ConsumeBack)182e0aece27SGuillaume Chatelet TEST(LlvmLibcStringViewTest, ConsumeBack) {
183e0aece27SGuillaume Chatelet   StringView Tmp("abc");
184e0aece27SGuillaume Chatelet   ASSERT_FALSE(Tmp.consume_back("###"));
185e0aece27SGuillaume Chatelet   ASSERT_TRUE(Tmp.consume_back("bc"));
186e0aece27SGuillaume Chatelet   ASSERT_TRUE(Tmp.equals("a"));
187e0aece27SGuillaume Chatelet }
188897b8014SJeff Bailey 
TEST(LlvmLibcStringViewTest,FindFirstOf)189897b8014SJeff Bailey TEST(LlvmLibcStringViewTest, FindFirstOf) {
190897b8014SJeff Bailey   StringView Tmp("abca");
191897b8014SJeff Bailey   ASSERT_TRUE(Tmp.find_first_of('a') == 0);
192897b8014SJeff Bailey   ASSERT_TRUE(Tmp.find_first_of('d') == StringView::npos);
193897b8014SJeff Bailey   ASSERT_TRUE(Tmp.find_first_of('b') == 1);
194897b8014SJeff Bailey   ASSERT_TRUE(Tmp.find_first_of('a', 0) == 0);
195897b8014SJeff Bailey   ASSERT_TRUE(Tmp.find_first_of('b', 1) == 1);
196897b8014SJeff Bailey   ASSERT_TRUE(Tmp.find_first_of('a', 1) == 3);
197897b8014SJeff Bailey   ASSERT_TRUE(Tmp.find_first_of('a', 42) == StringView::npos);
198897b8014SJeff Bailey   ASSERT_FALSE(Tmp.find_first_of('c') == 1);
199897b8014SJeff Bailey   ASSERT_FALSE(Tmp.find_first_of('c', 0) == 1);
200897b8014SJeff Bailey   ASSERT_FALSE(Tmp.find_first_of('c', 1) == 1);
201897b8014SJeff Bailey }
202*f8322d13SSiva Chandra Reddy 
TEST(LlvmLibcStringViewTest,FindLastOf)203*f8322d13SSiva Chandra Reddy TEST(LlvmLibcStringViewTest, FindLastOf) {
204*f8322d13SSiva Chandra Reddy   StringView Tmp("abada");
205*f8322d13SSiva Chandra Reddy 
206*f8322d13SSiva Chandra Reddy   ASSERT_EQ(Tmp.find_last_of('a'), size_t(4));
207*f8322d13SSiva Chandra Reddy   ASSERT_EQ(Tmp.find_last_of('a', 123), size_t(4));
208*f8322d13SSiva Chandra Reddy   ASSERT_EQ(Tmp.find_last_of('a', 5), size_t(4));
209*f8322d13SSiva Chandra Reddy   ASSERT_EQ(Tmp.find_last_of('a', 4), size_t(4));
210*f8322d13SSiva Chandra Reddy   ASSERT_EQ(Tmp.find_last_of('a', 3), size_t(2));
211*f8322d13SSiva Chandra Reddy   ASSERT_EQ(Tmp.find_last_of('a', 2), size_t(2));
212*f8322d13SSiva Chandra Reddy   ASSERT_EQ(Tmp.find_last_of('a', 1), size_t(0));
213*f8322d13SSiva Chandra Reddy   ASSERT_EQ(Tmp.find_last_of('a', 0), size_t(0));
214*f8322d13SSiva Chandra Reddy 
215*f8322d13SSiva Chandra Reddy   ASSERT_EQ(Tmp.find_last_of('b'), size_t(1));
216*f8322d13SSiva Chandra Reddy   ASSERT_EQ(Tmp.find_last_of('b', 123), size_t(1));
217*f8322d13SSiva Chandra Reddy   ASSERT_EQ(Tmp.find_last_of('b', 5), size_t(1));
218*f8322d13SSiva Chandra Reddy   ASSERT_EQ(Tmp.find_last_of('b', 4), size_t(1));
219*f8322d13SSiva Chandra Reddy   ASSERT_EQ(Tmp.find_last_of('b', 3), size_t(1));
220*f8322d13SSiva Chandra Reddy   ASSERT_EQ(Tmp.find_last_of('b', 2), size_t(1));
221*f8322d13SSiva Chandra Reddy   ASSERT_EQ(Tmp.find_last_of('b', 1), size_t(1));
222*f8322d13SSiva Chandra Reddy   ASSERT_EQ(Tmp.find_last_of('b', 0), StringView::npos);
223*f8322d13SSiva Chandra Reddy 
224*f8322d13SSiva Chandra Reddy   ASSERT_EQ(Tmp.find_last_of('d'), size_t(3));
225*f8322d13SSiva Chandra Reddy   ASSERT_EQ(Tmp.find_last_of('d', 123), size_t(3));
226*f8322d13SSiva Chandra Reddy   ASSERT_EQ(Tmp.find_last_of('d', 5), size_t(3));
227*f8322d13SSiva Chandra Reddy   ASSERT_EQ(Tmp.find_last_of('d', 4), size_t(3));
228*f8322d13SSiva Chandra Reddy   ASSERT_EQ(Tmp.find_last_of('d', 3), size_t(3));
229*f8322d13SSiva Chandra Reddy   ASSERT_EQ(Tmp.find_last_of('d', 2), StringView::npos);
230*f8322d13SSiva Chandra Reddy   ASSERT_EQ(Tmp.find_last_of('d', 1), StringView::npos);
231*f8322d13SSiva Chandra Reddy   ASSERT_EQ(Tmp.find_last_of('d', 0), StringView::npos);
232*f8322d13SSiva Chandra Reddy 
233*f8322d13SSiva Chandra Reddy   ASSERT_EQ(Tmp.find_last_of('e'), StringView::npos);
234*f8322d13SSiva Chandra Reddy   ASSERT_EQ(Tmp.find_last_of('e', 123), StringView::npos);
235*f8322d13SSiva Chandra Reddy   ASSERT_EQ(Tmp.find_last_of('e', 5), StringView::npos);
236*f8322d13SSiva Chandra Reddy   ASSERT_EQ(Tmp.find_last_of('e', 4), StringView::npos);
237*f8322d13SSiva Chandra Reddy   ASSERT_EQ(Tmp.find_last_of('e', 3), StringView::npos);
238*f8322d13SSiva Chandra Reddy   ASSERT_EQ(Tmp.find_last_of('e', 2), StringView::npos);
239*f8322d13SSiva Chandra Reddy   ASSERT_EQ(Tmp.find_last_of('e', 1), StringView::npos);
240*f8322d13SSiva Chandra Reddy   ASSERT_EQ(Tmp.find_last_of('e', 0), StringView::npos);
241*f8322d13SSiva Chandra Reddy 
242*f8322d13SSiva Chandra Reddy   StringView Empty;
243*f8322d13SSiva Chandra Reddy   ASSERT_EQ(Empty.find_last_of('a'), StringView::npos);
244*f8322d13SSiva Chandra Reddy   ASSERT_EQ(Empty.find_last_of('a', 0), StringView::npos);
245*f8322d13SSiva Chandra Reddy   ASSERT_EQ(Empty.find_last_of('a', 123), StringView::npos);
246*f8322d13SSiva Chandra Reddy 
247*f8322d13SSiva Chandra Reddy   StringView Empty1("");
248*f8322d13SSiva Chandra Reddy   ASSERT_EQ(Empty1.find_last_of('a'), StringView::npos);
249*f8322d13SSiva Chandra Reddy   ASSERT_EQ(Empty1.find_last_of('a', 0), StringView::npos);
250*f8322d13SSiva Chandra Reddy   ASSERT_EQ(Empty1.find_last_of('a', 123), StringView::npos);
251*f8322d13SSiva Chandra Reddy }
252