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