add protected method for internal_dispose overrides to jam fRefCnt before
calling destructor.
move SkTRefArray to actually inherit from SkRefCnt
Review URL: https://codereview.appspot.com/6422057
git-svn-id: http://skia.googlecode.com/svn/trunk@4719 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/tests/RefCntTest.cpp b/tests/RefCntTest.cpp
index 569e4e4..5197ffb 100644
--- a/tests/RefCntTest.cpp
+++ b/tests/RefCntTest.cpp
@@ -17,10 +17,15 @@
class InstCounterClass {
public:
- InstCounterClass() { gInstCounter += 1; }
- ~InstCounterClass() { gInstCounter -= 1; }
+ InstCounterClass() { fCount = gInstCounter++; }
+ InstCounterClass(const InstCounterClass& src) {
+ fCount = src.fCount;
+ gInstCounter += 1;
+ }
+ virtual ~InstCounterClass() { gInstCounter -= 1; }
static int gInstCounter;
+ int fCount;
};
int InstCounterClass::gInstCounter;
@@ -28,13 +33,40 @@
static void test_refarray(skiatest::Reporter* reporter) {
REPORTER_ASSERT(reporter, 0 == InstCounterClass::gInstCounter);
- int N = 10;
+ const int N = 10;
SkTRefArray<InstCounterClass>* array = SkTRefArray<InstCounterClass>::Create(N);
+
REPORTER_ASSERT(reporter, 1 == array->getRefCnt());
+ REPORTER_ASSERT(reporter, N == array->count());
REPORTER_ASSERT(reporter, N == InstCounterClass::gInstCounter);
- REPORTER_ASSERT(reporter, array->count() == N);
+ array->unref();
+ REPORTER_ASSERT(reporter, 0 == InstCounterClass::gInstCounter);
+
+ // Now test the copy factory
+ int i;
+ InstCounterClass* src = new InstCounterClass[N];
+ REPORTER_ASSERT(reporter, N == InstCounterClass::gInstCounter);
+ for (i = 0; i < N; ++i) {
+ REPORTER_ASSERT(reporter, i == src[i].fCount);
+ }
+
+ array = SkTRefArray<InstCounterClass>::Create(src, N);
+ REPORTER_ASSERT(reporter, 1 == array->getRefCnt());
+ REPORTER_ASSERT(reporter, N == array->count());
+
+ REPORTER_ASSERT(reporter, 2*N == InstCounterClass::gInstCounter);
+ for (i = 0; i < N; ++i) {
+ REPORTER_ASSERT(reporter, i == (*array)[i].fCount);
+ }
+
+ delete[] src;
+ REPORTER_ASSERT(reporter, N == InstCounterClass::gInstCounter);
+
+ for (i = 0; i < N; ++i) {
+ REPORTER_ASSERT(reporter, i == (*array)[i].fCount);
+ }
array->unref();
REPORTER_ASSERT(reporter, 0 == InstCounterClass::gInstCounter);
}