1 /*
2  *  Copyright (C) 2005-2018 Team Kodi
3  *  This file is part of Kodi - https://kodi.tv
4  *
5  *  SPDX-License-Identifier: GPL-2.0-or-later
6  *  See LICENSES/README.md for more information.
7  */
8 
9 #include "utils/StringUtils.h"
10 
11 #include <algorithm>
12 
13 #include <gtest/gtest.h>
14 enum class ECG
15 {
16   A,
17   B
18 };
19 
20 enum EG
21 {
22   C,
23   D
24 };
25 
26 namespace test_enum
27 {
28 enum class ECN
29 {
30   A = 1,
31   B
32 };
33 enum EN
34 {
35   C = 1,
36   D
37 };
38 }
TEST(TestStringUtils,Format)39 TEST(TestStringUtils, Format)
40 {
41   std::string refstr = "test 25 2.7 ff FF";
42 
43   std::string varstr =
44       StringUtils::Format("%s %d %.1f %x %02X", "test", 25, 2.743f, 0x00ff, 0x00ff);
45   EXPECT_STREQ(refstr.c_str(), varstr.c_str());
46 
47   varstr = StringUtils::Format("", "test", 25, 2.743f, 0x00ff, 0x00ff);
48   EXPECT_STREQ("", varstr.c_str());
49 }
50 
TEST(TestStringUtils,FormatEnum)51 TEST(TestStringUtils, FormatEnum)
52 {
53   const char* zero = "0";
54   const char* one = "1";
55 
56   std::string varstr = StringUtils::Format("{}", ECG::A);
57   EXPECT_STREQ(zero, varstr.c_str());
58 
59   varstr = StringUtils::Format("{}", EG::C);
60   EXPECT_STREQ(zero, varstr.c_str());
61 
62   varstr = StringUtils::Format("{}", test_enum::ECN::A);
63   EXPECT_STREQ(one, varstr.c_str());
64 
65   varstr = StringUtils::Format("{}", test_enum::EN::C);
66   EXPECT_STREQ(one, varstr.c_str());
67 }
68 
TEST(TestStringUtils,FormatEnumWidth)69 TEST(TestStringUtils, FormatEnumWidth)
70 {
71   const char* one = "01";
72 
73   std::string varstr = StringUtils::Format("{:02d}", ECG::B);
74   EXPECT_STREQ(one, varstr.c_str());
75 
76   varstr = StringUtils::Format("%02d", EG::D);
77   EXPECT_STREQ(one, varstr.c_str());
78 }
79 
TEST(TestStringUtils,ToUpper)80 TEST(TestStringUtils, ToUpper)
81 {
82   std::string refstr = "TEST";
83 
84   std::string varstr = "TeSt";
85   StringUtils::ToUpper(varstr);
86   EXPECT_STREQ(refstr.c_str(), varstr.c_str());
87 }
88 
TEST(TestStringUtils,ToLower)89 TEST(TestStringUtils, ToLower)
90 {
91   std::string refstr = "test";
92 
93   std::string varstr = "TeSt";
94   StringUtils::ToLower(varstr);
95   EXPECT_STREQ(refstr.c_str(), varstr.c_str());
96 }
97 
TEST(TestStringUtils,ToCapitalize)98 TEST(TestStringUtils, ToCapitalize)
99 {
100   std::string refstr = "Test";
101   std::string varstr = "test";
102   StringUtils::ToCapitalize(varstr);
103   EXPECT_STREQ(refstr.c_str(), varstr.c_str());
104 
105   refstr = "Just A Test";
106   varstr = "just a test";
107   StringUtils::ToCapitalize(varstr);
108   EXPECT_STREQ(refstr.c_str(), varstr.c_str());
109 
110   refstr = "Test -1;2:3, String For Case";
111   varstr = "test -1;2:3, string for Case";
112   StringUtils::ToCapitalize(varstr);
113   EXPECT_STREQ(refstr.c_str(), varstr.c_str());
114 
115   refstr = "  JuST Another\t\tTEst:\nWoRKs ";
116   varstr = "  juST another\t\ttEst:\nwoRKs ";
117   StringUtils::ToCapitalize(varstr);
118   EXPECT_STREQ(refstr.c_str(), varstr.c_str());
119 
120   refstr = "N.Y.P.D";
121   varstr = "n.y.p.d";
122   StringUtils::ToCapitalize(varstr);
123   EXPECT_STREQ(refstr.c_str(), varstr.c_str());
124 
125   refstr = "N-Y-P-D";
126   varstr = "n-y-p-d";
127   StringUtils::ToCapitalize(varstr);
128   EXPECT_STREQ(refstr.c_str(), varstr.c_str());
129 }
130 
TEST(TestStringUtils,EqualsNoCase)131 TEST(TestStringUtils, EqualsNoCase)
132 {
133   std::string refstr = "TeSt";
134 
135   EXPECT_TRUE(StringUtils::EqualsNoCase(refstr, "TeSt"));
136   EXPECT_TRUE(StringUtils::EqualsNoCase(refstr, "tEsT"));
137 }
138 
TEST(TestStringUtils,Left)139 TEST(TestStringUtils, Left)
140 {
141   std::string refstr, varstr;
142   std::string origstr = "test";
143 
144   refstr = "";
145   varstr = StringUtils::Left(origstr, 0);
146   EXPECT_STREQ(refstr.c_str(), varstr.c_str());
147 
148   refstr = "te";
149   varstr = StringUtils::Left(origstr, 2);
150   EXPECT_STREQ(refstr.c_str(), varstr.c_str());
151 
152   refstr = "test";
153   varstr = StringUtils::Left(origstr, 10);
154   EXPECT_STREQ(refstr.c_str(), varstr.c_str());
155 }
156 
TEST(TestStringUtils,Mid)157 TEST(TestStringUtils, Mid)
158 {
159   std::string refstr, varstr;
160   std::string origstr = "test";
161 
162   refstr = "";
163   varstr = StringUtils::Mid(origstr, 0, 0);
164   EXPECT_STREQ(refstr.c_str(), varstr.c_str());
165 
166   refstr = "te";
167   varstr = StringUtils::Mid(origstr, 0, 2);
168   EXPECT_STREQ(refstr.c_str(), varstr.c_str());
169 
170   refstr = "test";
171   varstr = StringUtils::Mid(origstr, 0, 10);
172   EXPECT_STREQ(refstr.c_str(), varstr.c_str());
173 
174   refstr = "st";
175   varstr = StringUtils::Mid(origstr, 2);
176   EXPECT_STREQ(refstr.c_str(), varstr.c_str());
177 
178   refstr = "st";
179   varstr = StringUtils::Mid(origstr, 2, 2);
180   EXPECT_STREQ(refstr.c_str(), varstr.c_str());
181 
182   refstr = "es";
183   varstr = StringUtils::Mid(origstr, 1, 2);
184   EXPECT_STREQ(refstr.c_str(), varstr.c_str());
185 }
186 
TEST(TestStringUtils,Right)187 TEST(TestStringUtils, Right)
188 {
189   std::string refstr, varstr;
190   std::string origstr = "test";
191 
192   refstr = "";
193   varstr = StringUtils::Right(origstr, 0);
194   EXPECT_STREQ(refstr.c_str(), varstr.c_str());
195 
196   refstr = "st";
197   varstr = StringUtils::Right(origstr, 2);
198   EXPECT_STREQ(refstr.c_str(), varstr.c_str());
199 
200   refstr = "test";
201   varstr = StringUtils::Right(origstr, 10);
202   EXPECT_STREQ(refstr.c_str(), varstr.c_str());
203 }
204 
TEST(TestStringUtils,Trim)205 TEST(TestStringUtils, Trim)
206 {
207   std::string refstr = "test test";
208 
209   std::string varstr = " test test   ";
210   StringUtils::Trim(varstr);
211   EXPECT_STREQ(refstr.c_str(), varstr.c_str());
212 }
213 
TEST(TestStringUtils,TrimLeft)214 TEST(TestStringUtils, TrimLeft)
215 {
216   std::string refstr = "test test   ";
217 
218   std::string varstr = " test test   ";
219   StringUtils::TrimLeft(varstr);
220   EXPECT_STREQ(refstr.c_str(), varstr.c_str());
221 }
222 
TEST(TestStringUtils,TrimRight)223 TEST(TestStringUtils, TrimRight)
224 {
225   std::string refstr = " test test";
226 
227   std::string varstr = " test test   ";
228   StringUtils::TrimRight(varstr);
229   EXPECT_STREQ(refstr.c_str(), varstr.c_str());
230 }
231 
TEST(TestStringUtils,Replace)232 TEST(TestStringUtils, Replace)
233 {
234   std::string refstr = "text text";
235 
236   std::string varstr = "test test";
237   EXPECT_EQ(StringUtils::Replace(varstr, 's', 'x'), 2);
238   EXPECT_STREQ(refstr.c_str(), varstr.c_str());
239 
240   EXPECT_EQ(StringUtils::Replace(varstr, 's', 'x'), 0);
241   EXPECT_STREQ(refstr.c_str(), varstr.c_str());
242 
243   varstr = "test test";
244   EXPECT_EQ(StringUtils::Replace(varstr, "s", "x"), 2);
245   EXPECT_STREQ(refstr.c_str(), varstr.c_str());
246 
247   EXPECT_EQ(StringUtils::Replace(varstr, "s", "x"), 0);
248   EXPECT_STREQ(refstr.c_str(), varstr.c_str());
249 }
250 
TEST(TestStringUtils,StartsWith)251 TEST(TestStringUtils, StartsWith)
252 {
253   std::string refstr = "test";
254 
255   EXPECT_FALSE(StringUtils::StartsWithNoCase(refstr, "x"));
256 
257   EXPECT_TRUE(StringUtils::StartsWith(refstr, "te"));
258   EXPECT_TRUE(StringUtils::StartsWith(refstr, "test"));
259   EXPECT_FALSE(StringUtils::StartsWith(refstr, "Te"));
260 
261   EXPECT_TRUE(StringUtils::StartsWithNoCase(refstr, "Te"));
262   EXPECT_TRUE(StringUtils::StartsWithNoCase(refstr, "TesT"));
263 }
264 
TEST(TestStringUtils,EndsWith)265 TEST(TestStringUtils, EndsWith)
266 {
267   std::string refstr = "test";
268 
269   EXPECT_FALSE(StringUtils::EndsWithNoCase(refstr, "x"));
270 
271   EXPECT_TRUE(StringUtils::EndsWith(refstr, "st"));
272   EXPECT_TRUE(StringUtils::EndsWith(refstr, "test"));
273   EXPECT_FALSE(StringUtils::EndsWith(refstr, "sT"));
274 
275   EXPECT_TRUE(StringUtils::EndsWithNoCase(refstr, "sT"));
276   EXPECT_TRUE(StringUtils::EndsWithNoCase(refstr, "TesT"));
277 }
278 
TEST(TestStringUtils,Join)279 TEST(TestStringUtils, Join)
280 {
281   std::string refstr, varstr;
282   std::vector<std::string> strarray;
283 
284   strarray.emplace_back("a");
285   strarray.emplace_back("b");
286   strarray.emplace_back("c");
287   strarray.emplace_back("de");
288   strarray.emplace_back(",");
289   strarray.emplace_back("fg");
290   strarray.emplace_back(",");
291   refstr = "a,b,c,de,,,fg,,";
292   varstr = StringUtils::Join(strarray, ",");
293   EXPECT_STREQ(refstr.c_str(), varstr.c_str());
294 }
295 
TEST(TestStringUtils,Split)296 TEST(TestStringUtils, Split)
297 {
298   std::vector<std::string> varresults;
299 
300   // test overload with string as delimiter
301   varresults = StringUtils::Split("g,h,ij,k,lm,,n", ",");
302   EXPECT_STREQ("g", varresults.at(0).c_str());
303   EXPECT_STREQ("h", varresults.at(1).c_str());
304   EXPECT_STREQ("ij", varresults.at(2).c_str());
305   EXPECT_STREQ("k", varresults.at(3).c_str());
306   EXPECT_STREQ("lm", varresults.at(4).c_str());
307   EXPECT_STREQ("", varresults.at(5).c_str());
308   EXPECT_STREQ("n", varresults.at(6).c_str());
309 
310   EXPECT_TRUE(StringUtils::Split("", "|").empty());
311 
312   EXPECT_EQ(4U, StringUtils::Split("a bc  d ef ghi ", " ", 4).size());
313   EXPECT_STREQ("d ef ghi ", StringUtils::Split("a bc  d ef ghi ", " ", 4).at(3).c_str()) << "Last part must include rest of the input string";
314   EXPECT_EQ(7U, StringUtils::Split("a bc  d ef ghi ", " ").size()) << "Result must be 7 strings including two empty strings";
315   EXPECT_STREQ("bc", StringUtils::Split("a bc  d ef ghi ", " ").at(1).c_str());
316   EXPECT_STREQ("", StringUtils::Split("a bc  d ef ghi ", " ").at(2).c_str());
317   EXPECT_STREQ("", StringUtils::Split("a bc  d ef ghi ", " ").at(6).c_str());
318 
319   EXPECT_EQ(2U, StringUtils::Split("a bc  d ef ghi ", "  ").size());
320   EXPECT_EQ(2U, StringUtils::Split("a bc  d ef ghi ", "  ", 10).size());
321   EXPECT_STREQ("a bc", StringUtils::Split("a bc  d ef ghi ", "  ", 10).at(0).c_str());
322 
323   EXPECT_EQ(1U, StringUtils::Split("a bc  d ef ghi ", " z").size());
324   EXPECT_STREQ("a bc  d ef ghi ", StringUtils::Split("a bc  d ef ghi ", " z").at(0).c_str());
325 
326   EXPECT_EQ(1U, StringUtils::Split("a bc  d ef ghi ", "").size());
327   EXPECT_STREQ("a bc  d ef ghi ", StringUtils::Split("a bc  d ef ghi ", "").at(0).c_str());
328 
329   // test overload with char as delimiter
330   EXPECT_EQ(4U, StringUtils::Split("a bc  d ef ghi ", ' ', 4).size());
331   EXPECT_STREQ("d ef ghi ", StringUtils::Split("a bc  d ef ghi ", ' ', 4).at(3).c_str());
332   EXPECT_EQ(7U, StringUtils::Split("a bc  d ef ghi ", ' ').size()) << "Result must be 7 strings including two empty strings";
333   EXPECT_STREQ("bc", StringUtils::Split("a bc  d ef ghi ", ' ').at(1).c_str());
334   EXPECT_STREQ("", StringUtils::Split("a bc  d ef ghi ", ' ').at(2).c_str());
335   EXPECT_STREQ("", StringUtils::Split("a bc  d ef ghi ", ' ').at(6).c_str());
336 
337   EXPECT_EQ(1U, StringUtils::Split("a bc  d ef ghi ", 'z').size());
338   EXPECT_STREQ("a bc  d ef ghi ", StringUtils::Split("a bc  d ef ghi ", 'z').at(0).c_str());
339 
340   EXPECT_EQ(1U, StringUtils::Split("a bc  d ef ghi ", "").size());
341   EXPECT_STREQ("a bc  d ef ghi ", StringUtils::Split("a bc  d ef ghi ", 'z').at(0).c_str());
342 }
343 
TEST(TestStringUtils,FindNumber)344 TEST(TestStringUtils, FindNumber)
345 {
346   EXPECT_EQ(3, StringUtils::FindNumber("aabcaadeaa", "aa"));
347   EXPECT_EQ(1, StringUtils::FindNumber("aabcaadeaa", "b"));
348 }
349 
TEST(TestStringUtils,AlphaNumericCompare)350 TEST(TestStringUtils, AlphaNumericCompare)
351 {
352   int64_t ref, var;
353 
354   ref = 0;
355   var = StringUtils::AlphaNumericCompare(L"123abc", L"abc123");
356   EXPECT_LT(var, ref);
357 }
358 
TEST(TestStringUtils,TimeStringToSeconds)359 TEST(TestStringUtils, TimeStringToSeconds)
360 {
361   EXPECT_EQ(77455, StringUtils::TimeStringToSeconds("21:30:55"));
362   EXPECT_EQ(7*60, StringUtils::TimeStringToSeconds("7 min"));
363   EXPECT_EQ(7*60, StringUtils::TimeStringToSeconds("7 min\t"));
364   EXPECT_EQ(154*60, StringUtils::TimeStringToSeconds("   154 min"));
365   EXPECT_EQ(1*60+1, StringUtils::TimeStringToSeconds("1:01"));
366   EXPECT_EQ(4*60+3, StringUtils::TimeStringToSeconds("4:03"));
367   EXPECT_EQ(2*3600+4*60+3, StringUtils::TimeStringToSeconds("2:04:03"));
368   EXPECT_EQ(2*3600+4*60+3, StringUtils::TimeStringToSeconds("   2:4:3"));
369   EXPECT_EQ(2*3600+4*60+3, StringUtils::TimeStringToSeconds("  \t\t 02:04:03 \n "));
370   EXPECT_EQ(1*3600+5*60+2, StringUtils::TimeStringToSeconds("01:05:02:04:03 \n "));
371   EXPECT_EQ(0, StringUtils::TimeStringToSeconds("blah"));
372   EXPECT_EQ(0, StringUtils::TimeStringToSeconds("ля-ля"));
373 }
374 
TEST(TestStringUtils,RemoveCRLF)375 TEST(TestStringUtils, RemoveCRLF)
376 {
377   std::string refstr, varstr;
378 
379   refstr = "test\r\nstring\nblah blah";
380   varstr = "test\r\nstring\nblah blah\n";
381   StringUtils::RemoveCRLF(varstr);
382   EXPECT_STREQ(refstr.c_str(), varstr.c_str());
383 }
384 
TEST(TestStringUtils,utf8_strlen)385 TEST(TestStringUtils, utf8_strlen)
386 {
387   size_t ref, var;
388 
389   ref = 9;
390   var = StringUtils::utf8_strlen("test_UTF8");
391   EXPECT_EQ(ref, var);
392 }
393 
TEST(TestStringUtils,SecondsToTimeString)394 TEST(TestStringUtils, SecondsToTimeString)
395 {
396   std::string ref, var;
397 
398   ref = "21:30:55";
399   var = StringUtils::SecondsToTimeString(77455);
400   EXPECT_STREQ(ref.c_str(), var.c_str());
401 }
402 
TEST(TestStringUtils,IsNaturalNumber)403 TEST(TestStringUtils, IsNaturalNumber)
404 {
405   EXPECT_TRUE(StringUtils::IsNaturalNumber("10"));
406   EXPECT_TRUE(StringUtils::IsNaturalNumber(" 10"));
407   EXPECT_TRUE(StringUtils::IsNaturalNumber("0"));
408   EXPECT_FALSE(StringUtils::IsNaturalNumber(" 1 0"));
409   EXPECT_FALSE(StringUtils::IsNaturalNumber("1.0"));
410   EXPECT_FALSE(StringUtils::IsNaturalNumber("1.1"));
411   EXPECT_FALSE(StringUtils::IsNaturalNumber("0x1"));
412   EXPECT_FALSE(StringUtils::IsNaturalNumber("blah"));
413   EXPECT_FALSE(StringUtils::IsNaturalNumber("120 h"));
414   EXPECT_FALSE(StringUtils::IsNaturalNumber(" "));
415   EXPECT_FALSE(StringUtils::IsNaturalNumber(""));
416 }
417 
TEST(TestStringUtils,IsInteger)418 TEST(TestStringUtils, IsInteger)
419 {
420   EXPECT_TRUE(StringUtils::IsInteger("10"));
421   EXPECT_TRUE(StringUtils::IsInteger(" -10"));
422   EXPECT_TRUE(StringUtils::IsInteger("0"));
423   EXPECT_FALSE(StringUtils::IsInteger(" 1 0"));
424   EXPECT_FALSE(StringUtils::IsInteger("1.0"));
425   EXPECT_FALSE(StringUtils::IsInteger("1.1"));
426   EXPECT_FALSE(StringUtils::IsInteger("0x1"));
427   EXPECT_FALSE(StringUtils::IsInteger("blah"));
428   EXPECT_FALSE(StringUtils::IsInteger("120 h"));
429   EXPECT_FALSE(StringUtils::IsInteger(" "));
430   EXPECT_FALSE(StringUtils::IsInteger(""));
431 }
432 
TEST(TestStringUtils,SizeToString)433 TEST(TestStringUtils, SizeToString)
434 {
435   std::string ref, var;
436 
437   ref = "2.00 GB";
438   var = StringUtils::SizeToString(2147483647);
439   EXPECT_STREQ(ref.c_str(), var.c_str());
440 }
441 
TEST(TestStringUtils,EmptyString)442 TEST(TestStringUtils, EmptyString)
443 {
444   EXPECT_STREQ("", StringUtils::Empty.c_str());
445 }
446 
TEST(TestStringUtils,FindWords)447 TEST(TestStringUtils, FindWords)
448 {
449   size_t ref, var;
450 
451   ref = 5;
452   var = StringUtils::FindWords("test string", "string");
453   EXPECT_EQ(ref, var);
454   var = StringUtils::FindWords("12345string", "string");
455   EXPECT_EQ(ref, var);
456   var = StringUtils::FindWords("apple2012", "2012");
457   EXPECT_EQ(ref, var);
458   ref = -1;
459   var = StringUtils::FindWords("12345string", "ring");
460   EXPECT_EQ(ref, var);
461   var = StringUtils::FindWords("12345string", "345");
462   EXPECT_EQ(ref, var);
463   var = StringUtils::FindWords("apple2012", "e2012");
464   EXPECT_EQ(ref, var);
465   var = StringUtils::FindWords("apple2012", "12");
466   EXPECT_EQ(ref, var);
467 }
468 
TEST(TestStringUtils,FindWords_NonAscii)469 TEST(TestStringUtils, FindWords_NonAscii)
470 {
471   size_t ref, var;
472 
473   ref = 6;
474   var = StringUtils::FindWords("我的视频", "视频");
475   EXPECT_EQ(ref, var);
476   var = StringUtils::FindWords("我的视频", "视");
477   EXPECT_EQ(ref, var);
478   var = StringUtils::FindWords("Apple ple", "ple");
479   EXPECT_EQ(ref, var);
480   ref = 7;
481   var = StringUtils::FindWords("Äpfel.pfel", "pfel");
482   EXPECT_EQ(ref, var);
483 }
484 
TEST(TestStringUtils,FindEndBracket)485 TEST(TestStringUtils, FindEndBracket)
486 {
487   int ref, var;
488 
489   ref = 11;
490   var = StringUtils::FindEndBracket("atest testbb test", 'a', 'b');
491   EXPECT_EQ(ref, var);
492 }
493 
TEST(TestStringUtils,DateStringToYYYYMMDD)494 TEST(TestStringUtils, DateStringToYYYYMMDD)
495 {
496   int ref, var;
497 
498   ref = 20120706;
499   var = StringUtils::DateStringToYYYYMMDD("2012-07-06");
500   EXPECT_EQ(ref, var);
501 }
502 
TEST(TestStringUtils,WordToDigits)503 TEST(TestStringUtils, WordToDigits)
504 {
505   std::string ref, var;
506 
507   ref = "8378 787464";
508   var = "test string";
509   StringUtils::WordToDigits(var);
510   EXPECT_STREQ(ref.c_str(), var.c_str());
511 }
512 
TEST(TestStringUtils,CreateUUID)513 TEST(TestStringUtils, CreateUUID)
514 {
515   std::cout << "CreateUUID(): " << StringUtils::CreateUUID() << std::endl;
516 }
517 
TEST(TestStringUtils,ValidateUUID)518 TEST(TestStringUtils, ValidateUUID)
519 {
520   EXPECT_TRUE(StringUtils::ValidateUUID(StringUtils::CreateUUID()));
521 }
522 
TEST(TestStringUtils,CompareFuzzy)523 TEST(TestStringUtils, CompareFuzzy)
524 {
525   double ref, var;
526 
527   ref = 6.25f;
528   var = StringUtils::CompareFuzzy("test string", "string test");
529   EXPECT_EQ(ref, var);
530 }
531 
TEST(TestStringUtils,FindBestMatch)532 TEST(TestStringUtils, FindBestMatch)
533 {
534   double refdouble, vardouble;
535   int refint, varint;
536   std::vector<std::string> strarray;
537 
538   refint = 3;
539   refdouble = 0.5625f;
540   strarray.emplace_back("");
541   strarray.emplace_back("a");
542   strarray.emplace_back("e");
543   strarray.emplace_back("es");
544   strarray.emplace_back("t");
545   varint = StringUtils::FindBestMatch("test", strarray, vardouble);
546   EXPECT_EQ(refint, varint);
547   EXPECT_EQ(refdouble, vardouble);
548 }
549 
TEST(TestStringUtils,Paramify)550 TEST(TestStringUtils, Paramify)
551 {
552   const char *input = "some, very \\ odd \"string\"";
553   const char *ref   = "\"some, very \\\\ odd \\\"string\\\"\"";
554 
555   std::string result = StringUtils::Paramify(input);
556   EXPECT_STREQ(ref, result.c_str());
557 }
558 
TEST(TestStringUtils,sortstringbyname)559 TEST(TestStringUtils, sortstringbyname)
560 {
561   std::vector<std::string> strarray;
562   strarray.emplace_back("B");
563   strarray.emplace_back("c");
564   strarray.emplace_back("a");
565   std::sort(strarray.begin(), strarray.end(), sortstringbyname());
566 
567   EXPECT_STREQ("a", strarray[0].c_str());
568   EXPECT_STREQ("B", strarray[1].c_str());
569   EXPECT_STREQ("c", strarray[2].c_str());
570 }
571 
TEST(TestStringUtils,FileSizeFormat)572 TEST(TestStringUtils, FileSizeFormat)
573 {
574   EXPECT_STREQ("0B", StringUtils::FormatFileSize(0).c_str());
575 
576   EXPECT_STREQ("999B", StringUtils::FormatFileSize(999).c_str());
577   EXPECT_STREQ("0.98kB", StringUtils::FormatFileSize(1000).c_str());
578 
579   EXPECT_STREQ("1.00kB", StringUtils::FormatFileSize(1024).c_str());
580   EXPECT_STREQ("9.99kB", StringUtils::FormatFileSize(10229).c_str());
581 
582   EXPECT_STREQ("10.1kB", StringUtils::FormatFileSize(10387).c_str());
583   EXPECT_STREQ("99.9kB", StringUtils::FormatFileSize(102297).c_str());
584 
585   EXPECT_STREQ("100kB", StringUtils::FormatFileSize(102400).c_str());
586   EXPECT_STREQ("999kB", StringUtils::FormatFileSize(1023431).c_str());
587 
588   EXPECT_STREQ("0.98MB", StringUtils::FormatFileSize(1023897).c_str());
589   EXPECT_STREQ("0.98MB", StringUtils::FormatFileSize(1024000).c_str());
590 
591   //Last unit should overflow the 3 digit limit
592   EXPECT_STREQ("5432PB", StringUtils::FormatFileSize(6115888293969133568).c_str());
593 }
594 
TEST(TestStringUtils,ToHexadecimal)595 TEST(TestStringUtils, ToHexadecimal)
596 {
597   EXPECT_STREQ("", StringUtils::ToHexadecimal("").c_str());
598   EXPECT_STREQ("616263", StringUtils::ToHexadecimal("abc").c_str());
599   std::string a{"a\0b\n", 4};
600   EXPECT_STREQ("6100620a", StringUtils::ToHexadecimal(a).c_str());
601   std::string nul{"\0", 1};
602   EXPECT_STREQ("00", StringUtils::ToHexadecimal(nul).c_str());
603   std::string ff{"\xFF", 1};
604   EXPECT_STREQ("ff", StringUtils::ToHexadecimal(ff).c_str());
605 }
606