strip_test.cc 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198
  1. // Copyright 2017 The Abseil Authors.
  2. //
  3. // Licensed under the Apache License, Version 2.0 (the "License");
  4. // you may not use this file except in compliance with the License.
  5. // You may obtain a copy of the License at
  6. //
  7. // https://www.apache.org/licenses/LICENSE-2.0
  8. //
  9. // Unless required by applicable law or agreed to in writing, software
  10. // distributed under the License is distributed on an "AS IS" BASIS,
  11. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. // See the License for the specific language governing permissions and
  13. // limitations under the License.
  14. // This file contains functions that remove a defined part from the string,
  15. // i.e., strip the string.
  16. #include "absl/strings/strip.h"
  17. #include <cassert>
  18. #include <cstdio>
  19. #include <cstring>
  20. #include "gmock/gmock.h"
  21. #include "gtest/gtest.h"
  22. #include "absl/strings/string_view.h"
  23. namespace {
  24. TEST(Strip, ConsumePrefixOneChar) {
  25. absl::string_view input("abc");
  26. EXPECT_TRUE(absl::ConsumePrefix(&input, "a"));
  27. EXPECT_EQ(input, "bc");
  28. EXPECT_FALSE(absl::ConsumePrefix(&input, "x"));
  29. EXPECT_EQ(input, "bc");
  30. EXPECT_TRUE(absl::ConsumePrefix(&input, "b"));
  31. EXPECT_EQ(input, "c");
  32. EXPECT_TRUE(absl::ConsumePrefix(&input, "c"));
  33. EXPECT_EQ(input, "");
  34. EXPECT_FALSE(absl::ConsumePrefix(&input, "a"));
  35. EXPECT_EQ(input, "");
  36. }
  37. TEST(Strip, ConsumePrefix) {
  38. absl::string_view input("abcdef");
  39. EXPECT_FALSE(absl::ConsumePrefix(&input, "abcdefg"));
  40. EXPECT_EQ(input, "abcdef");
  41. EXPECT_FALSE(absl::ConsumePrefix(&input, "abce"));
  42. EXPECT_EQ(input, "abcdef");
  43. EXPECT_TRUE(absl::ConsumePrefix(&input, ""));
  44. EXPECT_EQ(input, "abcdef");
  45. EXPECT_FALSE(absl::ConsumePrefix(&input, "abcdeg"));
  46. EXPECT_EQ(input, "abcdef");
  47. EXPECT_TRUE(absl::ConsumePrefix(&input, "abcdef"));
  48. EXPECT_EQ(input, "");
  49. input = "abcdef";
  50. EXPECT_TRUE(absl::ConsumePrefix(&input, "abcde"));
  51. EXPECT_EQ(input, "f");
  52. }
  53. TEST(Strip, ConsumeSuffix) {
  54. absl::string_view input("abcdef");
  55. EXPECT_FALSE(absl::ConsumeSuffix(&input, "abcdefg"));
  56. EXPECT_EQ(input, "abcdef");
  57. EXPECT_TRUE(absl::ConsumeSuffix(&input, ""));
  58. EXPECT_EQ(input, "abcdef");
  59. EXPECT_TRUE(absl::ConsumeSuffix(&input, "def"));
  60. EXPECT_EQ(input, "abc");
  61. input = "abcdef";
  62. EXPECT_FALSE(absl::ConsumeSuffix(&input, "abcdeg"));
  63. EXPECT_EQ(input, "abcdef");
  64. EXPECT_TRUE(absl::ConsumeSuffix(&input, "f"));
  65. EXPECT_EQ(input, "abcde");
  66. EXPECT_TRUE(absl::ConsumeSuffix(&input, "abcde"));
  67. EXPECT_EQ(input, "");
  68. }
  69. TEST(Strip, StripPrefix) {
  70. const absl::string_view null_str;
  71. EXPECT_EQ(absl::StripPrefix("foobar", "foo"), "bar");
  72. EXPECT_EQ(absl::StripPrefix("foobar", ""), "foobar");
  73. EXPECT_EQ(absl::StripPrefix("foobar", null_str), "foobar");
  74. EXPECT_EQ(absl::StripPrefix("foobar", "foobar"), "");
  75. EXPECT_EQ(absl::StripPrefix("foobar", "bar"), "foobar");
  76. EXPECT_EQ(absl::StripPrefix("foobar", "foobarr"), "foobar");
  77. EXPECT_EQ(absl::StripPrefix("", ""), "");
  78. }
  79. TEST(Strip, StripSuffix) {
  80. const absl::string_view null_str;
  81. EXPECT_EQ(absl::StripSuffix("foobar", "bar"), "foo");
  82. EXPECT_EQ(absl::StripSuffix("foobar", ""), "foobar");
  83. EXPECT_EQ(absl::StripSuffix("foobar", null_str), "foobar");
  84. EXPECT_EQ(absl::StripSuffix("foobar", "foobar"), "");
  85. EXPECT_EQ(absl::StripSuffix("foobar", "foo"), "foobar");
  86. EXPECT_EQ(absl::StripSuffix("foobar", "ffoobar"), "foobar");
  87. EXPECT_EQ(absl::StripSuffix("", ""), "");
  88. }
  89. TEST(Strip, RemoveExtraAsciiWhitespace) {
  90. const char* inputs[] = {
  91. "No extra space",
  92. " Leading whitespace",
  93. "Trailing whitespace ",
  94. " Leading and trailing ",
  95. " Whitespace \t in\v middle ",
  96. "'Eeeeep! \n Newlines!\n",
  97. "nospaces",
  98. };
  99. const char* outputs[] = {
  100. "No extra space",
  101. "Leading whitespace",
  102. "Trailing whitespace",
  103. "Leading and trailing",
  104. "Whitespace in middle",
  105. "'Eeeeep! Newlines!",
  106. "nospaces",
  107. };
  108. int NUM_TESTS = 7;
  109. for (int i = 0; i < NUM_TESTS; i++) {
  110. std::string s(inputs[i]);
  111. absl::RemoveExtraAsciiWhitespace(&s);
  112. EXPECT_STREQ(outputs[i], s.c_str());
  113. }
  114. // Test that absl::RemoveExtraAsciiWhitespace returns immediately for empty
  115. // strings (It was adding the \0 character to the C++ std::string, which broke
  116. // tests involving empty())
  117. std::string zero_string = "";
  118. assert(zero_string.empty());
  119. absl::RemoveExtraAsciiWhitespace(&zero_string);
  120. EXPECT_EQ(zero_string.size(), 0);
  121. EXPECT_TRUE(zero_string.empty());
  122. }
  123. TEST(Strip, StripTrailingAsciiWhitespace) {
  124. std::string test = "foo ";
  125. absl::StripTrailingAsciiWhitespace(&test);
  126. EXPECT_EQ(test, "foo");
  127. test = " ";
  128. absl::StripTrailingAsciiWhitespace(&test);
  129. EXPECT_EQ(test, "");
  130. test = "";
  131. absl::StripTrailingAsciiWhitespace(&test);
  132. EXPECT_EQ(test, "");
  133. test = " abc\t";
  134. absl::StripTrailingAsciiWhitespace(&test);
  135. EXPECT_EQ(test, " abc");
  136. }
  137. TEST(String, StripLeadingAsciiWhitespace) {
  138. absl::string_view orig = "\t \n\f\r\n\vfoo";
  139. EXPECT_EQ("foo", absl::StripLeadingAsciiWhitespace(orig));
  140. orig = "\t \n\f\r\v\n\t \n\f\r\v\n";
  141. EXPECT_EQ(absl::string_view(), absl::StripLeadingAsciiWhitespace(orig));
  142. }
  143. TEST(Strip, StripAsciiWhitespace) {
  144. std::string test2 = "\t \f\r\n\vfoo \t\f\r\v\n";
  145. absl::StripAsciiWhitespace(&test2);
  146. EXPECT_EQ(test2, "foo");
  147. std::string test3 = "bar";
  148. absl::StripAsciiWhitespace(&test3);
  149. EXPECT_EQ(test3, "bar");
  150. std::string test4 = "\t \f\r\n\vfoo";
  151. absl::StripAsciiWhitespace(&test4);
  152. EXPECT_EQ(test4, "foo");
  153. std::string test5 = "foo \t\f\r\v\n";
  154. absl::StripAsciiWhitespace(&test5);
  155. EXPECT_EQ(test5, "foo");
  156. absl::string_view test6("\t \f\r\n\vfoo \t\f\r\v\n");
  157. test6 = absl::StripAsciiWhitespace(test6);
  158. EXPECT_EQ(test6, "foo");
  159. test6 = absl::StripAsciiWhitespace(test6);
  160. EXPECT_EQ(test6, "foo"); // already stripped
  161. }
  162. } // namespace