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;