1 #include "Test.h"
2 #include "SkRefDict.h"
3
4 class TestRC : public SkRefCnt {
5 };
6
TestRefDict(skiatest::Reporter * reporter)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