diff options
author | reed <reed@google.com> | 2016-03-01 07:28:51 -0800 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2016-03-01 07:28:51 -0800 |
commit | bb7b043b2db64197d2f6a1edaf3562a50c77afb1 (patch) | |
tree | 18d20cebb755cb2069732472529ac630d3641634 /tests | |
parent | 856cc17db434be717a29e1fa893a2108d1f9db36 (diff) |
isolate sk_sp from larger cl
BUG=skia:
GOLD_TRYBOT_URL= https://gold.skia.org/search2?unt=true&query=source_type%3Dgm&master=false&issue=1752683002
Review URL: https://codereview.chromium.org/1752683002
Diffstat (limited to 'tests')
-rw-r--r-- | tests/RefCntTest.cpp | 90 |
1 files changed, 90 insertions, 0 deletions
diff --git a/tests/RefCntTest.cpp b/tests/RefCntTest.cpp index 6a1e0dc2fe..e3f41bdd5d 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); +} + |