Home | History | Annotate | Download | only in tests
      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/fixed_size_vector.h"
     20 
     21 using chre::FixedSizeVector;
     22 
     23 namespace {
     24 constexpr int kMaxTestCapacity = 10;
     25 int destructor_count[kMaxTestCapacity];
     26 
     27 class Foo {
     28  public:
     29   ~Foo() {
     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 
     43 TEST(FixedSizeVector, EmptyWithCapacityWithDefault) {
     44   FixedSizeVector<int, 8> testVector;
     45   ASSERT_NE(testVector.data(), nullptr);
     46   ASSERT_EQ(testVector.size(), 0);
     47   ASSERT_EQ(testVector.capacity(), 8);
     48   ASSERT_TRUE(testVector.empty());
     49   ASSERT_FALSE(testVector.full());
     50 }
     51 
     52 TEST(FixedSizeVector, PushBackOneAndRead) {
     53   FixedSizeVector<int, 8> testVector;
     54   testVector.push_back(0x1337);
     55   ASSERT_NE(testVector.data(), nullptr);
     56   ASSERT_EQ(testVector.size(), 1);
     57   ASSERT_EQ(testVector.capacity(), 8);
     58   ASSERT_FALSE(testVector.empty());
     59   ASSERT_FALSE(testVector.full());
     60   ASSERT_EQ(testVector[0], 0x1337);
     61 }
     62 
     63 TEST(FixedSizeVector, PushBackUntilFullAndRead) {
     64   FixedSizeVector<int, 4> testVector;
     65   testVector.push_back(1000);
     66   testVector.push_back(2000);
     67   testVector.push_back(3000);
     68   testVector.push_back(4000);
     69 
     70   ASSERT_NE(testVector.data(), nullptr);
     71   ASSERT_TRUE(testVector.full());
     72   ASSERT_FALSE(testVector.empty());
     73   ASSERT_EQ(testVector.size(), 4);
     74   ASSERT_EQ(testVector[0], 1000);
     75   ASSERT_EQ(testVector[1], 2000);
     76   ASSERT_EQ(testVector[2], 3000);
     77   ASSERT_EQ(testVector[3], 4000);
     78 
     79   ASSERT_EQ(testVector.data()[0], 1000);
     80   ASSERT_EQ(testVector.data()[1], 2000);
     81   ASSERT_EQ(testVector.data()[2], 3000);
     82   ASSERT_EQ(testVector.data()[3], 4000);
     83 }
     84 
     85 TEST(FixedSizeVector, PushBackAndErase) {
     86   FixedSizeVector<int, 8> vector;
     87   vector.push_back(0x1337);
     88   vector.push_back(0xcafe);
     89   vector.push_back(0xbeef);
     90   vector.push_back(0xface);
     91 
     92   vector.erase(1);
     93   ASSERT_EQ(vector[0], 0x1337);
     94   ASSERT_EQ(vector.data()[0], 0x1337);
     95   ASSERT_EQ(vector[1], 0xbeef);
     96   ASSERT_EQ(vector.data()[1], 0xbeef);
     97   ASSERT_EQ(vector[2], 0xface);
     98   ASSERT_EQ(vector.data()[2], 0xface);
     99   ASSERT_EQ(vector.size(), 3);
    100 }
    101 
    102 TEST(FixedSizeVector, EraseDestructorCalled) {
    103   FixedSizeVector<Foo, 4> vector;
    104   for (size_t i = 0; i < 4; ++i) {
    105     vector.push_back(Foo());
    106     vector[i].setValue(i);
    107   }
    108 
    109   // last item before erase is '3'.
    110   vector.erase(1);
    111   EXPECT_EQ(0, destructor_count[0]);
    112   EXPECT_EQ(0, destructor_count[1]);
    113   EXPECT_EQ(0, destructor_count[2]);
    114   EXPECT_EQ(1, destructor_count[3]);
    115 
    116   // last item before erase is still '3'.
    117   vector.erase(2);
    118   EXPECT_EQ(0, destructor_count[0]);
    119   EXPECT_EQ(0, destructor_count[1]);
    120   EXPECT_EQ(0, destructor_count[2]);
    121   EXPECT_EQ(2, destructor_count[3]);
    122 
    123   // last item before erase is now '2'.
    124   vector.erase(0);
    125   EXPECT_EQ(0, destructor_count[0]);
    126   EXPECT_EQ(0, destructor_count[1]);
    127   EXPECT_EQ(1, destructor_count[2]);
    128   EXPECT_EQ(2, destructor_count[3]);
    129 }
    130 
    131 TEST(FixedSizeVectorDeathTest, SwapWithInvalidIndex) {
    132   FixedSizeVector<int, 4> vector;
    133   vector.push_back(0x1337);
    134   vector.push_back(0xcafe);
    135   EXPECT_DEATH(vector.swap(0, 2), "");
    136 }
    137 
    138 TEST(FixedSizeVectorDeathTest, SwapWithInvalidIndices) {
    139   FixedSizeVector<int, 4> vector;
    140   vector.push_back(0x1337);
    141   vector.push_back(0xcafe);
    142   EXPECT_DEATH(vector.swap(2, 3), "");
    143 }
    144 
    145 TEST(FixedSizeVector, Swap) {
    146   FixedSizeVector<int, 4> vector;
    147   vector.push_back(0x1337);
    148   vector.push_back(0xcafe);
    149 
    150   vector.swap(0, 1);
    151   EXPECT_EQ(vector[0], 0xcafe);
    152   EXPECT_EQ(vector[1], 0x1337);
    153 }
    154 
    155 TEST(FixedSizeVector, ResizeLarger) {
    156   FixedSizeVector<int, 4> vector;
    157   vector.resize(4);
    158   EXPECT_EQ(vector.size(), 4);
    159 }
    160 
    161 TEST(FixedSizeVector, ResizeSmaller) {
    162   destructor_count[0] = 0;
    163 
    164   FixedSizeVector<Foo, 4> vector;
    165   for (size_t i = 0; i < 3; i++) {
    166     vector.push_back(Foo());
    167     vector[i].setValue(0);
    168   }
    169 
    170   EXPECT_EQ(vector.size(), 3);
    171   EXPECT_EQ(destructor_count[0], 0);
    172   vector.resize(2);
    173   EXPECT_EQ(vector.size(), 2);
    174   EXPECT_EQ(destructor_count[0], 1);
    175 }
    176 
    177 TEST(FixedSizeVector, Iterator) {
    178   FixedSizeVector<int, 8> vector;
    179   vector.push_back(0);
    180   vector.push_back(1);
    181   vector.push_back(2);
    182 
    183   size_t index = 0;
    184   for (FixedSizeVector<int, 8>::iterator it = vector.begin();
    185        it != vector.end(); ++it) {
    186     EXPECT_EQ(vector[index++], *it);
    187   }
    188 
    189   FixedSizeVector<int, 8>::iterator it = vector.begin() + vector.size() - 1;
    190   EXPECT_EQ(vector[vector.size() - 1], *it);
    191 
    192   it = vector.begin() + vector.size();
    193   EXPECT_TRUE(it == vector.end());
    194 }
    195 
    196 TEST(FixedSizeVector, ConstIterator) {
    197   FixedSizeVector<int, 8> vector;
    198   vector.push_back(0);
    199   vector.push_back(1);
    200   vector.push_back(2);
    201 
    202   size_t index = 0;
    203   for (FixedSizeVector<int, 8>::const_iterator cit = vector.cbegin();
    204        cit != vector.cend(); ++cit) {
    205     EXPECT_EQ(vector[index++], *cit);
    206   }
    207 
    208   FixedSizeVector<int, 8>::const_iterator cit =
    209       vector.cbegin() + vector.size() - 1;
    210   EXPECT_EQ(vector[vector.size() - 1], *cit);
    211 
    212   cit = vector.cbegin() + vector.size();
    213   EXPECT_TRUE(cit == vector.cend());
    214 }
    215 
    216 TEST(FixedSizeVector, IteratorAndPushBack) {
    217   FixedSizeVector<int, 8> vector;
    218   vector.push_back(0);
    219   vector.push_back(1);
    220   vector.push_back(2);
    221 
    222   FixedSizeVector<int, 8>::iterator it_b = vector.begin();
    223   FixedSizeVector<int, 8>::iterator it_e = vector.end();
    224 
    225   vector.push_back(3);
    226 
    227   size_t index = 0;
    228   while (it_b != it_e) {
    229     EXPECT_EQ(vector[index++], *it_b++);
    230   }
    231 }
    232 
    233 TEST(FixedSizeVector, IteratorAndEmplaceBack) {
    234   FixedSizeVector<int, 8> vector;
    235   vector.push_back(0);
    236   vector.push_back(1);
    237   vector.push_back(2);
    238 
    239   FixedSizeVector<int, 8>::iterator it_b = vector.begin();
    240   FixedSizeVector<int, 8>::iterator it_e = vector.end();
    241 
    242   vector.emplace_back(3);
    243 
    244   size_t index = 0;
    245   while (it_b != it_e) {
    246     EXPECT_EQ(vector[index++], *it_b++);
    247   }
    248 }
    249 
    250 TEST(FixedSizeVector, IteratorAndErase) {
    251   FixedSizeVector<int, 8> vector;
    252   vector.push_back(0);
    253   vector.push_back(1);
    254   vector.push_back(2);
    255 
    256   FixedSizeVector<int, 8>::iterator it_b = vector.begin();
    257 
    258   vector.erase(2);
    259 
    260   size_t index = 0;
    261   while (index < 2) {
    262     EXPECT_EQ(vector[index++], *it_b++);
    263   }
    264 }
    265 
    266 TEST(FixedSizeVector, IteratorAndSwap) {
    267   FixedSizeVector<int, 8> vector;
    268   vector.push_back(0);
    269   vector.push_back(1);
    270   vector.push_back(2);
    271   vector.push_back(3);
    272 
    273   FixedSizeVector<int, 8>::iterator it_b = vector.begin();
    274 
    275   vector.swap(1, 3);
    276 
    277   size_t index = 0;
    278   while (index < 4) {
    279     if (index != 1 && index != 3) {
    280       EXPECT_EQ(vector[index], *it_b);
    281     }
    282     index++;
    283     it_b++;
    284   }
    285 }
    286 
    287 TEST(FixedSizeVector, IteratorAndResize) {
    288   FixedSizeVector<int, 8> vector;
    289   vector.push_back(0);
    290   vector.push_back(1);
    291   vector.push_back(2);
    292   vector.push_back(3);
    293 
    294   FixedSizeVector<int, 8>::iterator it_b = vector.begin();
    295 
    296   vector.resize(2);
    297 
    298   size_t index = 0;
    299   while (index < 2) {
    300     EXPECT_EQ(vector[index++], *it_b++);
    301   }
    302 }
    303