1 //===-- StringListTest.cpp ---------------------------------------*- C++ -*-===//
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 "lldb/Utility/StringList.h"
11 #include "lldb/Utility/StreamString.h"
12 #include "gtest/gtest.h"
13 
14 using namespace lldb_private;
15 
16 TEST(StringListTest, DefaultConstructor) {
17   StringList s;
18   EXPECT_EQ(0U, s.GetSize());
19 }
20 
21 TEST(StringListTest, Assignment) {
22   StringList orig;
23   orig.AppendString("foo");
24   orig.AppendString("bar");
25 
26   StringList s = orig;
27 
28   ASSERT_EQ(2U, s.GetSize());
29   EXPECT_STREQ("foo", s.GetStringAtIndex(0));
30   EXPECT_STREQ("bar", s.GetStringAtIndex(1));
31 
32   ASSERT_EQ(2U, orig.GetSize());
33   EXPECT_STREQ("foo", orig.GetStringAtIndex(0));
34   EXPECT_STREQ("bar", orig.GetStringAtIndex(1));
35 }
36 
37 TEST(StringListTest, AppendStringStdString) {
38   StringList s;
39   s.AppendString("foo");
40   ASSERT_EQ(1U, s.GetSize());
41   EXPECT_STREQ("foo", s.GetStringAtIndex(0));
42 
43   s.AppendString("bar");
44   ASSERT_EQ(2U, s.GetSize());
45   EXPECT_STREQ("foo", s.GetStringAtIndex(0));
46   EXPECT_STREQ("bar", s.GetStringAtIndex(1));
47 }
48 
49 TEST(StringListTest, AppendStringCString) {
50   StringList s;
51   s.AppendString("foo", strlen("foo"));
52   ASSERT_EQ(1U, s.GetSize());
53   EXPECT_STREQ("foo", s.GetStringAtIndex(0));
54 
55   s.AppendString("bar", strlen("bar"));
56   ASSERT_EQ(2U, s.GetSize());
57   EXPECT_STREQ("foo", s.GetStringAtIndex(0));
58   EXPECT_STREQ("bar", s.GetStringAtIndex(1));
59 }
60 
61 TEST(StringListTest, AppendStringMove) {
62   StringList s;
63   std::string foo = "foo";
64   std::string bar = "bar";
65 
66   s.AppendString(std::move(foo));
67   ASSERT_EQ(1U, s.GetSize());
68   EXPECT_STREQ("foo", s.GetStringAtIndex(0));
69 
70   s.AppendString(std::move(bar));
71   ASSERT_EQ(2U, s.GetSize());
72   EXPECT_STREQ("foo", s.GetStringAtIndex(0));
73   EXPECT_STREQ("bar", s.GetStringAtIndex(1));
74 }
75 
76 TEST(StringListTest, ShiftStdString) {
77   StringList s;
78   std::string foo = "foo";
79   std::string bar = "bar";
80 
81   s << foo;
82   ASSERT_EQ(1U, s.GetSize());
83   EXPECT_STREQ("foo", s.GetStringAtIndex(0));
84 
85   s << bar;
86   ASSERT_EQ(2U, s.GetSize());
87   EXPECT_STREQ("foo", s.GetStringAtIndex(0));
88   EXPECT_STREQ("bar", s.GetStringAtIndex(1));
89 }
90 
91 TEST(StringListTest, ShiftCString) {
92   StringList s;
93   s << "foo";
94   ASSERT_EQ(1U, s.GetSize());
95   EXPECT_STREQ("foo", s.GetStringAtIndex(0));
96 
97   s << "bar";
98   ASSERT_EQ(2U, s.GetSize());
99   EXPECT_STREQ("foo", s.GetStringAtIndex(0));
100   EXPECT_STREQ("bar", s.GetStringAtIndex(1));
101 }
102 
103 TEST(StringListTest, ShiftMove) {
104   StringList s;
105   std::string foo = "foo";
106   std::string bar = "bar";
107 
108   s << std::move(foo);
109   ASSERT_EQ(1U, s.GetSize());
110   EXPECT_STREQ("foo", s.GetStringAtIndex(0));
111 
112   s << std::move(bar);
113   ASSERT_EQ(2U, s.GetSize());
114   EXPECT_STREQ("foo", s.GetStringAtIndex(0));
115   EXPECT_STREQ("bar", s.GetStringAtIndex(1));
116 }
117 
118 TEST(StringListTest, AppendListCStringArrayEmpty) {
119   StringList s;
120   s.AppendList(nullptr, 0);
121   EXPECT_EQ(0U, s.GetSize());
122 }
123 
124 TEST(StringListTest, AppendListCStringArray) {
125   StringList s;
126   const char *items[3] = {"foo", "", "bar"};
127   s.AppendList(items, 3);
128 
129   EXPECT_EQ(3U, s.GetSize());
130   EXPECT_STREQ("foo", s.GetStringAtIndex(0));
131   EXPECT_STREQ("", s.GetStringAtIndex(1));
132   EXPECT_STREQ("bar", s.GetStringAtIndex(2));
133 }
134 
135 TEST(StringListTest, AppendList) {
136   StringList other;
137   other.AppendString("foo");
138   other.AppendString("");
139   other.AppendString("bar");
140 
141   StringList empty;
142 
143   StringList s;
144   s.AppendList(other);
145 
146   EXPECT_EQ(3U, s.GetSize());
147   EXPECT_STREQ("foo", s.GetStringAtIndex(0));
148   EXPECT_STREQ("", s.GetStringAtIndex(1));
149   EXPECT_STREQ("bar", s.GetStringAtIndex(2));
150 
151   EXPECT_EQ(3U, other.GetSize());
152   EXPECT_STREQ("foo", other.GetStringAtIndex(0));
153   EXPECT_STREQ("", other.GetStringAtIndex(1));
154   EXPECT_STREQ("bar", other.GetStringAtIndex(2));
155 
156   s.AppendList(empty);
157   s.AppendList(other);
158   EXPECT_EQ(6U, s.GetSize());
159   EXPECT_STREQ("foo", s.GetStringAtIndex(0));
160   EXPECT_STREQ("", s.GetStringAtIndex(1));
161   EXPECT_STREQ("bar", s.GetStringAtIndex(2));
162   EXPECT_STREQ("foo", s.GetStringAtIndex(3));
163   EXPECT_STREQ("", s.GetStringAtIndex(4));
164   EXPECT_STREQ("bar", s.GetStringAtIndex(5));
165 
166   EXPECT_EQ(3U, other.GetSize());
167   EXPECT_STREQ("foo", other.GetStringAtIndex(0));
168   EXPECT_STREQ("", other.GetStringAtIndex(1));
169   EXPECT_STREQ("bar", other.GetStringAtIndex(2));
170 }
171 
172 TEST(StringListTest, GetSize) {
173   StringList s;
174   s.AppendString("foo");
175   EXPECT_EQ(1U, s.GetSize());
176 
177   s.AppendString("foo");
178   EXPECT_EQ(2U, s.GetSize());
179 
180   s.AppendString("foobar");
181   EXPECT_EQ(3U, s.GetSize());
182 }
183 
184 TEST(StringListTest, SetSize) {
185   StringList s;
186   s.SetSize(3);
187   EXPECT_EQ(3U, s.GetSize());
188   EXPECT_STREQ("", s.GetStringAtIndex(0));
189   EXPECT_STREQ("", s.GetStringAtIndex(1));
190   EXPECT_STREQ("", s.GetStringAtIndex(2));
191 }
192 
193 TEST(StringListTest, SplitIntoLines) {
194   StringList s;
195   s.SplitIntoLines("\nfoo\nbar\n\n");
196   EXPECT_EQ(4U, s.GetSize());
197   EXPECT_STREQ("", s.GetStringAtIndex(0));
198   EXPECT_STREQ("foo", s.GetStringAtIndex(1));
199   EXPECT_STREQ("bar", s.GetStringAtIndex(2));
200   EXPECT_STREQ("", s.GetStringAtIndex(3));
201 }
202 
203 TEST(StringListTest, SplitIntoLinesSingleTrailingCR) {
204   StringList s;
205   s.SplitIntoLines("\r");
206   EXPECT_EQ(1U, s.GetSize());
207   EXPECT_STREQ("", s.GetStringAtIndex(0));
208 }
209 
210 TEST(StringListTest, SplitIntoLinesEmpty) {
211   StringList s;
212   s.SplitIntoLines("");
213   EXPECT_EQ(0U, s.GetSize());
214 }
215 
216 TEST(StringListTest, LongestCommonPrefixEmpty) {
217   StringList s;
218   std::string prefix = "this should be cleared";
219   s.LongestCommonPrefix(prefix);
220   EXPECT_EQ("", prefix);
221 }
222 
223 TEST(StringListTest, LongestCommonPrefix) {
224   StringList s;
225   s.AppendString("foo");
226   s.AppendString("foobar");
227   s.AppendString("foo");
228   s.AppendString("foozar");
229 
230   std::string prefix = "this should be cleared";
231   s.LongestCommonPrefix(prefix);
232   EXPECT_EQ("foo", prefix);
233 }
234 
235 TEST(StringListTest, LongestCommonPrefixSingleElement) {
236   StringList s;
237   s.AppendString("foo");
238 
239   std::string prefix = "this should be cleared";
240   s.LongestCommonPrefix(prefix);
241   EXPECT_EQ("foo", prefix);
242 }
243 
244 TEST(StringListTest, LongestCommonPrefixDuplicateElement) {
245   StringList s;
246   s.AppendString("foo");
247   s.AppendString("foo");
248 
249   std::string prefix = "this should be cleared";
250   s.LongestCommonPrefix(prefix);
251   EXPECT_EQ("foo", prefix);
252 }
253 
254 TEST(StringListTest, LongestCommonPrefixNoPrefix) {
255   StringList s;
256   s.AppendString("foo");
257   s.AppendString("1foobar");
258   s.AppendString("2foo");
259   s.AppendString("3foozar");
260 
261   std::string prefix = "this should be cleared";
262   s.LongestCommonPrefix(prefix);
263   EXPECT_EQ("", prefix);
264 }
265 
266 TEST(StringListTest, Clear) {
267   StringList s;
268   s.Clear();
269   EXPECT_EQ(0U, s.GetSize());
270 
271   s.AppendString("foo");
272   s.Clear();
273   EXPECT_EQ(0U, s.GetSize());
274 
275   s.AppendString("foo");
276   s.AppendString("foo");
277   s.Clear();
278   EXPECT_EQ(0U, s.GetSize());
279 }
280 
281 TEST(StringListTest, PopBack) {
282   StringList s;
283   s.AppendString("foo");
284   s.AppendString("bar");
285   s.AppendString("boo");
286 
287   s.PopBack();
288   EXPECT_EQ(2U, s.GetSize());
289   EXPECT_STREQ("foo", s.GetStringAtIndex(0));
290   EXPECT_STREQ("bar", s.GetStringAtIndex(1));
291 
292   s.PopBack();
293   EXPECT_EQ(1U, s.GetSize());
294   EXPECT_STREQ("foo", s.GetStringAtIndex(0));
295 
296   s.PopBack();
297   EXPECT_EQ(0U, s.GetSize());
298 }
299 
300 TEST(StringListTest, RemoveBlankLines) {
301   StringList s;
302 
303   // Nothing to remove yet.
304   s.RemoveBlankLines();
305   EXPECT_EQ(0U, s.GetSize());
306 
307   // Add some lines.
308   s.AppendString("");
309   s.AppendString("");
310   s.AppendString("\t");
311   s.AppendString("");
312   s.AppendString(" ");
313   s.AppendString("");
314   s.AppendString("");
315   s.AppendString("f");
316   s.AppendString("");
317   s.AppendString("");
318 
319   // And remove all the empty ones again.
320   s.RemoveBlankLines();
321 
322   EXPECT_EQ(3U, s.GetSize());
323   EXPECT_STREQ("\t", s.GetStringAtIndex(0));
324   EXPECT_STREQ(" ", s.GetStringAtIndex(1));
325   EXPECT_STREQ("f", s.GetStringAtIndex(2));
326 }
327 
328 TEST(StringListTest, InsertStringAtIndexStart) {
329   StringList s;
330 
331   s.InsertStringAtIndex(0, "bar");
332   EXPECT_EQ(1U, s.GetSize());
333   EXPECT_STREQ("bar", s.GetStringAtIndex(0));
334 
335   s.InsertStringAtIndex(0, "foo");
336   EXPECT_EQ(2U, s.GetSize());
337   EXPECT_STREQ("foo", s.GetStringAtIndex(0));
338   EXPECT_STREQ("bar", s.GetStringAtIndex(1));
339 }
340 
341 TEST(StringListTest, InsertStringAtIndexEnd) {
342   StringList s;
343 
344   s.InsertStringAtIndex(0, "foo");
345   EXPECT_EQ(1U, s.GetSize());
346   EXPECT_STREQ("foo", s.GetStringAtIndex(0));
347 
348   s.InsertStringAtIndex(1, "bar");
349   EXPECT_EQ(2U, s.GetSize());
350   EXPECT_STREQ("foo", s.GetStringAtIndex(0));
351   EXPECT_STREQ("bar", s.GetStringAtIndex(1));
352 }
353 
354 TEST(StringListTest, InsertStringAtIndexOutOfBounds) {
355   StringList s;
356 
357   s.InsertStringAtIndex(1, "foo");
358   EXPECT_EQ(1U, s.GetSize());
359   EXPECT_STREQ("foo", s.GetStringAtIndex(0));
360 
361   // FIXME: Inserting at an OOB index will always just append to the list. This
362   // seems not very intuitive.
363   s.InsertStringAtIndex(3, "bar");
364   EXPECT_EQ(2U, s.GetSize());
365   EXPECT_STREQ("foo", s.GetStringAtIndex(0));
366   EXPECT_STREQ("bar", s.GetStringAtIndex(1));
367 }
368 
369 TEST(StringListTest, InsertStringAtIndexStdString) {
370   StringList s;
371 
372   std::string foo = "foo";
373   s.InsertStringAtIndex(0, foo);
374   EXPECT_EQ(1U, s.GetSize());
375   EXPECT_STREQ("foo", s.GetStringAtIndex(0));
376 }
377 
378 TEST(StringListTest, InsertStringAtIndexMove) {
379   StringList s;
380 
381   std::string foo = "foo";
382   s.InsertStringAtIndex(0, std::move(foo));
383   EXPECT_EQ(1U, s.GetSize());
384   EXPECT_STREQ("foo", s.GetStringAtIndex(0));
385 }
386 
387 TEST(StringListTest, CopyListEmpty) {
388   StringList s;
389 
390   EXPECT_EQ("", s.CopyList());
391   EXPECT_EQ("", s.CopyList("+"));
392 }
393 
394 TEST(StringListTest, CopyListSingle) {
395   StringList s;
396   s.AppendString("ab");
397 
398   EXPECT_EQ("ab", s.CopyList());
399   EXPECT_EQ("-ab", s.CopyList("-"));
400 }
401 
402 TEST(StringListTest, CopyList) {
403   StringList s;
404   s.AppendString("ab");
405   s.AppendString("cd");
406 
407   EXPECT_EQ("ab\ncd", s.CopyList());
408   EXPECT_EQ("-ab\n-cd", s.CopyList("-"));
409 }
410 
411 TEST(StringListTest, Join) {
412   StringList s;
413   s.AppendString("ab");
414   s.AppendString("cd");
415 
416   StreamString ss;
417   s.Join(" ", ss);
418 
419   EXPECT_EQ("ab cd", ss.GetString());
420 }
421 
422 TEST(StringListTest, JoinEmpty) {
423   StringList s;
424 
425   StreamString ss;
426   s.Join(" ", ss);
427 
428   EXPECT_EQ("", ss.GetString());
429 }
430 
431 TEST(StringListTest, JoinSingle) {
432   StringList s;
433   s.AppendString("foo");
434 
435   StreamString ss;
436   s.Join(" ", ss);
437 
438   EXPECT_EQ("foo", ss.GetString());
439 }
440 
441 TEST(StringListTest, JoinThree) {
442   StringList s;
443   s.AppendString("1");
444   s.AppendString("2");
445   s.AppendString("3");
446 
447   StreamString ss;
448   s.Join(" ", ss);
449 
450   EXPECT_EQ("1 2 3", ss.GetString());
451 }
452 
453 TEST(StringListTest, JoinNonSpace) {
454   StringList s;
455   s.AppendString("1");
456   s.AppendString("2");
457   s.AppendString("3");
458 
459   StreamString ss;
460   s.Join(".", ss);
461 
462   EXPECT_EQ("1.2.3", ss.GetString());
463 }
464 
465 TEST(StringListTest, JoinMultiCharSeparator) {
466   StringList s;
467   s.AppendString("1");
468   s.AppendString("2");
469   s.AppendString("3");
470 
471   StreamString ss;
472   s.Join("--", ss);
473 
474   EXPECT_EQ("1--2--3", ss.GetString());
475 }
476 
477 TEST(StringListTest, GetMaxStringLengthEqualSize) {
478   StringList s;
479   s.AppendString("123");
480   s.AppendString("123");
481   EXPECT_EQ(3U, s.GetMaxStringLength());
482 }
483 
484 TEST(StringListTest, GetMaxStringLengthIncreasingSize) {
485   StringList s;
486   s.AppendString("123");
487   s.AppendString("1234");
488   EXPECT_EQ(4U, s.GetMaxStringLength());
489 }
490 
491 TEST(StringListTest, GetMaxStringLengthDecreasingSize) {
492   StringList s;
493   s.AppendString("1234");
494   s.AppendString("123");
495   EXPECT_EQ(4U, s.GetMaxStringLength());
496 }
497 
498 TEST(StringListTest, GetMaxStringLengthMixed) {
499   StringList s;
500   s.AppendString("123");
501   s.AppendString("1");
502   s.AppendString("123");
503   s.AppendString("1234");
504   s.AppendString("123");
505   s.AppendString("1");
506   EXPECT_EQ(4U, s.GetMaxStringLength());
507 }
508 
509 TEST(StringListTest, GetMaxStringLengthEmpty) {
510   StringList s;
511   EXPECT_EQ(0U, s.GetMaxStringLength());
512 }
513