1 //===- llvm/unittest/ADT/OwningPtrTest.cpp - OwningPtr unit tests -----------===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 #include "llvm/ADT/OwningPtr.h"
11 #include "gtest/gtest.h"
16 struct TrackDestructor {
17 static unsigned Destructions;
19 explicit TrackDestructor(int val) : val(val) {}
20 ~TrackDestructor() { ++Destructions; }
21 static void ResetCounts() { Destructions = 0; }
24 TrackDestructor(const TrackDestructor &other) LLVM_DELETED_FUNCTION;
26 operator=(const TrackDestructor &other) LLVM_DELETED_FUNCTION;
27 TrackDestructor(TrackDestructor &&other) LLVM_DELETED_FUNCTION;
28 TrackDestructor &operator=(TrackDestructor &&other) LLVM_DELETED_FUNCTION;
31 unsigned TrackDestructor::Destructions = 0;
34 class OwningPtrTest : public testing::Test {};
36 TEST_F(OwningPtrTest, DefaultConstruction) {
37 TrackDestructor::ResetCounts();
39 OwningPtr<TrackDestructor> O;
42 EXPECT_FALSE(O.get());
43 EXPECT_FALSE(O.isValid());
45 EXPECT_EQ(0u, TrackDestructor::Destructions);
48 TEST_F(OwningPtrTest, PtrConstruction) {
49 TrackDestructor::ResetCounts();
51 OwningPtr<TrackDestructor> O(new TrackDestructor(3));
55 EXPECT_TRUE(O.isValid());
56 EXPECT_EQ(3, (*O).val);
58 EXPECT_EQ(0u, TrackDestructor::Destructions);
60 EXPECT_EQ(1u, TrackDestructor::Destructions);
63 TEST_F(OwningPtrTest, Reset) {
64 TrackDestructor::ResetCounts();
65 OwningPtr<TrackDestructor> O(new TrackDestructor(3));
66 EXPECT_EQ(0u, TrackDestructor::Destructions);
68 EXPECT_FALSE((bool)O);
70 EXPECT_FALSE(O.get());
71 EXPECT_FALSE(O.isValid());
72 EXPECT_EQ(1u, TrackDestructor::Destructions);
75 TEST_F(OwningPtrTest, Take) {
76 TrackDestructor::ResetCounts();
77 TrackDestructor *T = 0;
79 OwningPtr<TrackDestructor> O(new TrackDestructor(3));
81 EXPECT_FALSE((bool)O);
83 EXPECT_FALSE(O.get());
84 EXPECT_FALSE(O.isValid());
87 EXPECT_EQ(0u, TrackDestructor::Destructions);
90 EXPECT_EQ(1u, TrackDestructor::Destructions);
93 TEST_F(OwningPtrTest, MoveConstruction) {
94 TrackDestructor::ResetCounts();
96 OwningPtr<TrackDestructor> A(new TrackDestructor(3));
97 OwningPtr<TrackDestructor> B = std::move(A);
98 EXPECT_FALSE((bool)A);
100 EXPECT_FALSE(A.get());
101 EXPECT_FALSE(A.isValid());
102 EXPECT_TRUE((bool)B);
104 EXPECT_TRUE(B.get());
105 EXPECT_TRUE(B.isValid());
106 EXPECT_EQ(3, (*B).val);
107 EXPECT_EQ(3, B->val);
108 EXPECT_EQ(0u, TrackDestructor::Destructions);
110 EXPECT_EQ(1u, TrackDestructor::Destructions);
113 TEST_F(OwningPtrTest, MoveAssignment) {
114 TrackDestructor::ResetCounts();
116 OwningPtr<TrackDestructor> A(new TrackDestructor(3));
117 OwningPtr<TrackDestructor> B(new TrackDestructor(4));
121 EXPECT_FALSE(A.get());
122 EXPECT_FALSE(A.isValid());
123 EXPECT_TRUE((bool)B);
125 EXPECT_TRUE(B.get());
126 EXPECT_TRUE(B.isValid());
127 EXPECT_EQ(3, (*B).val);
128 EXPECT_EQ(3, B->val);
129 EXPECT_EQ(1u, TrackDestructor::Destructions);
131 EXPECT_EQ(2u, TrackDestructor::Destructions);
134 TEST_F(OwningPtrTest, Swap) {
135 TrackDestructor::ResetCounts();
137 OwningPtr<TrackDestructor> A(new TrackDestructor(3));
138 OwningPtr<TrackDestructor> B(new TrackDestructor(4));
140 EXPECT_TRUE((bool)A);
142 EXPECT_TRUE(A.get());
143 EXPECT_TRUE(A.isValid());
144 EXPECT_EQ(4, (*A).val);
145 EXPECT_EQ(4, A->val);
146 EXPECT_TRUE((bool)B);
148 EXPECT_TRUE(B.get());
149 EXPECT_TRUE(B.isValid());
150 EXPECT_EQ(3, (*B).val);
151 EXPECT_EQ(3, B->val);
152 EXPECT_EQ(0u, TrackDestructor::Destructions);
154 EXPECT_EQ(2u, TrackDestructor::Destructions);
155 TrackDestructor::ResetCounts();
157 OwningPtr<TrackDestructor> A(new TrackDestructor(3));
158 OwningPtr<TrackDestructor> B(new TrackDestructor(4));
160 EXPECT_TRUE((bool)A);
162 EXPECT_TRUE(A.get());
163 EXPECT_TRUE(A.isValid());
164 EXPECT_EQ(4, (*A).val);
165 EXPECT_EQ(4, A->val);
166 EXPECT_TRUE((bool)B);
168 EXPECT_TRUE(B.get());
169 EXPECT_TRUE(B.isValid());
170 EXPECT_EQ(3, (*B).val);
171 EXPECT_EQ(3, B->val);
172 EXPECT_EQ(0u, TrackDestructor::Destructions);
174 EXPECT_EQ(2u, TrackDestructor::Destructions);
177 TEST_F(OwningPtrTest, UniqueToOwningConstruction) {
178 TrackDestructor::ResetCounts();
180 std::unique_ptr<TrackDestructor> A(new TrackDestructor(3));
181 OwningPtr<TrackDestructor> B = std::move(A);
184 EXPECT_FALSE(A.get());
185 EXPECT_TRUE((bool)B);
187 EXPECT_TRUE(B.get());
188 EXPECT_TRUE(B.isValid());
189 EXPECT_EQ(3, (*B).val);
190 EXPECT_EQ(3, B->val);
191 EXPECT_EQ(0u, TrackDestructor::Destructions);
193 EXPECT_EQ(1u, TrackDestructor::Destructions);
196 TEST_F(OwningPtrTest, UniqueToOwningAssignment) {
197 TrackDestructor::ResetCounts();
199 std::unique_ptr<TrackDestructor> A(new TrackDestructor(3));
200 OwningPtr<TrackDestructor> B(new TrackDestructor(4));
204 EXPECT_FALSE(A.get());
205 EXPECT_TRUE((bool)B);
207 EXPECT_TRUE(B.get());
208 EXPECT_TRUE(B.isValid());
209 EXPECT_EQ(3, (*B).val);
210 EXPECT_EQ(3, B->val);
211 EXPECT_EQ(1u, TrackDestructor::Destructions);
213 EXPECT_EQ(2u, TrackDestructor::Destructions);
216 TEST_F(OwningPtrTest, TakeUniqueConstruction) {
217 TrackDestructor::ResetCounts();
219 OwningPtr<TrackDestructor> A(new TrackDestructor(3));
220 std::unique_ptr<TrackDestructor> B = A.take_unique();
223 EXPECT_FALSE(A.get());
224 EXPECT_FALSE(A.isValid());
225 EXPECT_TRUE((bool)B);
227 EXPECT_TRUE(B.get());
228 EXPECT_EQ(3, (*B).val);
229 EXPECT_EQ(3, B->val);
230 EXPECT_EQ(0u, TrackDestructor::Destructions);
232 EXPECT_EQ(1u, TrackDestructor::Destructions);
235 #if LLVM_HAS_RVALUE_REFERENCE_THIS
236 TEST_F(OwningPtrTest, OwningToUniqueConstruction) {
237 TrackDestructor::ResetCounts();
239 OwningPtr<TrackDestructor> A(new TrackDestructor(3));
240 std::unique_ptr<TrackDestructor> B = std::move(A);
243 EXPECT_FALSE(A.get());
244 EXPECT_FALSE(A.isValid());
245 EXPECT_TRUE((bool)B);
247 EXPECT_TRUE(B.get());
248 EXPECT_EQ(3, (*B).val);
249 EXPECT_EQ(3, B->val);
250 EXPECT_EQ(0u, TrackDestructor::Destructions);
252 EXPECT_EQ(1u, TrackDestructor::Destructions);