1 //
2 // Copyright 2018 The ANGLE Project Authors. All rights reserved.
3 // Use of this source code is governed by a BSD-style license that can be
4 // found in the LICENSE file.
5 //
6 // FixedVector_unittest:
7 //   Tests of the FixedVector class
8 //
9 
10 #include <gtest/gtest.h>
11 
12 #include "common/FixedVector.h"
13 
14 namespace angle
15 {
16 // Make sure the various constructors compile and do basic checks
TEST(FixedVector,Constructors)17 TEST(FixedVector, Constructors)
18 {
19     FixedVector<int, 5> defaultContructor;
20     EXPECT_EQ(0u, defaultContructor.size());
21 
22     FixedVector<int, 5> count(3);
23     EXPECT_EQ(3u, count.size());
24 
25     FixedVector<int, 5> countAndValue(3, 2);
26     EXPECT_EQ(3u, countAndValue.size());
27     EXPECT_EQ(2, countAndValue[1]);
28 
29     FixedVector<int, 5> copy(countAndValue);
30     EXPECT_EQ(copy, countAndValue);
31 
32     FixedVector<int, 5> copyRValue(std::move(count));
33     EXPECT_EQ(3u, copyRValue.size());
34 
35     FixedVector<int, 5> initializerList{1, 2, 3, 4, 5};
36     EXPECT_EQ(5u, initializerList.size());
37     EXPECT_EQ(3, initializerList[2]);
38 
39     FixedVector<int, 5> assignCopy(copyRValue);
40     EXPECT_EQ(3u, assignCopy.size());
41 
42     FixedVector<int, 5> assignRValue(std::move(assignCopy));
43     EXPECT_EQ(3u, assignRValue.size());
44 
45     FixedVector<int, 5> assignmentInitializerList = {1, 2, 3, 4, 5};
46     EXPECT_EQ(5u, assignmentInitializerList.size());
47     EXPECT_EQ(3, assignmentInitializerList[2]);
48 }
49 
50 // Test indexing operations (at, operator[])
TEST(FixedVector,Indexing)51 TEST(FixedVector, Indexing)
52 {
53     FixedVector<int, 5> vec = {0, 1, 2, 3, 4};
54     EXPECT_EQ(0, vec.at(0));
55     EXPECT_EQ(vec[0], vec.at(0));
56 }
57 
58 // Test the push_back functions
TEST(FixedVector,PushBack)59 TEST(FixedVector, PushBack)
60 {
61     FixedVector<int, 5> vec;
62     vec.push_back(1);
63     EXPECT_EQ(1, vec[0]);
64     vec.push_back(1);
65     vec.push_back(1);
66     vec.push_back(1);
67     vec.push_back(1);
68     EXPECT_EQ(vec.size(), vec.max_size());
69 }
70 
71 // Test the pop_back function
TEST(FixedVector,PopBack)72 TEST(FixedVector, PopBack)
73 {
74     FixedVector<int, 5> vec;
75     vec.push_back(1);
76     EXPECT_EQ(1, (int)vec.size());
77     vec.pop_back();
78     EXPECT_EQ(0, (int)vec.size());
79 }
80 
81 // Test the back function
TEST(FixedVector,Back)82 TEST(FixedVector, Back)
83 {
84     FixedVector<int, 5> vec;
85     vec.push_back(1);
86     vec.push_back(2);
87     EXPECT_EQ(2, vec.back());
88 }
89 
90 // Test the sizing operations
TEST(FixedVector,Size)91 TEST(FixedVector, Size)
92 {
93     FixedVector<int, 5> vec;
94     EXPECT_TRUE(vec.empty());
95     EXPECT_EQ(0u, vec.size());
96     EXPECT_EQ(5u, vec.max_size());
97 
98     vec.push_back(1);
99     EXPECT_FALSE(vec.empty());
100     EXPECT_EQ(1u, vec.size());
101 }
102 
103 // Test clearing the vector
TEST(FixedVector,Clear)104 TEST(FixedVector, Clear)
105 {
106     FixedVector<int, 5> vec = {0, 1, 2, 3, 4};
107     vec.clear();
108     EXPECT_TRUE(vec.empty());
109 }
110 
111 // Test resizing the vector
TEST(FixedVector,Resize)112 TEST(FixedVector, Resize)
113 {
114     FixedVector<int, 5> vec;
115     vec.resize(5u, 1);
116     EXPECT_EQ(5u, vec.size());
117     EXPECT_EQ(1, vec[4]);
118 
119     vec.resize(2u);
120     EXPECT_EQ(2u, vec.size());
121 }
122 
123 // Test iterating over the vector
TEST(FixedVector,Iteration)124 TEST(FixedVector, Iteration)
125 {
126     FixedVector<int, 5> vec = {0, 1, 2, 3};
127 
128     int vistedCount = 0;
129     for (int value : vec)
130     {
131         EXPECT_EQ(vistedCount, value);
132         vistedCount++;
133     }
134     EXPECT_EQ(4, vistedCount);
135 }
136 
137 // Test the "full" method.
TEST(FixedVector,Full)138 TEST(FixedVector, Full)
139 {
140     FixedVector<int, 2> vec;
141 
142     EXPECT_FALSE(vec.full());
143     vec.push_back(0);
144     EXPECT_FALSE(vec.full());
145     vec.push_back(1);
146     EXPECT_TRUE(vec.full());
147 }
148 }  // namespace angle
149