1*834a2baaSAndroid Build Coastguard Worker /*
2*834a2baaSAndroid Build Coastguard Worker * Copyright (C) 2024 The Android Open Source Project
3*834a2baaSAndroid Build Coastguard Worker *
4*834a2baaSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
5*834a2baaSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
6*834a2baaSAndroid Build Coastguard Worker * You may obtain a copy of the License at
7*834a2baaSAndroid Build Coastguard Worker *
8*834a2baaSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
9*834a2baaSAndroid Build Coastguard Worker *
10*834a2baaSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
11*834a2baaSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
12*834a2baaSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*834a2baaSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
14*834a2baaSAndroid Build Coastguard Worker * limitations under the License.
15*834a2baaSAndroid Build Coastguard Worker */
16*834a2baaSAndroid Build Coastguard Worker
17*834a2baaSAndroid Build Coastguard Worker #include <gtest/gtest.h>
18*834a2baaSAndroid Build Coastguard Worker
19*834a2baaSAndroid Build Coastguard Worker #include "minikin/PackedVector.h"
20*834a2baaSAndroid Build Coastguard Worker
21*834a2baaSAndroid Build Coastguard Worker namespace minikin {
22*834a2baaSAndroid Build Coastguard Worker
23*834a2baaSAndroid Build Coastguard Worker struct Data {
24*834a2baaSAndroid Build Coastguard Worker int x, y;
25*834a2baaSAndroid Build Coastguard Worker };
26*834a2baaSAndroid Build Coastguard Worker
TEST(PackedVector,construct)27*834a2baaSAndroid Build Coastguard Worker TEST(PackedVector, construct) {
28*834a2baaSAndroid Build Coastguard Worker {
29*834a2baaSAndroid Build Coastguard Worker PackedVector<int> packed;
30*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(0u, packed.size());
31*834a2baaSAndroid Build Coastguard Worker EXPECT_TRUE(packed.empty());
32*834a2baaSAndroid Build Coastguard Worker }
33*834a2baaSAndroid Build Coastguard Worker {
34*834a2baaSAndroid Build Coastguard Worker int data[] = {1, 2, 3, 4, 5};
35*834a2baaSAndroid Build Coastguard Worker
36*834a2baaSAndroid Build Coastguard Worker PackedVector<int> packed(data, 5);
37*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(5u, packed.size());
38*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(1, packed[0]);
39*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(2, packed[1]);
40*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(3, packed[2]);
41*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(4, packed[3]);
42*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(5, packed[4]);
43*834a2baaSAndroid Build Coastguard Worker }
44*834a2baaSAndroid Build Coastguard Worker {
45*834a2baaSAndroid Build Coastguard Worker int data[] = {1, 2, 3, 4, 5};
46*834a2baaSAndroid Build Coastguard Worker
47*834a2baaSAndroid Build Coastguard Worker PackedVector<int> packed(data + 2, 2);
48*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(2u, packed.size());
49*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(3, packed[0]);
50*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(4, packed[1]);
51*834a2baaSAndroid Build Coastguard Worker }
52*834a2baaSAndroid Build Coastguard Worker {
53*834a2baaSAndroid Build Coastguard Worker std::vector<int> data = {1, 2, 3, 4, 5};
54*834a2baaSAndroid Build Coastguard Worker
55*834a2baaSAndroid Build Coastguard Worker PackedVector<int> packed(data);
56*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(5u, packed.size());
57*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(1, packed[0]);
58*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(2, packed[1]);
59*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(3, packed[2]);
60*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(4, packed[3]);
61*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(5, packed[4]);
62*834a2baaSAndroid Build Coastguard Worker }
63*834a2baaSAndroid Build Coastguard Worker }
64*834a2baaSAndroid Build Coastguard Worker
TEST(PackedVector,push_back)65*834a2baaSAndroid Build Coastguard Worker TEST(PackedVector, push_back) {
66*834a2baaSAndroid Build Coastguard Worker PackedVector<int> packed;
67*834a2baaSAndroid Build Coastguard Worker
68*834a2baaSAndroid Build Coastguard Worker packed.push_back(0);
69*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(1u, packed.size());
70*834a2baaSAndroid Build Coastguard Worker EXPECT_FALSE(packed.empty());
71*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(0, packed[0]);
72*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(0, packed.data()[0]);
73*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(0, *packed.back());
74*834a2baaSAndroid Build Coastguard Worker
75*834a2baaSAndroid Build Coastguard Worker packed.push_back(10);
76*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(2u, packed.size());
77*834a2baaSAndroid Build Coastguard Worker EXPECT_FALSE(packed.empty());
78*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(10, packed[1]);
79*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(10, packed.data()[1]);
80*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(10, *packed.back());
81*834a2baaSAndroid Build Coastguard Worker }
82*834a2baaSAndroid Build Coastguard Worker
TEST(PackedVector,compare)83*834a2baaSAndroid Build Coastguard Worker TEST(PackedVector, compare) {
84*834a2baaSAndroid Build Coastguard Worker {
85*834a2baaSAndroid Build Coastguard Worker PackedVector<int> left = {1, 2, 3, 4, 5};
86*834a2baaSAndroid Build Coastguard Worker PackedVector<int> right = {1, 2, 3, 4, 5};
87*834a2baaSAndroid Build Coastguard Worker
88*834a2baaSAndroid Build Coastguard Worker EXPECT_TRUE(left == right);
89*834a2baaSAndroid Build Coastguard Worker EXPECT_FALSE(left != right);
90*834a2baaSAndroid Build Coastguard Worker }
91*834a2baaSAndroid Build Coastguard Worker {
92*834a2baaSAndroid Build Coastguard Worker PackedVector<int> left = {1, 2, 3, 4, 5};
93*834a2baaSAndroid Build Coastguard Worker PackedVector<int> right = {1, 2, 3, 4, 5, 6};
94*834a2baaSAndroid Build Coastguard Worker
95*834a2baaSAndroid Build Coastguard Worker EXPECT_FALSE(left == right);
96*834a2baaSAndroid Build Coastguard Worker EXPECT_TRUE(left != right);
97*834a2baaSAndroid Build Coastguard Worker }
98*834a2baaSAndroid Build Coastguard Worker {
99*834a2baaSAndroid Build Coastguard Worker PackedVector<int> left = {};
100*834a2baaSAndroid Build Coastguard Worker PackedVector<int> right = {};
101*834a2baaSAndroid Build Coastguard Worker
102*834a2baaSAndroid Build Coastguard Worker EXPECT_TRUE(left == right);
103*834a2baaSAndroid Build Coastguard Worker EXPECT_FALSE(left != right);
104*834a2baaSAndroid Build Coastguard Worker }
105*834a2baaSAndroid Build Coastguard Worker {
106*834a2baaSAndroid Build Coastguard Worker PackedVector<Data> left = {{0, 1}, {2, 3}};
107*834a2baaSAndroid Build Coastguard Worker PackedVector<Data> right = {{0, 1}, {2, 3}};
108*834a2baaSAndroid Build Coastguard Worker
109*834a2baaSAndroid Build Coastguard Worker EXPECT_TRUE(left == right);
110*834a2baaSAndroid Build Coastguard Worker EXPECT_FALSE(left != right);
111*834a2baaSAndroid Build Coastguard Worker }
112*834a2baaSAndroid Build Coastguard Worker {
113*834a2baaSAndroid Build Coastguard Worker PackedVector<Data> left = {{0, 1}, {2, 3}};
114*834a2baaSAndroid Build Coastguard Worker PackedVector<Data> right = {{0, 1}};
115*834a2baaSAndroid Build Coastguard Worker
116*834a2baaSAndroid Build Coastguard Worker EXPECT_FALSE(left == right);
117*834a2baaSAndroid Build Coastguard Worker EXPECT_TRUE(left != right);
118*834a2baaSAndroid Build Coastguard Worker }
119*834a2baaSAndroid Build Coastguard Worker }
120*834a2baaSAndroid Build Coastguard Worker
TEST(PackedVector,reserve)121*834a2baaSAndroid Build Coastguard Worker TEST(PackedVector, reserve) {
122*834a2baaSAndroid Build Coastguard Worker {
123*834a2baaSAndroid Build Coastguard Worker PackedVector<int> packed;
124*834a2baaSAndroid Build Coastguard Worker packed.reserve(100);
125*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(0u, packed.size());
126*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(100u, packed.capacity());
127*834a2baaSAndroid Build Coastguard Worker packed.shrink_to_fit();
128*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(0u, packed.size());
129*834a2baaSAndroid Build Coastguard Worker // The PackedVector has minimum capacity for the space of pointers. So cannot expect it
130*834a2baaSAndroid Build Coastguard Worker // becomes 0.
131*834a2baaSAndroid Build Coastguard Worker EXPECT_NE(100u, packed.capacity());
132*834a2baaSAndroid Build Coastguard Worker }
133*834a2baaSAndroid Build Coastguard Worker {
134*834a2baaSAndroid Build Coastguard Worker PackedVector<int> packed;
135*834a2baaSAndroid Build Coastguard Worker packed.reserve(100);
136*834a2baaSAndroid Build Coastguard Worker for (int i = 0; i < 50; ++i) {
137*834a2baaSAndroid Build Coastguard Worker packed.push_back(i);
138*834a2baaSAndroid Build Coastguard Worker }
139*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(50u, packed.size());
140*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(100u, packed.capacity());
141*834a2baaSAndroid Build Coastguard Worker packed.shrink_to_fit();
142*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(50u, packed.size());
143*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(50u, packed.capacity());
144*834a2baaSAndroid Build Coastguard Worker }
145*834a2baaSAndroid Build Coastguard Worker }
146*834a2baaSAndroid Build Coastguard Worker
TEST(PackedVector,iterator)147*834a2baaSAndroid Build Coastguard Worker TEST(PackedVector, iterator) {
148*834a2baaSAndroid Build Coastguard Worker {
149*834a2baaSAndroid Build Coastguard Worker PackedVector<int> packed = {0, 1, 2, 3, 4, 5};
150*834a2baaSAndroid Build Coastguard Worker std::vector<int> copied(packed.begin(), packed.end());
151*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(std::vector<int>({0, 1, 2, 3, 4, 5}), copied);
152*834a2baaSAndroid Build Coastguard Worker }
153*834a2baaSAndroid Build Coastguard Worker }
154*834a2baaSAndroid Build Coastguard Worker
TEST(PackedVector,resize)155*834a2baaSAndroid Build Coastguard Worker TEST(PackedVector, resize) {
156*834a2baaSAndroid Build Coastguard Worker {
157*834a2baaSAndroid Build Coastguard Worker // Reduction
158*834a2baaSAndroid Build Coastguard Worker PackedVector<int> packed = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
159*834a2baaSAndroid Build Coastguard Worker packed.resize(10);
160*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(10u, packed.size());
161*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(10u, packed.capacity());
162*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(PackedVector<int>({1, 2, 3, 4, 5, 6, 7, 8, 9, 10}), packed);
163*834a2baaSAndroid Build Coastguard Worker
164*834a2baaSAndroid Build Coastguard Worker packed.resize(9);
165*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(9u, packed.size());
166*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(PackedVector<int>({1, 2, 3, 4, 5, 6, 7, 8, 9}), packed);
167*834a2baaSAndroid Build Coastguard Worker
168*834a2baaSAndroid Build Coastguard Worker packed.resize(8);
169*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(8u, packed.size());
170*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(PackedVector<int>({1, 2, 3, 4, 5, 6, 7, 8}), packed);
171*834a2baaSAndroid Build Coastguard Worker
172*834a2baaSAndroid Build Coastguard Worker packed.resize(7);
173*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(7u, packed.size());
174*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(PackedVector<int>({1, 2, 3, 4, 5, 6, 7}), packed);
175*834a2baaSAndroid Build Coastguard Worker
176*834a2baaSAndroid Build Coastguard Worker packed.resize(6);
177*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(6u, packed.size());
178*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(PackedVector<int>({1, 2, 3, 4, 5, 6}), packed);
179*834a2baaSAndroid Build Coastguard Worker
180*834a2baaSAndroid Build Coastguard Worker packed.resize(5);
181*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(5u, packed.size());
182*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(PackedVector<int>({1, 2, 3, 4, 5}), packed);
183*834a2baaSAndroid Build Coastguard Worker
184*834a2baaSAndroid Build Coastguard Worker packed.resize(4);
185*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(4u, packed.size());
186*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(PackedVector<int>({1, 2, 3, 4}), packed);
187*834a2baaSAndroid Build Coastguard Worker
188*834a2baaSAndroid Build Coastguard Worker packed.resize(3);
189*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(3u, packed.size());
190*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(PackedVector<int>({1, 2, 3}), packed);
191*834a2baaSAndroid Build Coastguard Worker
192*834a2baaSAndroid Build Coastguard Worker packed.resize(2);
193*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(2u, packed.size());
194*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(PackedVector<int>({1, 2}), packed);
195*834a2baaSAndroid Build Coastguard Worker
196*834a2baaSAndroid Build Coastguard Worker packed.resize(1);
197*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(1u, packed.size());
198*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(PackedVector<int>({1}), packed);
199*834a2baaSAndroid Build Coastguard Worker
200*834a2baaSAndroid Build Coastguard Worker packed.resize(0);
201*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(0u, packed.size());
202*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(PackedVector<int>({}), packed);
203*834a2baaSAndroid Build Coastguard Worker }
204*834a2baaSAndroid Build Coastguard Worker {
205*834a2baaSAndroid Build Coastguard Worker // Expansion
206*834a2baaSAndroid Build Coastguard Worker PackedVector<int> packed = {};
207*834a2baaSAndroid Build Coastguard Worker packed.resize(1, 1);
208*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(1u, packed.size());
209*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(PackedVector<int>({1}), packed);
210*834a2baaSAndroid Build Coastguard Worker
211*834a2baaSAndroid Build Coastguard Worker packed.resize(2, 2);
212*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(2u, packed.size());
213*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(PackedVector<int>({1, 2}), packed);
214*834a2baaSAndroid Build Coastguard Worker
215*834a2baaSAndroid Build Coastguard Worker packed.resize(3, 3);
216*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(3u, packed.size());
217*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(PackedVector<int>({1, 2, 3}), packed);
218*834a2baaSAndroid Build Coastguard Worker
219*834a2baaSAndroid Build Coastguard Worker packed.resize(4, 4);
220*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(4u, packed.size());
221*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(PackedVector<int>({1, 2, 3, 4}), packed);
222*834a2baaSAndroid Build Coastguard Worker
223*834a2baaSAndroid Build Coastguard Worker packed.resize(5, 5);
224*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(5u, packed.size());
225*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(PackedVector<int>({1, 2, 3, 4, 5}), packed);
226*834a2baaSAndroid Build Coastguard Worker
227*834a2baaSAndroid Build Coastguard Worker packed.resize(6, 6);
228*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(6u, packed.size());
229*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(PackedVector<int>({1, 2, 3, 4, 5, 6}), packed);
230*834a2baaSAndroid Build Coastguard Worker
231*834a2baaSAndroid Build Coastguard Worker packed.resize(7, 7);
232*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(7u, packed.size());
233*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(PackedVector<int>({1, 2, 3, 4, 5, 6, 7}), packed);
234*834a2baaSAndroid Build Coastguard Worker
235*834a2baaSAndroid Build Coastguard Worker packed.resize(8, 8);
236*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(8u, packed.size());
237*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(PackedVector<int>({1, 2, 3, 4, 5, 6, 7, 8}), packed);
238*834a2baaSAndroid Build Coastguard Worker
239*834a2baaSAndroid Build Coastguard Worker packed.resize(9, 9);
240*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(9u, packed.size());
241*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(PackedVector<int>({1, 2, 3, 4, 5, 6, 7, 8, 9}), packed);
242*834a2baaSAndroid Build Coastguard Worker
243*834a2baaSAndroid Build Coastguard Worker packed.resize(10, 10);
244*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(10u, packed.size());
245*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(PackedVector<int>({1, 2, 3, 4, 5, 6, 7, 8, 9, 10}), packed);
246*834a2baaSAndroid Build Coastguard Worker }
247*834a2baaSAndroid Build Coastguard Worker }
248*834a2baaSAndroid Build Coastguard Worker } // namespace minikin
249