summaryrefslogtreecommitdiff
path: root/src/base/sat_counter.test.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/base/sat_counter.test.cc')
-rw-r--r--src/base/sat_counter.test.cc39
1 files changed, 39 insertions, 0 deletions
diff --git a/src/base/sat_counter.test.cc b/src/base/sat_counter.test.cc
index 817f2c7ac..d9a377f9f 100644
--- a/src/base/sat_counter.test.cc
+++ b/src/base/sat_counter.test.cc
@@ -28,6 +28,7 @@
* Authors: Daniel Carvalho
*/
+#include <gtest/gtest-spi.h>
#include <gtest/gtest.h>
#include <utility>
@@ -184,6 +185,11 @@ TEST(SatCounterTest, Shift)
ASSERT_EQ(counter, value);
counter >>= saturated_counter;
ASSERT_EQ(counter, 0);
+
+ // Make sure the counters cannot be shifted by negative numbers, since
+ // that is undefined behaviour
+ ASSERT_DEATH(counter >>= -1, "");
+ ASSERT_DEATH(counter <<= -1, "");
}
/**
@@ -319,3 +325,36 @@ TEST(SatCounterTest, AddSubAssignment)
ASSERT_EQ(counter, 0);
}
+/**
+ * Test add-assignment and subtract assignment using negative numbers.
+ */
+TEST(SatCounterTest, NegativeAddSubAssignment)
+{
+ const unsigned bits = 3;
+ const unsigned max_value = (1 << bits) - 1;
+ SatCounter counter(bits, max_value);
+ int value = max_value;
+
+ // Test add-assignment for a few negative values until zero is reached
+ counter += -2;
+ value += -2;
+ ASSERT_EQ(counter, value);
+ counter += -3;
+ value += -3;
+ ASSERT_EQ(counter, value);
+ counter += (int)-max_value;
+ value = 0;
+ ASSERT_EQ(counter, value);
+
+ // Test subtract-assignment for a few negative values until saturation
+ counter -= -2;
+ value -= -2;
+ ASSERT_EQ(counter, value);
+ counter -= -3;
+ value -= -3;
+ ASSERT_EQ(counter, value);
+ counter -= (int)-max_value;
+ value = max_value;
+ ASSERT_EQ(counter, value);
+}
+