| 457 | |
| 458 | template <typename Timer> |
| 459 | void testTranscoding(Timer & timer, ICompressionCodec & codec, const CodecTestSequence & test_sequence, |
| 460 | std::optional<double> expected_compression_ratio = {}) |
| 461 | { |
| 462 | const auto & source_data = test_sequence.serialized_data; |
| 463 | |
| 464 | const UInt32 encoded_max_size = codec.getCompressedReserveSize( |
| 465 | static_cast<UInt32>(source_data.size())); |
| 466 | PODArray<char> encoded(encoded_max_size); |
| 467 | |
| 468 | timer.start(); |
| 469 | |
| 470 | chassert(source_data.data() != nullptr); // Codec assumes that source buffer is not null. |
| 471 | const UInt32 encoded_size = codec.compress( |
| 472 | source_data.data(), static_cast<UInt32>(source_data.size()), encoded.data()); |
| 473 | timer.report("encoding"); |
| 474 | |
| 475 | encoded.resize(encoded_size); |
| 476 | |
| 477 | PODArray<char> decoded(source_data.size()); |
| 478 | |
| 479 | timer.start(); |
| 480 | const UInt32 decoded_size = codec.decompress( |
| 481 | encoded.data(), static_cast<UInt32>(encoded.size()), decoded.data()); |
| 482 | timer.report("decoding"); |
| 483 | |
| 484 | decoded.resize(decoded_size); |
| 485 | |
| 486 | ASSERT_TRUE(EqualByteContainers(static_cast<uint8_t>(test_sequence.data_type->getSizeOfValueInMemory()), source_data, decoded)); |
| 487 | |
| 488 | const auto header_size = ICompressionCodec::getHeaderSize(); |
| 489 | const auto compression_ratio = (encoded_size - header_size) / static_cast<double>(source_data.size()); |
| 490 | |
| 491 | if (expected_compression_ratio) |
| 492 | { |
| 493 | ASSERT_LE(compression_ratio, *expected_compression_ratio) |
| 494 | << "\n\tdecoded size: " << source_data.size() |
| 495 | << "\n\tencoded size: " << encoded_size |
| 496 | << "(no header: " << encoded_size - header_size << ")"; |
| 497 | } |
| 498 | } |
| 499 | |
| 500 | class CodecTest : public ::testing::TestWithParam<std::tuple<Codec, CodecTestSequence>> |
| 501 | { |
no test coverage detected