#include "gtest/gtest.h" #include #include #include #include "../src/BitEncoder.hpp" static auto lengthes = { 1, 8, 10, 30, 9999 }; TEST(BitEncoder, Fixed_4Bit_uint8) { std::mt19937_64 rng; std::uniform_int_distribution ud{ 0, 15 }; for (auto len : lengthes) { std::vector orig, reconstructed; for (size_t i = 0; i < len; ++i) { orig.emplace_back(ud(rng)); } std::ostringstream oss; kiwi::lm::FixedLengthEncoder encoder{ oss }; for (size_t i = 0; i < len; ++i) encoder.write(orig[i]); encoder.flush(); EXPECT_EQ(oss.str().size(), (len * 4 + 7) / 8); kiwi::lm::FixedLengthEncoder decoder{ oss.str() }; for (size_t i = 0; i < len; ++i) { reconstructed.emplace_back(decoder.read()); } EXPECT_EQ(orig, reconstructed); } } TEST(BitEncoder, Fixed_5Bit_uint8) { std::mt19937_64 rng; std::uniform_int_distribution ud{ 0, 31 }; for (auto len : lengthes) { std::vector orig, reconstructed; for (size_t i = 0; i < len; ++i) { orig.emplace_back(ud(rng)); } std::ostringstream oss; kiwi::lm::FixedLengthEncoder encoder{ oss }; for (size_t i = 0; i < len; ++i) encoder.write(orig[i]); encoder.flush(); EXPECT_EQ(oss.str().size(), (len * 5 + 7) / 8); kiwi::lm::FixedLengthEncoder decoder{ oss.str() }; for (size_t i = 0; i < len; ++i) { reconstructed.emplace_back(decoder.read()); } EXPECT_EQ(orig, reconstructed); } } TEST(BitEncoder, Fixed_8Bit_uint8) { std::mt19937_64 rng; std::uniform_int_distribution ud{ 0, 255 }; for (auto len : lengthes) { std::vector orig, reconstructed; for (size_t i = 0; i < len; ++i) { orig.emplace_back(ud(rng)); } std::ostringstream oss; kiwi::lm::FixedLengthEncoder encoder{ oss }; for (size_t i = 0; i < len; ++i) encoder.write(orig[i]); encoder.flush(); EXPECT_EQ(oss.str().size(), len); kiwi::lm::FixedLengthEncoder decoder{ oss.str() }; for (size_t i = 0; i < len; ++i) { reconstructed.emplace_back(decoder.read()); } EXPECT_EQ(orig, reconstructed); } } TEST(BitEncoder, Fixed_10Bit_uint8) { std::mt19937_64 rng; std::uniform_int_distribution ud{ 0, 1023 }; for (auto len : lengthes) { std::vector orig, reconstructed; for (size_t i = 0; i < len; ++i) { orig.emplace_back(ud(rng)); } std::ostringstream oss; kiwi::lm::FixedLengthEncoder encoder{ oss }; for (size_t i = 0; i < len; ++i) encoder.write(orig[i]); encoder.flush(); EXPECT_EQ(oss.str().size(), (len * 10 + 7) / 8); kiwi::lm::FixedLengthEncoder decoder{ oss.str() }; for (size_t i = 0; i < len; ++i) { reconstructed.emplace_back(decoder.read()); } EXPECT_EQ(orig, reconstructed); } } TEST(BitEncoder, Fixed_4Bit_uint32) { std::mt19937_64 rng; std::uniform_int_distribution ud{ 0, 15 }; for (auto len : lengthes) { std::vector orig, reconstructed; for (size_t i = 0; i < len; ++i) { orig.emplace_back(ud(rng)); } std::ostringstream oss; kiwi::lm::FixedLengthEncoder encoder{ oss }; for (size_t i = 0; i < len; ++i) encoder.write(orig[i]); encoder.flush(); EXPECT_EQ(oss.str().size(), (len * 4 + 31) / 32 * 4); kiwi::lm::FixedLengthEncoder decoder{ oss.str() }; for (size_t i = 0; i < len; ++i) { reconstructed.emplace_back(decoder.read()); } EXPECT_EQ(orig, reconstructed); } } TEST(BitEncoder, Fixed_5Bit_uint32) { std::mt19937_64 rng; std::uniform_int_distribution ud{ 0, 31 }; for (auto len : lengthes) { std::vector orig, reconstructed; for (size_t i = 0; i < len; ++i) { orig.emplace_back(ud(rng)); } std::ostringstream oss; kiwi::lm::FixedLengthEncoder encoder{ oss }; for (size_t i = 0; i < len; ++i) encoder.write(orig[i]); encoder.flush(); EXPECT_EQ(oss.str().size(), (len * 5 + 31) / 32 * 4); kiwi::lm::FixedLengthEncoder decoder{ oss.str() }; for (size_t i = 0; i < len; ++i) { reconstructed.emplace_back(decoder.read()); } EXPECT_EQ(orig, reconstructed); } } TEST(BitEncoder, Fixed_8Bit_uint32) { std::mt19937_64 rng; std::uniform_int_distribution ud{ 0, 255 }; for (auto len : lengthes) { std::vector orig, reconstructed; for (size_t i = 0; i < len; ++i) { orig.emplace_back(ud(rng)); } std::ostringstream oss; kiwi::lm::FixedLengthEncoder encoder{ oss }; for (size_t i = 0; i < len; ++i) encoder.write(orig[i]); encoder.flush(); EXPECT_EQ(oss.str().size(), (len + 3) / 4 * 4); kiwi::lm::FixedLengthEncoder decoder{ oss.str() }; for (size_t i = 0; i < len; ++i) { reconstructed.emplace_back(decoder.read()); } EXPECT_EQ(orig, reconstructed); } } TEST(BitEncoder, Fixed_10Bit_uint32) { std::mt19937_64 rng; std::uniform_int_distribution ud{ 0, 1023 }; for (auto len : lengthes) { std::vector orig, reconstructed; for (size_t i = 0; i < len; ++i) { orig.emplace_back(ud(rng)); } std::ostringstream oss; kiwi::lm::FixedLengthEncoder encoder{ oss }; for (size_t i = 0; i < len; ++i) encoder.write(orig[i]); encoder.flush(); EXPECT_EQ(oss.str().size(), (len * 10 + 31) / 32 * 4); kiwi::lm::FixedLengthEncoder decoder{ oss.str() }; for (size_t i = 0; i < len; ++i) { reconstructed.emplace_back(decoder.read()); } EXPECT_EQ(orig, reconstructed); } }