#include "tests/ObjectPoolTests.h"
#include "tests/Test.h"
#include "memory/ObjectPool.h"
struct A {
static int instances;
int a;
A(int a) : a(a) {
instances += a;
}
~A() {
instances -= a;
}
};
int A::instances = 0;
static void testAllocateAndFree(Test& test) {
ObjectPool pool;
int a = pool.allocate(1);
int b = pool.allocate(2);
int c = pool.allocate(3);
int d = pool.allocate(4);
int e = pool.allocate(5);
test.checkEqual(0, a, "int pointer allocate 1");
test.checkEqual(1, b, "int pointer allocate 2");
test.checkEqual(2, c, "int pointer allocate 3");
test.checkEqual(-1, d, "int pointer allocate 4");
test.checkEqual(-1, e, "int pointer allocate 5");
pool.free(a);
pool.free(b);
pool.free(c);
test.checkEqual(0, A::instances, "all destructors are called 1");
}
static void testAllocateAfterFree(Test& test) {
ObjectPool pool;
int a = pool.allocate(1);
int b = pool.allocate(2);
int c = pool.allocate(3);
pool.free(b);
b = pool.allocate(7);
test.checkEqual(1, b, "int pointer allocate after free 1");
pool.free(c);
c = pool.allocate(9);
test.checkEqual(2, c, "int pointer allocate after free 2");
pool.free(a);
a = pool.allocate(11);
test.checkEqual(0, a, "int pointer allocate after free 3");
pool.free(a);
pool.free(b);
b = pool.allocate(23);
a = pool.allocate(17);
test.checkEqual(0, a, "int pointer allocate after free 4");
test.checkEqual(1, b, "int pointer allocate after free 5");
test.checkEqual(-1, pool.allocate(50), "int pointer allocate after free 6");
pool.free(a);
pool.free(b);
pool.free(c);
test.checkEqual(0, A::instances, "all destructors are called 2");
}
void ObjectPoolTests::test() {
Test test("ObjectPool");
testAllocateAndFree(test);
testAllocateAfterFree(test);
test.finalize();
}