{};
TEST_P(CodecTestCompatibility, Encoding)
{
    const auto & codec_spec = std::get<0>(GetParam());
    const auto & [data_sequence, expected] = std::get<1>(GetParam());
    const auto codec = makeCodec(codec_spec.codec_statement, data_sequence.data_type);
    const auto & source_data = data_sequence.serialized_data;
    
    const UInt32 encoded_max_size = codec->getCompressedReserveSize(
        static_cast<UInt32>(source_data.size()));
    PODArray<char> encoded(encoded_max_size);
    const UInt32 encoded_size = codec->compress(
        source_data.data(), static_cast<UInt32>(source_data.size()), encoded.data());
    encoded.resize(encoded_size);
    SCOPED_TRACE(::testing::Message("encoded:  ") << AsHexString(encoded));
    ASSERT_TRUE(EqualByteContainersAs<UInt8>(expected, encoded));
}
TEST_P(CodecTestCompatibility, Decoding)
{
    const auto & codec_spec = std::get<0>(GetParam());
    const auto & [expected, encoded_data] = std::get<1>(GetParam());
    const auto codec = makeCodec(codec_spec.codec_statement, expected.data_type);
    PODArray<char> decoded(expected.serialized_data.size());
    const UInt32 decoded_size = codec->decompress(
        encoded_data.c_str(), static_cast<UInt32>(encoded_data.size()), decoded.data());
    decoded.resize(decoded_size);
    ASSERT_TRUE(EqualByteContainers(expected.data_type->getSizeOfValueInMemory(), expected.serialized_data, decoded));
}
class CodecTestPerformance : public ::testing::TestWithParam<std::tuple<Codec, CodecTestSequence>>