1//===- RTLinearAllocatorTest.cpp ------------------------------------------===//
2//
3//                     The MCLinker Project
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9#include "mcld/Support/Allocators.h"
10#include <RTLinearAllocatorTest.h>
11
12using namespace mcld;
13using namespace mcldtest;
14
15
16// Constructor can do set-up work for all test here.
17RTLinearAllocatorTest::RTLinearAllocatorTest()
18{
19	// create testee. modify it if need
20	m_pTestee = new LinearAllocator<Data, 0>(CHUNK_SIZE);
21}
22
23// Destructor can do clean-up work that doesn't throw exceptions here.
24RTLinearAllocatorTest::~RTLinearAllocatorTest()
25{
26	delete m_pTestee;
27}
28
29// SetUp() will be called immediately before each test.
30void RTLinearAllocatorTest::SetUp()
31{
32}
33
34// TearDown() will be called immediately after each test.
35void RTLinearAllocatorTest::TearDown()
36{
37}
38
39//==========================================================================//
40// Testcases
41//
42
43TEST_F(RTLinearAllocatorTest, AllocateN) {
44	Data* pointer = m_pTestee->allocate(10);
45	ASSERT_FALSE(0 == pointer);
46	ASSERT_EQ(CHUNK_SIZE, m_pTestee->max_size());
47	ASSERT_FALSE(m_pTestee->empty());
48}
49
50TEST_F(RTLinearAllocatorTest, allocate ) {
51	Data* pointer = m_pTestee->allocate();
52	ASSERT_FALSE(0 == pointer);
53	ASSERT_EQ(CHUNK_SIZE, m_pTestee->max_size());
54	ASSERT_FALSE(m_pTestee->empty());
55}
56
57TEST_F(RTLinearAllocatorTest, allocateOver ) {
58	Data* pointer = m_pTestee->allocate(CHUNK_SIZE+1);
59	ASSERT_TRUE(0 == pointer);
60	ASSERT_EQ(0, m_pTestee->max_size());
61	ASSERT_TRUE(m_pTestee->empty());
62}
63
64TEST_F(RTLinearAllocatorTest, alloc_construct ) {
65	Data* pointer = m_pTestee->allocate();
66	m_pTestee->construct(pointer);
67	ASSERT_EQ(1, pointer->one);
68	ASSERT_EQ(2, pointer->two);
69	ASSERT_EQ(3, pointer->three);
70	ASSERT_EQ(4, pointer->four);
71}
72
73TEST_F(RTLinearAllocatorTest, alloc_constructCopy ) {
74	Data* pointer = m_pTestee->allocate();
75	Data data(7, 7, 7, 7);
76	m_pTestee->construct(pointer, data);
77
78	ASSERT_EQ(7, pointer->one);
79	ASSERT_EQ(7, pointer->two);
80	ASSERT_EQ(7, pointer->three);
81	ASSERT_EQ(7, pointer->four);
82}
83
84TEST_F(RTLinearAllocatorTest, allocN_construct ) {
85	Data* pointer = m_pTestee->allocate(10);
86	m_pTestee->construct(pointer);
87	ASSERT_EQ(1, pointer->one);
88	ASSERT_EQ(2, pointer->two);
89	ASSERT_EQ(3, pointer->three);
90	ASSERT_EQ(4, pointer->four);
91}
92
93TEST_F(RTLinearAllocatorTest, allocN_constructCopy ) {
94	Data* pointer = m_pTestee->allocate(10);
95	Data data(7, 7, 7, 7);
96	m_pTestee->construct(pointer, data);
97
98	ASSERT_EQ(7, pointer->one);
99	ASSERT_EQ(7, pointer->two);
100	ASSERT_EQ(7, pointer->three);
101	ASSERT_EQ(7, pointer->four);
102}
103
104TEST_F(RTLinearAllocatorTest, multi_alloc_ctor_iterate ) {
105	for (int i=0; i<101; ++i) {
106		Data* pointer = m_pTestee->allocate();
107		m_pTestee->construct(pointer);
108		pointer->one = i;
109	}
110/**
111	Alloc::iterator data, dEnd = m_pTestee->end();
112	int counter = 0;
113	for (data=m_pTestee->begin(); data!=dEnd; ++data) {
114		ASSERT_EQ(counter, (*data).one);
115		++counter;
116	}
117**/
118}
119
120TEST_F(RTLinearAllocatorTest, multi_allocN_ctor_iterate ) {
121	int counter = 0;
122	for (int i=0; i<10000; ++i) {
123		Data* pointer = m_pTestee->allocate(10);
124		for (int j=0; j<10; ++j) {
125			m_pTestee->construct(pointer);
126			pointer->one = counter;
127			++pointer;
128			++counter;
129		}
130	}
131/**
132	Alloc::iterator data, dEnd = m_pTestee->end();
133	counter = 0;
134	for (data=m_pTestee->begin(); data!=dEnd; ++data) {
135		ASSERT_EQ(counter, (*data).one);
136		++counter;
137	}
138**/
139}
140
141