diff options
author | tsepez <tsepez@chromium.org> | 2016-10-17 11:20:01 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2016-10-17 11:20:01 -0700 |
commit | 2239cee23e914b974b458699d52733d7dd3116a6 (patch) | |
tree | c9c2baa2331b4ee4fc081dc09da27017ab718b2f /core/fxcrt/cfx_shared_copy_on_write_unittest.cpp | |
parent | d5bd8a16565bbee05bfb8a8409f3ba90c461da0e (diff) | |
download | pdfium-2239cee23e914b974b458699d52733d7dd3116a6.tar.xz |
Rename CFX_CountRef to CFX_SharedCopyOnWrite
Avoid confusing this class with other ref-counted objects.
Review-Url: https://codereview.chromium.org/2426673002
Diffstat (limited to 'core/fxcrt/cfx_shared_copy_on_write_unittest.cpp')
-rw-r--r-- | core/fxcrt/cfx_shared_copy_on_write_unittest.cpp | 129 |
1 files changed, 129 insertions, 0 deletions
diff --git a/core/fxcrt/cfx_shared_copy_on_write_unittest.cpp b/core/fxcrt/cfx_shared_copy_on_write_unittest.cpp new file mode 100644 index 0000000000..b0205d899b --- /dev/null +++ b/core/fxcrt/cfx_shared_copy_on_write_unittest.cpp @@ -0,0 +1,129 @@ +// 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/cfx_shared_copy_on_write.h" + +#include <map> +#include <string> + +#include "testing/fx_string_testhelpers.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace { + +class Observer { + public: + void OnConstruct(const std::string& name) { construction_counts_[name]++; } + void OnDestruct(const std::string& name) { destruction_counts_[name]++; } + int GetConstructionCount(const std::string& name) { + return construction_counts_[name]; + } + int GetDestructionCount(const std::string& name) { + return destruction_counts_[name]; + } + + private: + std::map<std::string, int> construction_counts_; + std::map<std::string, int> destruction_counts_; +}; + +class Object { + public: + Object(Observer* observer, const std::string& name) + : name_(name), observer_(observer) { + observer->OnConstruct(name_); + } + Object(const Object& that) : name_(that.name_), observer_(that.observer_) { + observer_->OnConstruct(name_); + } + ~Object() { observer_->OnDestruct(name_); } + + private: + std::string name_; + Observer* observer_; +}; + +} // namespace + +TEST(fxcrt, SharedCopyOnWriteNull) { + Observer observer; + { + CFX_SharedCopyOnWrite<Object> ptr; + EXPECT_EQ(nullptr, ptr.GetObject()); + } +} + +TEST(fxcrt, SharedCopyOnWriteCopy) { + Observer observer; + { + CFX_SharedCopyOnWrite<Object> ptr1; + ptr1.Emplace(&observer, std::string("one")); + { + CFX_SharedCopyOnWrite<Object> ptr2 = ptr1; + EXPECT_EQ(1, observer.GetConstructionCount("one")); + EXPECT_EQ(0, observer.GetDestructionCount("one")); + } + { + CFX_SharedCopyOnWrite<Object> ptr3(ptr1); + EXPECT_EQ(1, observer.GetConstructionCount("one")); + EXPECT_EQ(0, observer.GetDestructionCount("one")); + } + EXPECT_EQ(1, observer.GetConstructionCount("one")); + EXPECT_EQ(0, observer.GetDestructionCount("one")); + } + EXPECT_EQ(1, observer.GetDestructionCount("one")); +} + +TEST(fxcrt, SharedCopyOnWriteAssignOverOld) { + Observer observer; + { + CFX_SharedCopyOnWrite<Object> ptr1; + ptr1.Emplace(&observer, std::string("one")); + ptr1.Emplace(&observer, std::string("two")); + EXPECT_EQ(1, observer.GetConstructionCount("one")); + EXPECT_EQ(1, observer.GetConstructionCount("two")); + EXPECT_EQ(1, observer.GetDestructionCount("one")); + EXPECT_EQ(0, observer.GetDestructionCount("two")); + } + EXPECT_EQ(1, observer.GetDestructionCount("two")); +} + +TEST(fxcrt, SharedCopyOnWriteAssignOverRetained) { + Observer observer; + { + CFX_SharedCopyOnWrite<Object> ptr1; + ptr1.Emplace(&observer, std::string("one")); + CFX_SharedCopyOnWrite<Object> ptr2(ptr1); + ptr1.Emplace(&observer, std::string("two")); + EXPECT_EQ(1, observer.GetConstructionCount("one")); + EXPECT_EQ(1, observer.GetConstructionCount("two")); + EXPECT_EQ(0, observer.GetDestructionCount("one")); + EXPECT_EQ(0, observer.GetDestructionCount("two")); + } + EXPECT_EQ(1, observer.GetDestructionCount("one")); + EXPECT_EQ(1, observer.GetDestructionCount("two")); +} + +TEST(fxcrt, SharedCopyOnWriteGetModify) { + Observer observer; + { + CFX_SharedCopyOnWrite<Object> ptr; + EXPECT_NE(nullptr, ptr.GetPrivateCopy(&observer, std::string("one"))); + EXPECT_EQ(1, observer.GetConstructionCount("one")); + EXPECT_EQ(0, observer.GetDestructionCount("one")); + + EXPECT_NE(nullptr, ptr.GetPrivateCopy(&observer, std::string("one"))); + EXPECT_EQ(1, observer.GetConstructionCount("one")); + EXPECT_EQ(0, observer.GetDestructionCount("one")); + { + CFX_SharedCopyOnWrite<Object> other(ptr); + EXPECT_NE(nullptr, ptr.GetPrivateCopy(&observer, std::string("one"))); + EXPECT_EQ(2, observer.GetConstructionCount("one")); + EXPECT_EQ(0, observer.GetDestructionCount("one")); + } + EXPECT_EQ(2, observer.GetConstructionCount("one")); + EXPECT_EQ(1, observer.GetDestructionCount("one")); + } + EXPECT_EQ(2, observer.GetDestructionCount("one")); +} |