#include "../Tests.hpp" #include "core/data/RingBuffer.hpp" template class Core::RingBuffer; struct Tester final { static int ids; static int sum; int id; Tester() : id(++ids) { sum += id; } Tester(const Tester&) : id(++ids) { sum += id; } Tester(Tester&&) : id(++ids) { sum += id; } Tester& operator=(const Tester&) { return *this; } Tester& operator=(Tester&&) { return *this; } ~Tester() { sum -= id; } void toString(Core::BufferString& s) const { s.append(id); } }; int Tester::ids = 0; int Tester::sum = 0; static void resetTester() { Tester::ids = 0; Tester::sum = 0; } static void testReadAndWrite() { Core::RingBuffer buffer; CORE_TEST_FALSE(buffer.canRemove()); CORE_TEST_EQUAL(0, buffer.getLength()); buffer.add(4); CORE_TEST_EQUAL(1, buffer.getLength()); CORE_TEST_TRUE(buffer.canRemove()); CORE_TEST_EQUAL(4, buffer[0]); buffer.remove(); CORE_TEST_FALSE(buffer.canRemove()); CORE_TEST_EQUAL(0, buffer.getLength()); } static void testOverflow() { Core::RingBuffer buffer; buffer.add(1).add(2).add(3).add(4).add(5); CORE_TEST_EQUAL(3, buffer.getLength()); CORE_TEST_EQUAL(1, buffer[0]); buffer.remove(); CORE_TEST_EQUAL(2, buffer.getLength()); CORE_TEST_EQUAL(2, buffer[0]); buffer.remove(); CORE_TEST_EQUAL(1, buffer.getLength()); CORE_TEST_EQUAL(3, buffer[0]); buffer.remove(); CORE_TEST_FALSE(buffer.canRemove()); CORE_TEST_EQUAL(0, buffer.getLength()); } static void testRefill() { Core::RingBuffer buffer; buffer.add(1).add(2).add(3).add(4); CORE_TEST_EQUAL(3, buffer.getLength()); CORE_TEST_TRUE(buffer.canRemove()); CORE_TEST_EQUAL(1, buffer[0]); buffer.remove(); CORE_TEST_EQUAL(2, buffer[0]); buffer.remove(); CORE_TEST_EQUAL(3, buffer[0]); buffer.remove(); CORE_TEST_EQUAL(0, buffer.getLength()); CORE_TEST_FALSE(buffer.canRemove()); buffer.add(5).add(6); CORE_TEST_EQUAL(2, buffer.getLength()); CORE_TEST_TRUE(buffer.canRemove()); CORE_TEST_EQUAL(5, buffer[0]); buffer.remove(); CORE_TEST_EQUAL(6, buffer[0]); buffer.remove(); CORE_TEST_FALSE(buffer.canRemove()); CORE_TEST_EQUAL(0, buffer.getLength()); } static void testClear() { Core::RingBuffer buffer; buffer.add(1).add(2); CORE_TEST_EQUAL(2, buffer.getLength()); buffer.clear(); CORE_TEST_FALSE(buffer.canRemove()); CORE_TEST_EQUAL(0, buffer.getLength()); } static void testConstructDestruct() { resetTester(); Core::RingBuffer buffer; buffer.add(); CORE_TEST_EQUAL(1, Tester::sum); buffer.add(); CORE_TEST_EQUAL(3, Tester::sum); buffer.add(); CORE_TEST_EQUAL(6, Tester::sum); buffer.remove(); CORE_TEST_EQUAL(5, Tester::sum); buffer.remove(); CORE_TEST_EQUAL(3, Tester::sum); buffer.remove(); CORE_TEST_EQUAL(0, Tester::sum); } static void testCopyDestruct() { resetTester(); { Core::RingBuffer buffer; buffer.add(); CORE_TEST_EQUAL(1, Tester::sum); buffer.add(); CORE_TEST_EQUAL(3, Tester::sum); buffer.add(); CORE_TEST_EQUAL(6, Tester::sum); { Core::RingBuffer copy = buffer; CORE_TEST_EQUAL(6 + 4 + 5 + 6, Tester::sum); } CORE_TEST_EQUAL(6, Tester::sum); } CORE_TEST_EQUAL(0, Tester::sum); } static void testCopyAssignmentDestruct() { resetTester(); { Core::RingBuffer buffer; buffer.add(); CORE_TEST_EQUAL(1, Tester::sum); buffer.add(); CORE_TEST_EQUAL(3, Tester::sum); buffer.add(); CORE_TEST_EQUAL(6, Tester::sum); { Core::RingBuffer copy; copy = buffer; CORE_TEST_EQUAL(6 + 4 + 5 + 6, Tester::sum); } CORE_TEST_EQUAL(6, Tester::sum); } CORE_TEST_EQUAL(0, Tester::sum); } static void testMoveDestruct() { resetTester(); { Core::RingBuffer buffer; buffer.add(); CORE_TEST_EQUAL(1, Tester::sum); buffer.add(); CORE_TEST_EQUAL(3, Tester::sum); buffer.add(); CORE_TEST_EQUAL(6, Tester::sum); { Core::RingBuffer move = Core::move(buffer); CORE_TEST_EQUAL(4 + 5 + 6, Tester::sum); CORE_TEST_EQUAL(0, buffer.getLength()); } CORE_TEST_EQUAL(0, Tester::sum); } CORE_TEST_EQUAL(0, Tester::sum); } static void testMoveAssignmentDestruct() { resetTester(); { Core::RingBuffer buffer; buffer.add(); CORE_TEST_EQUAL(1, Tester::sum); buffer.add(); CORE_TEST_EQUAL(3, Tester::sum); buffer.add(); CORE_TEST_EQUAL(6, Tester::sum); { Core::RingBuffer move; move = Core::move(buffer); CORE_TEST_EQUAL(4 + 5 + 6, Tester::sum); CORE_TEST_EQUAL(0, buffer.getLength()); } CORE_TEST_EQUAL(0, Tester::sum); } CORE_TEST_EQUAL(0, Tester::sum); } static void testOverall() { resetTester(); Core::RingBuffer buffer; buffer.add().add().add(); CORE_TEST_STRING("[1, 2, 3]", buffer); CORE_TEST_EQUAL(3, buffer.getLength()); CORE_TEST_EQUAL(6, Tester::sum); buffer.remove(); CORE_TEST_STRING("[2, 3]", buffer); CORE_TEST_EQUAL(2, buffer.getLength()); CORE_TEST_EQUAL(5, Tester::sum); buffer.add(); CORE_TEST_STRING("[2, 3, 4]", buffer); CORE_TEST_EQUAL(3, buffer.getLength()); CORE_TEST_EQUAL(9, Tester::sum); buffer.remove(); CORE_TEST_STRING("[3, 4]", buffer); CORE_TEST_EQUAL(2, buffer.getLength()); CORE_TEST_EQUAL(7, Tester::sum); buffer.add(); CORE_TEST_STRING("[3, 4, 5]", buffer); CORE_TEST_EQUAL(3, buffer.getLength()); CORE_TEST_EQUAL(12, Tester::sum); buffer.remove(); CORE_TEST_STRING("[4, 5]", buffer); CORE_TEST_EQUAL(2, buffer.getLength()); CORE_TEST_EQUAL(9, Tester::sum); buffer.clear(); CORE_TEST_STRING("[]", buffer); CORE_TEST_EQUAL(0, buffer.getLength()); CORE_TEST_EQUAL(0, Tester::sum); } void Core::testRingBuffer() { testReadAndWrite(); testOverflow(); testRefill(); testClear(); testConstructDestruct(); testCopyDestruct(); testCopyAssignmentDestruct(); testMoveDestruct(); testMoveAssignmentDestruct(); testOverall(); }