buffer_ut.cpp 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205
  1. #include <library/cpp/testing/unittest/registar.h>
  2. #include <util/system/datetime.h>
  3. #include "string.h"
  4. #include "vector.h"
  5. #include "buffer.h"
  6. Y_UNIT_TEST_SUITE(TBufferTest) {
  7. Y_UNIT_TEST(TestEraseBack) {
  8. TBuffer buf;
  9. buf.Append("1234567", 7);
  10. buf.Reserve(1000);
  11. buf.Resize(6);
  12. buf.EraseBack(2);
  13. UNIT_ASSERT_EQUAL(TString(buf.data(), buf.size()), "1234");
  14. }
  15. Y_UNIT_TEST(TestAppend) {
  16. const char data[] = "1234567890qwertyuiop";
  17. TBuffer buf(13);
  18. TString str;
  19. for (size_t i = 0; i < 10; ++i) {
  20. for (size_t j = 0; j < sizeof(data) - 1; ++j) {
  21. buf.Append(data, j);
  22. buf.Append('q');
  23. str.append(data, j);
  24. str.append('q');
  25. }
  26. }
  27. UNIT_ASSERT_EQUAL(TString(buf.data(), buf.size()), str);
  28. }
  29. Y_UNIT_TEST(TestReset) {
  30. char content[] = "some text";
  31. TBuffer buf;
  32. buf.Append(content, sizeof(content));
  33. buf.Clear();
  34. UNIT_ASSERT(buf.Capacity() != 0);
  35. buf.Append(content, sizeof(content));
  36. buf.Reset();
  37. UNIT_ASSERT_EQUAL(buf.Capacity(), 0);
  38. }
  39. Y_UNIT_TEST(TestResize) {
  40. char content[] = "some text";
  41. TBuffer buf;
  42. buf.Resize(10);
  43. UNIT_ASSERT_VALUES_EQUAL(buf.size(), 10u);
  44. buf.Resize(0);
  45. UNIT_ASSERT_VALUES_EQUAL(buf.size(), 0u);
  46. buf.Resize(9);
  47. memcpy(buf.data(), content, 9);
  48. UNIT_ASSERT_VALUES_EQUAL(TString(buf.data(), buf.size()), "some text");
  49. buf.Resize(4);
  50. UNIT_ASSERT_VALUES_EQUAL(TString(buf.data(), buf.size()), "some");
  51. }
  52. Y_UNIT_TEST(TestReserve) {
  53. TBuffer buf;
  54. UNIT_ASSERT_EQUAL(buf.Capacity(), 0);
  55. buf.Reserve(4);
  56. UNIT_ASSERT_EQUAL(buf.Capacity(), 4);
  57. buf.Reserve(6);
  58. UNIT_ASSERT_EQUAL(buf.Capacity(), 8);
  59. buf.Reserve(32);
  60. UNIT_ASSERT_EQUAL(buf.Capacity(), 32);
  61. buf.Reserve(33);
  62. UNIT_ASSERT_EQUAL(buf.Capacity(), 64);
  63. buf.Reserve(64);
  64. UNIT_ASSERT_EQUAL(buf.Capacity(), 64);
  65. buf.Resize(128);
  66. UNIT_ASSERT_EQUAL(buf.Capacity(), 128);
  67. buf.Append('a');
  68. UNIT_ASSERT_EQUAL(buf.Capacity(), 256);
  69. TString tmp1 = "abcdef";
  70. buf.Append(tmp1.data(), tmp1.size());
  71. UNIT_ASSERT_EQUAL(buf.Capacity(), 256);
  72. TString tmp2 = "30498290sfokdsflj2308w";
  73. buf.Resize(1020);
  74. buf.Append(tmp2.data(), tmp2.size());
  75. UNIT_ASSERT_EQUAL(buf.Capacity(), 2048);
  76. }
  77. Y_UNIT_TEST(TestShrinkToFit) {
  78. TBuffer buf;
  79. TString content = "some text";
  80. buf.Append(content.data(), content.size());
  81. UNIT_ASSERT_EQUAL(buf.Size(), 9);
  82. UNIT_ASSERT_EQUAL(buf.Capacity(), 16);
  83. buf.ShrinkToFit();
  84. UNIT_ASSERT_EQUAL(buf.Size(), 9);
  85. UNIT_ASSERT_EQUAL(buf.Capacity(), 9);
  86. UNIT_ASSERT_EQUAL(TString(buf.data(), buf.size()), content);
  87. const size_t MB = 1024 * 1024;
  88. buf.Resize(MB);
  89. UNIT_ASSERT_EQUAL(buf.Capacity(), MB);
  90. buf.ShrinkToFit();
  91. UNIT_ASSERT_EQUAL(buf.Capacity(), MB);
  92. buf.Resize(MB + 100);
  93. UNIT_ASSERT_EQUAL(buf.Capacity(), 2 * MB);
  94. buf.ShrinkToFit();
  95. UNIT_ASSERT_EQUAL(buf.Capacity(), MB + 100);
  96. }
  97. #if 0
  98. Y_UNIT_TEST(TestAlignUp) {
  99. char content[] = "some text";
  100. TBuffer buf;
  101. buf.Append(content, sizeof(content));
  102. buf.AlignUp(4, '!');
  103. UNIT_ASSERT(buf.Size() % 4 == 0);
  104. UNIT_ASSERT_VALUES_EQUAL(TString(~buf, +buf), "some text!!!");
  105. char addContent[] = "1234";
  106. buf.Append(addContent, sizeof(addContent));
  107. buf.AlignUp(4, 'X');
  108. UNIT_ASSERT(buf.Size() % 4 == 0);
  109. UNIT_ASSERT_VALUES_EQUAL(TString(~buf, +buf), "some text!!!1234");
  110. }
  111. #endif
  112. #if 0
  113. Y_UNIT_TEST(TestSpeed) {
  114. const char data[] = "1234567890qwertyuiop";
  115. const size_t c = 100000;
  116. ui64 t1 = 0;
  117. ui64 t2 = 0;
  118. {
  119. TBuffer buf;
  120. t1 = MicroSeconds();
  121. for (size_t i = 0; i < c; ++i) {
  122. buf.Append(data, sizeof(data));
  123. }
  124. t1 = MicroSeconds() - t1;
  125. }
  126. {
  127. TVector<char> buf;
  128. t2 = MicroSeconds();
  129. for (size_t i = 0; i < c; ++i) {
  130. buf.insert(buf.end(), data, data + sizeof(data));
  131. }
  132. t2 = MicroSeconds() - t2;
  133. }
  134. UNIT_ASSERT(t1 < t2);
  135. }
  136. #endif
  137. Y_UNIT_TEST(TestFillAndChop) {
  138. TBuffer buf;
  139. buf.Append("Some ", 5);
  140. buf.Fill('!', 5);
  141. buf.Append(" text.", 6);
  142. UNIT_ASSERT_VALUES_EQUAL(TString(buf.data(), buf.size()), "Some !!!!! text.");
  143. buf.Chop(5, 6);
  144. UNIT_ASSERT_VALUES_EQUAL(TString(buf.data(), buf.size()), "Some text.");
  145. }
  146. Y_UNIT_TEST(TestComparison) {
  147. TBuffer buf1("abcd", 4);
  148. TBuffer buf2("abcde", 5);
  149. TBuffer empty;
  150. UNIT_ASSERT(empty == empty);
  151. UNIT_ASSERT(!(empty != empty));
  152. UNIT_ASSERT(buf1 != buf2);
  153. UNIT_ASSERT(buf1 == buf1);
  154. buf2.EraseBack(1);
  155. UNIT_ASSERT(buf2 == buf1);
  156. }
  157. } // Y_UNIT_TEST_SUITE(TBufferTest)