Advanced Chunk Processing Library 0.2.0
A comprehensive C++ library for advanced data chunking strategies and processing operations
Loading...
Searching...
No Matches
utils_test.cpp
Go to the documentation of this file.
1#include "utils.hpp"
2#include <gtest/gtest.h>
3#include <vector>
4
5using namespace chunk_utils;
6
7class StatisticsTest : public ::testing::Test {
8protected:
9 std::vector<double> test_data = {1.0, 2.0, 3.0, 4.0, 5.0};
10 std::vector<double> empty_data = {};
11 std::vector<double> duplicate_data = {1.0, 2.0, 2.0, 3.0, 4.0};
12};
13
14// Statistics Tests
15TEST_F(StatisticsTest, MeanCalculation) {
16 EXPECT_DOUBLE_EQ(Statistics<double>::mean(test_data), 3.0);
17 EXPECT_DOUBLE_EQ(Statistics<double>::mean(empty_data), 0.0);
18}
19
20TEST_F(StatisticsTest, MedianCalculation) {
21 EXPECT_DOUBLE_EQ(Statistics<double>::median(test_data), 3.0);
22 EXPECT_DOUBLE_EQ(Statistics<double>::median(empty_data), 0.0);
23
24 // Even number of elements
25 std::vector<double> even_data = {1.0, 2.0, 3.0, 4.0};
26 EXPECT_DOUBLE_EQ(Statistics<double>::median(even_data), 2.5);
27}
28
29TEST_F(StatisticsTest, ModeCalculation) {
30 auto mode_result = Statistics<double>::mode(duplicate_data);
31 EXPECT_DOUBLE_EQ(mode_result.first, 2.0);
32 EXPECT_EQ(mode_result.second, 2);
33
34 auto empty_mode = Statistics<double>::mode(empty_data);
35 EXPECT_DOUBLE_EQ(empty_mode.first, 0.0);
36 EXPECT_EQ(empty_mode.second, 0);
37}
38
39// ChunkManipulator Tests
40class ChunkManipulatorTest : public ::testing::Test {
41protected:
42 std::vector<std::vector<double>> chunks1 = {{1.0, 2.0}, {3.0, 4.0}};
43 std::vector<std::vector<double>> chunks2 = {{5.0, 6.0}, {7.0, 8.0}};
44 std::vector<std::vector<double>> empty_chunks = {};
45};
46
48 auto merged = ChunkManipulator<double>::merge_chunks(chunks1, chunks2);
49 EXPECT_EQ(merged.size(), 4);
50 EXPECT_EQ(merged[0], std::vector<double>({1.0, 2.0}));
51 EXPECT_EQ(merged[3], std::vector<double>({7.0, 8.0}));
52}
53
56 chunks1, [](const std::vector<double>& chunk) { return chunk[0] > 2.0; });
57 EXPECT_EQ(filtered.size(), 1);
58 EXPECT_EQ(filtered[0], std::vector<double>({3.0, 4.0}));
59}
60
61TEST_F(ChunkManipulatorTest, TransformChunks) {
62 auto transformed =
63 ChunkManipulator<double>::transform_chunks(chunks1, [](const std::vector<double>& chunk) {
64 std::vector<double> result = chunk;
65 for (auto& val : result)
66 val *= 2;
67 return result;
68 });
69 EXPECT_EQ(transformed.size(), 2);
70 EXPECT_EQ(transformed[0], std::vector<double>({2.0, 4.0}));
71}
72
73// ChunkGenerator Tests
74class ChunkGeneratorTest : public ::testing::Test {
75protected:
76 const size_t test_size = 1000;
77 const double min_val = 0.0;
78 const double max_val = 10.0;
79};
80
81TEST_F(ChunkGeneratorTest, GenerateRandomData) {
82 auto data = ChunkGenerator<double>::generate_random_data(test_size, min_val, max_val);
83 EXPECT_EQ(data.size(), test_size);
84
85 // Check bounds
86 for (const auto& val : data) {
87 EXPECT_GE(val, min_val);
88 EXPECT_LE(val, max_val);
89 }
90}
91
92TEST_F(ChunkGeneratorTest, GenerateRandomChunks) {
93 const size_t num_chunks = 5;
94 const size_t chunk_size = 10;
95
96 auto chunks =
97 ChunkGenerator<double>::generate_random_chunks(num_chunks, chunk_size, min_val, max_val);
98 EXPECT_EQ(chunks.size(), num_chunks);
99
100 for (const auto& chunk : chunks) {
101 EXPECT_EQ(chunk.size(), chunk_size);
102 for (const auto& val : chunk) {
103 EXPECT_GE(val, min_val);
104 EXPECT_LE(val, max_val);
105 }
106 }
107}
108
109// Edge Cases and Special Values
110TEST_F(StatisticsTest, HandleSpecialValues) {
111 std::vector<double> special_values = {std::numeric_limits<double>::infinity(),
112 -std::numeric_limits<double>::infinity(),
113 std::numeric_limits<double>::quiet_NaN()};
114
115 // Mean should handle special values
116 EXPECT_FALSE(std::isfinite(Statistics<double>::mean(special_values)));
117}
118
119TEST_F(ChunkManipulatorTest, EmptyChunkOperations) {
120 // Merge with empty chunks
121 auto merged_empty = ChunkManipulator<double>::merge_chunks(chunks1, empty_chunks);
122 EXPECT_EQ(merged_empty.size(), chunks1.size());
123
124 // Filter empty chunks
125 auto filtered_empty = ChunkManipulator<double>::filter_chunks(
126 empty_chunks, [](const std::vector<double>&) { return true; });
127 EXPECT_TRUE(filtered_empty.empty());
128
129 // Transform empty chunks
130 auto transformed_empty = ChunkManipulator<double>::transform_chunks(
131 empty_chunks, [](const std::vector<double>& chunk) { return chunk; });
132 EXPECT_TRUE(transformed_empty.empty());
133}
134
135TEST_F(ChunkGeneratorTest, ZeroSizeGeneration) {
136 auto empty_data = ChunkGenerator<double>::generate_random_data(0, min_val, max_val);
137 EXPECT_TRUE(empty_data.empty());
138
139 auto empty_chunks = ChunkGenerator<double>::generate_random_chunks(0, 5, min_val, max_val);
140 EXPECT_TRUE(empty_chunks.empty());
141}
142
143// Performance Tests
144TEST_F(ChunkGeneratorTest, LargeDataGeneration) {
145 const size_t large_size = 1000000;
146 auto large_data = ChunkGenerator<double>::generate_random_data(large_size, min_val, max_val);
147 EXPECT_EQ(large_data.size(), large_size);
148}
const size_t test_size
const double max_val
const double min_val
std::vector< std::vector< double > > chunks1
std::vector< std::vector< double > > chunks2
std::vector< std::vector< double > > empty_chunks
std::vector< double > test_data
Definition utils_test.cpp:9
std::vector< double > duplicate_data
std::vector< double > empty_data
static std::vector< T > generate_random_data(size_t size, T min_val, T max_val)
Definition utils.hpp:86
static std::vector< std::vector< T > > generate_random_chunks(size_t num_chunks, size_t chunk_size, T min_val, T max_val)
Definition utils.hpp:93
static std::vector< std::vector< T > > transform_chunks(const std::vector< std::vector< T > > &chunks, std::function< std::vector< T >(const std::vector< T > &)> transformer)
Definition utils.hpp:70
static std::vector< std::vector< T > > merge_chunks(const std::vector< std::vector< T > > &chunks1, const std::vector< std::vector< T > > &chunks2)
Definition utils.hpp:54
static std::vector< std::vector< T > > filter_chunks(const std::vector< std::vector< T > > &chunks, std::function< bool(const std::vector< T > &)> predicate)
Definition utils.hpp:62
static std::pair< T, size_t > mode(const std::vector< T > &data)
Definition utils.hpp:38
TEST_F(StatisticsTest, MeanCalculation)