aboutsummaryrefslogtreecommitdiffhomepage
path: root/tests
diff options
context:
space:
mode:
authorGravatar reed <reed@google.com>2016-03-01 07:28:51 -0800
committerGravatar Commit bot <commit-bot@chromium.org>2016-03-01 07:28:51 -0800
commitbb7b043b2db64197d2f6a1edaf3562a50c77afb1 (patch)
tree18d20cebb755cb2069732472529ac630d3641634 /tests
parent856cc17db434be717a29e1fa893a2108d1f9db36 (diff)
isolate sk_sp from larger cl
Diffstat (limited to 'tests')
-rw-r--r--tests/RefCntTest.cpp90
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);
+}
+