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