1 #include "Test.h" 2 #include "SkRefDict.h" 3 4 class TestRC : public SkRefCnt { 5 }; 6 7 static void TestRefDict(skiatest::Reporter* reporter) { 8 TestRC data0, data1; 9 SkRefDict dict; 10 11 REPORTER_ASSERT(reporter, NULL == dict.find(NULL)); 12 REPORTER_ASSERT(reporter, NULL == dict.find("foo")); 13 REPORTER_ASSERT(reporter, NULL == dict.find("bar")); 14 15 dict.set("foo", &data0); 16 REPORTER_ASSERT(reporter, &data0 == dict.find("foo")); 17 REPORTER_ASSERT(reporter, 2 == data0.getRefCnt()); 18 19 dict.set("foo", &data0); 20 REPORTER_ASSERT(reporter, &data0 == dict.find("foo")); 21 REPORTER_ASSERT(reporter, 2 == data0.getRefCnt()); 22 23 dict.set("foo", &data1); 24 REPORTER_ASSERT(reporter, &data1 == dict.find("foo")); 25 REPORTER_ASSERT(reporter, 1 == data0.getRefCnt()); 26 REPORTER_ASSERT(reporter, 2 == data1.getRefCnt()); 27 28 dict.set("foo", NULL); 29 REPORTER_ASSERT(reporter, NULL == dict.find("foo")); 30 REPORTER_ASSERT(reporter, 1 == data0.getRefCnt()); 31 REPORTER_ASSERT(reporter, 1 == data1.getRefCnt()); 32 33 dict.set("foo", &data0); 34 dict.set("bar", &data1); 35 REPORTER_ASSERT(reporter, &data0 == dict.find("foo")); 36 REPORTER_ASSERT(reporter, &data1 == dict.find("bar")); 37 REPORTER_ASSERT(reporter, 2 == data0.getRefCnt()); 38 REPORTER_ASSERT(reporter, 2 == data1.getRefCnt()); 39 40 dict.set("foo", &data1); 41 REPORTER_ASSERT(reporter, &data1 == dict.find("foo")); 42 REPORTER_ASSERT(reporter, &data1 == dict.find("bar")); 43 REPORTER_ASSERT(reporter, 1 == data0.getRefCnt()); 44 REPORTER_ASSERT(reporter, 3 == data1.getRefCnt()); 45 46 dict.removeAll(); 47 REPORTER_ASSERT(reporter, NULL == dict.find("foo")); 48 REPORTER_ASSERT(reporter, NULL == dict.find("bar")); 49 REPORTER_ASSERT(reporter, 1 == data0.getRefCnt()); 50 REPORTER_ASSERT(reporter, 1 == data1.getRefCnt()); 51 52 { 53 SkRefDict d; 54 REPORTER_ASSERT(reporter, NULL == d.find("foo")); 55 REPORTER_ASSERT(reporter, 1 == data0.getRefCnt()); 56 d.set("foo", &data0); 57 REPORTER_ASSERT(reporter, &data0 == d.find("foo")); 58 REPORTER_ASSERT(reporter, 2 == data0.getRefCnt()); 59 // let d go out of scope still with a ref on data0 60 } 61 // be sure d's destructor lowered data0's owner count back to 1 62 REPORTER_ASSERT(reporter, 1 == data0.getRefCnt()); 63 } 64 65 #include "TestClassDef.h" 66 DEFINE_TESTCLASS("RefDict", RefDictTestClass, TestRefDict) 67