1 2 /* 3 * Copyright 2011 Google Inc. 4 * 5 * Use of this source code is governed by a BSD-style license that can be 6 * found in the LICENSE file. 7 */ 8 #include "Test.h" 9 #include "SkRefDict.h" 10 11 class TestRC : public SkRefCnt { 12 public: 13 SK_DECLARE_INST_COUNT(TestRC) 14 private: 15 typedef SkRefCnt INHERITED; 16 }; 17 18 SK_DEFINE_INST_COUNT(TestRC) 19 20 static void TestRefDict(skiatest::Reporter* reporter) { 21 TestRC data0, data1; 22 SkRefDict dict; 23 24 REPORTER_ASSERT(reporter, NULL == dict.find(NULL)); 25 REPORTER_ASSERT(reporter, NULL == dict.find("foo")); 26 REPORTER_ASSERT(reporter, NULL == dict.find("bar")); 27 28 dict.set("foo", &data0); 29 REPORTER_ASSERT(reporter, &data0 == dict.find("foo")); 30 REPORTER_ASSERT(reporter, 2 == data0.getRefCnt()); 31 32 dict.set("foo", &data0); 33 REPORTER_ASSERT(reporter, &data0 == dict.find("foo")); 34 REPORTER_ASSERT(reporter, 2 == data0.getRefCnt()); 35 36 dict.set("foo", &data1); 37 REPORTER_ASSERT(reporter, &data1 == dict.find("foo")); 38 REPORTER_ASSERT(reporter, 1 == data0.getRefCnt()); 39 REPORTER_ASSERT(reporter, 2 == data1.getRefCnt()); 40 41 dict.set("foo", NULL); 42 REPORTER_ASSERT(reporter, NULL == dict.find("foo")); 43 REPORTER_ASSERT(reporter, 1 == data0.getRefCnt()); 44 REPORTER_ASSERT(reporter, 1 == data1.getRefCnt()); 45 46 dict.set("foo", &data0); 47 dict.set("bar", &data1); 48 REPORTER_ASSERT(reporter, &data0 == dict.find("foo")); 49 REPORTER_ASSERT(reporter, &data1 == dict.find("bar")); 50 REPORTER_ASSERT(reporter, 2 == data0.getRefCnt()); 51 REPORTER_ASSERT(reporter, 2 == data1.getRefCnt()); 52 53 dict.set("foo", &data1); 54 REPORTER_ASSERT(reporter, &data1 == dict.find("foo")); 55 REPORTER_ASSERT(reporter, &data1 == dict.find("bar")); 56 REPORTER_ASSERT(reporter, 1 == data0.getRefCnt()); 57 REPORTER_ASSERT(reporter, 3 == data1.getRefCnt()); 58 59 dict.removeAll(); 60 REPORTER_ASSERT(reporter, NULL == dict.find("foo")); 61 REPORTER_ASSERT(reporter, NULL == dict.find("bar")); 62 REPORTER_ASSERT(reporter, 1 == data0.getRefCnt()); 63 REPORTER_ASSERT(reporter, 1 == data1.getRefCnt()); 64 65 { 66 SkRefDict d; 67 REPORTER_ASSERT(reporter, NULL == d.find("foo")); 68 REPORTER_ASSERT(reporter, 1 == data0.getRefCnt()); 69 d.set("foo", &data0); 70 REPORTER_ASSERT(reporter, &data0 == d.find("foo")); 71 REPORTER_ASSERT(reporter, 2 == data0.getRefCnt()); 72 // let d go out of scope still with a ref on data0 73 } 74 // be sure d's destructor lowered data0's owner count back to 1 75 REPORTER_ASSERT(reporter, 1 == data0.getRefCnt()); 76 } 77 78 #include "TestClassDef.h" 79 DEFINE_TESTCLASS("RefDict", RefDictTestClass, TestRefDict) 80