|  | //===- 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; | 
|  | } | 
|  | **/ | 
|  | } | 
|  |  |