Add two more RetainPtr tests.
The MoveAssignConvert test would fail without the move convert
constructor from the previous CL, defaulting to copy assign.
-- use Unleak() in one place for clarity.
Change-Id: I2cb8d90fc7652b26184a0a06a1580cb5311a271e
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/97270
Reviewed-by: Lei Zhang <thestig@chromium.org>
Commit-Queue: Tom Sepez <tsepez@chromium.org>
diff --git a/core/fxcrt/retain_ptr.h b/core/fxcrt/retain_ptr.h
index 4087dbb..b8bc6a0 100644
--- a/core/fxcrt/retain_ptr.h
+++ b/core/fxcrt/retain_ptr.h
@@ -83,7 +83,7 @@
// Move-assign a RetainPtr. After assignment, |that| will be NULL.
RetainPtr& operator=(RetainPtr&& that) noexcept {
- m_pObj.reset(that.Leak());
+ Unleak(that.Leak());
return *this;
}
diff --git a/core/fxcrt/retain_ptr_unittest.cpp b/core/fxcrt/retain_ptr_unittest.cpp
index 655a964..aae889c 100644
--- a/core/fxcrt/retain_ptr_unittest.cpp
+++ b/core/fxcrt/retain_ptr_unittest.cpp
@@ -213,6 +213,29 @@
EXPECT_EQ(3, obj.release_count());
}
+TEST(RetainPtr, AssignConvert) {
+ PseudoRetainable obj;
+ {
+ RetainPtr<PseudoRetainable> ptr(&obj);
+ {
+ RetainPtr<const PseudoRetainable> ptr2;
+ ptr2 = ptr;
+ EXPECT_EQ(2, obj.retain_count());
+ EXPECT_EQ(0, obj.release_count());
+ }
+ {
+ RetainPtr<const PseudoRetainable> ptr2;
+ ptr2 = ptr.Get(); // Test assignment from underlying type.
+ EXPECT_EQ(3, obj.retain_count());
+ EXPECT_EQ(1, obj.release_count());
+ }
+ EXPECT_EQ(3, obj.retain_count());
+ EXPECT_EQ(2, obj.release_count());
+ }
+ EXPECT_EQ(3, obj.retain_count());
+ EXPECT_EQ(3, obj.release_count());
+}
+
TEST(RetainPtr, MoveAssign) {
PseudoRetainable obj;
{
@@ -234,6 +257,27 @@
EXPECT_EQ(1, obj.release_count());
}
+TEST(RetainPtr, MoveAssignConvert) {
+ PseudoRetainable obj;
+ {
+ RetainPtr<PseudoRetainable> ptr1(&obj);
+ {
+ RetainPtr<const PseudoRetainable> ptr2;
+ EXPECT_EQ(&obj, ptr1.Get());
+ EXPECT_FALSE(ptr2.Get());
+ ptr2 = std::move(ptr1);
+ EXPECT_FALSE(ptr1.Get());
+ EXPECT_EQ(&obj, ptr2.Get());
+ EXPECT_EQ(1, obj.retain_count());
+ EXPECT_EQ(0, obj.release_count());
+ }
+ EXPECT_EQ(1, obj.retain_count());
+ EXPECT_EQ(1, obj.release_count());
+ }
+ EXPECT_EQ(1, obj.retain_count());
+ EXPECT_EQ(1, obj.release_count());
+}
+
TEST(RetainPtr, Equals) {
PseudoRetainable obj1;
PseudoRetainable obj2;