test_vector.cpp revision 2a4077a9186d6f6dff104bbd1a73484aae6d5c01
1/*
2 * Copyright (C) 2009 The Android Open Source Project
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 *  * Redistributions of source code must retain the above copyright
9 *    notice, this list of conditions and the following disclaimer.
10 *  * Redistributions in binary form must reproduce the above copyright
11 *    notice, this list of conditions and the following disclaimer in
12 *    the documentation and/or other materials provided with the
13 *    distribution.
14 *
15 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
16 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
17 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
18 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
19 * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
20 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
21 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
22 * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
23 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
24 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
25 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26 * SUCH DAMAGE.
27 */
28
29#include "../include/vector"
30#ifndef ANDROID_ASTL_VECTOR__
31#error "Wrong header included!!"
32#endif
33#include <climits>
34#include <cstring>
35#include "common.h"
36
37namespace android {
38using std::vector;
39static const size_t kExponentialFactor = 2;
40bool testConstructorInt()
41{
42    {
43        vector<int> vec1;
44        EXPECT_TRUE(vec1.empty());
45        EXPECT_TRUE(vec1.size() == 0);
46        EXPECT_TRUE(vec1.capacity() == 0);
47    }
48    {
49        vector<int> vec2(100);
50        EXPECT_TRUE(!vec2.empty());
51        EXPECT_TRUE(vec2.size() == 100);
52        EXPECT_TRUE(vec2.capacity() == 100);
53        for (size_t i = 0; i < 100; ++i)
54        {
55            EXPECT_TRUE(vec2[i] == 0);
56        }
57    }
58    {
59        vector<int> vec3(200, 0xaa);
60        EXPECT_TRUE(!vec3.empty());
61        EXPECT_TRUE(vec3.size() == 200);
62        EXPECT_TRUE(vec3.capacity() == 200);
63        for (size_t i = 0; i < 200; ++i)
64        {
65            EXPECT_TRUE(vec3[i] == 0xaa);
66        }
67    }
68    return true;
69}
70
71typedef enum { ONE = 10, TWO} TestEnum;
72
73template<typename T> struct A { };
74struct B { };
75
76bool testConstructorRepeat()
77{
78    {
79        const vector<int> vec1(100, 10);
80
81        EXPECT_TRUE(vec1.end() - vec1.begin() == 100);
82        for (int i = 0; i < 100; ++i)
83        {
84            EXPECT_TRUE(vec1[i] == 10);
85        }
86    }
87    {
88        const vector<float> vec2(100, 10.0f);
89
90        for (int i = 0; i < 100; ++i)
91        {
92            EXPECT_TRUE(vec2[i] == 10.0f);
93        }
94    }
95    {
96        const vector<TestEnum> vec3(100, ONE);
97
98        for (int i = 0; i < 100; ++i)
99        {
100            EXPECT_TRUE(vec3[i] == ONE);
101        }
102    }
103    {
104        const vector< A<B> > vec4;
105        const vector< A<B> > vec5(10);
106
107        EXPECT_TRUE(vec4.size() == 0);
108        EXPECT_TRUE(vec5.size() == 10);
109    }
110    return true;
111}
112
113
114bool testReserve()
115{
116    { // basic reserve + shrink.
117        vector<int> vec1(100, 10);
118
119        EXPECT_TRUE(vec1.capacity() == 100);
120        EXPECT_TRUE(vec1.reserve(200));
121        EXPECT_TRUE(vec1.capacity() == 200);
122        EXPECT_TRUE(vec1.size() == 100);
123
124        EXPECT_TRUE(vec1.reserve());
125        EXPECT_TRUE(vec1.capacity() == 100);
126        EXPECT_TRUE(vec1.size() == 100);
127    }
128    {
129        vector<int> vec2;
130
131        EXPECT_TRUE(vec2.capacity() == 0);
132        EXPECT_TRUE(vec2.reserve());
133        EXPECT_TRUE(vec2.capacity() == 0);
134
135        vec2.reserve(200);
136        EXPECT_TRUE(vec2.capacity() == 200);
137        vec2.reserve();
138        EXPECT_TRUE(vec2.capacity() == 0);
139        vec2.push_back(3);
140        vec2.reserve();
141        EXPECT_TRUE(vec2.capacity() == 1);
142    }
143    {
144        vector<int> vec3;
145
146        vec3.push_back(5);
147        vec3.reserve();
148        EXPECT_TRUE(vec3.capacity() == 1);
149        vec3.push_back(3);
150        EXPECT_TRUE(vec3.capacity() == kExponentialFactor);
151        while (vec3.size() < kExponentialFactor)
152            vec3.push_back(3);
153
154        EXPECT_TRUE(vec3.size() == kExponentialFactor);
155        EXPECT_TRUE(vec3.capacity() == kExponentialFactor);
156
157        // exp increment.
158        vec3.push_back(10);
159        EXPECT_TRUE(vec3.capacity() == kExponentialFactor * kExponentialFactor);
160    }
161    {
162        CopyCounter c;
163
164        c.mCount = 0;
165        vector<CopyCounter> vec4(100, c);
166        EXPECT_TRUE(c.mCount == 100);
167        // Resizing does not do any copy via the copy assignement op.
168        vec4.reserve(1000);
169        EXPECT_TRUE(c.mCount == 200);
170        vec4.reserve(50); // reserving less than length is a nop.
171        EXPECT_TRUE(c.mCount == 200);
172    }
173    {
174        vector<unsigned short> vec5;
175
176        EXPECT_TRUE(!vec5.reserve(vec5.max_size() + 1));
177        EXPECT_TRUE(vec5.capacity() == 0);
178    }
179    return true;
180}
181
182
183bool testPushBack()
184{
185    {
186        vector<CtorDtorCounter> vec1;
187        CtorDtorCounter c;
188
189        c.reset();
190        for (int i = 0; i < 1000; ++i)
191        {
192            vec1.push_back(c);
193        }
194        EXPECT_TRUE(vec1.capacity() == 1024);
195        EXPECT_TRUE(vec1.size() == 1000);
196        EXPECT_TRUE(c.mAssignCount == 1000);
197        // Due to the multiple augmentation of the capacity, the copy
198        // constructor has been invoked.
199        EXPECT_TRUE(c.mCopyCtorCount > 0);
200        EXPECT_TRUE(c.mCtorCount == 0);
201    }
202    {
203        vector<int> vec2;
204
205        vec2.push_back(10);
206        EXPECT_TRUE(vec2.front() == 10);
207        EXPECT_TRUE(vec2.back() == 10);
208        EXPECT_TRUE(vec2.size() == 1);
209        vec2.push_back(20);
210        EXPECT_TRUE(vec2.front() == 10);
211        EXPECT_TRUE(vec2.back() == 20);
212        EXPECT_TRUE(vec2.size() == 2);
213    }
214    return true;
215}
216
217
218bool testPopBack()
219{
220    vector<int> vec1(10, 0xdeadbeef);;
221
222    EXPECT_TRUE(vec1.capacity() == 10);
223    EXPECT_TRUE(vec1.size() == 10);
224
225    for(size_t i = 10; i > 0; --i)
226    {
227        EXPECT_TRUE(vec1.capacity() == 10);
228        EXPECT_TRUE(vec1.size() == i);
229        vec1.pop_back();
230    }
231    EXPECT_TRUE(vec1.empty());
232    EXPECT_TRUE(vec1.begin() == vec1.end());
233    vec1.pop_back(); // pop_back on empty vector
234    EXPECT_TRUE(vec1.size() == 0);
235    EXPECT_TRUE(vec1.capacity() == 10);
236
237    vec1.clear();
238    vec1.pop_back(); // pop_back on empty vector
239    EXPECT_TRUE(vec1.size() == 0);
240    EXPECT_TRUE(vec1.capacity() == 0);
241    EXPECT_TRUE(vec1.begin() == vec1.end());
242    EXPECT_TRUE(vec1.begin() == NULL);
243
244    CtorDtorCounter instance;
245    vector<CtorDtorCounter> vec2(10, instance);
246
247    CtorDtorCounter::reset();
248    for (int i = 0; i < 10; ++i)
249    {
250        vec2.pop_back();
251    }
252    EXPECT_TRUE(vec2.size() == 0);
253    EXPECT_TRUE(CtorDtorCounter::mDtorCount == 10);
254    return true;
255}
256
257
258bool testSwap()
259{
260    vector<int> vec1(100, 10);
261    vector<int> vec2;
262
263    vec1.swap(vec2);
264
265    EXPECT_TRUE(vec1.capacity() == 0);
266    EXPECT_TRUE(vec2.capacity() == 100);
267
268    EXPECT_TRUE(vec1.size() == 0);
269    EXPECT_TRUE(vec2.size() == 100);
270
271    EXPECT_TRUE(vec1.begin() == vec1.end());
272    EXPECT_TRUE(vec2.begin() != vec2.end());
273    return true;
274}
275
276
277bool testIterators()
278{
279    vector<int> vec1(10);
280
281    for (size_t i = 0; i < 10; ++i)
282    {
283        vec1[i] = i;
284    }
285
286    vector<int>::iterator i = vec1.begin();
287    for (int c = 0; i != vec1.end(); ++i, ++c)
288    {
289        EXPECT_TRUE(c == *i);
290    }
291
292    vector<int>::const_iterator j = vec1.begin();
293    for (int c = 0; j != vec1.end(); ++j, ++c)
294    {
295        EXPECT_TRUE(c == *j);
296    }
297    return true;
298}
299
300bool testCtorDtorForNonPod()
301{
302    {  // empty vector, no construction should happen.
303        CtorDtorCounter::reset();
304        vector<CtorDtorCounter> vec1;
305
306        EXPECT_TRUE(CtorDtorCounter::mCtorCount == 0);
307        EXPECT_TRUE(CtorDtorCounter::mCopyCtorCount == 0);
308    }
309    EXPECT_TRUE(CtorDtorCounter::mDtorCount == 0);
310
311    {
312        CtorDtorCounter instance;
313        EXPECT_TRUE(CtorDtorCounter::mCtorCount == 1);
314        CtorDtorCounter::reset();
315
316        vector<CtorDtorCounter> vec2(200, instance);
317
318        // 200 copies by assignement of the sample instance
319        EXPECT_TRUE(CtorDtorCounter::mAssignCount == 0);
320        EXPECT_TRUE(CtorDtorCounter::mCtorCount == 0);
321        EXPECT_TRUE(CtorDtorCounter::mCopyCtorCount == 200);
322        EXPECT_TRUE(CtorDtorCounter::mDtorCount == 0);
323
324        CtorDtorCounter::reset();
325        vec2.reserve(400);
326
327        // 200 moves: 200 copies by copy constructor and 200 destructions.
328        EXPECT_TRUE(CtorDtorCounter::mCopyCtorCount == 200);
329        EXPECT_TRUE(CtorDtorCounter::mDtorCount == 200);
330        EXPECT_TRUE(CtorDtorCounter::mCtorCount == 0);
331        EXPECT_TRUE(CtorDtorCounter::mAssignCount == 0);
332
333        CtorDtorCounter::reset();
334    }
335    // 200 + 1 for the instance
336    EXPECT_TRUE(CtorDtorCounter::mDtorCount == 201);
337    return true;
338}
339}  // namespace android
340
341int main(int argc, char **argv)
342{
343    FAIL_UNLESS(testConstructorInt);
344    FAIL_UNLESS(testConstructorRepeat);
345    FAIL_UNLESS(testReserve);
346    FAIL_UNLESS(testPushBack);
347    FAIL_UNLESS(testPopBack);
348    FAIL_UNLESS(testSwap);
349    FAIL_UNLESS(testIterators);
350    FAIL_UNLESS(testCtorDtorForNonPod);
351    return kPassed;
352}
353