1 // Copyright (C) 2014 The Android Open Source Project
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 // http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14
15 #include "emugl/common/pod_vector.h"
16
17 #include <gtest/gtest.h>
18
19 namespace emugl {
20
hashIndex(size_t n)21 static int hashIndex(size_t n) {
22 return static_cast<int>(((n >> 14) * 13773) + (n * 51));
23 }
24
TEST(PodVector,Empty)25 TEST(PodVector, Empty) {
26 PodVector<int> v;
27 EXPECT_TRUE(v.empty());
28 EXPECT_EQ(0U, v.size());
29 }
30
TEST(PodVector,AppendOneItem)31 TEST(PodVector, AppendOneItem) {
32 PodVector<int> v;
33 v.append(10234);
34 EXPECT_FALSE(v.empty());
35 EXPECT_EQ(1U, v.size());
36 EXPECT_EQ(10234, v[0]);
37 }
38
TEST(PodVector,AppendLotsOfItems)39 TEST(PodVector, AppendLotsOfItems) {
40 PodVector<int> v;
41 const size_t kMaxCount = 10000;
42 for (size_t n = 0; n < kMaxCount; ++n) {
43 v.append(hashIndex(n));
44 }
45 EXPECT_EQ(kMaxCount, v.size());
46 for (size_t n = 0; n < kMaxCount; ++n) {
47 EXPECT_EQ(hashIndex(n), v[n]) << "At index " << n;
48 }
49 }
50
TEST(PodVector,RemoveFrontItems)51 TEST(PodVector, RemoveFrontItems) {
52 PodVector<int> v;
53 const size_t kMaxCount = 100;
54 for (size_t n = 0; n < kMaxCount; ++n) {
55 v.append(hashIndex(n));
56 }
57 EXPECT_EQ(kMaxCount, v.size());
58 for (size_t n = 0; n < kMaxCount; ++n) {
59 EXPECT_EQ(hashIndex(n), v[0]) << "At index " << n;
60 v.remove(0U);
61 EXPECT_EQ(kMaxCount - n - 1U, v.size()) << "At index " << n;
62 }
63 }
64
TEST(PodVector,PrependItems)65 TEST(PodVector, PrependItems) {
66 PodVector<int> v;
67 const size_t kMaxCount = 100;
68 for (size_t n = 0; n < kMaxCount; ++n) {
69 v.prepend(hashIndex(n));
70 }
71 EXPECT_EQ(kMaxCount, v.size());
72 for (size_t n = 0; n < kMaxCount; ++n) {
73 EXPECT_EQ(hashIndex(kMaxCount - n - 1), v[n]) << "At index " << n;
74 }
75 }
76
TEST(PodVector,ResizeExpands)77 TEST(PodVector, ResizeExpands) {
78 PodVector<int> v;
79 const size_t kMaxCount = 100;
80 const size_t kMaxCount2 = 10000;
81 for (size_t n = 0; n < kMaxCount; ++n) {
82 v.append(hashIndex(n));
83 }
84 EXPECT_EQ(kMaxCount, v.size());
85 v.resize(kMaxCount2);
86 EXPECT_EQ(kMaxCount2, v.size());
87 for (size_t n = 0; n < kMaxCount; ++n) {
88 EXPECT_EQ(hashIndex(n), v[n]) << "At index " << n;
89 }
90 }
91
TEST(PodVector,ResizeTruncates)92 TEST(PodVector, ResizeTruncates) {
93 PodVector<int> v;
94 const size_t kMaxCount = 10000;
95 const size_t kMaxCount2 = 10;
96 for (size_t n = 0; n < kMaxCount; ++n) {
97 v.append(hashIndex(n));
98 }
99 EXPECT_EQ(kMaxCount, v.size());
100 v.resize(kMaxCount2);
101 EXPECT_EQ(kMaxCount2, v.size());
102 for (size_t n = 0; n < kMaxCount2; ++n) {
103 EXPECT_EQ(hashIndex(n), v[n]) << "At index " << n;
104 }
105 }
106
107
TEST(PodVector,AssignmentOperator)108 TEST(PodVector, AssignmentOperator) {
109 PodVector<int> v1;
110 const size_t kMaxCount = 10000;
111 for (size_t n = 0; n < kMaxCount; ++n) {
112 v1.append(hashIndex(n));
113 }
114 EXPECT_EQ(kMaxCount, v1.size());
115
116 PodVector<int> v2;
117 v2 = v1;
118
119 v1.reserve(0);
120
121 EXPECT_EQ(kMaxCount, v2.size());
122 for (size_t n = 0; n < kMaxCount; ++n) {
123 EXPECT_EQ(hashIndex(n), v2[n]) << "At index " << n;
124 }
125 }
126
127 } // namespace emugl
128