blob: 6d37bf4e187d2b2d2a70103201e5c2028b5e80e8 [file] [log] [blame]
David Blaikiea28eda7e2013-02-20 00:26:04 +00001//===- llvm/unittest/ADT/OptionalTest.cpp - Optional unit tests -----------===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#include "gtest/gtest.h"
11#include "llvm/ADT/Optional.h"
12using namespace llvm;
13
14namespace {
15
16struct NonDefaultConstructible {
17 static unsigned CopyConstructions;
18 static unsigned Destructions;
19 static unsigned CopyAssignments;
20 explicit NonDefaultConstructible(int) {
21 }
22 NonDefaultConstructible(const NonDefaultConstructible&) {
23 ++CopyConstructions;
24 }
25 NonDefaultConstructible &operator=(const NonDefaultConstructible&) {
26 ++CopyAssignments;
27 return *this;
28 }
29 ~NonDefaultConstructible() {
30 ++Destructions;
31 }
32 static void ResetCounts() {
33 CopyConstructions = 0;
34 Destructions = 0;
35 CopyAssignments = 0;
36 }
37};
38
39unsigned NonDefaultConstructible::CopyConstructions = 0;
40unsigned NonDefaultConstructible::Destructions = 0;
41unsigned NonDefaultConstructible::CopyAssignments = 0;
42
David Blaikieea722552013-02-21 07:55:39 +000043struct MoveOnly {
44 static unsigned MoveConstructions;
45 static unsigned Destructions;
46 static unsigned MoveAssignments;
47 int val;
48 explicit MoveOnly(int val) : val(val) {
49 }
50 MoveOnly(MoveOnly&& other) {
51 val = other.val;
52 ++MoveConstructions;
53 }
54 MoveOnly &operator=(MoveOnly&& other) {
55 val = other.val;
56 ++MoveAssignments;
57 return *this;
58 }
59 ~MoveOnly() {
60 ++Destructions;
61 }
62 static void ResetCounts() {
63 MoveConstructions = 0;
64 Destructions = 0;
65 MoveAssignments = 0;
66 }
67};
68
69unsigned MoveOnly::MoveConstructions = 0;
70unsigned MoveOnly::Destructions = 0;
71unsigned MoveOnly::MoveAssignments = 0;
72
David Blaikiea28eda7e2013-02-20 00:26:04 +000073// Test fixture
74class OptionalTest : public testing::Test {
75};
76
77TEST_F(OptionalTest, NonDefaultConstructibleTest) {
78 Optional<NonDefaultConstructible> O;
79 EXPECT_FALSE(O);
80}
81
82TEST_F(OptionalTest, ResetTest) {
83 NonDefaultConstructible::ResetCounts();
84 Optional<NonDefaultConstructible> O(NonDefaultConstructible(3));
85 EXPECT_EQ(1u, NonDefaultConstructible::CopyConstructions);
86 EXPECT_EQ(0u, NonDefaultConstructible::CopyAssignments);
87 EXPECT_EQ(1u, NonDefaultConstructible::Destructions);
88 NonDefaultConstructible::ResetCounts();
David Blaikie4318fc52013-02-20 06:25:36 +000089 O.reset();
David Blaikiea28eda7e2013-02-20 00:26:04 +000090 EXPECT_EQ(0u, NonDefaultConstructible::CopyConstructions);
91 EXPECT_EQ(0u, NonDefaultConstructible::CopyAssignments);
92 EXPECT_EQ(1u, NonDefaultConstructible::Destructions);
93}
94
95TEST_F(OptionalTest, InitializationLeakTest) {
96 NonDefaultConstructible::ResetCounts();
97 Optional<NonDefaultConstructible>(NonDefaultConstructible(3));
98 EXPECT_EQ(1u, NonDefaultConstructible::CopyConstructions);
99 EXPECT_EQ(0u, NonDefaultConstructible::CopyAssignments);
100 EXPECT_EQ(2u, NonDefaultConstructible::Destructions);
101}
102
103TEST_F(OptionalTest, CopyConstructionTest) {
104 NonDefaultConstructible::ResetCounts();
105 {
106 Optional<NonDefaultConstructible> A(NonDefaultConstructible(3));
107 EXPECT_EQ(1u, NonDefaultConstructible::CopyConstructions);
108 EXPECT_EQ(0u, NonDefaultConstructible::CopyAssignments);
109 EXPECT_EQ(1u, NonDefaultConstructible::Destructions);
110 NonDefaultConstructible::ResetCounts();
111 Optional<NonDefaultConstructible> B(A);
112 EXPECT_EQ(1u, NonDefaultConstructible::CopyConstructions);
113 EXPECT_EQ(0u, NonDefaultConstructible::CopyAssignments);
114 EXPECT_EQ(0u, NonDefaultConstructible::Destructions);
115 NonDefaultConstructible::ResetCounts();
116 }
117 EXPECT_EQ(0u, NonDefaultConstructible::CopyConstructions);
118 EXPECT_EQ(0u, NonDefaultConstructible::CopyAssignments);
119 EXPECT_EQ(2u, NonDefaultConstructible::Destructions);
120}
121
122TEST_F(OptionalTest, ConstructingCopyAssignmentTest) {
123 NonDefaultConstructible::ResetCounts();
124 {
125 Optional<NonDefaultConstructible> A(NonDefaultConstructible(3));
126 Optional<NonDefaultConstructible> B;
127 EXPECT_EQ(1u, NonDefaultConstructible::CopyConstructions);
128 EXPECT_EQ(0u, NonDefaultConstructible::CopyAssignments);
129 EXPECT_EQ(1u, NonDefaultConstructible::Destructions);
130 NonDefaultConstructible::ResetCounts();
131 B = A;
132 EXPECT_EQ(1u, NonDefaultConstructible::CopyConstructions);
133 EXPECT_EQ(0u, NonDefaultConstructible::CopyAssignments);
134 EXPECT_EQ(0u, NonDefaultConstructible::Destructions);
135 NonDefaultConstructible::ResetCounts();
136 }
137 EXPECT_EQ(0u, NonDefaultConstructible::CopyConstructions);
138 EXPECT_EQ(0u, NonDefaultConstructible::CopyAssignments);
139 EXPECT_EQ(2u, NonDefaultConstructible::Destructions);
140}
141
142TEST_F(OptionalTest, CopyingCopyAssignmentTest) {
143 NonDefaultConstructible::ResetCounts();
144 {
145 Optional<NonDefaultConstructible> A(NonDefaultConstructible(3));
146 Optional<NonDefaultConstructible> B(NonDefaultConstructible(4));
147 EXPECT_EQ(2u, NonDefaultConstructible::CopyConstructions);
148 EXPECT_EQ(0u, NonDefaultConstructible::CopyAssignments);
149 EXPECT_EQ(2u, NonDefaultConstructible::Destructions);
150 NonDefaultConstructible::ResetCounts();
151 B = A;
152 EXPECT_EQ(0u, NonDefaultConstructible::CopyConstructions);
153 EXPECT_EQ(1u, NonDefaultConstructible::CopyAssignments);
154 EXPECT_EQ(0u, NonDefaultConstructible::Destructions);
155 NonDefaultConstructible::ResetCounts();
156 }
157 EXPECT_EQ(0u, NonDefaultConstructible::CopyConstructions);
158 EXPECT_EQ(0u, NonDefaultConstructible::CopyAssignments);
159 EXPECT_EQ(2u, NonDefaultConstructible::Destructions);
160}
161
162TEST_F(OptionalTest, DeletingCopyAssignmentTest) {
163 NonDefaultConstructible::ResetCounts();
164 {
165 Optional<NonDefaultConstructible> A;
166 Optional<NonDefaultConstructible> B(NonDefaultConstructible(3));
167 EXPECT_EQ(1u, NonDefaultConstructible::CopyConstructions);
168 EXPECT_EQ(0u, NonDefaultConstructible::CopyAssignments);
169 EXPECT_EQ(1u, NonDefaultConstructible::Destructions);
170 NonDefaultConstructible::ResetCounts();
171 B = A;
172 EXPECT_EQ(0u, NonDefaultConstructible::CopyConstructions);
173 EXPECT_EQ(0u, NonDefaultConstructible::CopyAssignments);
174 EXPECT_EQ(1u, NonDefaultConstructible::Destructions);
175 NonDefaultConstructible::ResetCounts();
176 }
177 EXPECT_EQ(0u, NonDefaultConstructible::CopyConstructions);
178 EXPECT_EQ(0u, NonDefaultConstructible::CopyAssignments);
179 EXPECT_EQ(0u, NonDefaultConstructible::Destructions);
180}
181
182TEST_F(OptionalTest, NullCopyConstructionTest) {
183 NonDefaultConstructible::ResetCounts();
184 {
185 Optional<NonDefaultConstructible> A;
186 Optional<NonDefaultConstructible> B;
187 EXPECT_EQ(0u, NonDefaultConstructible::CopyConstructions);
188 EXPECT_EQ(0u, NonDefaultConstructible::CopyAssignments);
189 EXPECT_EQ(0u, NonDefaultConstructible::Destructions);
190 NonDefaultConstructible::ResetCounts();
191 B = A;
192 EXPECT_EQ(0u, NonDefaultConstructible::CopyConstructions);
193 EXPECT_EQ(0u, NonDefaultConstructible::CopyAssignments);
194 EXPECT_EQ(0u, NonDefaultConstructible::Destructions);
195 NonDefaultConstructible::ResetCounts();
196 }
197 EXPECT_EQ(0u, NonDefaultConstructible::CopyConstructions);
198 EXPECT_EQ(0u, NonDefaultConstructible::CopyAssignments);
199 EXPECT_EQ(0u, NonDefaultConstructible::Destructions);
200}
201
David Blaikieea722552013-02-21 07:55:39 +0000202TEST_F(OptionalTest, MoveOnlyNull) {
203 MoveOnly::ResetCounts();
204 Optional<MoveOnly> O;
205 EXPECT_EQ(0u, MoveOnly::MoveConstructions);
206 EXPECT_EQ(0u, MoveOnly::MoveAssignments);
207 EXPECT_EQ(0u, MoveOnly::Destructions);
208}
209
210TEST_F(OptionalTest, MoveOnlyConstruction) {
211 MoveOnly::ResetCounts();
212 Optional<MoveOnly> O(MoveOnly(3));
213 EXPECT_TRUE((bool)O);
214 EXPECT_EQ(3, O->val);
215 EXPECT_EQ(1u, MoveOnly::MoveConstructions);
216 EXPECT_EQ(0u, MoveOnly::MoveAssignments);
217 EXPECT_EQ(1u, MoveOnly::Destructions);
218}
219
220TEST_F(OptionalTest, MoveOnlyMoveConstruction) {
221 Optional<MoveOnly> A(MoveOnly(3));
222 MoveOnly::ResetCounts();
223 Optional<MoveOnly> B(std::move(A));
224 EXPECT_FALSE((bool)A);
225 EXPECT_TRUE((bool)B);
226 EXPECT_EQ(3, B->val);
227 EXPECT_EQ(1u, MoveOnly::MoveConstructions);
228 EXPECT_EQ(0u, MoveOnly::MoveAssignments);
229 EXPECT_EQ(1u, MoveOnly::Destructions);
230}
231
232TEST_F(OptionalTest, MoveOnlyAssignment) {
233 MoveOnly::ResetCounts();
234 Optional<MoveOnly> O;
235 O = MoveOnly(3);
236 EXPECT_TRUE((bool)O);
237 EXPECT_EQ(3, O->val);
238 EXPECT_EQ(1u, MoveOnly::MoveConstructions);
239 EXPECT_EQ(0u, MoveOnly::MoveAssignments);
240 EXPECT_EQ(1u, MoveOnly::Destructions);
241}
242
243TEST_F(OptionalTest, MoveOnlyInitializingAssignment) {
244 Optional<MoveOnly> A(MoveOnly(3));
245 Optional<MoveOnly> B;
246 MoveOnly::ResetCounts();
247 B = std::move(A);
248 EXPECT_FALSE((bool)A);
249 EXPECT_TRUE((bool)B);
250 EXPECT_EQ(3, B->val);
251 EXPECT_EQ(1u, MoveOnly::MoveConstructions);
252 EXPECT_EQ(0u, MoveOnly::MoveAssignments);
253 EXPECT_EQ(1u, MoveOnly::Destructions);
254}
255
256TEST_F(OptionalTest, MoveOnlyNullingAssignment) {
257 Optional<MoveOnly> A;
258 Optional<MoveOnly> B(MoveOnly(3));
259 MoveOnly::ResetCounts();
260 B = std::move(A);
261 EXPECT_FALSE((bool)A);
262 EXPECT_FALSE((bool)B);
263 EXPECT_EQ(0u, MoveOnly::MoveConstructions);
264 EXPECT_EQ(0u, MoveOnly::MoveAssignments);
265 EXPECT_EQ(1u, MoveOnly::Destructions);
266}
267
268TEST_F(OptionalTest, MoveOnlyAssigningAssignment) {
269 Optional<MoveOnly> A(MoveOnly(3));
270 Optional<MoveOnly> B(MoveOnly(4));
271 MoveOnly::ResetCounts();
272 B = std::move(A);
273 EXPECT_FALSE((bool)A);
274 EXPECT_TRUE((bool)B);
275 EXPECT_EQ(3, B->val);
276 EXPECT_EQ(0u, MoveOnly::MoveConstructions);
277 EXPECT_EQ(1u, MoveOnly::MoveAssignments);
278 EXPECT_EQ(1u, MoveOnly::Destructions);
279}
280
David Blaikiea28eda7e2013-02-20 00:26:04 +0000281} // end anonymous namespace
282