#include <library/cpp/testing/unittest/registar.h>
#include <util/system/datetime.h>
#include "string.h"
#include "vector.h"
#include "buffer.h"
Y_UNIT_TEST_SUITE(TBufferTest) {
Y_UNIT_TEST(TestEraseBack) {
TBuffer buf;
buf.Append("1234567", 7);
buf.Reserve(1000);
buf.Resize(6);
buf.EraseBack(2);
UNIT_ASSERT_EQUAL(TString(buf.data(), buf.size()), "1234");
}
Y_UNIT_TEST(TestAppend) {
const char data[] = "1234567890qwertyuiop";
TBuffer buf(13);
TString str;
for (size_t i = 0; i < 10; ++i) {
for (size_t j = 0; j < sizeof(data) - 1; ++j) {
buf.Append(data, j);
buf.Append('q');
str.append(data, j);
str.append('q');
}
}
UNIT_ASSERT_EQUAL(TString(buf.data(), buf.size()), str);
}
Y_UNIT_TEST(TestReset) {
char content[] = "some text";
TBuffer buf;
buf.Append(content, sizeof(content));
buf.Clear();
UNIT_ASSERT(buf.Capacity() != 0);
buf.Append(content, sizeof(content));
buf.Reset();
UNIT_ASSERT_EQUAL(buf.Capacity(), 0);
}
Y_UNIT_TEST(TestResize) {
char content[] = "some text";
TBuffer buf;
buf.Resize(10);
UNIT_ASSERT_VALUES_EQUAL(buf.size(), 10u);
buf.Resize(0);
UNIT_ASSERT_VALUES_EQUAL(buf.size(), 0u);
buf.Resize(9);
memcpy(buf.data(), content, 9);
UNIT_ASSERT_VALUES_EQUAL(TString(buf.data(), buf.size()), "some text");
buf.Resize(4);
UNIT_ASSERT_VALUES_EQUAL(TString(buf.data(), buf.size()), "some");
}
Y_UNIT_TEST(TestReserve) {
TBuffer buf;
UNIT_ASSERT_EQUAL(buf.Capacity(), 0);
buf.Reserve(4);
UNIT_ASSERT_EQUAL(buf.Capacity(), 4);
buf.Reserve(6);
UNIT_ASSERT_EQUAL(buf.Capacity(), 8);
buf.Reserve(32);
UNIT_ASSERT_EQUAL(buf.Capacity(), 32);
buf.Reserve(33);
UNIT_ASSERT_EQUAL(buf.Capacity(), 64);
buf.Reserve(64);
UNIT_ASSERT_EQUAL(buf.Capacity(), 64);
buf.Resize(128);
UNIT_ASSERT_EQUAL(buf.Capacity(), 128);
buf.Append('a');
UNIT_ASSERT_EQUAL(buf.Capacity(), 256);
TString tmp1 = "abcdef";
buf.Append(tmp1.data(), tmp1.size());
UNIT_ASSERT_EQUAL(buf.Capacity(), 256);
TString tmp2 = "30498290sfokdsflj2308w";
buf.Resize(1020);
buf.Append(tmp2.data(), tmp2.size());
UNIT_ASSERT_EQUAL(buf.Capacity(), 2048);
}
Y_UNIT_TEST(TestShrinkToFit) {
TBuffer buf;
TString content = "some text";
buf.Append(content.data(), content.size());
UNIT_ASSERT_EQUAL(buf.Size(), 9);
UNIT_ASSERT_EQUAL(buf.Capacity(), 16);
buf.ShrinkToFit();
UNIT_ASSERT_EQUAL(buf.Size(), 9);
UNIT_ASSERT_EQUAL(buf.Capacity(), 9);
UNIT_ASSERT_EQUAL(TString(buf.data(), buf.size()), content);
const size_t MB = 1024 * 1024;
buf.Resize(MB);
UNIT_ASSERT_EQUAL(buf.Capacity(), MB);
buf.ShrinkToFit();
UNIT_ASSERT_EQUAL(buf.Capacity(), MB);
buf.Resize(MB + 100);
UNIT_ASSERT_EQUAL(buf.Capacity(), 2 * MB);
buf.ShrinkToFit();
UNIT_ASSERT_EQUAL(buf.Capacity(), MB + 100);
}
#if 0
Y_UNIT_TEST(TestAlignUp) {
char content[] = "some text";
TBuffer buf;
buf.Append(content, sizeof(content));
buf.AlignUp(4, '!');
UNIT_ASSERT(buf.Size() % 4 == 0);
UNIT_ASSERT_VALUES_EQUAL(TString(~buf, +buf), "some text!!!");
char addContent[] = "1234";
buf.Append(addContent, sizeof(addContent));
buf.AlignUp(4, 'X');
UNIT_ASSERT(buf.Size() % 4 == 0);
UNIT_ASSERT_VALUES_EQUAL(TString(~buf, +buf), "some text!!!1234");
}
#endif
#if 0
Y_UNIT_TEST(TestSpeed) {
const char data[] = "1234567890qwertyuiop";
const size_t c = 100000;
ui64 t1 = 0;
ui64 t2 = 0;
{
TBuffer buf;
t1 = MicroSeconds();
for (size_t i = 0; i < c; ++i) {
buf.Append(data, sizeof(data));
}
t1 = MicroSeconds() - t1;
}
{
TVector<char> buf;
t2 = MicroSeconds();
for (size_t i = 0; i < c; ++i) {
buf.insert(buf.end(), data, data + sizeof(data));
}
t2 = MicroSeconds() - t2;
}
UNIT_ASSERT(t1 < t2);
}
#endif
Y_UNIT_TEST(TestFillAndChop) {
TBuffer buf;
buf.Append("Some ", 5);
buf.Fill('!', 5);
buf.Append(" text.", 6);
UNIT_ASSERT_VALUES_EQUAL(TString(buf.data(), buf.size()), "Some !!!!! text.");
buf.Chop(5, 6);
UNIT_ASSERT_VALUES_EQUAL(TString(buf.data(), buf.size()), "Some text.");
}
Y_UNIT_TEST(TestComparison) {
TBuffer buf1("abcd", 4);
TBuffer buf2("abcde", 5);
TBuffer empty;
UNIT_ASSERT(empty == empty);
UNIT_ASSERT(!(empty != empty));
UNIT_ASSERT(buf1 != buf2);
UNIT_ASSERT(buf1 == buf1);
buf2.EraseBack(1);
UNIT_ASSERT(buf2 == buf1);
}
}