diff --git a/UTests/utestListBlockAllocator.cpp b/UTests/utestListBlockAllocator.cpp new file mode 100644 index 0000000000000000000000000000000000000000..a958f44320bd9f8b4a72412dd7ea088802305771 --- /dev/null +++ b/UTests/utestListBlockAllocator.cpp @@ -0,0 +1,103 @@ + +// =================================================================================== +// Copyright ScalFmm 2011 INRIA, Olivier Coulaud, Bérenger Bramas, Matthias Messner +// olivier.coulaud@inria.fr, berenger.bramas@inria.fr +// This software is a computer program whose purpose is to compute the FMM. +// +// This software is governed by the CeCILL-C and LGPL licenses and +// abiding by the rules of distribution of free software. +// +// 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 and CeCILL-C Licenses for more details. +// "http://www.cecill.info". +// "http://www.gnu.org/licenses". +// =================================================================================== +#include "FUTester.hpp" + +#include "../Src/Containers/FBlockAllocator.hpp" + +#include <cstring> + +/** +* This file is a unit test for the List block allocator +*/ + +/** +* This class is simply used to count alloc dealloc +*/ +class TestObject{ +public: + static int counter; + static int dealloced; + + int array[50]; + + TestObject(){ + memset(array, 0, 50 * sizeof(int)); + ++counter; + } + TestObject(const TestObject&){ + ++counter; + } + ~TestObject(){ + ++dealloced; + } +}; + +int TestObject::counter(0); +int TestObject::dealloced(0); + + +/** this class test the list container */ +class TestBlock : public FUTester<TestBlock> { + // Called before each test : simply set counter to 0 + void PreTest(){ + TestObject::counter = 0; + TestObject::dealloced = 0; + } + + // test copy + void TestBlockFunction(){ + FListBlockAllocator<TestObject, 10> alloc; + + TestObject* ptr[100]; + for(int idx = 0 ; idx < 100 ; ++idx){ + TestObject* dl1 = alloc.newObject(); + TestObject* dl2 = alloc.newObject(); + alloc.deleteObject(dl1); + ptr[idx] = alloc.newObject(); + alloc.deleteObject(dl2); + } + + for(int idx = 0 ; idx < 100 ; ++idx){ + for(int idxval = 0 ; idxval < 50 ; ++idxval){ + ptr[idx]->array[idxval] += (idxval * idx); + } + } + + for(int idx = 0 ; idx < 100 ; ++idx){ + for(int idxval = 0 ; idxval < 50 ; ++idxval){ + uassert(ptr[idx]->array[idxval] == (idxval * idx)); + } + } + + for(int idx = 0 ; idx < 100 ; ++idx){ + alloc.deleteObject(ptr[idx]); + } + + uassert(TestObject::counter == 300); + uassert(TestObject::counter == TestObject::dealloced); + } + + // set test + void SetTests(){ + AddTest(&TestBlock::TestBlockFunction,"Test Allocate Deallocate"); + } +}; + +// You must do this +TestClass(TestBlock) + +