diff options
author | Dan Sinclair <dsinclair@chromium.org> | 2017-09-21 14:52:41 -0400 |
---|---|---|
committer | Chromium commit bot <commit-bot@chromium.org> | 2017-09-21 19:22:00 +0000 |
commit | de44d154f6c61af75f149e965a7f483f0b30dd98 (patch) | |
tree | cb33c824a73bb017d4403fba898b1d8c4e0c1566 /core/fxcrt/maybe_owned_unittest.cpp | |
parent | b89669975f6156fce4ced5c8998125a845f8e7dc (diff) | |
download | pdfium-de44d154f6c61af75f149e965a7f483f0b30dd98.tar.xz |
Move CFX_MaybeOwned to fxcrt::MaybeOwned
This CL moves CFX_MaybeOwned into the fxcrt namespace and removes the
CFX_ prefix.
The test names for maybe owned were updated to be in the MaybeOned test
suite instead of the fxcrt suite.
Bug: pdfium:898
Change-Id: I0c07057d66c8610e7b19133094b4507fff725e76
Reviewed-on: https://pdfium-review.googlesource.com/14470
Commit-Queue: dsinclair <dsinclair@chromium.org>
Reviewed-by: Tom Sepez <tsepez@chromium.org>
Diffstat (limited to 'core/fxcrt/maybe_owned_unittest.cpp')
-rw-r--r-- | core/fxcrt/maybe_owned_unittest.cpp | 182 |
1 files changed, 182 insertions, 0 deletions
diff --git a/core/fxcrt/maybe_owned_unittest.cpp b/core/fxcrt/maybe_owned_unittest.cpp new file mode 100644 index 0000000000..686fa6ffd2 --- /dev/null +++ b/core/fxcrt/maybe_owned_unittest.cpp @@ -0,0 +1,182 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "core/fxcrt/maybe_owned.h" + +#include <memory> +#include <utility> + +#include "core/fxcrt/fx_memory.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "third_party/base/ptr_util.h" + +namespace fxcrt { + +namespace { + +class PseudoDeletable { + public: + explicit PseudoDeletable(int id, int* count_location) + : id_(id), count_location_(count_location) {} + ~PseudoDeletable() { ++(*count_location_); } + int GetID() const { return id_; } + + private: + int id_; + int* count_location_; +}; + +} // namespace + +TEST(MaybeOwned, Null) { + MaybeOwned<PseudoDeletable> ptr1; + EXPECT_FALSE(ptr1.IsOwned()); + EXPECT_FALSE(ptr1); + EXPECT_EQ(nullptr, ptr1.Get()); + + MaybeOwned<PseudoDeletable> ptr2; + EXPECT_TRUE(ptr1 == ptr2); + EXPECT_FALSE(ptr1 != ptr2); +} + +TEST(MaybeOwned, NotOwned) { + int delete_count = 0; + PseudoDeletable thing1(100, &delete_count); + { + MaybeOwned<PseudoDeletable> ptr(&thing1); + EXPECT_FALSE(ptr.IsOwned()); + EXPECT_EQ(ptr.Get(), &thing1); + EXPECT_EQ(100, ptr->GetID()); + EXPECT_TRUE(ptr == &thing1); + EXPECT_FALSE(ptr != &thing1); + + MaybeOwned<PseudoDeletable> empty; + EXPECT_FALSE(ptr == empty); + EXPECT_TRUE(ptr != empty); + } + EXPECT_EQ(0, delete_count); + + delete_count = 0; + PseudoDeletable thing2(200, &delete_count); + { + MaybeOwned<PseudoDeletable> ptr(&thing1); + ptr = &thing2; + EXPECT_FALSE(ptr.IsOwned()); + EXPECT_EQ(ptr.Get(), &thing2); + EXPECT_EQ(200, ptr->GetID()); + } + EXPECT_EQ(0, delete_count); + + delete_count = 0; + int owned_delete_count = 0; + { + MaybeOwned<PseudoDeletable> ptr(&thing1); + EXPECT_EQ(100, ptr->GetID()); + ptr = pdfium::MakeUnique<PseudoDeletable>(300, &owned_delete_count); + EXPECT_TRUE(ptr.IsOwned()); + EXPECT_EQ(300, ptr->GetID()); + } + EXPECT_EQ(0, delete_count); + EXPECT_EQ(1, owned_delete_count); +} + +TEST(MaybeOwned, Owned) { + int delete_count = 0; + { + MaybeOwned<PseudoDeletable> ptr( + pdfium::MakeUnique<PseudoDeletable>(100, &delete_count)); + EXPECT_TRUE(ptr.IsOwned()); + EXPECT_EQ(100, ptr->GetID()); + + MaybeOwned<PseudoDeletable> empty; + EXPECT_FALSE(ptr == empty); + EXPECT_TRUE(ptr != empty); + } + EXPECT_EQ(1, delete_count); + + delete_count = 0; + { + MaybeOwned<PseudoDeletable> ptr( + pdfium::MakeUnique<PseudoDeletable>(200, &delete_count)); + ptr = pdfium::MakeUnique<PseudoDeletable>(300, &delete_count); + EXPECT_TRUE(ptr.IsOwned()); + EXPECT_EQ(300, ptr->GetID()); + EXPECT_EQ(1, delete_count); + } + EXPECT_EQ(2, delete_count); + + delete_count = 0; + int unowned_delete_count = 0; + PseudoDeletable thing2(400, &unowned_delete_count); + { + MaybeOwned<PseudoDeletable> ptr( + pdfium::MakeUnique<PseudoDeletable>(500, &delete_count)); + ptr = &thing2; + EXPECT_FALSE(ptr.IsOwned()); + EXPECT_EQ(400, ptr->GetID()); + EXPECT_EQ(1, delete_count); + EXPECT_EQ(0, unowned_delete_count); + } + EXPECT_EQ(1, delete_count); + EXPECT_EQ(0, unowned_delete_count); +} + +TEST(MaybeOwned, Release) { + int delete_count = 0; + { + std::unique_ptr<PseudoDeletable> stolen; + { + MaybeOwned<PseudoDeletable> ptr( + pdfium::MakeUnique<PseudoDeletable>(100, &delete_count)); + EXPECT_TRUE(ptr.IsOwned()); + stolen = ptr.Release(); + EXPECT_FALSE(ptr.IsOwned()); + EXPECT_EQ(ptr, stolen); + EXPECT_EQ(0, delete_count); + } + EXPECT_EQ(0, delete_count); + } + EXPECT_EQ(1, delete_count); +} + +TEST(MaybeOwned, Move) { + int delete_count = 0; + PseudoDeletable thing1(100, &delete_count); + { + MaybeOwned<PseudoDeletable> ptr1(&thing1); + MaybeOwned<PseudoDeletable> ptr2( + pdfium::MakeUnique<PseudoDeletable>(200, &delete_count)); + EXPECT_FALSE(ptr1.IsOwned()); + EXPECT_TRUE(ptr2.IsOwned()); + + MaybeOwned<PseudoDeletable> ptr3(std::move(ptr1)); + MaybeOwned<PseudoDeletable> ptr4(std::move(ptr2)); + EXPECT_FALSE(ptr1.IsOwned()); + EXPECT_FALSE(ptr2.IsOwned()); + EXPECT_FALSE(ptr3.IsOwned()); + EXPECT_TRUE(ptr4.IsOwned()); + EXPECT_EQ(0, delete_count); + EXPECT_EQ(nullptr, ptr1.Get()); + EXPECT_EQ(nullptr, ptr2.Get()); + EXPECT_EQ(100, ptr3->GetID()); + EXPECT_EQ(200, ptr4->GetID()); + + MaybeOwned<PseudoDeletable> ptr5; + MaybeOwned<PseudoDeletable> ptr6; + ptr5 = std::move(ptr3); + ptr6 = std::move(ptr4); + EXPECT_FALSE(ptr3.IsOwned()); + EXPECT_FALSE(ptr4.IsOwned()); + EXPECT_FALSE(ptr5.IsOwned()); + EXPECT_TRUE(ptr6.IsOwned()); + EXPECT_EQ(0, delete_count); + EXPECT_EQ(nullptr, ptr3.Get()); + EXPECT_EQ(nullptr, ptr4.Get()); + EXPECT_EQ(100, ptr5->GetID()); + EXPECT_EQ(200, ptr6->GetID()); + } + EXPECT_EQ(1, delete_count); +} + +} // namespace fxcrt |