Browse Source

ring buffer and tests

Kajetan Johannes Hammerle 3 years ago
parent
commit
a4e35518b1
6 changed files with 114 additions and 10 deletions
  1. 2 0
      Main.cpp
  2. 1 1
      meson.build
  3. 58 0
      tests/RingBufferTests.cpp
  4. 8 0
      tests/RingBufferTests.h
  5. 8 9
      utils/Random.h
  6. 37 0
      utils/RingBuffer.h

+ 2 - 0
Main.cpp

@@ -4,6 +4,7 @@
 #include "tests/BitArrayTests.h"
 #include "tests/StringBufferTests.h"
 #include "tests/RandomTests.h"
+#include "tests/RingBufferTests.h"
 
 int main() {
     ArrayTests::test();
@@ -12,5 +13,6 @@ int main() {
     BitArrayTests::test();
     StringBufferTests::test();
     RandomTests::test();
+    RingBufferTests::test();
     return 0;
 }

+ 1 - 1
meson.build

@@ -1,6 +1,6 @@
 project('gaming core tests', 'cpp')
 
-sources = ['Main.cpp', 'tests/Test.cpp', 'tests/ArrayTests.cpp', 'tests/HashMapTests.cpp', 'tests/ListTests.cpp', 'tests/BitArrayTests.cpp', 'tests/StringBufferTests.cpp', 'tests/RandomTests.cpp', 'utils/Random.cpp']
+sources = ['Main.cpp', 'tests/Test.cpp', 'tests/ArrayTests.cpp', 'tests/HashMapTests.cpp', 'tests/ListTests.cpp', 'tests/BitArrayTests.cpp', 'tests/StringBufferTests.cpp', 'tests/RandomTests.cpp', 'utils/Random.cpp', 'tests/RingBufferTests.cpp']
 
 executable('tests', 
     sources: sources,

+ 58 - 0
tests/RingBufferTests.cpp

@@ -0,0 +1,58 @@
+#include "tests/RingBufferTests.h"
+#include "tests/Test.h"
+#include "utils/RingBuffer.h"
+
+static void testReadAndWrite(Test& test) {
+    RingBuffer<int, 5> buffer;
+    test.checkEqual(false, buffer.canRead(), "no read from empty buffer");
+    buffer.write(4);
+    test.checkEqual(true, buffer.canRead(), "can read from buffer with value");
+    test.checkEqual(4, buffer.read(), "can read value");
+    test.checkEqual(false, buffer.canRead(), "value is gone after read");
+}
+
+static void testOverflow(Test& test) {
+    RingBuffer<int, 3> buffer;
+    bool r1 = buffer.write(1);
+    bool r2 = buffer.write(2);
+    bool r3 = buffer.write(3);
+    bool r4 = buffer.write(4);
+    bool r5 = buffer.write(5);
+    test.checkEqual(false, r1, "check buffer write return value 1");
+    test.checkEqual(false, r2, "check buffer write return value 2");
+    test.checkEqual(false, r3, "check buffer write return value 3");
+    test.checkEqual(true, r4, "check buffer write return value 4");
+    test.checkEqual(true, r5, "check buffer write return value 5");
+    test.checkEqual(1, buffer.read(), "can read value from overflowed buffer 1");
+    test.checkEqual(2, buffer.read(), "can read value from overflowed buffer 2");
+    test.checkEqual(3, buffer.read(), "can read value from overflowed buffer 3");
+    test.checkEqual(false, buffer.canRead(), "values are gone after full read");
+}
+
+static void testRefill(Test& test) {
+    RingBuffer<int, 3> buffer;
+    buffer.write(1);
+    buffer.write(2);
+    buffer.write(3);
+    buffer.write(4);
+    test.checkEqual(true, buffer.canRead(), "values are ready to be read 2");
+    test.checkEqual(1, buffer.read(), "can read value from overflowed buffer 1");
+    test.checkEqual(2, buffer.read(), "can read value from overflowed buffer 2");
+    test.checkEqual(3, buffer.read(), "can read value from overflowed buffer 3");
+    test.checkEqual(false, buffer.canRead(), "values are gone after full read 1");
+    buffer.write(5);
+    buffer.write(6);
+    test.checkEqual(true, buffer.canRead(), "values are ready to be read 2");
+    test.checkEqual(5, buffer.read(), "can read value from overflowed buffer 4");
+    test.checkEqual(6, buffer.read(), "can read value from overflowed buffer 5");
+    test.checkEqual(false, buffer.canRead(), "values are gone after full read 1");
+    
+}
+
+void RingBufferTests::test() {
+    Test test("RingBuffer");
+    testReadAndWrite(test);
+    testOverflow(test);
+    testRefill(test);
+    test.finalize();
+}

+ 8 - 0
tests/RingBufferTests.h

@@ -0,0 +1,8 @@
+#ifndef RINGBUFFERTESTS_H
+#define RINGBUFFERTESTS_H
+
+namespace RingBufferTests {
+    void test();
+}
+
+#endif

+ 8 - 9
utils/Random.h

@@ -2,6 +2,14 @@
 #define RANDOM_H
 
 class Random final {
+    constexpr static int N = 25;
+    constexpr static int M = 7;
+
+    int data[N];
+    int index;
+
+    void update();
+
 public:
     Random(int seed);
     Random();
@@ -10,15 +18,6 @@ public:
     int next(int min, int inclusiveMax);
     float nextFloat();
     float nextFloat(float min, float exclusiveMax);
-
-private:
-    constexpr static int N = 25;
-    constexpr static int M = 7;
-    
-    void update();
-
-    int data[N];
-    int index;
 };
 
 #endif

+ 37 - 0
utils/RingBuffer.h

@@ -0,0 +1,37 @@
+#ifndef RINGBUFFER_H
+#define RINGBUFFER_H
+
+#include "utils/Array.h"
+
+template<typename T, int N>
+class RingBuffer final {
+    Array<T, N> data;
+    int writeIndex = 0;
+    int readIndex = 0;
+    int values = 0;
+
+public:
+
+    bool write(const T& t) {
+        if(values >= N) {
+            return true;
+        }
+        data[writeIndex] = t;
+        writeIndex = (writeIndex + 1) % N;
+        values++;
+        return false;
+    }
+
+    bool canRead() const {
+        return values > 0;
+    }
+
+    T read() {
+        values -= values > 0;
+        T& t = data[readIndex];
+        readIndex = (readIndex + 1) % N;
+        return t;
+    }
+};
+
+#endif