dynamic_vector_test.cc revision 12048259ea9203bccb00460b821a40731249f1e2
1/*
2 * Copyright (C) 2016 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#include "gtest/gtest.h"
18
19#include "chre/util/dynamic_vector.h"
20
21using chre::DynamicVector;
22
23namespace {
24constexpr int kMaxTestCapacity = 10;
25int destructor_count[kMaxTestCapacity];
26
27class Dummy {
28 public:
29  ~Dummy() {
30    if (mValue >= 0) {
31      destructor_count[mValue]++;
32    }
33  };
34  void setValue(int value) {
35    mValue = value;
36  }
37
38 private:
39  int mValue = -1;
40};
41}
42
43TEST(DynamicVector, EmptyByDefault) {
44  DynamicVector<int> vector;
45  ASSERT_EQ(vector.data(), nullptr);
46  ASSERT_EQ(vector.size(), 0);
47  ASSERT_EQ(vector.capacity(), 0);
48}
49
50TEST(DynamicVector, PushBackAndRead) {
51  DynamicVector<int> vector;
52  ASSERT_TRUE(vector.push_back(0x1337));
53  ASSERT_EQ(vector[0], 0x1337);
54  ASSERT_EQ(vector.data()[0], 0x1337);
55}
56
57TEST(DynamicVector, PushBackReserveAndRead) {
58  DynamicVector<int> vector;
59  ASSERT_TRUE(vector.push_back(0x1337));
60  ASSERT_TRUE(vector.push_back(0xface));
61  ASSERT_TRUE(vector.reserve(4));
62  ASSERT_EQ(vector[0], 0x1337);
63  ASSERT_EQ(vector.data()[0], 0x1337);
64  ASSERT_EQ(vector[1], 0xface);
65  ASSERT_EQ(vector.data()[1], 0xface);
66}
67
68/**
69 * A simple test helper object to count number of construction and destructions.
70 */
71class Foo {
72 public:
73  /**
74   * Construct an object storing a simple integer. Increment the number of
75   * objects that have been constructed of this type.
76   */
77  Foo(int value) : value(value) {
78    sConstructedCounter++;
79  }
80
81  /**
82   * Tear down the object, decrementing the number of objects that have been
83   * constructed of this type.
84   */
85  ~Foo() {
86    sConstructedCounter--;
87  }
88
89  //! The number of objects of this type that have been constructed.
90  static size_t sConstructedCounter;
91
92  //! The value stored in the object to verify the contents of this object after
93  //! construction.
94  int value;
95};
96
97//! Storage for the Foo reference counter.
98size_t Foo::sConstructedCounter = 0;
99
100TEST(DynamicVector, EmplaceBackAndDestruct) {
101  {
102    DynamicVector<Foo> vector;
103    ASSERT_TRUE(vector.emplace_back(1000));
104    ASSERT_TRUE(vector.emplace_back(2000));
105    ASSERT_TRUE(vector.emplace_back(3000));
106    ASSERT_TRUE(vector.emplace_back(4000));
107
108    ASSERT_EQ(vector[0].value, 1000);
109    ASSERT_EQ(vector.data()[0].value, 1000);
110    ASSERT_EQ(vector[1].value, 2000);
111    ASSERT_EQ(vector.data()[1].value, 2000);
112    ASSERT_EQ(vector[2].value, 3000);
113    ASSERT_EQ(vector.data()[2].value, 3000);
114    ASSERT_EQ(vector[3].value, 4000);
115    ASSERT_EQ(vector.data()[3].value, 4000);
116
117    ASSERT_EQ(Foo::sConstructedCounter, 4);
118  }
119
120  ASSERT_EQ(Foo::sConstructedCounter, 0);
121}
122
123TEST(DynamicVector, InsertEmpty) {
124  DynamicVector<int> vector;
125  ASSERT_FALSE(vector.insert(1, 0x1337));
126  ASSERT_TRUE(vector.insert(0, 0x1337));
127  ASSERT_EQ(vector[0], 0x1337);
128  ASSERT_EQ(vector.data()[0], 0x1337);
129}
130
131TEST(DynamicVector, PushBackInsertInMiddleAndRead) {
132  DynamicVector<int> vector;
133  ASSERT_TRUE(vector.push_back(0x1337));
134  ASSERT_TRUE(vector.push_back(0xface));
135  ASSERT_TRUE(vector.push_back(0xcafe));
136  ASSERT_TRUE(vector.insert(1, 0xbeef));
137
138  ASSERT_EQ(vector[0], 0x1337);
139  ASSERT_EQ(vector.data()[0], 0x1337);
140  ASSERT_EQ(vector[1], 0xbeef);
141  ASSERT_EQ(vector.data()[1], 0xbeef);
142  ASSERT_EQ(vector[2], 0xface);
143  ASSERT_EQ(vector.data()[2], 0xface);
144  ASSERT_EQ(vector[3], 0xcafe);
145  ASSERT_EQ(vector.data()[3], 0xcafe);
146}
147
148TEST(DynamicVector, PushBackAndErase) {
149  DynamicVector<int> vector;
150  ASSERT_TRUE(vector.push_back(0x1337));
151  ASSERT_TRUE(vector.push_back(0xcafe));
152  ASSERT_TRUE(vector.push_back(0xbeef));
153  ASSERT_TRUE(vector.push_back(0xface));
154
155  vector.erase(1);
156
157  ASSERT_EQ(vector[0], 0x1337);
158  ASSERT_EQ(vector.data()[0], 0x1337);
159  ASSERT_EQ(vector[1], 0xbeef);
160  ASSERT_EQ(vector.data()[1], 0xbeef);
161  ASSERT_EQ(vector[2], 0xface);
162  ASSERT_EQ(vector.data()[2], 0xface);
163  ASSERT_EQ(vector.size(), 3);
164}
165
166TEST(DynamicVector, FindEmpty) {
167  DynamicVector<int> vector;
168  ASSERT_EQ(vector.find(0), 0);
169}
170
171TEST(DynamicVector, FindWithElements) {
172  DynamicVector<int> vector;
173  ASSERT_TRUE(vector.push_back(0x1337));
174  ASSERT_TRUE(vector.push_back(0xcafe));
175  ASSERT_TRUE(vector.push_back(0xbeef));
176
177  ASSERT_EQ(vector.find(0x1337), 0);
178  ASSERT_EQ(vector.find(0xcafe), 1);
179  ASSERT_EQ(vector.find(0xbeef), 2);
180  ASSERT_EQ(vector.find(1000), 3);
181}
182
183TEST(FixedSizeVector, EraseDestructorCalled) {
184  DynamicVector<Dummy> vector;
185  for (size_t i = 0; i < 4; ++i) {
186    vector.push_back(Dummy());
187    vector[i].setValue(i);
188  }
189
190  // last item before erase is '3'.
191  vector.erase(1);
192  EXPECT_EQ(0, destructor_count[0]);
193  EXPECT_EQ(0, destructor_count[1]);
194  EXPECT_EQ(0, destructor_count[2]);
195  EXPECT_EQ(1, destructor_count[3]);
196
197  // last item before erase is still '3'.
198  vector.erase(2);
199  EXPECT_EQ(0, destructor_count[0]);
200  EXPECT_EQ(0, destructor_count[1]);
201  EXPECT_EQ(0, destructor_count[2]);
202  EXPECT_EQ(2, destructor_count[3]);
203
204  // last item before erase is now '2'.
205  vector.erase(0);
206  EXPECT_EQ(0, destructor_count[0]);
207  EXPECT_EQ(0, destructor_count[1]);
208  EXPECT_EQ(1, destructor_count[2]);
209  EXPECT_EQ(2, destructor_count[3]);
210}
211
212TEST(DynamicVectorDeathTest, SwapWithInvalidIndex) {
213  DynamicVector<int> vector;
214  vector.push_back(0x1337);
215  vector.push_back(0xcafe);
216  EXPECT_DEATH(vector.swap(0, 2), "");
217}
218
219TEST(DynamicVectorDeathTest, SwapWithInvalidIndices) {
220  DynamicVector<int> vector;
221  vector.push_back(0x1337);
222  vector.push_back(0xcafe);
223  EXPECT_DEATH(vector.swap(2, 3), "");
224}
225
226TEST(DynamicVector, Swap) {
227  DynamicVector<int> vector;
228  vector.push_back(0x1337);
229  vector.push_back(0xcafe);
230
231  vector.swap(0, 1);
232  EXPECT_EQ(vector[0], 0xcafe);
233  EXPECT_EQ(vector[1], 0x1337);
234}
235