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