str_ut.cpp 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225
  1. #include "str.h"
  2. #include <library/cpp/testing/unittest/registar.h>
  3. #include <util/generic/typetraits.h>
  4. #include <util/string/join.h>
  5. template <typename T>
  6. const T ReturnConstTemp();
  7. Y_UNIT_TEST_SUITE(TStringInputOutputTest) {
  8. Y_UNIT_TEST(Lvalue) {
  9. TString str = "Hello, World!";
  10. TStringInput input(str);
  11. TString result = input.ReadAll();
  12. UNIT_ASSERT_VALUES_EQUAL(result, str);
  13. }
  14. Y_UNIT_TEST(ConstRef) {
  15. TString str = "Hello, World!";
  16. const TString& r = str;
  17. TStringInput input(r);
  18. TString result = input.ReadAll();
  19. UNIT_ASSERT_VALUES_EQUAL(result, str);
  20. }
  21. Y_UNIT_TEST(NonConstRef) {
  22. TString str = "Hello, World!";
  23. TString& r = str;
  24. TStringInput input(r);
  25. TString result = input.ReadAll();
  26. UNIT_ASSERT_VALUES_EQUAL(result, str);
  27. }
  28. Y_UNIT_TEST(Transfer) {
  29. TString inputString = "some_string";
  30. TStringInput input(inputString);
  31. TString outputString;
  32. TStringOutput output(outputString);
  33. TransferData(&input, &output);
  34. UNIT_ASSERT_VALUES_EQUAL(inputString, outputString);
  35. }
  36. Y_UNIT_TEST(SkipReadAll) {
  37. TString string0 = "All animals are equal, but some animals are more equal than others.";
  38. TString string1;
  39. for (size_t i = 1; i <= string0.size(); i++) {
  40. string1 += string0.substr(0, i);
  41. }
  42. TStringInput input0(string1);
  43. size_t left = 5;
  44. while (left > 0) {
  45. left -= input0.Skip(left);
  46. }
  47. TString string2 = input0.ReadAll();
  48. UNIT_ASSERT_VALUES_EQUAL(string2, string1.substr(5));
  49. }
  50. Y_UNIT_TEST(OperatorBool) {
  51. TStringStream str;
  52. UNIT_ASSERT(!str);
  53. str << "data";
  54. UNIT_ASSERT(str);
  55. str.Clear();
  56. UNIT_ASSERT(!str);
  57. }
  58. Y_UNIT_TEST(TestReadTo) {
  59. TString s("0123456789abc");
  60. TString t;
  61. TStringInput in0(s);
  62. UNIT_ASSERT_VALUES_EQUAL(in0.ReadTo(t, '7'), 8);
  63. UNIT_ASSERT_VALUES_EQUAL(t, "0123456");
  64. UNIT_ASSERT_VALUES_EQUAL(in0.ReadTo(t, 'z'), 5);
  65. UNIT_ASSERT_VALUES_EQUAL(t, "89abc");
  66. }
  67. Y_UNIT_TEST(WriteViaNextAndUndo) {
  68. TString str1;
  69. TStringOutput output(str1);
  70. TString str2;
  71. for (size_t i = 0; i < 10000; ++i) {
  72. str2.push_back('a' + (i % 20));
  73. }
  74. size_t written = 0;
  75. void* ptr = nullptr;
  76. while (written < str2.size()) {
  77. size_t bufferSize = output.Next(&ptr);
  78. UNIT_ASSERT(ptr && bufferSize > 0);
  79. size_t toWrite = Min(bufferSize, str2.size() - written);
  80. memcpy(ptr, str2.begin() + written, toWrite);
  81. written += toWrite;
  82. if (toWrite < bufferSize) {
  83. output.Undo(bufferSize - toWrite);
  84. }
  85. }
  86. UNIT_ASSERT_STRINGS_EQUAL(str1, str2);
  87. }
  88. Y_UNIT_TEST(Write) {
  89. TString str;
  90. TStringOutput output(str);
  91. output << "1"
  92. << "22"
  93. << "333"
  94. << "4444"
  95. << "55555";
  96. UNIT_ASSERT_STRINGS_EQUAL(str, "1"
  97. "22"
  98. "333"
  99. "4444"
  100. "55555");
  101. }
  102. Y_UNIT_TEST(WriteChars) {
  103. TString str;
  104. TStringOutput output(str);
  105. output << '1' << '2' << '3' << '4' << '5' << '6' << '7' << '8' << '9' << '0';
  106. UNIT_ASSERT_STRINGS_EQUAL(str, "1234567890");
  107. }
  108. Y_UNIT_TEST(MoveConstructor) {
  109. TString str;
  110. TStringOutput output1(str);
  111. output1 << "foo";
  112. TStringOutput output2 = std::move(output1);
  113. output2 << "bar";
  114. UNIT_ASSERT_STRINGS_EQUAL(str, "foobar");
  115. // Check old stream is in a valid state
  116. output1 << "baz";
  117. }
  118. Y_UNIT_TEST(MoveableStringInputStream) {
  119. TString data{JoinSeq("\n", "qwertyuiop"sv)};
  120. TStringInput in0{data};
  121. TString str;
  122. in0 >> str;
  123. UNIT_ASSERT_VALUES_EQUAL(str, ToString(int('q')));
  124. TStringInput in1{std::move(in0)};
  125. in1 >> str;
  126. UNIT_ASSERT_VALUES_EQUAL(str, ToString(int('w')));
  127. // Check old stream is in a valid state
  128. in0 >> str;
  129. }
  130. Y_UNIT_TEST(MoveableStringStream) {
  131. TString str;
  132. str.reserve(500);
  133. const char* ptr = str.data();
  134. TStringStream stream{std::move(str)};
  135. stream << "foo"
  136. << "bar";
  137. TString out = std::move(stream).Str();
  138. UNIT_ASSERT_EQUAL(ptr, out.data());
  139. UNIT_ASSERT_STRINGS_EQUAL(out, "foobar");
  140. TStringStream multiline{JoinSeq("\n", "qwertyuiop"sv)};
  141. multiline >> str;
  142. UNIT_ASSERT_VALUES_EQUAL(str, ToString(int('q')));
  143. TStringStream other = std::move(multiline);
  144. // Check old stream is in a valid state
  145. multiline >> str;
  146. multiline << "bar";
  147. }
  148. // There is no distinct tests for Out<> via IOutputStream.
  149. // Let's tests strings output here.
  150. Y_UNIT_TEST(TestWritingWideStrings) {
  151. using namespace std::literals::string_literals;
  152. TString str;
  153. TStringOutput stream(str);
  154. // test char16_t
  155. const char16_t* utf16Data = u"Быть или не быть? Вот в чём вопрос";
  156. stream << std::u16string(utf16Data);
  157. UNIT_ASSERT_STRINGS_EQUAL(str, "Быть или не быть? Вот в чём вопрос");
  158. str.clear();
  159. stream << std::u16string_view(utf16Data);
  160. UNIT_ASSERT_STRINGS_EQUAL(str, "Быть или не быть? Вот в чём вопрос");
  161. str.clear();
  162. // test char32_t
  163. const char32_t* utf32Data = U"Быть или не быть? Вот в чём вопрос";
  164. stream << std::u32string(utf32Data);
  165. UNIT_ASSERT_STRINGS_EQUAL(str, "Быть или не быть? Вот в чём вопрос");
  166. str.clear();
  167. stream << std::u32string_view(utf32Data);
  168. UNIT_ASSERT_STRINGS_EQUAL(str, "Быть или не быть? Вот в чём вопрос");
  169. str.clear();
  170. // test wchar_t
  171. const wchar_t* wcharData = L"Быть или не быть? Вот в чём вопрос";
  172. stream << std::wstring(wcharData);
  173. UNIT_ASSERT_STRINGS_EQUAL(str, "Быть или не быть? Вот в чём вопрос");
  174. str.clear();
  175. stream << std::wstring_view(wcharData);
  176. UNIT_ASSERT_STRINGS_EQUAL(str, "Быть или не быть? Вот в чём вопрос");
  177. str.clear();
  178. }
  179. }