tor-browser

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

test_instance_tracker_test.cc (5757B)


      1 // Copyright 2017 The Abseil Authors.
      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 //      https://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 "absl/container/internal/test_instance_tracker.h"
     16 
     17 #include "gtest/gtest.h"
     18 
     19 namespace {
     20 
     21 using absl::test_internal::CopyableMovableInstance;
     22 using absl::test_internal::CopyableOnlyInstance;
     23 using absl::test_internal::InstanceTracker;
     24 using absl::test_internal::MovableOnlyInstance;
     25 
     26 TEST(TestInstanceTracker, CopyableMovable) {
     27  InstanceTracker tracker;
     28  CopyableMovableInstance src(1);
     29  EXPECT_EQ(1, src.value()) << src;
     30  CopyableMovableInstance copy(src);
     31  CopyableMovableInstance move(std::move(src));
     32  EXPECT_EQ(1, tracker.copies());
     33  EXPECT_EQ(1, tracker.moves());
     34  EXPECT_EQ(0, tracker.swaps());
     35  EXPECT_EQ(3, tracker.instances());
     36  EXPECT_EQ(2, tracker.live_instances());
     37  tracker.ResetCopiesMovesSwaps();
     38 
     39  CopyableMovableInstance copy_assign(1);
     40  copy_assign = copy;
     41  CopyableMovableInstance move_assign(1);
     42  move_assign = std::move(move);
     43  EXPECT_EQ(1, tracker.copies());
     44  EXPECT_EQ(1, tracker.moves());
     45  EXPECT_EQ(0, tracker.swaps());
     46  EXPECT_EQ(5, tracker.instances());
     47  EXPECT_EQ(3, tracker.live_instances());
     48  tracker.ResetCopiesMovesSwaps();
     49 
     50  {
     51    using std::swap;
     52    swap(move_assign, copy);
     53    swap(copy, move_assign);
     54    EXPECT_EQ(2, tracker.swaps());
     55    EXPECT_EQ(0, tracker.copies());
     56    EXPECT_EQ(0, tracker.moves());
     57    EXPECT_EQ(5, tracker.instances());
     58    EXPECT_EQ(3, tracker.live_instances());
     59  }
     60 }
     61 
     62 TEST(TestInstanceTracker, CopyableOnly) {
     63  InstanceTracker tracker;
     64  CopyableOnlyInstance src(1);
     65  EXPECT_EQ(1, src.value()) << src;
     66  CopyableOnlyInstance copy(src);
     67  CopyableOnlyInstance copy2(std::move(src));  // NOLINT
     68  EXPECT_EQ(2, tracker.copies());
     69  EXPECT_EQ(0, tracker.moves());
     70  EXPECT_EQ(3, tracker.instances());
     71  EXPECT_EQ(3, tracker.live_instances());
     72  tracker.ResetCopiesMovesSwaps();
     73 
     74  CopyableOnlyInstance copy_assign(1);
     75  copy_assign = copy;
     76  CopyableOnlyInstance copy_assign2(1);
     77  copy_assign2 = std::move(copy2);  // NOLINT
     78  EXPECT_EQ(2, tracker.copies());
     79  EXPECT_EQ(0, tracker.moves());
     80  EXPECT_EQ(5, tracker.instances());
     81  EXPECT_EQ(5, tracker.live_instances());
     82  tracker.ResetCopiesMovesSwaps();
     83 
     84  {
     85    using std::swap;
     86    swap(src, copy);
     87    swap(copy, src);
     88    EXPECT_EQ(2, tracker.swaps());
     89    EXPECT_EQ(0, tracker.copies());
     90    EXPECT_EQ(0, tracker.moves());
     91    EXPECT_EQ(5, tracker.instances());
     92    EXPECT_EQ(5, tracker.live_instances());
     93  }
     94 }
     95 
     96 TEST(TestInstanceTracker, MovableOnly) {
     97  InstanceTracker tracker;
     98  MovableOnlyInstance src(1);
     99  EXPECT_EQ(1, src.value()) << src;
    100  MovableOnlyInstance move(std::move(src));
    101  MovableOnlyInstance move_assign(2);
    102  move_assign = std::move(move);
    103  EXPECT_EQ(3, tracker.instances());
    104  EXPECT_EQ(1, tracker.live_instances());
    105  EXPECT_EQ(2, tracker.moves());
    106  EXPECT_EQ(0, tracker.copies());
    107  tracker.ResetCopiesMovesSwaps();
    108 
    109  {
    110    using std::swap;
    111    MovableOnlyInstance other(2);
    112    swap(move_assign, other);
    113    swap(other, move_assign);
    114    EXPECT_EQ(2, tracker.swaps());
    115    EXPECT_EQ(0, tracker.copies());
    116    EXPECT_EQ(0, tracker.moves());
    117    EXPECT_EQ(4, tracker.instances());
    118    EXPECT_EQ(2, tracker.live_instances());
    119  }
    120 }
    121 
    122 TEST(TestInstanceTracker, ExistingInstances) {
    123  CopyableMovableInstance uncounted_instance(1);
    124  CopyableMovableInstance uncounted_live_instance(
    125      std::move(uncounted_instance));
    126  InstanceTracker tracker;
    127  EXPECT_EQ(0, tracker.instances());
    128  EXPECT_EQ(0, tracker.live_instances());
    129  EXPECT_EQ(0, tracker.copies());
    130  {
    131    CopyableMovableInstance instance1(1);
    132    EXPECT_EQ(1, tracker.instances());
    133    EXPECT_EQ(1, tracker.live_instances());
    134    EXPECT_EQ(0, tracker.copies());
    135    EXPECT_EQ(0, tracker.moves());
    136    {
    137      InstanceTracker tracker2;
    138      CopyableMovableInstance instance2(instance1);
    139      CopyableMovableInstance instance3(std::move(instance2));
    140      EXPECT_EQ(3, tracker.instances());
    141      EXPECT_EQ(2, tracker.live_instances());
    142      EXPECT_EQ(1, tracker.copies());
    143      EXPECT_EQ(1, tracker.moves());
    144      EXPECT_EQ(2, tracker2.instances());
    145      EXPECT_EQ(1, tracker2.live_instances());
    146      EXPECT_EQ(1, tracker2.copies());
    147      EXPECT_EQ(1, tracker2.moves());
    148    }
    149    EXPECT_EQ(1, tracker.instances());
    150    EXPECT_EQ(1, tracker.live_instances());
    151    EXPECT_EQ(1, tracker.copies());
    152    EXPECT_EQ(1, tracker.moves());
    153  }
    154  EXPECT_EQ(0, tracker.instances());
    155  EXPECT_EQ(0, tracker.live_instances());
    156  EXPECT_EQ(1, tracker.copies());
    157  EXPECT_EQ(1, tracker.moves());
    158 }
    159 
    160 TEST(TestInstanceTracker, Comparisons) {
    161  InstanceTracker tracker;
    162  MovableOnlyInstance one(1), two(2);
    163 
    164  EXPECT_EQ(0, tracker.comparisons());
    165  EXPECT_FALSE(one == two);
    166  EXPECT_EQ(1, tracker.comparisons());
    167  EXPECT_TRUE(one != two);
    168  EXPECT_EQ(2, tracker.comparisons());
    169  EXPECT_TRUE(one < two);
    170  EXPECT_EQ(3, tracker.comparisons());
    171  EXPECT_FALSE(one > two);
    172  EXPECT_EQ(4, tracker.comparisons());
    173  EXPECT_TRUE(one <= two);
    174  EXPECT_EQ(5, tracker.comparisons());
    175  EXPECT_FALSE(one >= two);
    176  EXPECT_EQ(6, tracker.comparisons());
    177  EXPECT_TRUE(one.compare(two) < 0);  // NOLINT
    178  EXPECT_EQ(7, tracker.comparisons());
    179 
    180  tracker.ResetCopiesMovesSwaps();
    181  EXPECT_EQ(0, tracker.comparisons());
    182 }
    183 
    184 }  // namespace