{
public:
    enum MakeCodecParam
    {
        CODEC_WITH_DATA_TYPE,
        CODEC_WITHOUT_DATA_TYPE,
    };
    static CompressionCodecPtr makeCodec(MakeCodecParam with_data_type)
    {
        const auto & codec_string = std::get<0>(GetParam()).codec_statement;
        const auto & data_type = with_data_type == CODEC_WITH_DATA_TYPE ? std::get<1>(GetParam()).data_type : nullptr;
        return ::makeCodec(codec_string, data_type);
    }
    static void testTranscoding(ICompressionCodec & codec)
    {
        NoOpTimer timer;
        ::testTranscoding(timer, codec, std::get<1>(GetParam()), std::get<0>(GetParam()).expected_compression_ratio);
    }
};
TEST_P(CodecTest, TranscodingWithDataType)
{
    const auto codec = makeCodec(CODEC_WITH_DATA_TYPE);
    testTranscoding(*codec);
}
class CodecTestCompatibility : public ::testing::TestWithParam<std::tuple<Codec, std::tuple<CodecTestSequence, std::string>>>