tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

TestSmallPointerArray.cpp (6716B)


      1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
      2 /* vim: set ts=8 sts=2 et sw=2 tw=80: */
      3 /* This Source Code Form is subject to the terms of the Mozilla Public
      4 * License, v. 2.0. If a copy of the MPL was not distributed with this file,
      5 * You can obtain one at http://mozilla.org/MPL/2.0/. */
      6 
      7 #include "mozilla/SmallPointerArray.h"
      8 
      9 #define PTR1 (void*)0x4
     10 #define PTR2 (void*)0x5
     11 #define PTR3 (void*)0x6
     12 
     13 // We explicitly test sizes up to 3 here, as that is when SmallPointerArray<>
     14 // switches to the storage method used for larger arrays.
     15 void TestArrayManipulation() {
     16  using namespace mozilla;
     17  SmallPointerArray<void> testArray;
     18 
     19  MOZ_RELEASE_ASSERT(testArray.Length() == 0);
     20  MOZ_RELEASE_ASSERT(sizeof(testArray) == 2 * sizeof(void*));
     21  MOZ_RELEASE_ASSERT(!testArray.Contains(PTR1));
     22 
     23  testArray.AppendElement(PTR1);
     24 
     25  MOZ_RELEASE_ASSERT(testArray.Length() == 1);
     26  MOZ_RELEASE_ASSERT(testArray[0] == PTR1);
     27  MOZ_RELEASE_ASSERT(testArray.ElementAt(0) == PTR1);
     28  MOZ_RELEASE_ASSERT(testArray.Contains(PTR1));
     29 
     30  testArray.AppendElement(PTR2);
     31 
     32  MOZ_RELEASE_ASSERT(testArray.Length() == 2);
     33  MOZ_RELEASE_ASSERT(testArray[0] == PTR1);
     34  MOZ_RELEASE_ASSERT(testArray.ElementAt(0) == PTR1);
     35  MOZ_RELEASE_ASSERT(testArray[1] == PTR2);
     36  MOZ_RELEASE_ASSERT(testArray.ElementAt(1) == PTR2);
     37  MOZ_RELEASE_ASSERT(testArray.Contains(PTR2));
     38 
     39  MOZ_RELEASE_ASSERT(testArray.RemoveElement(PTR1));
     40  MOZ_RELEASE_ASSERT(!testArray.RemoveElement(PTR1));
     41 
     42  MOZ_RELEASE_ASSERT(testArray.Length() == 1);
     43  MOZ_RELEASE_ASSERT(testArray[0] == PTR2);
     44  MOZ_RELEASE_ASSERT(testArray.ElementAt(0) == PTR2);
     45  MOZ_RELEASE_ASSERT(!testArray.Contains(PTR1));
     46 
     47  testArray.AppendElement(PTR1);
     48 
     49  MOZ_RELEASE_ASSERT(testArray.Length() == 2);
     50  MOZ_RELEASE_ASSERT(testArray[0] == PTR2);
     51  MOZ_RELEASE_ASSERT(testArray.ElementAt(0) == PTR2);
     52  MOZ_RELEASE_ASSERT(testArray[1] == PTR1);
     53  MOZ_RELEASE_ASSERT(testArray.ElementAt(1) == PTR1);
     54  MOZ_RELEASE_ASSERT(testArray.Contains(PTR1));
     55 
     56  testArray.AppendElement(PTR3);
     57 
     58  MOZ_RELEASE_ASSERT(testArray.Length() == 3);
     59  MOZ_RELEASE_ASSERT(testArray[0] == PTR2);
     60  MOZ_RELEASE_ASSERT(testArray.ElementAt(0) == PTR2);
     61  MOZ_RELEASE_ASSERT(testArray[1] == PTR1);
     62  MOZ_RELEASE_ASSERT(testArray.ElementAt(1) == PTR1);
     63  MOZ_RELEASE_ASSERT(testArray[2] == PTR3);
     64  MOZ_RELEASE_ASSERT(testArray.ElementAt(2) == PTR3);
     65  MOZ_RELEASE_ASSERT(testArray.Contains(PTR3));
     66 
     67  MOZ_RELEASE_ASSERT(testArray.RemoveElement(PTR1));
     68 
     69  MOZ_RELEASE_ASSERT(testArray.Length() == 2);
     70  MOZ_RELEASE_ASSERT(testArray[0] == PTR2);
     71  MOZ_RELEASE_ASSERT(testArray.ElementAt(0) == PTR2);
     72  MOZ_RELEASE_ASSERT(testArray[1] == PTR3);
     73  MOZ_RELEASE_ASSERT(testArray.ElementAt(1) == PTR3);
     74 
     75  MOZ_RELEASE_ASSERT(testArray.RemoveElement(PTR2));
     76 
     77  MOZ_RELEASE_ASSERT(testArray.Length() == 1);
     78  MOZ_RELEASE_ASSERT(testArray[0] == PTR3);
     79  MOZ_RELEASE_ASSERT(testArray.ElementAt(0) == PTR3);
     80 
     81  MOZ_RELEASE_ASSERT(testArray.RemoveElement(PTR3));
     82 
     83  MOZ_RELEASE_ASSERT(testArray.Length() == 0);
     84 
     85  testArray.Clear();
     86 
     87  MOZ_RELEASE_ASSERT(testArray.Length() == 0);
     88 
     89  testArray.AppendElement(PTR1);
     90 
     91  MOZ_RELEASE_ASSERT(testArray.Length() == 1);
     92  MOZ_RELEASE_ASSERT(testArray[0] == PTR1);
     93  MOZ_RELEASE_ASSERT(testArray.ElementAt(0) == PTR1);
     94 
     95  testArray.AppendElement(PTR2);
     96 
     97  MOZ_RELEASE_ASSERT(testArray.Length() == 2);
     98  MOZ_RELEASE_ASSERT(testArray[0] == PTR1);
     99  MOZ_RELEASE_ASSERT(testArray.ElementAt(0) == PTR1);
    100  MOZ_RELEASE_ASSERT(testArray[1] == PTR2);
    101  MOZ_RELEASE_ASSERT(testArray.ElementAt(1) == PTR2);
    102 
    103  MOZ_RELEASE_ASSERT(testArray.RemoveElement(PTR2));
    104 
    105  MOZ_RELEASE_ASSERT(testArray.Length() == 1);
    106  MOZ_RELEASE_ASSERT(testArray[0] == PTR1);
    107  MOZ_RELEASE_ASSERT(testArray.ElementAt(0) == PTR1);
    108 
    109  MOZ_RELEASE_ASSERT(!testArray.RemoveElement(PTR3));
    110 
    111  MOZ_RELEASE_ASSERT(testArray.Length() == 1);
    112  MOZ_RELEASE_ASSERT(testArray[0] == PTR1);
    113  MOZ_RELEASE_ASSERT(testArray.ElementAt(0) == PTR1);
    114 }
    115 
    116 void TestRangeBasedLoops() {
    117  using namespace mozilla;
    118  SmallPointerArray<void> testArray;
    119  void* verification[3];
    120  uint32_t entries = 0;
    121 
    122  for (void* test : testArray) {
    123    verification[entries++] = test;
    124  }
    125 
    126  MOZ_RELEASE_ASSERT(entries == 0);
    127 
    128  testArray.AppendElement(PTR1);
    129 
    130  for (void* test : testArray) {
    131    verification[entries++] = test;
    132  }
    133 
    134  MOZ_RELEASE_ASSERT(entries == 1);
    135  MOZ_RELEASE_ASSERT(verification[0] == PTR1);
    136 
    137  entries = 0;
    138 
    139  testArray.AppendElement(PTR2);
    140 
    141  for (void* test : testArray) {
    142    verification[entries++] = test;
    143  }
    144 
    145  MOZ_RELEASE_ASSERT(entries == 2);
    146  MOZ_RELEASE_ASSERT(verification[0] == PTR1);
    147  MOZ_RELEASE_ASSERT(verification[1] == PTR2);
    148 
    149  entries = 0;
    150 
    151  testArray.RemoveElement(PTR1);
    152 
    153  for (void* test : testArray) {
    154    verification[entries++] = test;
    155  }
    156 
    157  MOZ_RELEASE_ASSERT(entries == 1);
    158  MOZ_RELEASE_ASSERT(verification[0] == PTR2);
    159 
    160  entries = 0;
    161 
    162  testArray.AppendElement(PTR1);
    163  testArray.AppendElement(PTR3);
    164 
    165  for (void* test : testArray) {
    166    verification[entries++] = test;
    167  }
    168 
    169  MOZ_RELEASE_ASSERT(entries == 3);
    170  MOZ_RELEASE_ASSERT(verification[0] == PTR2);
    171  MOZ_RELEASE_ASSERT(verification[1] == PTR1);
    172  MOZ_RELEASE_ASSERT(verification[2] == PTR3);
    173 
    174  entries = 0;
    175 
    176  testArray.RemoveElement(PTR1);
    177  testArray.RemoveElement(PTR2);
    178  testArray.RemoveElement(PTR3);
    179 
    180  for (void* test : testArray) {
    181    verification[entries++] = test;
    182  }
    183 
    184  MOZ_RELEASE_ASSERT(entries == 0);
    185 
    186  testArray.Clear();
    187 
    188  for (void* test : testArray) {
    189    verification[entries++] = test;
    190  }
    191 
    192  MOZ_RELEASE_ASSERT(entries == 0);
    193 }
    194 
    195 void TestMove() {
    196  using namespace mozilla;
    197 
    198  SmallPointerArray<void> testArray;
    199  testArray.AppendElement(PTR1);
    200  testArray.AppendElement(PTR2);
    201 
    202  SmallPointerArray<void> moved = std::move(testArray);
    203 
    204  MOZ_RELEASE_ASSERT(testArray.IsEmpty());
    205  MOZ_RELEASE_ASSERT(moved.Length() == 2);
    206  MOZ_RELEASE_ASSERT(moved[0] == PTR1);
    207  MOZ_RELEASE_ASSERT(moved[1] == PTR2);
    208 
    209  // Heap case.
    210  moved.AppendElement(PTR3);
    211 
    212  SmallPointerArray<void> another = std::move(moved);
    213 
    214  MOZ_RELEASE_ASSERT(testArray.IsEmpty());
    215  MOZ_RELEASE_ASSERT(moved.IsEmpty());
    216  MOZ_RELEASE_ASSERT(another.Length() == 3);
    217  MOZ_RELEASE_ASSERT(another[0] == PTR1);
    218  MOZ_RELEASE_ASSERT(another[1] == PTR2);
    219  MOZ_RELEASE_ASSERT(another[2] == PTR3);
    220 
    221  // Move assignment.
    222  testArray = std::move(another);
    223 
    224  MOZ_RELEASE_ASSERT(moved.IsEmpty());
    225  MOZ_RELEASE_ASSERT(another.IsEmpty());
    226  MOZ_RELEASE_ASSERT(testArray.Length() == 3);
    227  MOZ_RELEASE_ASSERT(testArray[0] == PTR1);
    228  MOZ_RELEASE_ASSERT(testArray[1] == PTR2);
    229  MOZ_RELEASE_ASSERT(testArray[2] == PTR3);
    230 }
    231 
    232 int main() {
    233  TestArrayManipulation();
    234  TestRangeBasedLoops();
    235  TestMove();
    236  return 0;
    237 }