Advanced Chunk Processing Library 0.2.0
A comprehensive C++ library for advanced data chunking strategies and processing operations
Loading...
Searching...
No Matches
chunk_compression_test.cpp
Go to the documentation of this file.
2#include "gtest/gtest.h"
3
4using namespace chunk_compression;
5
6class ChunkCompressorTest : public ::testing::Test {
7protected:
8 void SetUp() override {
9 test_data = {1, 1, 1, 2, 2, 3, 4, 4, 4, 4};
10 empty_data = {};
11 single_data = {42};
12 same_data = std::vector<int>(5, 7);
13 }
14
15 std::vector<int> test_data;
16 std::vector<int> empty_data;
17 std::vector<int> single_data;
18 std::vector<int> same_data;
19};
20
21TEST_F(ChunkCompressorTest, RunLengthEncoding) {
22 auto encoded = ChunkCompressor<int>::run_length_encode(test_data);
23
24 EXPECT_EQ(encoded.size(), 4);
25 EXPECT_EQ(encoded[0], (std::pair<int, size_t>{1, 3}));
26 EXPECT_EQ(encoded[1], (std::pair<int, size_t>{2, 2}));
27 EXPECT_EQ(encoded[2], (std::pair<int, size_t>{3, 1}));
28 EXPECT_EQ(encoded[3], (std::pair<int, size_t>{4, 4}));
29}
30
31TEST_F(ChunkCompressorTest, DeltaEncoding) {
32 std::vector<int> data = {10, 12, 15, 19, 24};
33 auto encoded = ChunkCompressor<int>::delta_encode(data);
34 auto decoded = ChunkCompressor<int>::delta_decode(encoded);
35
36 EXPECT_EQ(encoded, (std::vector<int>{10, 2, 3, 4, 5}));
37 EXPECT_EQ(decoded, data);
38}
39
40TEST_F(ChunkCompressorTest, EmptyCompression) {
41 EXPECT_TRUE(ChunkCompressor<int>::run_length_encode(empty_data).empty());
42 EXPECT_TRUE(ChunkCompressor<int>::delta_encode(empty_data).empty());
43}
44
45TEST_F(ChunkCompressorTest, SingleElementCompression) {
46 auto rle = ChunkCompressor<int>::run_length_encode(single_data);
47 EXPECT_EQ(rle.size(), 1);
48
49 auto delta = ChunkCompressor<int>::delta_encode(single_data);
50 EXPECT_EQ(delta.size(), 1);
51}
52
53TEST_F(ChunkCompressorTest, AllSameElements) {
54 auto rle = ChunkCompressor<int>::run_length_encode(same_data);
55 EXPECT_EQ(rle.size(), 1);
56}
57
58TEST_F(ChunkCompressorTest, RunLengthEdgeCases) {
59 // Test alternating values
60 std::vector<int> alternating = {1, 2, 1, 2, 1, 2};
61 auto encoded = ChunkCompressor<int>::run_length_encode(alternating);
62 EXPECT_EQ(encoded.size(), 6);
63 for (size_t i = 0; i < encoded.size(); ++i) {
64 EXPECT_EQ(encoded[i].first, (i % 2) + 1);
65 EXPECT_EQ(encoded[i].second, 1);
66 }
67
68 // Test single repeated value
69 std::vector<int> repeated(5, 42);
70 auto encoded_repeated = ChunkCompressor<int>::run_length_encode(repeated);
71 EXPECT_EQ(encoded_repeated.size(), 1);
72 EXPECT_EQ(encoded_repeated[0], (std::pair<int, size_t>{42, 5}));
73}
74
75TEST_F(ChunkCompressorTest, DeltaEdgeCases) {
76 // Test constant sequence
77 std::vector<int> constant(5, 7);
78 auto encoded_constant = ChunkCompressor<int>::delta_encode(constant);
79 EXPECT_EQ(encoded_constant[0], 7);
80 for (size_t i = 1; i < encoded_constant.size(); ++i) {
81 EXPECT_EQ(encoded_constant[i], 0);
82 }
83
84 // Test decreasing sequence
85 std::vector<int> decreasing = {10, 8, 6, 4, 2};
86 auto encoded_decreasing = ChunkCompressor<int>::delta_encode(decreasing);
87 EXPECT_EQ(encoded_decreasing[0], 10);
88 for (size_t i = 1; i < encoded_decreasing.size(); ++i) {
89 EXPECT_EQ(encoded_decreasing[i], -2);
90 }
91}
92
93TEST_F(ChunkCompressorTest, DeltaRoundTrip) {
94 // Test various sequences
95 std::vector<std::vector<int>> test_sequences = {
96 {1, 1, 1, 1}, // Constant
97 {1, 2, 3, 4, 5}, // Linear increasing
98 {5, 4, 3, 2, 1}, // Linear decreasing
99 {1, 3, 6, 10, 15}, // Quadratic
100 {-2, -1, 0, 1, 2} // Negative to positive
101 };
102
103 for (const auto& sequence : test_sequences) {
104 auto encoded = ChunkCompressor<int>::delta_encode(sequence);
105 auto decoded = ChunkCompressor<int>::delta_decode(encoded);
106 EXPECT_EQ(decoded, sequence) << "Failed for sequence starting with " << sequence[0];
107 }
108}
109
111 std::vector<int> large_nums = {1000000, 1000001, 1000002, 1000003};
112
113 // Test RLE with large numbers
114 auto rle = ChunkCompressor<int>::run_length_encode(large_nums);
115 EXPECT_EQ(rle.size(), 4);
116 for (size_t i = 0; i < rle.size(); ++i) {
117 EXPECT_EQ(rle[i].first, 1000000 + i);
118 EXPECT_EQ(rle[i].second, 1);
119 }
120
121 // Test delta encoding with large numbers
122 auto delta = ChunkCompressor<int>::delta_encode(large_nums);
123 EXPECT_EQ(delta[0], 1000000);
124 for (size_t i = 1; i < delta.size(); ++i) {
125 EXPECT_EQ(delta[i], 1);
126 }
127}
128
130 std::vector<int> mixed = {1, 1, 1, 2, 3, 3, 4, 4, 4, 4};
131
132 // Test RLE with mixed patterns
134 EXPECT_EQ(rle.size(), 4);
135 EXPECT_EQ(rle[0], (std::pair<int, size_t>{1, 3}));
136 EXPECT_EQ(rle[1], (std::pair<int, size_t>{2, 1}));
137 EXPECT_EQ(rle[2], (std::pair<int, size_t>{3, 2}));
138 EXPECT_EQ(rle[3], (std::pair<int, size_t>{4, 4}));
139
140 // Test delta encoding with mixed patterns
141 auto delta = ChunkCompressor<int>::delta_encode(mixed);
142 auto decoded = ChunkCompressor<int>::delta_decode(delta);
143 EXPECT_EQ(decoded, mixed);
144}
145
146TEST_F(ChunkCompressorTest, CompressionRatio) {
147 // Create a highly compressible sequence
148 std::vector<int> compressible(100, 42);
149 auto rle = ChunkCompressor<int>::run_length_encode(compressible);
150 EXPECT_EQ(rle.size(), 1);
151 EXPECT_EQ(rle[0].second, 100);
152
153 // Create a sequence with poor compression
154 std::vector<int> incompressible;
155 for (int i = 0; i < 100; ++i) {
156 incompressible.push_back(i);
157 }
158 auto rle_incomp = ChunkCompressor<int>::run_length_encode(incompressible);
159 EXPECT_EQ(rle_incomp.size(), 100);
160}
TEST_F(ChunkCompressorTest, RunLengthEncoding)
std::vector< int > empty_data
std::vector< int > single_data
Compression strategies for chunk data.
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.