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