| Index: tests/RefCntTest.cpp
 | 
| diff --git a/tests/RefCntTest.cpp b/tests/RefCntTest.cpp
 | 
| index e3f41bdd5d5fc78877aa0d710fa3e7e9658f05b9..0c545a4369a5a2184821c4c54f5956d2e1863011 100644
 | 
| --- a/tests/RefCntTest.cpp
 | 
| +++ b/tests/RefCntTest.cpp
 | 
| @@ -134,11 +134,26 @@ public:
 | 
|      }
 | 
|  };
 | 
|  
 | 
| -DEF_TEST(sk_sp, reporter) {
 | 
| +struct EffectImpl : public Effect {
 | 
| +    static sk_sp<EffectImpl> Create() {
 | 
| +        return sk_sp<EffectImpl>(new EffectImpl);
 | 
| +    }
 | 
| +    int fValue;
 | 
| +};
 | 
| +static sk_sp<Effect> make_effect() {
 | 
| +    auto foo = EffectImpl::Create();
 | 
| +    foo->fValue = 42;
 | 
| +    return std::move(foo);
 | 
| +}
 | 
| +
 | 
| +static void reset_counters() {
 | 
|      gRefCounter = 0;
 | 
|      gUnrefCounter = 0;
 | 
|      gNewCounter = 0;
 | 
|      gDeleteCounter = 0;
 | 
| +}
 | 
| +DEF_TEST(sk_sp, reporter) {
 | 
| +    reset_counters();
 | 
|  
 | 
|      Paint paint;
 | 
|      REPORTER_ASSERT(reporter, paint.fEffect.get() == nullptr);
 | 
| @@ -167,5 +182,68 @@ DEF_TEST(sk_sp, reporter) {
 | 
|  
 | 
|      delete paint.get()->method();
 | 
|      check(reporter, 2, 1, 2, 1);
 | 
| +
 | 
| +    paint.set(nullptr);
 | 
| +    e = nullptr;
 | 
| +    paint2.set(nullptr);
 | 
| +    check(reporter, 2, 4, 2, 2);
 | 
| +
 | 
| +    reset_counters();
 | 
| +    {
 | 
| +        // Test convertible sk_sp assignment.
 | 
| +        check(reporter, 0, 0, 0, 0);
 | 
| +        sk_sp<Effect> foo(nullptr);
 | 
| +        REPORTER_ASSERT(reporter, !foo);
 | 
| +        foo = make_effect();
 | 
| +        REPORTER_ASSERT(reporter, foo);
 | 
| +        check(reporter, 0, 0, 1, 0);
 | 
| +    }
 | 
| +    check(reporter, 0, 1, 1, 1);
 | 
| +
 | 
| +    // Test passing convertible rvalue into funtion.
 | 
| +    reset_counters();
 | 
| +    paint.set(EffectImpl::Create());
 | 
| +    check(reporter, 0, 0, 1, 0);
 | 
| +    paint.set(nullptr);
 | 
| +    check(reporter, 0, 1, 1, 1);
 | 
| +
 | 
| +    reset_counters();
 | 
| +    auto baz = EffectImpl::Create();
 | 
| +    check(reporter, 0, 0, 1, 0);
 | 
| +    paint.set(std::move(baz));
 | 
| +    check(reporter, 0, 0, 1, 0);
 | 
| +    REPORTER_ASSERT(reporter, !baz);
 | 
| +    paint.set(nullptr);
 | 
| +    check(reporter, 0, 1, 1, 1);
 | 
| +
 | 
| +    reset_counters();
 | 
| +    {
 | 
| +        // test comparison operator with convertible type.
 | 
| +        sk_sp<EffectImpl> bar1 = EffectImpl::Create();
 | 
| +        sk_sp<Effect> bar2(bar1);  // convertible copy constructor
 | 
| +        check(reporter, 1, 0, 1, 0);
 | 
| +        REPORTER_ASSERT(reporter, bar1);
 | 
| +        REPORTER_ASSERT(reporter, bar2);
 | 
| +        REPORTER_ASSERT(reporter, bar1 == bar2);
 | 
| +        REPORTER_ASSERT(reporter, bar2 == bar1);
 | 
| +        REPORTER_ASSERT(reporter, !(bar1 != bar2));
 | 
| +        REPORTER_ASSERT(reporter, !(bar2 != bar1));
 | 
| +        sk_sp<Effect> bar3(nullptr);
 | 
| +        bar3 = bar1;  // convertible copy assignment
 | 
| +        check(reporter, 2, 0, 1, 0);
 | 
| +
 | 
| +    }
 | 
| +    check(reporter, 2, 3, 1, 1);
 | 
| +
 | 
| +    // test passing convertible copy into funtion.
 | 
| +    reset_counters();
 | 
| +    baz = EffectImpl::Create();
 | 
| +    check(reporter, 0, 0, 1, 0);
 | 
| +    paint.set(baz);
 | 
| +    check(reporter, 1, 0, 1, 0);
 | 
| +    baz = nullptr;
 | 
| +    check(reporter, 1, 1, 1, 0);
 | 
| +    paint.set(nullptr);
 | 
| +    check(reporter, 1, 2, 1, 1);
 | 
|  }
 | 
|  
 | 
| 
 |