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(StringView("a")));
53   ASSERT_TRUE(v.starts_with(StringView("ab")));
54   ASSERT_TRUE(v.starts_with(StringView("abc")));
55   ASSERT_TRUE(v.starts_with(StringView()));
56   ASSERT_TRUE(v.starts_with(StringView("")));
57   ASSERT_FALSE(v.starts_with(StringView("123")));
58   ASSERT_FALSE(v.starts_with(StringView("abd")));
59   ASSERT_FALSE(v.starts_with(StringView("aaa")));
60   ASSERT_FALSE(v.starts_with(StringView("abcde")));
61 }
62 
63 TEST(LlvmLibcStringViewTest, RemovePrefix) {
64   StringView v("123456789");
65 
66   auto p = v.remove_prefix(0);
67   ASSERT_EQ(p.size(), size_t(9));
68   ASSERT_TRUE(p.equals(StringView("123456789")));
69 
70   p = v.remove_prefix(4);
71   ASSERT_EQ(p.size(), size_t(5));
72   ASSERT_TRUE(p.equals(StringView("56789")));
73 
74   p = v.remove_prefix(9);
75   ASSERT_EQ(p.size(), size_t(0));
76   ASSERT_TRUE(p.data() == nullptr);
77 
78   p = v.remove_prefix(10);
79   ASSERT_EQ(p.size(), size_t(0));
80   ASSERT_TRUE(p.data() == nullptr);
81 }
82 
83 TEST(LlvmLibcStringViewTest, RemoveSuffix) {
84   StringView v("123456789");
85 
86   auto p = v.remove_suffix(0);
87   ASSERT_EQ(p.size(), size_t(9));
88   ASSERT_TRUE(p.equals(StringView("123456789")));
89 
90   p = v.remove_suffix(4);
91   ASSERT_EQ(p.size(), size_t(5));
92   ASSERT_TRUE(p.equals(StringView("12345")));
93 
94   p = v.remove_suffix(9);
95   ASSERT_EQ(p.size(), size_t(0));
96   ASSERT_TRUE(p.data() == nullptr);
97 
98   p = v.remove_suffix(10);
99   ASSERT_EQ(p.size(), size_t(0));
100   ASSERT_TRUE(p.data() == nullptr);
101 }
102 
103 TEST(LlvmLibcStringViewTest, TrimSingleChar) {
104   StringView v("     123456789   ");
105   auto t = v.trim(' ');
106   ASSERT_EQ(t.size(), size_t(9));
107   ASSERT_TRUE(t.equals(StringView("123456789")));
108 
109   v = StringView("====12345==");
110   t = v.trim(' ');
111   ASSERT_EQ(v.size(), size_t(11));
112   ASSERT_TRUE(t.equals(StringView("====12345==")));
113 
114   t = v.trim('=');
115   ASSERT_EQ(t.size(), size_t(5));
116   ASSERT_TRUE(t.equals(StringView("12345")));
117 
118   v = StringView("12345===");
119   t = v.trim('=');
120   ASSERT_EQ(t.size(), size_t(5));
121   ASSERT_TRUE(t.equals(StringView("12345")));
122 
123   v = StringView("===========12345");
124   t = v.trim('=');
125   ASSERT_EQ(t.size(), size_t(5));
126   ASSERT_TRUE(t.equals(StringView("12345")));
127 
128   v = StringView("============");
129   t = v.trim('=');
130   ASSERT_EQ(t.size(), size_t(0));
131   ASSERT_TRUE(t.data() == nullptr);
132 
133   v = StringView();
134   t = v.trim(' ');
135   ASSERT_EQ(t.size(), size_t(0));
136   ASSERT_TRUE(t.data() == nullptr);
137 
138   v = StringView("");
139   t = v.trim(' ');
140   ASSERT_EQ(t.size(), size_t(0));
141   ASSERT_TRUE(t.data() == nullptr);
142 }
143 
144 TEST(LlvmLibcStringViewTest, Observer) {
145   StringView ABC("abc");
146   ASSERT_EQ(ABC.size(), size_t(3));
147   ASSERT_FALSE(ABC.empty());
148   ASSERT_EQ(ABC.front(), 'a');
149   ASSERT_EQ(ABC.back(), 'c');
150 }
151 
152 bool isDigit(char c) { return c >= '0' && c <= '9'; }
153 
154 TEST(LlvmLibcStringViewTest, Transform) {
155   ASSERT_TRUE(StringView("123abc").drop_back(3).equals("123"));
156   ASSERT_TRUE(StringView("123abc").drop_front(3).equals("abc"));
157   ASSERT_TRUE(StringView("123abc").take_back(3).equals("abc"));
158   ASSERT_TRUE(StringView("123abc").take_front(3).equals("123"));
159 
160   ASSERT_TRUE(StringView("123abc").take_while(&isDigit).equals("123"));
161   ASSERT_TRUE(StringView("abc123").take_until(&isDigit).equals("abc"));
162   ASSERT_TRUE(StringView("123abc").drop_while(&isDigit).equals("abc"));
163   ASSERT_TRUE(StringView("abc123").drop_until(&isDigit).equals("123"));
164 }
165 
166 TEST(LlvmLibcStringViewTest, ConsumeFront) {
167   StringView Tmp("abc");
168   ASSERT_FALSE(Tmp.consume_front("###"));
169   ASSERT_TRUE(Tmp.consume_front("ab"));
170   ASSERT_TRUE(Tmp.equals("c"));
171 }
172 
173 TEST(LlvmLibcStringViewTest, ConsumeBack) {
174   StringView Tmp("abc");
175   ASSERT_FALSE(Tmp.consume_back("###"));
176   ASSERT_TRUE(Tmp.consume_back("bc"));
177   ASSERT_TRUE(Tmp.equals("a"));
178 }
179