summaryrefslogtreecommitdiff
path: root/Source/UnitTests/Common/FixedSizeQueueTest.cpp
diff options
context:
space:
mode:
authorSilent <zdanio95@gmail.com>2019-08-31 20:16:16 +0200
committerSilent <zdanio95@gmail.com>2019-08-31 21:18:07 +0200
commitb3969e91d901ae6c30c9fc12c7e457658817903c (patch)
treecf5e232e17bac973683d7c0eb982dacb892be347 /Source/UnitTests/Common/FixedSizeQueueTest.cpp
parentb088fc37d5de88b122c3e440319b421de9bee209 (diff)
FixedSizeQueue: Bugfixes and improvements
- Fixed a bug where pushing items over queue's size left it in a corrupted state - For non-trivial types, have clear() and pop() run destructors - Added emplace(args...) - Added empty() FixedSizeQueue has semantics of a circular buffer, so pushing items continuously is expected to keep overwriting oldest elements gracefully. Tests have been updated to verify correctness of a previously bugged behaviour and to verify correctness of destructing non-trivial types
Diffstat (limited to 'Source/UnitTests/Common/FixedSizeQueueTest.cpp')
-rw-r--r--Source/UnitTests/Common/FixedSizeQueueTest.cpp82
1 files changed, 82 insertions, 0 deletions
diff --git a/Source/UnitTests/Common/FixedSizeQueueTest.cpp b/Source/UnitTests/Common/FixedSizeQueueTest.cpp
index 1461ad672f..a6f6d7e833 100644
--- a/Source/UnitTests/Common/FixedSizeQueueTest.cpp
+++ b/Source/UnitTests/Common/FixedSizeQueueTest.cpp
@@ -31,3 +31,85 @@ TEST(FixedSizeQueue, Simple)
EXPECT_EQ(0u, q.size());
}
+
+TEST(FixedSizeQueue, RingBuffer)
+{
+ // Testing if queue works when used as a ring buffer
+ FixedSizeQueue<int, 5> q;
+
+ EXPECT_EQ(0u, q.size());
+
+ q.push(0);
+ q.push(1);
+ q.push(2);
+ q.push(3);
+ q.push(4);
+ q.push(5);
+
+ EXPECT_EQ(5u, q.size());
+ EXPECT_EQ(1, q.pop_front());
+
+ EXPECT_EQ(4u, q.size());
+}
+
+// Local classes cannot have static fields,
+// therefore this has to be declared in global scope.
+class NonTrivialTypeTestData
+{
+public:
+ static inline int num_objects = 0;
+ static inline int total_constructed = 0;
+ static inline int default_constructed = 0;
+ static inline int total_destructed = 0;
+
+ NonTrivialTypeTestData()
+ {
+ num_objects++;
+ total_constructed++;
+ default_constructed++;
+ }
+
+ NonTrivialTypeTestData(int /*val*/)
+ {
+ num_objects++;
+ total_constructed++;
+ }
+
+ ~NonTrivialTypeTestData()
+ {
+ num_objects--;
+ total_destructed++;
+ }
+};
+
+TEST(FixedSizeQueue, NonTrivialTypes)
+{
+ // Testing if construction/destruction of non-trivial types happens as expected
+ FixedSizeQueue<NonTrivialTypeTestData, 2> q;
+
+ EXPECT_EQ(0u, q.size());
+
+ EXPECT_EQ(2, NonTrivialTypeTestData::num_objects);
+ EXPECT_EQ(2, NonTrivialTypeTestData::total_constructed);
+ EXPECT_EQ(2, NonTrivialTypeTestData::default_constructed);
+ EXPECT_EQ(0, NonTrivialTypeTestData::total_destructed);
+
+ q.emplace(4);
+ q.emplace(6);
+ q.emplace(8);
+
+ EXPECT_EQ(2, NonTrivialTypeTestData::num_objects);
+ EXPECT_EQ(2 + 3, NonTrivialTypeTestData::total_constructed);
+ EXPECT_EQ(2, NonTrivialTypeTestData::default_constructed);
+ EXPECT_EQ(3, NonTrivialTypeTestData::total_destructed);
+ EXPECT_EQ(2u, q.size());
+
+ q.pop();
+ q.pop();
+
+ EXPECT_EQ(2, NonTrivialTypeTestData::num_objects);
+ EXPECT_EQ(2 + 3 + 2, NonTrivialTypeTestData::total_constructed);
+ EXPECT_EQ(2 + 2, NonTrivialTypeTestData::default_constructed);
+ EXPECT_EQ(3 + 2, NonTrivialTypeTestData::total_destructed);
+ EXPECT_EQ(0u, q.size());
+}