/* * CarlaRingBuffer Tests * Copyright (C) 2014 Filipe Coelho * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of * the License, or any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * For a full copy of the GNU General Public License see the doc/GPL.txt file. */ #include "CarlaRingBuffer.hpp" // ----------------------------------------------------------------------- // simple types template static void test_CarlaRingBuffer1(CarlaRingBuffer& b) noexcept { // start empty assert(b.isEmpty()); // write all types b.writeBool(true); b.writeByte(123); b.writeShort(1234); b.writeInt(99999123); b.writeLong(0xffffffff); b.writeFloat(0.0123f); b.writeDouble(0.0123); // should be considered empty until a commitWrite assert(b.isEmpty()); // commit assert(b.commitWrite()); // should have data now assert(! b.isEmpty()); // read all types back assert(b.readBool() == true); assert(b.readByte() == 123); assert(b.readShort() == 1234); assert(b.readInt() == 99999123); assert(b.readLong() == 0xffffffff); assert(b.readFloat() == 0.0123f); // still has data assert(! b.isEmpty()); assert(b.readDouble() == 0.0123); // now empty assert(b.isEmpty()); } // ----------------------------------------------------------------------- // custom type struct BufferTestStruct { BufferTestStruct() : b(false), i(255), l(9999) {} bool b; int32_t i; char _pad[999]; int64_t l; bool operator==(const BufferTestStruct& s) const noexcept { return (b == s.b && i == s.i && l == s.l); } }; template static void test_CarlaRingBuffer2(CarlaRingBuffer& b) noexcept { // start empty assert(b.isEmpty()); // write unmodified BufferTestStruct t1, t2; assert(t1 == t2); b.writeCustomType(t1); assert(b.commitWrite()); // test read b.readCustomType(t1); assert(t1 == t2); // modify t1 b.writeCustomType(t1); assert(b.commitWrite()); carla_zeroStruct(t1); // test read b.readCustomType(t1); assert(t1 == t2); // now empty assert(b.isEmpty()); } // ----------------------------------------------------------------------- // custom data template static void test_CarlaRingBuffer3(CarlaRingBuffer& b) noexcept { static const char* const kLicense = "" "This program is free software; you can redistribute it and/or\n" "modify it under the terms of the GNU General Public License as\n" "published by the Free Software Foundation; either version 2 of\n" "the License, or any later version.\n" "\n" "This program is distributed in the hope that it will be useful,\n" "but WITHOUT ANY WARRANTY; without even the implied warranty of\n" "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n" "GNU General Public License for more details.\n" "\n" "For a full copy of the GNU General Public License see the doc/GPL.txt file.\n" "\n"; static const std::size_t kLicenseSize = std::strlen(kLicense); // start empty assert(b.isEmpty()); // write big chunk b.writeCustomData(kLicense, kLicenseSize); // still empty assert(b.isEmpty()); // commit assert(b.commitWrite()); // not empty assert(! b.isEmpty()); // read data char license[kLicenseSize+1]; carla_zeroChar(license, kLicenseSize+1); b.readCustomData(license, kLicenseSize); // now empty again assert(b.isEmpty()); // test data integrity assert(std::strcmp(license, kLicense) == 0); } // ----------------------------------------------------------------------- int main() { CarlaHeapRingBuffer heap; CarlaStackRingBuffer stack; // small test first heap.createBuffer(4096); heap.deleteBuffer(); heap.createBuffer(1); heap.deleteBuffer(); // ok heap.createBuffer(1024); test_CarlaRingBuffer1(heap); test_CarlaRingBuffer1(stack); test_CarlaRingBuffer2(heap); test_CarlaRingBuffer2(stack); // test the big chunk a couple of times to ensure circular writing for (int i=0; i<20; ++i) { test_CarlaRingBuffer3(heap); test_CarlaRingBuffer3(stack); } return 0; } // -----------------------------------------------------------------------