blob: 19665df88d54eb9d1e67ec85b439da7f3cbf2fc9 [file] [log] [blame]
Daniel Dunbar4cf95d72009-07-21 07:28:51 +00001//===- llvm/unittest/ADT/StringRefTest.cpp - StringRef unit tests ---------===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#include "gtest/gtest.h"
11#include "llvm/ADT/StringRef.h"
Rafael Espindolac78c0c92009-11-13 02:18:25 +000012#include "llvm/ADT/SmallVector.h"
Daniel Dunbardbe77cf2009-07-22 17:13:20 +000013#include "llvm/Support/raw_ostream.h"
Daniel Dunbar4cf95d72009-07-21 07:28:51 +000014using namespace llvm;
15
16namespace {
17
Daniel Dunbare6551282009-09-16 22:38:48 +000018std::ostream &operator<<(std::ostream &OS, const StringRef &S) {
19 OS << S;
20 return OS;
21}
22
23std::ostream &operator<<(std::ostream &OS,
24 const std::pair<StringRef, StringRef> &P) {
25 OS << "(" << P.first << ", " << P.second << ")";
26 return OS;
27}
28
Daniel Dunbar4cf95d72009-07-21 07:28:51 +000029TEST(StringRefTest, Construction) {
Daniel Dunbare6551282009-09-16 22:38:48 +000030 EXPECT_EQ("", StringRef());
31 EXPECT_EQ("hello", StringRef("hello"));
32 EXPECT_EQ("hello", StringRef("hello world", 5));
33 EXPECT_EQ("hello", StringRef(std::string("hello")));
Daniel Dunbar4cf95d72009-07-21 07:28:51 +000034}
35
36TEST(StringRefTest, Iteration) {
37 StringRef S("hello");
38 const char *p = "hello";
39 for (const char *it = S.begin(), *ie = S.end(); it != ie; ++it, ++p)
Daniel Dunbare6551282009-09-16 22:38:48 +000040 EXPECT_EQ(*it, *p);
Daniel Dunbar4cf95d72009-07-21 07:28:51 +000041}
42
43TEST(StringRefTest, StringOps) {
44 const char *p = "hello";
45 EXPECT_EQ(p, StringRef(p, 0).data());
46 EXPECT_TRUE(StringRef().empty());
47 EXPECT_EQ((size_t) 5, StringRef("hello").size());
48 EXPECT_EQ(-1, StringRef("aab").compare("aad"));
49 EXPECT_EQ( 0, StringRef("aab").compare("aab"));
50 EXPECT_EQ( 1, StringRef("aab").compare("aaa"));
51 EXPECT_EQ(-1, StringRef("aab").compare("aabb"));
52 EXPECT_EQ( 1, StringRef("aab").compare("aa"));
53}
54
55TEST(StringRefTest, Operators) {
Daniel Dunbare6551282009-09-16 22:38:48 +000056 EXPECT_EQ("", StringRef());
Daniel Dunbar4cf95d72009-07-21 07:28:51 +000057 EXPECT_TRUE(StringRef("aab") < StringRef("aad"));
58 EXPECT_FALSE(StringRef("aab") < StringRef("aab"));
59 EXPECT_TRUE(StringRef("aab") <= StringRef("aab"));
60 EXPECT_FALSE(StringRef("aab") <= StringRef("aaa"));
61 EXPECT_TRUE(StringRef("aad") > StringRef("aab"));
62 EXPECT_FALSE(StringRef("aab") > StringRef("aab"));
63 EXPECT_TRUE(StringRef("aab") >= StringRef("aab"));
64 EXPECT_FALSE(StringRef("aaa") >= StringRef("aab"));
Daniel Dunbare6551282009-09-16 22:38:48 +000065 EXPECT_EQ(StringRef("aab"), StringRef("aab"));
Daniel Dunbar4cf95d72009-07-21 07:28:51 +000066 EXPECT_FALSE(StringRef("aab") == StringRef("aac"));
67 EXPECT_FALSE(StringRef("aab") != StringRef("aab"));
68 EXPECT_TRUE(StringRef("aab") != StringRef("aac"));
69 EXPECT_EQ('a', StringRef("aab")[1]);
70}
71
Daniel Dunbare6551282009-09-16 22:38:48 +000072TEST(StringRefTest, Substr) {
Daniel Dunbarf5fdf732009-07-21 09:18:49 +000073 StringRef Str("hello");
Daniel Dunbare6551282009-09-16 22:38:48 +000074 EXPECT_EQ("lo", Str.substr(3));
75 EXPECT_EQ("", Str.substr(100));
76 EXPECT_EQ("hello", Str.substr(0, 100));
77 EXPECT_EQ("o", Str.substr(4, 10));
78}
Daniel Dunbarf5fdf732009-07-21 09:18:49 +000079
Daniel Dunbare6551282009-09-16 22:38:48 +000080TEST(StringRefTest, Slice) {
81 StringRef Str("hello");
82 EXPECT_EQ("l", Str.slice(2, 3));
83 EXPECT_EQ("ell", Str.slice(1, 4));
84 EXPECT_EQ("llo", Str.slice(2, 100));
85 EXPECT_EQ("", Str.slice(2, 1));
86 EXPECT_EQ("", Str.slice(10, 20));
87}
Daniel Dunbard61918f2009-07-26 03:18:15 +000088
Daniel Dunbare6551282009-09-16 22:38:48 +000089TEST(StringRefTest, Split) {
90 StringRef Str("hello");
91 EXPECT_EQ(std::make_pair(StringRef("hello"), StringRef("")),
92 Str.split('X'));
93 EXPECT_EQ(std::make_pair(StringRef("h"), StringRef("llo")),
94 Str.split('e'));
95 EXPECT_EQ(std::make_pair(StringRef(""), StringRef("ello")),
96 Str.split('h'));
97 EXPECT_EQ(std::make_pair(StringRef("he"), StringRef("lo")),
98 Str.split('l'));
99 EXPECT_EQ(std::make_pair(StringRef("hell"), StringRef("")),
100 Str.split('o'));
Daniel Dunbard61918f2009-07-26 03:18:15 +0000101
Daniel Dunbare6551282009-09-16 22:38:48 +0000102 EXPECT_EQ(std::make_pair(StringRef("hello"), StringRef("")),
103 Str.rsplit('X'));
104 EXPECT_EQ(std::make_pair(StringRef("h"), StringRef("llo")),
105 Str.rsplit('e'));
106 EXPECT_EQ(std::make_pair(StringRef(""), StringRef("ello")),
107 Str.rsplit('h'));
108 EXPECT_EQ(std::make_pair(StringRef("hel"), StringRef("o")),
109 Str.rsplit('l'));
110 EXPECT_EQ(std::make_pair(StringRef("hell"), StringRef("")),
111 Str.rsplit('o'));
112}
113
Rafael Espindola5ccac242009-11-13 01:24:40 +0000114TEST(StringRefTest, Split2) {
Rafael Espindolac78c0c92009-11-13 02:18:25 +0000115 SmallVector<StringRef, 5> parts;
116 SmallVector<StringRef, 5> expected;
Rafael Espindola5ccac242009-11-13 01:24:40 +0000117
118 expected.push_back("ab"); expected.push_back("c");
119 StringRef(",ab,,c,").split(parts, ",", -1, false);
120 EXPECT_TRUE(parts == expected);
121
122 expected.clear(); parts.clear();
123 expected.push_back(""); expected.push_back("ab"); expected.push_back("");
124 expected.push_back("c"); expected.push_back("");
125 StringRef(",ab,,c,").split(parts, ",", -1, true);
126 EXPECT_TRUE(parts == expected);
127
128 expected.clear(); parts.clear();
129 expected.push_back("");
130 StringRef("").split(parts, ",", -1, true);
131 EXPECT_TRUE(parts == expected);
132
133 expected.clear(); parts.clear();
134 StringRef("").split(parts, ",", -1, false);
135 EXPECT_TRUE(parts == expected);
136
137 expected.clear(); parts.clear();
138 StringRef(",").split(parts, ",", -1, false);
139 EXPECT_TRUE(parts == expected);
140
141 expected.clear(); parts.clear();
142 expected.push_back(""); expected.push_back("");
143 StringRef(",").split(parts, ",", -1, true);
144 EXPECT_TRUE(parts == expected);
145
Rafael Espindola20fd4ec2009-11-13 04:55:09 +0000146 expected.clear(); parts.clear();
147 expected.push_back("a"); expected.push_back("b");
148 StringRef("a,b").split(parts, ",", -1, true);
149 EXPECT_TRUE(parts == expected);
150
Rafael Espindola5ccac242009-11-13 01:24:40 +0000151 // Test MaxSplit
152 expected.clear(); parts.clear();
153 expected.push_back("a,,b,c");
154 StringRef("a,,b,c").split(parts, ",", 0, true);
155 EXPECT_TRUE(parts == expected);
156
157 expected.clear(); parts.clear();
158 expected.push_back("a,,b,c");
159 StringRef("a,,b,c").split(parts, ",", 0, false);
160 EXPECT_TRUE(parts == expected);
161
162 expected.clear(); parts.clear();
163 expected.push_back("a"); expected.push_back(",b,c");
164 StringRef("a,,b,c").split(parts, ",", 1, true);
165 EXPECT_TRUE(parts == expected);
166
167 expected.clear(); parts.clear();
168 expected.push_back("a"); expected.push_back(",b,c");
169 StringRef("a,,b,c").split(parts, ",", 1, false);
170 EXPECT_TRUE(parts == expected);
171
172 expected.clear(); parts.clear();
173 expected.push_back("a"); expected.push_back(""); expected.push_back("b,c");
174 StringRef("a,,b,c").split(parts, ",", 2, true);
175 EXPECT_TRUE(parts == expected);
176
177 expected.clear(); parts.clear();
178 expected.push_back("a"); expected.push_back("b,c");
179 StringRef("a,,b,c").split(parts, ",", 2, false);
180 EXPECT_TRUE(parts == expected);
181
182 expected.clear(); parts.clear();
183 expected.push_back("a"); expected.push_back(""); expected.push_back("b");
184 expected.push_back("c");
185 StringRef("a,,b,c").split(parts, ",", 3, true);
186 EXPECT_TRUE(parts == expected);
187
188 expected.clear(); parts.clear();
189 expected.push_back("a"); expected.push_back("b"); expected.push_back("c");
190 StringRef("a,,b,c").split(parts, ",", 3, false);
191 EXPECT_TRUE(parts == expected);
192}
193
Daniel Dunbare6551282009-09-16 22:38:48 +0000194TEST(StringRefTest, StartsWith) {
195 StringRef Str("hello");
Daniel Dunbarf5fdf732009-07-21 09:18:49 +0000196 EXPECT_TRUE(Str.startswith("he"));
197 EXPECT_FALSE(Str.startswith("helloworld"));
198 EXPECT_FALSE(Str.startswith("hi"));
Daniel Dunbare6551282009-09-16 22:38:48 +0000199}
Daniel Dunbardbe77cf2009-07-22 17:13:20 +0000200
Eli Friedmand5b1f8a2009-12-21 06:49:24 +0000201TEST(StringRefTest, EndsWith) {
202 StringRef Str("hello");
203 EXPECT_TRUE(Str.endswith("lo"));
204 EXPECT_FALSE(Str.endswith("helloworld"));
205 EXPECT_FALSE(Str.endswith("worldhello"));
206 EXPECT_FALSE(Str.endswith("so"));
207}
208
Daniel Dunbare6551282009-09-16 22:38:48 +0000209TEST(StringRefTest, Find) {
210 StringRef Str("hello");
211 EXPECT_EQ(2U, Str.find('l'));
212 EXPECT_EQ(StringRef::npos, Str.find('z'));
213 EXPECT_EQ(StringRef::npos, Str.find("helloworld"));
214 EXPECT_EQ(0U, Str.find("hello"));
215 EXPECT_EQ(1U, Str.find("ello"));
216 EXPECT_EQ(StringRef::npos, Str.find("zz"));
Daniel Dunbar64066bd2009-11-11 00:28:53 +0000217 EXPECT_EQ(2U, Str.find("ll", 2));
218 EXPECT_EQ(StringRef::npos, Str.find("ll", 3));
Daniel Dunbare6551282009-09-16 22:38:48 +0000219
220 EXPECT_EQ(3U, Str.rfind('l'));
221 EXPECT_EQ(StringRef::npos, Str.rfind('z'));
222 EXPECT_EQ(StringRef::npos, Str.rfind("helloworld"));
223 EXPECT_EQ(0U, Str.rfind("hello"));
224 EXPECT_EQ(1U, Str.rfind("ello"));
225 EXPECT_EQ(StringRef::npos, Str.rfind("zz"));
Daniel Dunbar64066bd2009-11-11 00:28:53 +0000226
227 EXPECT_EQ(2U, Str.find_first_of('l'));
228 EXPECT_EQ(1U, Str.find_first_of("el"));
229 EXPECT_EQ(StringRef::npos, Str.find_first_of("xyz"));
230
231 EXPECT_EQ(1U, Str.find_first_not_of('h'));
232 EXPECT_EQ(4U, Str.find_first_not_of("hel"));
233 EXPECT_EQ(StringRef::npos, Str.find_first_not_of("hello"));
Daniel Dunbare6551282009-09-16 22:38:48 +0000234}
235
236TEST(StringRefTest, Count) {
237 StringRef Str("hello");
238 EXPECT_EQ(2U, Str.count('l'));
239 EXPECT_EQ(1U, Str.count('o'));
240 EXPECT_EQ(0U, Str.count('z'));
241 EXPECT_EQ(0U, Str.count("helloworld"));
242 EXPECT_EQ(1U, Str.count("hello"));
243 EXPECT_EQ(1U, Str.count("ello"));
244 EXPECT_EQ(0U, Str.count("zz"));
245}
246
247TEST(StringRefTest, Misc) {
Daniel Dunbardbe77cf2009-07-22 17:13:20 +0000248 std::string Storage;
249 raw_string_ostream OS(Storage);
250 OS << StringRef("hello");
251 EXPECT_EQ("hello", OS.str());
Daniel Dunbarf5fdf732009-07-21 09:18:49 +0000252}
253
Daniel Dunbar4cf95d72009-07-21 07:28:51 +0000254} // end anonymous namespace