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 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 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 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 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 161 bool isDigit(char c) { return c >= '0' && c <= '9'; } 162 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 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 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 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 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