Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(57)

Side by Side Diff: core/fxcrt/cfx_retain_ptr_unittest.cpp

Issue 1805683002: Add a Retained Pointer smart class. (Closed) Base URL: https://pdfium.googlesource.com/pdfium.git@master
Patch Set: Rebase, improve Reset(). Created 4 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « BUILD.gn ('k') | core/fxcrt/include/cfx_retain_ptr.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 // Copyright 2016 PDFium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "core/fxcrt/include/cfx_retain_ptr.h"
6
7 #include <utility>
8
9 #include "testing/fx_string_testhelpers.h"
10 #include "testing/gtest/include/gtest/gtest.h"
11
12 namespace {
13
14 class PseudoRetainable {
15 public:
16 PseudoRetainable() : retain_count_(0), release_count_(0) {}
17 void Retain() { ++retain_count_; }
18 void Release() { ++release_count_; }
19 int retain_count() const { return retain_count_; }
20 int release_count() const { return release_count_; }
21
22 private:
23 int retain_count_;
24 int release_count_;
25 };
26
27 } // namespace
28
29 TEST(fxcrt, RetainPtrNull) {
30 CFX_RetainPtr<PseudoRetainable> ptr;
31 EXPECT_EQ(nullptr, ptr.Get());
32 }
33
34 TEST(fxcrt, RetainPtrNormal) {
35 PseudoRetainable obj;
36 {
37 CFX_RetainPtr<PseudoRetainable> ptr(&obj);
38 EXPECT_EQ(&obj, ptr.Get());
39 EXPECT_EQ(1, obj.retain_count());
40 EXPECT_EQ(0, obj.release_count());
41 }
42 EXPECT_EQ(1, obj.retain_count());
43 EXPECT_EQ(1, obj.release_count());
44 }
45
46 TEST(fxcrt, RetainPtrCopyCtor) {
47 PseudoRetainable obj;
48 {
49 CFX_RetainPtr<PseudoRetainable> ptr1(&obj);
50 {
51 CFX_RetainPtr<PseudoRetainable> ptr2(ptr1);
52 EXPECT_EQ(2, obj.retain_count());
53 EXPECT_EQ(0, obj.release_count());
54 }
55 EXPECT_EQ(2, obj.retain_count());
56 EXPECT_EQ(1, obj.release_count());
57 }
58 EXPECT_EQ(2, obj.retain_count());
59 EXPECT_EQ(2, obj.release_count());
60 }
61
62 TEST(fxcrt, RetainPtrMoveCtor) {
63 PseudoRetainable obj;
64 {
65 CFX_RetainPtr<PseudoRetainable> ptr1(&obj);
66 {
67 CFX_RetainPtr<PseudoRetainable> ptr2(std::move(ptr1));
68 EXPECT_EQ(1, obj.retain_count());
69 EXPECT_EQ(0, obj.release_count());
70 }
71 EXPECT_EQ(1, obj.retain_count());
72 EXPECT_EQ(1, obj.release_count());
73 }
74 EXPECT_EQ(1, obj.retain_count());
75 EXPECT_EQ(1, obj.release_count());
76 }
77
78 TEST(fxcrt, RetainPtrResetNull) {
79 PseudoRetainable obj;
80 {
81 CFX_RetainPtr<PseudoRetainable> ptr(&obj);
82 ptr.Reset();
83 EXPECT_EQ(1, obj.retain_count());
84 EXPECT_EQ(1, obj.release_count());
85 }
86 EXPECT_EQ(1, obj.retain_count());
87 EXPECT_EQ(1, obj.release_count());
88 }
89
90 TEST(fxcrt, RetainPtrReset) {
91 PseudoRetainable obj1;
92 PseudoRetainable obj2;
93 {
94 CFX_RetainPtr<PseudoRetainable> ptr(&obj1);
95 ptr.Reset(&obj2);
96 EXPECT_EQ(1, obj1.retain_count());
97 EXPECT_EQ(1, obj1.release_count());
98 EXPECT_EQ(1, obj2.retain_count());
99 EXPECT_EQ(0, obj2.release_count());
100 }
101 EXPECT_EQ(1, obj1.retain_count());
102 EXPECT_EQ(1, obj1.release_count());
103 EXPECT_EQ(1, obj2.retain_count());
104 EXPECT_EQ(1, obj2.release_count());
105 }
106
107 TEST(fxcrt, RetainPtrSwap) {
108 PseudoRetainable obj1;
109 PseudoRetainable obj2;
110 {
111 CFX_RetainPtr<PseudoRetainable> ptr1(&obj1);
112 {
113 CFX_RetainPtr<PseudoRetainable> ptr2(&obj2);
114 ptr1.Swap(ptr2);
115 EXPECT_EQ(1, obj1.retain_count());
116 EXPECT_EQ(0, obj1.release_count());
117 EXPECT_EQ(1, obj2.retain_count());
118 EXPECT_EQ(0, obj2.release_count());
119 }
120 EXPECT_EQ(1, obj1.retain_count());
121 EXPECT_EQ(1, obj1.release_count());
122 EXPECT_EQ(1, obj2.retain_count());
123 EXPECT_EQ(0, obj2.release_count());
124 }
125 EXPECT_EQ(1, obj1.retain_count());
126 EXPECT_EQ(1, obj1.release_count());
127 EXPECT_EQ(1, obj2.retain_count());
128 EXPECT_EQ(1, obj2.release_count());
129 }
130
131 TEST(fxcrt, RetainPtrSwapNull) {
132 PseudoRetainable obj1;
133 {
134 CFX_RetainPtr<PseudoRetainable> ptr1(&obj1);
135 {
136 CFX_RetainPtr<PseudoRetainable> ptr2;
137 ptr1.Swap(ptr2);
138 EXPECT_FALSE(ptr1);
139 EXPECT_TRUE(ptr2);
140 EXPECT_EQ(1, obj1.retain_count());
141 EXPECT_EQ(0, obj1.release_count());
142 }
143 EXPECT_EQ(1, obj1.retain_count());
144 EXPECT_EQ(1, obj1.release_count());
145 }
146 EXPECT_EQ(1, obj1.retain_count());
147 EXPECT_EQ(1, obj1.release_count());
148 }
149
150 TEST(fxcrt, RetainPtrAssign) {
151 PseudoRetainable obj;
152 {
153 CFX_RetainPtr<PseudoRetainable> ptr(&obj);
154 {
155 CFX_RetainPtr<PseudoRetainable> ptr2;
156 ptr2 = ptr;
157 EXPECT_EQ(2, obj.retain_count());
158 EXPECT_EQ(0, obj.release_count());
159 }
160 EXPECT_EQ(2, obj.retain_count());
161 EXPECT_EQ(1, obj.release_count());
162 }
163 EXPECT_EQ(2, obj.retain_count());
164 EXPECT_EQ(2, obj.release_count());
165 }
166
167 TEST(fxcrt, RetainPtrEquals) {
168 PseudoRetainable obj1;
169 PseudoRetainable obj2;
170 CFX_RetainPtr<PseudoRetainable> null_ptr1;
171 CFX_RetainPtr<PseudoRetainable> obj1_ptr1(&obj1);
172 CFX_RetainPtr<PseudoRetainable> obj2_ptr1(&obj2);
173 {
174 CFX_RetainPtr<PseudoRetainable> null_ptr2;
175 EXPECT_TRUE(null_ptr1 == null_ptr2);
176
177 CFX_RetainPtr<PseudoRetainable> obj1_ptr2(&obj1);
178 EXPECT_TRUE(obj1_ptr1 == obj1_ptr2);
179
180 CFX_RetainPtr<PseudoRetainable> obj2_ptr2(&obj2);
181 EXPECT_TRUE(obj2_ptr1 == obj2_ptr2);
182 }
183 EXPECT_FALSE(null_ptr1 == obj1_ptr1);
184 EXPECT_FALSE(null_ptr1 == obj2_ptr1);
185 EXPECT_FALSE(obj1_ptr1 == obj2_ptr1);
186 }
187
188 TEST(fxcrt, RetainPtrNotEquals) {
189 PseudoRetainable obj1;
190 PseudoRetainable obj2;
191 CFX_RetainPtr<PseudoRetainable> null_ptr1;
192 CFX_RetainPtr<PseudoRetainable> obj1_ptr1(&obj1);
193 CFX_RetainPtr<PseudoRetainable> obj2_ptr1(&obj2);
194 {
195 CFX_RetainPtr<PseudoRetainable> null_ptr2;
196 CFX_RetainPtr<PseudoRetainable> obj1_ptr2(&obj1);
197 CFX_RetainPtr<PseudoRetainable> obj2_ptr2(&obj2);
198 EXPECT_FALSE(null_ptr1 != null_ptr2);
199 EXPECT_FALSE(obj1_ptr1 != obj1_ptr2);
200 EXPECT_FALSE(obj2_ptr1 != obj2_ptr2);
201 }
202 EXPECT_TRUE(null_ptr1 != obj1_ptr1);
203 EXPECT_TRUE(null_ptr1 != obj2_ptr1);
204 EXPECT_TRUE(obj1_ptr1 != obj2_ptr1);
205 }
206
207 TEST(fxcrt, RetainPtrBool) {
208 PseudoRetainable obj1;
209 CFX_RetainPtr<PseudoRetainable> null_ptr;
210 CFX_RetainPtr<PseudoRetainable> obj1_ptr(&obj1);
211 bool null_bool = null_ptr;
212 bool obj1_bool = obj1_ptr;
213 EXPECT_FALSE(null_bool);
214 EXPECT_TRUE(obj1_bool);
215 }
OLDNEW
« no previous file with comments | « BUILD.gn ('k') | core/fxcrt/include/cfx_retain_ptr.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698