31 #include <gtest/gtest-spi.h> 32 #include <gtest/gtest.h> 41 TEST(SatCounterTest, MaximumValue)
43 const unsigned bits = 3;
44 const unsigned max_value = (1 <<
bits) - 1;
47 for (
int i = 0;
i < 2*max_value;
i++) {
51 ASSERT_EQ(counter, max_value);
57 TEST(SatCounterTest, MinimumValue)
59 const unsigned bits = 3;
62 for (
int i = 0;
i < 2;
i++) {
66 ASSERT_EQ(counter, 0);
72 TEST(SatCounterTest, InitialValue)
74 const unsigned bits = 3;
75 const unsigned initial_value = 4;
77 ASSERT_EQ(counter, initial_value);
80 ASSERT_EQ(counter, initial_value);
86 TEST(SatCounterTest, SaturationPercentile)
88 const unsigned bits = 3;
89 const unsigned max_value = (1 <<
bits) - 1;
93 for (
double value = 0.0; value <= max_value; value++, counter++) {
94 const double saturation = value / max_value;
105 const unsigned bits = 3;
106 const unsigned max_value = (1 <<
bits) - 1;
112 const unsigned diff = counter.
saturate();
113 ASSERT_EQ(diff, max_value - 1);
120 TEST(SatCounterTest, IntComparison)
122 const unsigned bits = 3;
126 ASSERT_EQ(counter++, value++);
127 ASSERT_EQ(counter++, value++);
128 ASSERT_EQ(counter--, value--);
129 ASSERT_EQ(counter++, value++);
130 ASSERT_EQ(counter++, value++);
131 ASSERT_EQ(counter--, value--);
132 ASSERT_EQ(counter++, value++);
133 ASSERT_EQ(counter--, value--);
134 ASSERT_EQ(counter--, value--);
135 ASSERT_EQ(counter++, value++);
136 ASSERT_EQ(counter--, value--);
137 ASSERT_EQ(counter--, value--);
138 ASSERT_EQ(counter, 0);
146 const unsigned bits = 3;
147 const unsigned max_value = (1 <<
bits) - 1;
148 const unsigned initial_value = 1;
154 int value = initial_value;
159 ASSERT_EQ(counter, value);
162 ASSERT_EQ(counter, value);
166 ASSERT_EQ(counter, max_value);
170 ASSERT_EQ(counter, 0);
174 value = initial_value;
177 ASSERT_EQ(counter, value);
178 counter <<= saturated_counter;
180 ASSERT_EQ(counter, max_value);
185 ASSERT_EQ(counter, value);
186 counter >>= saturated_counter;
187 ASSERT_EQ(counter, 0);
191 ASSERT_DEATH(counter >>= -1,
"");
192 ASSERT_DEATH(counter <<= -1,
"");
198 TEST(SatCounterTest, PrePostOperators)
200 const unsigned bits = 3;
201 const unsigned max_value = (1 <<
bits) - 1;
205 for (
int i = 0;
i < 2*max_value;
i++) {
208 ASSERT_EQ(counter_post, value_pre);
211 ASSERT_EQ(counter_pre, max_value);
212 ASSERT_EQ(counter_post, max_value);
214 for (
int i = 0;
i < 2*max_value;
i++) {
217 ASSERT_EQ(counter_post, value_pre);
220 ASSERT_EQ(counter_pre, 0);
221 ASSERT_EQ(counter_post, 0);
229 const unsigned bits = 3;
230 const unsigned max_value = (1 <<
bits) - 1;
231 const unsigned initial_value = 1;
242 deep_copy = counter_copy = counter;
243 ASSERT_EQ(counter_copy_constructor, initial_value + 1);
244 ASSERT_EQ(counter_copy, initial_value + 1);
245 ASSERT_EQ(deep_copy, initial_value + 1);
249 for (
int i = 0;
i < 2*max_value;
i++) {
250 counter_copy_constructor++;
254 ASSERT_EQ(counter, initial_value + 1);
255 ASSERT_EQ(counter_copy_constructor, max_value);
256 ASSERT_EQ(counter_copy, max_value);
257 ASSERT_EQ(deep_copy, max_value);
260 counter_copy_constructor.
reset();
261 counter_copy.
reset();
263 ASSERT_EQ(counter_copy_constructor, initial_value);
264 ASSERT_EQ(counter_copy, initial_value);
265 ASSERT_EQ(deep_copy, initial_value);
268 SatCounter counter_move_constructor(std::move(counter));
269 ASSERT_EQ(counter, 0);
270 ASSERT_EQ(counter_move_constructor, initial_value + 1);
273 counter_move = std::move(counter_move_constructor);
274 ASSERT_EQ(counter_move_constructor, 0);
275 ASSERT_EQ(counter_move, initial_value + 1);
281 TEST(SatCounterTest, AddSubAssignment)
283 const unsigned bits = 3;
284 const unsigned max_value = (1 <<
bits) - 1;
287 SatCounter saturated_counter(bits, max_value);
293 ASSERT_EQ(counter, value);
296 ASSERT_EQ(counter, value);
297 counter += max_value;
299 ASSERT_EQ(counter, value);
304 ASSERT_EQ(counter, value);
307 ASSERT_EQ(counter, value);
308 counter -= max_value;
310 ASSERT_EQ(counter, value);
315 ASSERT_EQ(counter, value);
316 counter += saturated_counter;
318 ASSERT_EQ(counter, saturated_counter);
323 ASSERT_EQ(counter, value);
324 counter -= saturated_counter;
325 ASSERT_EQ(counter, 0);
331 TEST(SatCounterTest, NegativeAddSubAssignment)
333 const unsigned bits = 3;
334 const unsigned max_value = (1 <<
bits) - 1;
336 int value = max_value;
341 ASSERT_EQ(counter, value);
344 ASSERT_EQ(counter, value);
345 counter += (int)-max_value;
347 ASSERT_EQ(counter, value);
352 ASSERT_EQ(counter, value);
355 ASSERT_EQ(counter, value);
356 counter -= (int)-max_value;
358 ASSERT_EQ(counter, value);
TEST(SatCounterTest, MaximumValue)
Test if the maximum value is indeed the maximum value reachable.
double calcSaturation() const
Calculate saturation percentile of the current counter's value with regard to its maximum possible va...
Implements an n bit saturating counter and provides methods to increment, decrement, and read it.
void reset()
Reset the counter to its initial value.
uint8_t saturate()
Saturate the counter.
bool isSaturated() const
Whether the counter has achieved its maximum value or not.
T bits(T val, int first, int last)
Extract the bitfield from position 'first' to 'last' (inclusive) from 'val' and right justify it...