strutil_unittest.cc 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214
  1. // Copyright (C) 2011 Internet Systems Consortium, Inc. ("ISC")
  2. //
  3. // Permission to use, copy, modify, and/or distribute this software for any
  4. // purpose with or without fee is hereby granted, provided that the above
  5. // copyright notice and this permission notice appear in all copies.
  6. //
  7. // THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
  8. // REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
  9. // AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
  10. // INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
  11. // LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
  12. // OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
  13. // PERFORMANCE OF THIS SOFTWARE.
  14. #include <string>
  15. #include <gtest/gtest.h>
  16. #include <util/strutil.h>
  17. using namespace isc;
  18. using namespace std;
  19. class StringUtilTest : public ::testing::Test {
  20. protected:
  21. StringUtilTest()
  22. {
  23. }
  24. };
  25. // Check for slash replacement
  26. TEST_F(StringUtilTest, Slash) {
  27. string instring = "";
  28. isc::strutil::normalizeSlash(instring);
  29. EXPECT_EQ("", instring);
  30. instring = "C:\\A\\B\\C.D";
  31. isc::strutil::normalizeSlash(instring);
  32. EXPECT_EQ("C:/A/B/C.D", instring);
  33. instring = "// \\ //";
  34. isc::strutil::normalizeSlash(instring);
  35. EXPECT_EQ("// / //", instring);
  36. }
  37. // Check that leading and trailing space trimming works
  38. TEST_F(StringUtilTest, Trim) {
  39. // Empty and full string.
  40. EXPECT_EQ("", isc::strutil::trim(""));
  41. EXPECT_EQ("abcxyz", isc::strutil::trim("abcxyz"));
  42. // Trim right-most blanks
  43. EXPECT_EQ("ABC", isc::strutil::trim("ABC "));
  44. EXPECT_EQ("ABC", isc::strutil::trim("ABC\t\t \n\t"));
  45. // Left-most blank trimming
  46. EXPECT_EQ("XYZ", isc::strutil::trim(" XYZ"));
  47. EXPECT_EQ("XYZ", isc::strutil::trim("\t\t \tXYZ"));
  48. // Right and left, with embedded spaces
  49. EXPECT_EQ("MN \t OP", isc::strutil::trim("\t\tMN \t OP \t"));
  50. }
  51. // Check tokenization. Note that ASSERT_EQ is used to check the size of the
  52. // returned vector; if not as expected, the following references may be invalid
  53. // so should not be used.
  54. TEST_F(StringUtilTest, Tokens) {
  55. vector<string> result;
  56. // Default delimiters
  57. // Degenerate cases
  58. result = isc::strutil::tokens(""); // Empty string
  59. EXPECT_EQ(0, result.size());
  60. result = isc::strutil::tokens(" \n "); // String is all delimiters
  61. EXPECT_EQ(0, result.size());
  62. result = isc::strutil::tokens("abc"); // String has no delimiters
  63. ASSERT_EQ(1, result.size());
  64. EXPECT_EQ(string("abc"), result[0]);
  65. // String containing leading and/or trailing delimiters, no embedded ones.
  66. result = isc::strutil::tokens("\txyz"); // One leading delimiter
  67. ASSERT_EQ(1, result.size());
  68. EXPECT_EQ(string("xyz"), result[0]);
  69. result = isc::strutil::tokens("\t \nxyz"); // Multiple leading delimiters
  70. ASSERT_EQ(1, result.size());
  71. EXPECT_EQ(string("xyz"), result[0]);
  72. result = isc::strutil::tokens("xyz\n"); // One trailing delimiter
  73. ASSERT_EQ(1, result.size());
  74. EXPECT_EQ(string("xyz"), result[0]);
  75. result = isc::strutil::tokens("xyz \t"); // Multiple trailing
  76. ASSERT_EQ(1, result.size());
  77. EXPECT_EQ(string("xyz"), result[0]);
  78. result = isc::strutil::tokens("\t xyz \n"); // Leading and trailing
  79. ASSERT_EQ(1, result.size());
  80. EXPECT_EQ(string("xyz"), result[0]);
  81. // Embedded delimiters
  82. result = isc::strutil::tokens("abc\ndef"); // 2 tokens, one separator
  83. ASSERT_EQ(2, result.size());
  84. EXPECT_EQ(string("abc"), result[0]);
  85. EXPECT_EQ(string("def"), result[1]);
  86. result = isc::strutil::tokens("abc\t\t\ndef"); // 2 tokens, 3 separators
  87. ASSERT_EQ(2, result.size());
  88. EXPECT_EQ(string("abc"), result[0]);
  89. EXPECT_EQ(string("def"), result[1]);
  90. result = isc::strutil::tokens("abc\n \tdef\t\tghi");
  91. ASSERT_EQ(3, result.size()); // Multiple tokens, many delims
  92. EXPECT_EQ(string("abc"), result[0]);
  93. EXPECT_EQ(string("def"), result[1]);
  94. EXPECT_EQ(string("ghi"), result[2]);
  95. // Embedded and non-embedded delimiters
  96. result = isc::strutil::tokens("\t\t \nabc\n \tdef\t\tghi \n\n");
  97. ASSERT_EQ(3, result.size()); // Multiple tokens, many delims
  98. EXPECT_EQ(string("abc"), result[0]);
  99. EXPECT_EQ(string("def"), result[1]);
  100. EXPECT_EQ(string("ghi"), result[2]);
  101. // Non-default delimiter
  102. result = isc::strutil::tokens("alpha/beta/ /gamma//delta/epsilon/", "/");
  103. ASSERT_EQ(6, result.size());
  104. EXPECT_EQ(string("alpha"), result[0]);
  105. EXPECT_EQ(string("beta"), result[1]);
  106. EXPECT_EQ(string(" "), result[2]);
  107. EXPECT_EQ(string("gamma"), result[3]);
  108. EXPECT_EQ(string("delta"), result[4]);
  109. EXPECT_EQ(string("epsilon"), result[5]);
  110. // Non-default delimiters (plural)
  111. result = isc::strutil::tokens("+*--alpha*beta+ -gamma**delta+epsilon-+**",
  112. "*+-");
  113. ASSERT_EQ(6, result.size());
  114. EXPECT_EQ(string("alpha"), result[0]);
  115. EXPECT_EQ(string("beta"), result[1]);
  116. EXPECT_EQ(string(" "), result[2]);
  117. EXPECT_EQ(string("gamma"), result[3]);
  118. EXPECT_EQ(string("delta"), result[4]);
  119. EXPECT_EQ(string("epsilon"), result[5]);
  120. }
  121. // Changing case
  122. TEST_F(StringUtilTest, ChangeCase) {
  123. string mixed("abcDEFghiJKLmno123[]{=+--+]}");
  124. string upper("ABCDEFGHIJKLMNO123[]{=+--+]}");
  125. string lower("abcdefghijklmno123[]{=+--+]}");
  126. string test = mixed;
  127. isc::strutil::lowercase(test);
  128. EXPECT_EQ(lower, test);
  129. test = mixed;
  130. isc::strutil::uppercase(test);
  131. EXPECT_EQ(upper, test);
  132. }
  133. // Formatting
  134. TEST_F(StringUtilTest, Formatting) {
  135. vector<string> args;
  136. args.push_back("arg1");
  137. args.push_back("arg2");
  138. args.push_back("arg3");
  139. string format1 = "This is a string with no tokens";
  140. EXPECT_EQ(format1, isc::strutil::format(format1, args));
  141. string format2 = ""; // Empty string
  142. EXPECT_EQ(format2, isc::strutil::format(format2, args));
  143. string format3 = " "; // Empty string
  144. EXPECT_EQ(format3, isc::strutil::format(format3, args));
  145. string format4 = "String with %d non-string tokens %lf";
  146. EXPECT_EQ(format4, isc::strutil::format(format4, args));
  147. string format5 = "String with %s correct %s number of tokens %s";
  148. string result5 = "String with arg1 correct arg2 number of tokens arg3";
  149. EXPECT_EQ(result5, isc::strutil::format(format5, args));
  150. string format6 = "String with %s too %s few tokens";
  151. string result6 = "String with arg1 too arg2 few tokens";
  152. EXPECT_EQ(result6, isc::strutil::format(format6, args));
  153. string format7 = "String with %s too %s many %s tokens %s !";
  154. string result7 = "String with arg1 too arg2 many arg3 tokens %s !";
  155. EXPECT_EQ(result7, isc::strutil::format(format7, args));
  156. string format8 = "String with embedded%s%s%stokens";
  157. string result8 = "String with embeddedarg1arg2arg3tokens";
  158. EXPECT_EQ(result8, isc::strutil::format(format8, args));
  159. // Handle an empty vector
  160. args.clear();
  161. string format9 = "%s %s";
  162. EXPECT_EQ(format9, isc::strutil::format(format9, args));
  163. }