//===- RTLinearAllocatorTest.cpp ------------------------------------------===//
//
// The MCLinker Project
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#include "mcld/Support/Allocators.h"
#include <RTLinearAllocatorTest.h>
using namespace mcld;
using namespace mcldtest;
// Constructor can do set-up work for all test here.
RTLinearAllocatorTest::RTLinearAllocatorTest()
{
// create testee. modify it if need
m_pTestee = new LinearAllocator<Data, 0>(CHUNK_SIZE);
}
// Destructor can do clean-up work that doesn't throw exceptions here.
RTLinearAllocatorTest::~RTLinearAllocatorTest()
{
delete m_pTestee;
}
// SetUp() will be called immediately before each test.
void RTLinearAllocatorTest::SetUp()
{
}
// TearDown() will be called immediately after each test.
void RTLinearAllocatorTest::TearDown()
{
}
//==========================================================================//
// Testcases
//
TEST_F(RTLinearAllocatorTest, AllocateN) {
Data* pointer = m_pTestee->allocate(10);
ASSERT_FALSE(0 == pointer);
ASSERT_EQ(CHUNK_SIZE, m_pTestee->max_size());
ASSERT_FALSE(m_pTestee->empty());
}
TEST_F(RTLinearAllocatorTest, allocate ) {
Data* pointer = m_pTestee->allocate();
ASSERT_FALSE(0 == pointer);
ASSERT_EQ(CHUNK_SIZE, m_pTestee->max_size());
ASSERT_FALSE(m_pTestee->empty());
}
TEST_F(RTLinearAllocatorTest, allocateOver ) {
Data* pointer = m_pTestee->allocate(CHUNK_SIZE+1);
ASSERT_TRUE(0 == pointer);
ASSERT_EQ(0, m_pTestee->max_size());
ASSERT_TRUE(m_pTestee->empty());
}
TEST_F(RTLinearAllocatorTest, alloc_construct ) {
Data* pointer = m_pTestee->allocate();
m_pTestee->construct(pointer);
ASSERT_EQ(1, pointer->one);
ASSERT_EQ(2, pointer->two);
ASSERT_EQ(3, pointer->three);
ASSERT_EQ(4, pointer->four);
}
TEST_F(RTLinearAllocatorTest, alloc_constructCopy ) {
Data* pointer = m_pTestee->allocate();
Data data(7, 7, 7, 7);
m_pTestee->construct(pointer, data);
ASSERT_EQ(7, pointer->one);
ASSERT_EQ(7, pointer->two);
ASSERT_EQ(7, pointer->three);
ASSERT_EQ(7, pointer->four);
}
TEST_F(RTLinearAllocatorTest, allocN_construct ) {
Data* pointer = m_pTestee->allocate(10);
m_pTestee->construct(pointer);
ASSERT_EQ(1, pointer->one);
ASSERT_EQ(2, pointer->two);
ASSERT_EQ(3, pointer->three);
ASSERT_EQ(4, pointer->four);
}
TEST_F(RTLinearAllocatorTest, allocN_constructCopy ) {
Data* pointer = m_pTestee->allocate(10);
Data data(7, 7, 7, 7);
m_pTestee->construct(pointer, data);
ASSERT_EQ(7, pointer->one);
ASSERT_EQ(7, pointer->two);
ASSERT_EQ(7, pointer->three);
ASSERT_EQ(7, pointer->four);
}
TEST_F(RTLinearAllocatorTest, multi_alloc_ctor_iterate ) {
for (int i=0; i<101; ++i) {
Data* pointer = m_pTestee->allocate();
m_pTestee->construct(pointer);
pointer->one = i;
}
/**
Alloc::iterator data, dEnd = m_pTestee->end();
int counter = 0;
for (data=m_pTestee->begin(); data!=dEnd; ++data) {
ASSERT_EQ(counter, (*data).one);
++counter;
}
**/
}
TEST_F(RTLinearAllocatorTest, multi_allocN_ctor_iterate ) {
int counter = 0;
for (int i=0; i<10000; ++i) {
Data* pointer = m_pTestee->allocate(10);
for (int j=0; j<10; ++j) {
m_pTestee->construct(pointer);
pointer->one = counter;
++pointer;
++counter;
}
}
/**
Alloc::iterator data, dEnd = m_pTestee->end();
counter = 0;
for (data=m_pTestee->begin(); data!=dEnd; ++data) {
ASSERT_EQ(counter, (*data).one);
++counter;
}
**/
}