| Index: tests/RefCntTest.cpp
|
| diff --git a/tests/RefCntTest.cpp b/tests/RefCntTest.cpp
|
| index 6a1e0dc2fee3e3c72adb59531ff5a4e9abf36b02..e3f41bdd5d5fc78877aa0d710fa3e7e9658f05b9 100644
|
| --- a/tests/RefCntTest.cpp
|
| +++ b/tests/RefCntTest.cpp
|
| @@ -79,3 +79,93 @@ DEF_TEST(RefCnt, reporter) {
|
| test_refCnt(reporter);
|
| test_weakRefCnt(reporter);
|
| }
|
| +
|
| +///////////////////////////////////////////////////////////////////////////////////////////////////
|
| +
|
| +static int gRefCounter;
|
| +static int gUnrefCounter;
|
| +static int gNewCounter;
|
| +static int gDeleteCounter;
|
| +
|
| +#define check(reporter, ref, unref, make, kill) \
|
| + REPORTER_ASSERT(reporter, gRefCounter == ref); \
|
| + REPORTER_ASSERT(reporter, gUnrefCounter == unref); \
|
| + REPORTER_ASSERT(reporter, gNewCounter == make); \
|
| + REPORTER_ASSERT(reporter, gDeleteCounter == kill);
|
| +
|
| +
|
| +class Effect {
|
| +public:
|
| + Effect() : fRefCnt(1) {
|
| + gNewCounter += 1;
|
| + }
|
| +
|
| + int fRefCnt;
|
| +
|
| + void ref() {
|
| + gRefCounter += 1;
|
| + fRefCnt += 1;
|
| + }
|
| + void unref() {
|
| + gUnrefCounter += 1;
|
| +
|
| + SkASSERT(fRefCnt > 0);
|
| + if (0 == --fRefCnt) {
|
| + gDeleteCounter += 1;
|
| + delete this;
|
| + }
|
| + }
|
| +
|
| + int* method() const { return new int; }
|
| +};
|
| +
|
| +static sk_sp<Effect> Create() {
|
| + return sk_sp<Effect>(new Effect);
|
| +}
|
| +
|
| +class Paint {
|
| +public:
|
| + sk_sp<Effect> fEffect;
|
| +
|
| + const sk_sp<Effect>& get() const { return fEffect; }
|
| +
|
| + void set(sk_sp<Effect> value) {
|
| + fEffect = std::move(value);
|
| + }
|
| +};
|
| +
|
| +DEF_TEST(sk_sp, reporter) {
|
| + gRefCounter = 0;
|
| + gUnrefCounter = 0;
|
| + gNewCounter = 0;
|
| + gDeleteCounter = 0;
|
| +
|
| + Paint paint;
|
| + REPORTER_ASSERT(reporter, paint.fEffect.get() == nullptr);
|
| + REPORTER_ASSERT(reporter, !paint.get());
|
| + check(reporter, 0, 0, 0, 0);
|
| +
|
| + paint.set(Create());
|
| + check(reporter, 0, 0, 1, 0);
|
| + REPORTER_ASSERT(reporter, paint.fEffect.get()->fRefCnt == 1);
|
| +
|
| + paint.set(nullptr);
|
| + check(reporter, 0, 1, 1, 1);
|
| +
|
| + auto e = Create();
|
| + REPORTER_ASSERT(reporter, sizeof(e) == sizeof(void*));
|
| +
|
| + check(reporter, 0, 1, 2, 1);
|
| + paint.set(e);
|
| + check(reporter, 1, 1, 2, 1);
|
| + REPORTER_ASSERT(reporter, paint.fEffect.get()->fRefCnt == 2);
|
| +
|
| + Paint paint2;
|
| + paint2.set(paint.get());
|
| + check(reporter, 2, 1, 2, 1);
|
| + REPORTER_ASSERT(reporter, paint.fEffect.get()->fRefCnt == 3);
|
| +
|
| + delete paint.get()->method();
|
| + check(reporter, 2, 1, 2, 1);
|
| +}
|
| +
|
|
|