#include "region_packer.h"
#include <library/cpp/unittest/registar.h>

template <typename TValue>
void TestPacker() {
    TValue values[] = {1, 2, 3, 42};
    TString buffer;

    TRegionPacker<TValue> p;

    using TValues = TArrayRef<TValue>;
    TValues valueRegion = TValues(values, Y_ARRAY_SIZE(values));
    size_t sz = p.MeasureLeaf(valueRegion);
    UNIT_ASSERT_VALUES_EQUAL(sz, 1 + sizeof(values));

    buffer.resize(sz);
    p.PackLeaf(buffer.begin(), valueRegion, sz);
    UNIT_ASSERT_VALUES_EQUAL(buffer[0], 4);

    p.UnpackLeaf(buffer.data(), valueRegion);
    UNIT_ASSERT_EQUAL(valueRegion.data(), (const TValue*)(buffer.begin() + 1));
    UNIT_ASSERT_EQUAL(valueRegion.size(), Y_ARRAY_SIZE(values));
    UNIT_ASSERT_EQUAL(0, memcmp(values, valueRegion.data(), sizeof(values)));
}

Y_UNIT_TEST_SUITE(RegionPacker) {
    Y_UNIT_TEST(Test0) {
        TestPacker<char>();
        TestPacker<signed char>();
        TestPacker<unsigned char>();
        TestPacker<i8>();
        TestPacker<ui8>();
        TestPacker<i16>();
        TestPacker<ui16>();
        TestPacker<i32>();
        TestPacker<ui32>();
        TestPacker<i64>();
        TestPacker<ui64>();
    }
}
