Advanced Chunk Processing Library 0.2.0
A comprehensive C++ library for advanced data chunking strategies and processing operations
Loading...
Searching...
No Matches
chunk_compress_test.cpp
Go to the documentation of this file.
2#include <cstdint> // for uint64_t
3#include <gtest/gtest.h>
4#include <limits>
5#include <numeric> // for std::iota
6#include <utility> // for std::pair
7#include <vector>
8
9using namespace chunk_compression;
10
11template <typename T>
12bool ComparePairs(const std::pair<T, size_t>& lhs, const std::pair<T, size_t>& rhs) {
13 return lhs.first == rhs.first && lhs.second == rhs.second;
14}
15
16class ChunkCompressorTest : public ::testing::Test {
17protected:
18 std::vector<int> repeated_data = {1, 1, 1, 2, 2, 3, 3, 3, 3};
19 std::vector<int> single_value = {5};
20 std::vector<int> unique_data = {1, 2, 3, 4, 5};
21 std::vector<int> empty_data = {};
22 std::vector<double> floating_data = {1.5, 1.5, 2.5, 2.5, 2.5};
23};
24
25// Run-Length Encoding Tests
26TEST_F(ChunkCompressorTest, BasicRunLengthEncode) {
27 auto encoded = ChunkCompressor<int>::run_length_encode(repeated_data);
28 EXPECT_EQ(encoded.size(), 3);
29 EXPECT_TRUE(ComparePairs(encoded[0], std::make_pair(1, size_t(3))));
30 EXPECT_TRUE(ComparePairs(encoded[1], std::make_pair(2, size_t(2))));
31 EXPECT_TRUE(ComparePairs(encoded[2], std::make_pair(3, size_t(4))));
32}
33
34TEST_F(ChunkCompressorTest, SingleValueRunLength) {
35 auto encoded = ChunkCompressor<int>::run_length_encode(single_value);
36 EXPECT_EQ(encoded.size(), 1);
37 EXPECT_TRUE(ComparePairs(encoded[0], std::make_pair(5, size_t(1))));
38}
39
40TEST_F(ChunkCompressorTest, UniqueValuesRunLength) {
41 auto encoded = ChunkCompressor<int>::run_length_encode(unique_data);
42 EXPECT_EQ(encoded.size(), unique_data.size());
43 for (size_t i = 0; i < encoded.size(); ++i) {
44 EXPECT_TRUE(ComparePairs(encoded[i], std::make_pair(unique_data[i], size_t(1))));
45 }
46}
47
48TEST_F(ChunkCompressorTest, EmptyRunLength) {
49 auto encoded = ChunkCompressor<int>::run_length_encode(empty_data);
50 EXPECT_TRUE(encoded.empty());
51}
52
53TEST_F(ChunkCompressorTest, FloatingPointRunLength) {
54 auto encoded = ChunkCompressor<double>::run_length_encode(floating_data);
55 EXPECT_EQ(encoded.size(), 2);
56 EXPECT_TRUE(ComparePairs(encoded[0], std::make_pair(1.5, size_t(2))));
57 EXPECT_TRUE(ComparePairs(encoded[1], std::make_pair(2.5, size_t(3))));
58}
59
60// Delta Encoding Tests
61TEST_F(ChunkCompressorTest, BasicDeltaEncode) {
62 std::vector<int> sequence = {10, 13, 15, 16, 20};
63 auto encoded = ChunkCompressor<int>::delta_encode(sequence);
64 EXPECT_EQ(encoded.size(), sequence.size());
65 EXPECT_EQ(encoded[0], 10); // First value unchanged
66 EXPECT_EQ(encoded[1], 3); // 13 - 10
67 EXPECT_EQ(encoded[2], 2); // 15 - 13
68 EXPECT_EQ(encoded[3], 1); // 16 - 15
69 EXPECT_EQ(encoded[4], 4); // 20 - 16
70}
71
72TEST_F(ChunkCompressorTest, DeltaEncodeConstantSequence) {
73 std::vector<int> constant = {5, 5, 5, 5, 5};
74 auto encoded = ChunkCompressor<int>::delta_encode(constant);
75 EXPECT_EQ(encoded[0], 5);
76 for (size_t i = 1; i < encoded.size(); ++i) {
77 EXPECT_EQ(encoded[i], 0);
78 }
79}
80
81TEST_F(ChunkCompressorTest, DeltaEncodeEmpty) {
82 auto encoded = ChunkCompressor<int>::delta_encode(empty_data);
83 EXPECT_TRUE(encoded.empty());
84}
85
86TEST_F(ChunkCompressorTest, DeltaEncodeSingle) {
87 auto encoded = ChunkCompressor<int>::delta_encode(single_value);
88 EXPECT_EQ(encoded.size(), 1);
89 EXPECT_EQ(encoded[0], single_value[0]);
90}
91
92// Delta Decoding Tests
93TEST_F(ChunkCompressorTest, DeltaEncodeDecode) {
94 std::vector<int> original = {10, 13, 15, 16, 20};
95 auto encoded = ChunkCompressor<int>::delta_encode(original);
96 auto decoded = ChunkCompressor<int>::delta_decode(encoded);
97 EXPECT_EQ(decoded, original);
98}
99
100TEST_F(ChunkCompressorTest, DeltaDecodeEmpty) {
101 auto decoded = ChunkCompressor<int>::delta_decode(empty_data);
102 EXPECT_TRUE(decoded.empty());
103}
104
105TEST_F(ChunkCompressorTest, DeltaDecodeSingle) {
106 auto decoded = ChunkCompressor<int>::delta_decode(single_value);
107 EXPECT_EQ(decoded, single_value);
108}
109
110// Edge Cases and Special Values
112 std::vector<int> large_values = {std::numeric_limits<int>::max() - 2,
113 std::numeric_limits<int>::max() - 1,
114 std::numeric_limits<int>::max()};
115 auto encoded = ChunkCompressor<int>::delta_encode(large_values);
116 auto decoded = ChunkCompressor<int>::delta_decode(encoded);
117 EXPECT_EQ(decoded, large_values);
118}
119
120TEST_F(ChunkCompressorTest, NegativeDeltas) {
121 std::vector<int> alternating = {5, 3, 8, 1, 6};
122 auto encoded = ChunkCompressor<int>::delta_encode(alternating);
123 auto decoded = ChunkCompressor<int>::delta_decode(encoded);
124 EXPECT_EQ(decoded, alternating);
125}
126
127TEST_F(ChunkCompressorTest, FloatingPointDelta) {
128 std::vector<double> float_sequence = {1.5, 2.5, 2.0, 3.5};
129 auto encoded = ChunkCompressor<double>::delta_encode(float_sequence);
130 auto decoded = ChunkCompressor<double>::delta_decode(encoded);
131
132 for (size_t i = 0; i < float_sequence.size(); ++i) {
133 EXPECT_DOUBLE_EQ(decoded[i], float_sequence[i]);
134 }
135}
136
137// Performance Tests
138TEST_F(ChunkCompressorTest, LargeSequenceCompression) {
139 std::vector<int> large_sequence(10000, 42); // Long sequence of same value
140 auto encoded = ChunkCompressor<int>::run_length_encode(large_sequence);
141 EXPECT_EQ(encoded.size(), 1);
142 EXPECT_TRUE(ComparePairs(encoded[0], std::make_pair(42, size_t(10000))));
143}
144
145TEST_F(ChunkCompressorTest, LongDeltaSequence) {
146 std::vector<int> long_sequence(10000);
147 std::iota(long_sequence.begin(), long_sequence.end(), 0); // 0,1,2,3,...
148 auto encoded = ChunkCompressor<int>::delta_encode(long_sequence);
149 auto decoded = ChunkCompressor<int>::delta_decode(encoded);
150 EXPECT_EQ(decoded, long_sequence);
151}
TEST_F(ChunkCompressorTest, BasicRunLengthEncode)
bool ComparePairs(const std::pair< T, size_t > &lhs, const std::pair< T, size_t > &rhs)
std::vector< double > floating_data
std::vector< int > unique_data
std::vector< int > repeated_data
std::vector< int > empty_data
std::vector< int > single_value
static std::vector< T > delta_encode(const std::vector< T > &chunk)
Delta encode a chunk.
static std::vector< std::pair< T, size_t > > run_length_encode(const std::vector< T > &chunk)
Run-length encode a chunk.
static std::vector< T > delta_decode(const std::vector< T > &chunk)
Delta decode a chunk.