aboutsummaryrefslogblamecommitdiffstats
path: root/util/generic/buffer_ut.cpp
blob: 437d7122ec22e6fb0d695e01d7d952f28e160b65 (plain) (tree)
1
2
3
4
5
6
7
8
9
                                                  
                                 
                   

                   
                                





                                 
                                                                   
     
                             
                                                   
 
                        
                    
 






                                                           
 
                                                                
     
                            
                                     
 
                                             
 
                                         
 
                                             
 
                                             
 
                             
                                     
 
                       
                                                  
 
                      
                                                 
 
                      
                                                                               
 
                      
                                                                          
     
 
                              
                                             
 
                                             
 
                                             
 
                                              
 


                                              
 
                                               
 
                                               
                                
                                             
                                               
 
                                                
                         
                                             
                                                
 
                                  
                    
 
                                      
                                                   
                                              
 

                                             
                                                                    
 








                                                    
 
     
                          





                                         
                                                                  



                                               
                                                                      
 
      
 
     
                        
















                                               
                          










                                                             
      
 
                                  


                                
                                                                                      
 
                       
                                                                                
     










                                       
 
#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);
    }

}