str_ut.cpp 5.5 KB

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