• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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