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);