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 
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 
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 
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 
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 
80 TEST(LlvmLibcStringViewTest, RemovePrefix) {
81   StringView v("123456789");
82 
83   auto p = v.remove_prefix(0);
84   ASSERT_EQ(p.size(), size_t(9));
85   ASSERT_TRUE(p.equals(StringView("123456789")));
86 
87   p = v.remove_prefix(4);
88   ASSERT_EQ(p.size(), size_t(5));
89   ASSERT_TRUE(p.equals(StringView("56789")));
90 
91   p = v.remove_prefix(9);
92   ASSERT_EQ(p.size(), size_t(0));
93   ASSERT_TRUE(p.data() == nullptr);
94 
95   p = v.remove_prefix(10);
96   ASSERT_EQ(p.size(), size_t(0));
97   ASSERT_TRUE(p.data() == nullptr);
98 }
99 
100 TEST(LlvmLibcStringViewTest, RemoveSuffix) {
101   StringView v("123456789");
102 
103   auto p = v.remove_suffix(0);
104   ASSERT_EQ(p.size(), size_t(9));
105   ASSERT_TRUE(p.equals(StringView("123456789")));
106 
107   p = v.remove_suffix(4);
108   ASSERT_EQ(p.size(), size_t(5));
109   ASSERT_TRUE(p.equals(StringView("12345")));
110 
111   p = v.remove_suffix(9);
112   ASSERT_EQ(p.size(), size_t(0));
113   ASSERT_TRUE(p.data() == nullptr);
114 
115   p = v.remove_suffix(10);
116   ASSERT_EQ(p.size(), size_t(0));
117   ASSERT_TRUE(p.data() == nullptr);
118 }
119 
120 TEST(LlvmLibcStringViewTest, TrimSingleChar) {
121   StringView v("     123456789   ");
122   auto t = v.trim(' ');
123   ASSERT_EQ(t.size(), size_t(9));
124   ASSERT_TRUE(t.equals(StringView("123456789")));
125 
126   v = StringView("====12345==");
127   t = v.trim(' ');
128   ASSERT_EQ(v.size(), size_t(11));
129   ASSERT_TRUE(t.equals(StringView("====12345==")));
130 
131   t = v.trim('=');
132   ASSERT_EQ(t.size(), size_t(5));
133   ASSERT_TRUE(t.equals(StringView("12345")));
134 
135   v = StringView("12345===");
136   t = v.trim('=');
137   ASSERT_EQ(t.size(), size_t(5));
138   ASSERT_TRUE(t.equals(StringView("12345")));
139 
140   v = StringView("===========12345");
141   t = v.trim('=');
142   ASSERT_EQ(t.size(), size_t(5));
143   ASSERT_TRUE(t.equals(StringView("12345")));
144 
145   v = StringView("============");
146   t = v.trim('=');
147   ASSERT_EQ(t.size(), size_t(0));
148   ASSERT_TRUE(t.data() == nullptr);
149 
150   v = StringView();
151   t = v.trim(' ');
152   ASSERT_EQ(t.size(), size_t(0));
153   ASSERT_TRUE(t.data() == nullptr);
154 
155   v = StringView("");
156   t = v.trim(' ');
157   ASSERT_EQ(t.size(), size_t(0));
158   ASSERT_TRUE(t.data() == nullptr);
159 }
160 
161 TEST(LlvmLibcStringViewTest, Observer) {
162   StringView ABC("abc");
163   ASSERT_EQ(ABC.size(), size_t(3));
164   ASSERT_FALSE(ABC.empty());
165   ASSERT_EQ(ABC.front(), 'a');
166   ASSERT_EQ(ABC.back(), 'c');
167 }
168 
169 bool isDigit(char c) { return c >= '0' && c <= '9'; }
170 
171 TEST(LlvmLibcStringViewTest, Transform) {
172   ASSERT_TRUE(StringView("123abc").drop_back(3).equals("123"));
173   ASSERT_TRUE(StringView("123abc").drop_front(3).equals("abc"));
174   ASSERT_TRUE(StringView("123abc").take_back(3).equals("abc"));
175   ASSERT_TRUE(StringView("123abc").take_front(3).equals("123"));
176 
177   ASSERT_TRUE(StringView("123abc").take_while(&isDigit).equals("123"));
178   ASSERT_TRUE(StringView("abc123").take_until(&isDigit).equals("abc"));
179   ASSERT_TRUE(StringView("123abc").drop_while(&isDigit).equals("abc"));
180   ASSERT_TRUE(StringView("abc123").drop_until(&isDigit).equals("123"));
181 }
182 
183 TEST(LlvmLibcStringViewTest, ConsumeFront) {
184   StringView Tmp("abc");
185   ASSERT_FALSE(Tmp.consume_front("###"));
186   ASSERT_TRUE(Tmp.consume_front("ab"));
187   ASSERT_TRUE(Tmp.equals("c"));
188 }
189 
190 TEST(LlvmLibcStringViewTest, ConsumeBack) {
191   StringView Tmp("abc");
192   ASSERT_FALSE(Tmp.consume_back("###"));
193   ASSERT_TRUE(Tmp.consume_back("bc"));
194   ASSERT_TRUE(Tmp.equals("a"));
195 }
196 
197 TEST(LlvmLibcStringViewTest, FindFirstOf) {
198   StringView Tmp("abca");
199   ASSERT_TRUE(Tmp.find_first_of('a') == 0);
200   ASSERT_TRUE(Tmp.find_first_of('d') == StringView::npos);
201   ASSERT_TRUE(Tmp.find_first_of('b') == 1);
202   ASSERT_TRUE(Tmp.find_first_of('a', 0) == 0);
203   ASSERT_TRUE(Tmp.find_first_of('b', 1) == 1);
204   ASSERT_TRUE(Tmp.find_first_of('a', 1) == 3);
205   ASSERT_TRUE(Tmp.find_first_of('a', 42) == StringView::npos);
206   ASSERT_FALSE(Tmp.find_first_of('c') == 1);
207   ASSERT_FALSE(Tmp.find_first_of('c', 0) == 1);
208   ASSERT_FALSE(Tmp.find_first_of('c', 1) == 1);
209 }
210