1*9880d681SAndroid Build Coastguard Worker //===- llvm/unittest/ADT/OptionalTest.cpp - Optional unit tests -----------===//
2*9880d681SAndroid Build Coastguard Worker //
3*9880d681SAndroid Build Coastguard Worker // The LLVM Compiler Infrastructure
4*9880d681SAndroid Build Coastguard Worker //
5*9880d681SAndroid Build Coastguard Worker // This file is distributed under the University of Illinois Open Source
6*9880d681SAndroid Build Coastguard Worker // License. See LICENSE.TXT for details.
7*9880d681SAndroid Build Coastguard Worker //
8*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
9*9880d681SAndroid Build Coastguard Worker
10*9880d681SAndroid Build Coastguard Worker #include "gtest/gtest.h"
11*9880d681SAndroid Build Coastguard Worker #include "llvm/ADT/Optional.h"
12*9880d681SAndroid Build Coastguard Worker using namespace llvm;
13*9880d681SAndroid Build Coastguard Worker
14*9880d681SAndroid Build Coastguard Worker namespace {
15*9880d681SAndroid Build Coastguard Worker
16*9880d681SAndroid Build Coastguard Worker struct NonDefaultConstructible {
17*9880d681SAndroid Build Coastguard Worker static unsigned CopyConstructions;
18*9880d681SAndroid Build Coastguard Worker static unsigned Destructions;
19*9880d681SAndroid Build Coastguard Worker static unsigned CopyAssignments;
NonDefaultConstructible__anonaea807520111::NonDefaultConstructible20*9880d681SAndroid Build Coastguard Worker explicit NonDefaultConstructible(int) {
21*9880d681SAndroid Build Coastguard Worker }
NonDefaultConstructible__anonaea807520111::NonDefaultConstructible22*9880d681SAndroid Build Coastguard Worker NonDefaultConstructible(const NonDefaultConstructible&) {
23*9880d681SAndroid Build Coastguard Worker ++CopyConstructions;
24*9880d681SAndroid Build Coastguard Worker }
operator =__anonaea807520111::NonDefaultConstructible25*9880d681SAndroid Build Coastguard Worker NonDefaultConstructible &operator=(const NonDefaultConstructible&) {
26*9880d681SAndroid Build Coastguard Worker ++CopyAssignments;
27*9880d681SAndroid Build Coastguard Worker return *this;
28*9880d681SAndroid Build Coastguard Worker }
~NonDefaultConstructible__anonaea807520111::NonDefaultConstructible29*9880d681SAndroid Build Coastguard Worker ~NonDefaultConstructible() {
30*9880d681SAndroid Build Coastguard Worker ++Destructions;
31*9880d681SAndroid Build Coastguard Worker }
ResetCounts__anonaea807520111::NonDefaultConstructible32*9880d681SAndroid Build Coastguard Worker static void ResetCounts() {
33*9880d681SAndroid Build Coastguard Worker CopyConstructions = 0;
34*9880d681SAndroid Build Coastguard Worker Destructions = 0;
35*9880d681SAndroid Build Coastguard Worker CopyAssignments = 0;
36*9880d681SAndroid Build Coastguard Worker }
37*9880d681SAndroid Build Coastguard Worker };
38*9880d681SAndroid Build Coastguard Worker
39*9880d681SAndroid Build Coastguard Worker unsigned NonDefaultConstructible::CopyConstructions = 0;
40*9880d681SAndroid Build Coastguard Worker unsigned NonDefaultConstructible::Destructions = 0;
41*9880d681SAndroid Build Coastguard Worker unsigned NonDefaultConstructible::CopyAssignments = 0;
42*9880d681SAndroid Build Coastguard Worker
43*9880d681SAndroid Build Coastguard Worker // Test fixture
44*9880d681SAndroid Build Coastguard Worker class OptionalTest : public testing::Test {
45*9880d681SAndroid Build Coastguard Worker };
46*9880d681SAndroid Build Coastguard Worker
TEST_F(OptionalTest,NonDefaultConstructibleTest)47*9880d681SAndroid Build Coastguard Worker TEST_F(OptionalTest, NonDefaultConstructibleTest) {
48*9880d681SAndroid Build Coastguard Worker Optional<NonDefaultConstructible> O;
49*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(O);
50*9880d681SAndroid Build Coastguard Worker }
51*9880d681SAndroid Build Coastguard Worker
TEST_F(OptionalTest,ResetTest)52*9880d681SAndroid Build Coastguard Worker TEST_F(OptionalTest, ResetTest) {
53*9880d681SAndroid Build Coastguard Worker NonDefaultConstructible::ResetCounts();
54*9880d681SAndroid Build Coastguard Worker Optional<NonDefaultConstructible> O(NonDefaultConstructible(3));
55*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(1u, NonDefaultConstructible::CopyConstructions);
56*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(0u, NonDefaultConstructible::CopyAssignments);
57*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(1u, NonDefaultConstructible::Destructions);
58*9880d681SAndroid Build Coastguard Worker NonDefaultConstructible::ResetCounts();
59*9880d681SAndroid Build Coastguard Worker O.reset();
60*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(0u, NonDefaultConstructible::CopyConstructions);
61*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(0u, NonDefaultConstructible::CopyAssignments);
62*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(1u, NonDefaultConstructible::Destructions);
63*9880d681SAndroid Build Coastguard Worker }
64*9880d681SAndroid Build Coastguard Worker
TEST_F(OptionalTest,InitializationLeakTest)65*9880d681SAndroid Build Coastguard Worker TEST_F(OptionalTest, InitializationLeakTest) {
66*9880d681SAndroid Build Coastguard Worker NonDefaultConstructible::ResetCounts();
67*9880d681SAndroid Build Coastguard Worker Optional<NonDefaultConstructible>(NonDefaultConstructible(3));
68*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(1u, NonDefaultConstructible::CopyConstructions);
69*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(0u, NonDefaultConstructible::CopyAssignments);
70*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(2u, NonDefaultConstructible::Destructions);
71*9880d681SAndroid Build Coastguard Worker }
72*9880d681SAndroid Build Coastguard Worker
TEST_F(OptionalTest,CopyConstructionTest)73*9880d681SAndroid Build Coastguard Worker TEST_F(OptionalTest, CopyConstructionTest) {
74*9880d681SAndroid Build Coastguard Worker NonDefaultConstructible::ResetCounts();
75*9880d681SAndroid Build Coastguard Worker {
76*9880d681SAndroid Build Coastguard Worker Optional<NonDefaultConstructible> A(NonDefaultConstructible(3));
77*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(1u, NonDefaultConstructible::CopyConstructions);
78*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(0u, NonDefaultConstructible::CopyAssignments);
79*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(1u, NonDefaultConstructible::Destructions);
80*9880d681SAndroid Build Coastguard Worker NonDefaultConstructible::ResetCounts();
81*9880d681SAndroid Build Coastguard Worker Optional<NonDefaultConstructible> B(A);
82*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(1u, NonDefaultConstructible::CopyConstructions);
83*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(0u, NonDefaultConstructible::CopyAssignments);
84*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(0u, NonDefaultConstructible::Destructions);
85*9880d681SAndroid Build Coastguard Worker NonDefaultConstructible::ResetCounts();
86*9880d681SAndroid Build Coastguard Worker }
87*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(0u, NonDefaultConstructible::CopyConstructions);
88*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(0u, NonDefaultConstructible::CopyAssignments);
89*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(2u, NonDefaultConstructible::Destructions);
90*9880d681SAndroid Build Coastguard Worker }
91*9880d681SAndroid Build Coastguard Worker
TEST_F(OptionalTest,ConstructingCopyAssignmentTest)92*9880d681SAndroid Build Coastguard Worker TEST_F(OptionalTest, ConstructingCopyAssignmentTest) {
93*9880d681SAndroid Build Coastguard Worker NonDefaultConstructible::ResetCounts();
94*9880d681SAndroid Build Coastguard Worker {
95*9880d681SAndroid Build Coastguard Worker Optional<NonDefaultConstructible> A(NonDefaultConstructible(3));
96*9880d681SAndroid Build Coastguard Worker Optional<NonDefaultConstructible> B;
97*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(1u, NonDefaultConstructible::CopyConstructions);
98*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(0u, NonDefaultConstructible::CopyAssignments);
99*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(1u, NonDefaultConstructible::Destructions);
100*9880d681SAndroid Build Coastguard Worker NonDefaultConstructible::ResetCounts();
101*9880d681SAndroid Build Coastguard Worker B = A;
102*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(1u, NonDefaultConstructible::CopyConstructions);
103*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(0u, NonDefaultConstructible::CopyAssignments);
104*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(0u, NonDefaultConstructible::Destructions);
105*9880d681SAndroid Build Coastguard Worker NonDefaultConstructible::ResetCounts();
106*9880d681SAndroid Build Coastguard Worker }
107*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(0u, NonDefaultConstructible::CopyConstructions);
108*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(0u, NonDefaultConstructible::CopyAssignments);
109*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(2u, NonDefaultConstructible::Destructions);
110*9880d681SAndroid Build Coastguard Worker }
111*9880d681SAndroid Build Coastguard Worker
TEST_F(OptionalTest,CopyingCopyAssignmentTest)112*9880d681SAndroid Build Coastguard Worker TEST_F(OptionalTest, CopyingCopyAssignmentTest) {
113*9880d681SAndroid Build Coastguard Worker NonDefaultConstructible::ResetCounts();
114*9880d681SAndroid Build Coastguard Worker {
115*9880d681SAndroid Build Coastguard Worker Optional<NonDefaultConstructible> A(NonDefaultConstructible(3));
116*9880d681SAndroid Build Coastguard Worker Optional<NonDefaultConstructible> B(NonDefaultConstructible(4));
117*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(2u, NonDefaultConstructible::CopyConstructions);
118*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(0u, NonDefaultConstructible::CopyAssignments);
119*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(2u, NonDefaultConstructible::Destructions);
120*9880d681SAndroid Build Coastguard Worker NonDefaultConstructible::ResetCounts();
121*9880d681SAndroid Build Coastguard Worker B = A;
122*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(0u, NonDefaultConstructible::CopyConstructions);
123*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(1u, NonDefaultConstructible::CopyAssignments);
124*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(0u, NonDefaultConstructible::Destructions);
125*9880d681SAndroid Build Coastguard Worker NonDefaultConstructible::ResetCounts();
126*9880d681SAndroid Build Coastguard Worker }
127*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(0u, NonDefaultConstructible::CopyConstructions);
128*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(0u, NonDefaultConstructible::CopyAssignments);
129*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(2u, NonDefaultConstructible::Destructions);
130*9880d681SAndroid Build Coastguard Worker }
131*9880d681SAndroid Build Coastguard Worker
TEST_F(OptionalTest,DeletingCopyAssignmentTest)132*9880d681SAndroid Build Coastguard Worker TEST_F(OptionalTest, DeletingCopyAssignmentTest) {
133*9880d681SAndroid Build Coastguard Worker NonDefaultConstructible::ResetCounts();
134*9880d681SAndroid Build Coastguard Worker {
135*9880d681SAndroid Build Coastguard Worker Optional<NonDefaultConstructible> A;
136*9880d681SAndroid Build Coastguard Worker Optional<NonDefaultConstructible> B(NonDefaultConstructible(3));
137*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(1u, NonDefaultConstructible::CopyConstructions);
138*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(0u, NonDefaultConstructible::CopyAssignments);
139*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(1u, NonDefaultConstructible::Destructions);
140*9880d681SAndroid Build Coastguard Worker NonDefaultConstructible::ResetCounts();
141*9880d681SAndroid Build Coastguard Worker B = A;
142*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(0u, NonDefaultConstructible::CopyConstructions);
143*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(0u, NonDefaultConstructible::CopyAssignments);
144*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(1u, NonDefaultConstructible::Destructions);
145*9880d681SAndroid Build Coastguard Worker NonDefaultConstructible::ResetCounts();
146*9880d681SAndroid Build Coastguard Worker }
147*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(0u, NonDefaultConstructible::CopyConstructions);
148*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(0u, NonDefaultConstructible::CopyAssignments);
149*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(0u, NonDefaultConstructible::Destructions);
150*9880d681SAndroid Build Coastguard Worker }
151*9880d681SAndroid Build Coastguard Worker
TEST_F(OptionalTest,NullCopyConstructionTest)152*9880d681SAndroid Build Coastguard Worker TEST_F(OptionalTest, NullCopyConstructionTest) {
153*9880d681SAndroid Build Coastguard Worker NonDefaultConstructible::ResetCounts();
154*9880d681SAndroid Build Coastguard Worker {
155*9880d681SAndroid Build Coastguard Worker Optional<NonDefaultConstructible> A;
156*9880d681SAndroid Build Coastguard Worker Optional<NonDefaultConstructible> B;
157*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(0u, NonDefaultConstructible::CopyConstructions);
158*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(0u, NonDefaultConstructible::CopyAssignments);
159*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(0u, NonDefaultConstructible::Destructions);
160*9880d681SAndroid Build Coastguard Worker NonDefaultConstructible::ResetCounts();
161*9880d681SAndroid Build Coastguard Worker B = A;
162*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(0u, NonDefaultConstructible::CopyConstructions);
163*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(0u, NonDefaultConstructible::CopyAssignments);
164*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(0u, NonDefaultConstructible::Destructions);
165*9880d681SAndroid Build Coastguard Worker NonDefaultConstructible::ResetCounts();
166*9880d681SAndroid Build Coastguard Worker }
167*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(0u, NonDefaultConstructible::CopyConstructions);
168*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(0u, NonDefaultConstructible::CopyAssignments);
169*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(0u, NonDefaultConstructible::Destructions);
170*9880d681SAndroid Build Coastguard Worker }
171*9880d681SAndroid Build Coastguard Worker
TEST_F(OptionalTest,GetValueOr)172*9880d681SAndroid Build Coastguard Worker TEST_F(OptionalTest, GetValueOr) {
173*9880d681SAndroid Build Coastguard Worker Optional<int> A;
174*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(42, A.getValueOr(42));
175*9880d681SAndroid Build Coastguard Worker
176*9880d681SAndroid Build Coastguard Worker A = 5;
177*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(5, A.getValueOr(42));
178*9880d681SAndroid Build Coastguard Worker }
179*9880d681SAndroid Build Coastguard Worker
180*9880d681SAndroid Build Coastguard Worker struct MultiArgConstructor {
181*9880d681SAndroid Build Coastguard Worker int x, y;
MultiArgConstructor__anonaea807520111::MultiArgConstructor182*9880d681SAndroid Build Coastguard Worker MultiArgConstructor(int x, int y) : x(x), y(y) {}
MultiArgConstructor__anonaea807520111::MultiArgConstructor183*9880d681SAndroid Build Coastguard Worker explicit MultiArgConstructor(int x, bool positive)
184*9880d681SAndroid Build Coastguard Worker : x(x), y(positive ? x : -x) {}
185*9880d681SAndroid Build Coastguard Worker
186*9880d681SAndroid Build Coastguard Worker MultiArgConstructor(const MultiArgConstructor &) = delete;
187*9880d681SAndroid Build Coastguard Worker MultiArgConstructor(MultiArgConstructor &&) = delete;
188*9880d681SAndroid Build Coastguard Worker MultiArgConstructor &operator=(const MultiArgConstructor &) = delete;
189*9880d681SAndroid Build Coastguard Worker MultiArgConstructor &operator=(MultiArgConstructor &&) = delete;
190*9880d681SAndroid Build Coastguard Worker
191*9880d681SAndroid Build Coastguard Worker static unsigned Destructions;
~MultiArgConstructor__anonaea807520111::MultiArgConstructor192*9880d681SAndroid Build Coastguard Worker ~MultiArgConstructor() {
193*9880d681SAndroid Build Coastguard Worker ++Destructions;
194*9880d681SAndroid Build Coastguard Worker }
ResetCounts__anonaea807520111::MultiArgConstructor195*9880d681SAndroid Build Coastguard Worker static void ResetCounts() {
196*9880d681SAndroid Build Coastguard Worker Destructions = 0;
197*9880d681SAndroid Build Coastguard Worker }
198*9880d681SAndroid Build Coastguard Worker };
199*9880d681SAndroid Build Coastguard Worker unsigned MultiArgConstructor::Destructions = 0;
200*9880d681SAndroid Build Coastguard Worker
TEST_F(OptionalTest,Emplace)201*9880d681SAndroid Build Coastguard Worker TEST_F(OptionalTest, Emplace) {
202*9880d681SAndroid Build Coastguard Worker MultiArgConstructor::ResetCounts();
203*9880d681SAndroid Build Coastguard Worker Optional<MultiArgConstructor> A;
204*9880d681SAndroid Build Coastguard Worker
205*9880d681SAndroid Build Coastguard Worker A.emplace(1, 2);
206*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(A.hasValue());
207*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(1, A->x);
208*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(2, A->y);
209*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(0u, MultiArgConstructor::Destructions);
210*9880d681SAndroid Build Coastguard Worker
211*9880d681SAndroid Build Coastguard Worker A.emplace(5, false);
212*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(A.hasValue());
213*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(5, A->x);
214*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(-5, A->y);
215*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(1u, MultiArgConstructor::Destructions);
216*9880d681SAndroid Build Coastguard Worker }
217*9880d681SAndroid Build Coastguard Worker
218*9880d681SAndroid Build Coastguard Worker struct MoveOnly {
219*9880d681SAndroid Build Coastguard Worker static unsigned MoveConstructions;
220*9880d681SAndroid Build Coastguard Worker static unsigned Destructions;
221*9880d681SAndroid Build Coastguard Worker static unsigned MoveAssignments;
222*9880d681SAndroid Build Coastguard Worker int val;
MoveOnly__anonaea807520111::MoveOnly223*9880d681SAndroid Build Coastguard Worker explicit MoveOnly(int val) : val(val) {
224*9880d681SAndroid Build Coastguard Worker }
MoveOnly__anonaea807520111::MoveOnly225*9880d681SAndroid Build Coastguard Worker MoveOnly(MoveOnly&& other) {
226*9880d681SAndroid Build Coastguard Worker val = other.val;
227*9880d681SAndroid Build Coastguard Worker ++MoveConstructions;
228*9880d681SAndroid Build Coastguard Worker }
operator =__anonaea807520111::MoveOnly229*9880d681SAndroid Build Coastguard Worker MoveOnly &operator=(MoveOnly&& other) {
230*9880d681SAndroid Build Coastguard Worker val = other.val;
231*9880d681SAndroid Build Coastguard Worker ++MoveAssignments;
232*9880d681SAndroid Build Coastguard Worker return *this;
233*9880d681SAndroid Build Coastguard Worker }
~MoveOnly__anonaea807520111::MoveOnly234*9880d681SAndroid Build Coastguard Worker ~MoveOnly() {
235*9880d681SAndroid Build Coastguard Worker ++Destructions;
236*9880d681SAndroid Build Coastguard Worker }
ResetCounts__anonaea807520111::MoveOnly237*9880d681SAndroid Build Coastguard Worker static void ResetCounts() {
238*9880d681SAndroid Build Coastguard Worker MoveConstructions = 0;
239*9880d681SAndroid Build Coastguard Worker Destructions = 0;
240*9880d681SAndroid Build Coastguard Worker MoveAssignments = 0;
241*9880d681SAndroid Build Coastguard Worker }
242*9880d681SAndroid Build Coastguard Worker };
243*9880d681SAndroid Build Coastguard Worker
244*9880d681SAndroid Build Coastguard Worker unsigned MoveOnly::MoveConstructions = 0;
245*9880d681SAndroid Build Coastguard Worker unsigned MoveOnly::Destructions = 0;
246*9880d681SAndroid Build Coastguard Worker unsigned MoveOnly::MoveAssignments = 0;
247*9880d681SAndroid Build Coastguard Worker
TEST_F(OptionalTest,MoveOnlyNull)248*9880d681SAndroid Build Coastguard Worker TEST_F(OptionalTest, MoveOnlyNull) {
249*9880d681SAndroid Build Coastguard Worker MoveOnly::ResetCounts();
250*9880d681SAndroid Build Coastguard Worker Optional<MoveOnly> O;
251*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(0u, MoveOnly::MoveConstructions);
252*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(0u, MoveOnly::MoveAssignments);
253*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(0u, MoveOnly::Destructions);
254*9880d681SAndroid Build Coastguard Worker }
255*9880d681SAndroid Build Coastguard Worker
TEST_F(OptionalTest,MoveOnlyConstruction)256*9880d681SAndroid Build Coastguard Worker TEST_F(OptionalTest, MoveOnlyConstruction) {
257*9880d681SAndroid Build Coastguard Worker MoveOnly::ResetCounts();
258*9880d681SAndroid Build Coastguard Worker Optional<MoveOnly> O(MoveOnly(3));
259*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE((bool)O);
260*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(3, O->val);
261*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(1u, MoveOnly::MoveConstructions);
262*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(0u, MoveOnly::MoveAssignments);
263*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(1u, MoveOnly::Destructions);
264*9880d681SAndroid Build Coastguard Worker }
265*9880d681SAndroid Build Coastguard Worker
TEST_F(OptionalTest,MoveOnlyMoveConstruction)266*9880d681SAndroid Build Coastguard Worker TEST_F(OptionalTest, MoveOnlyMoveConstruction) {
267*9880d681SAndroid Build Coastguard Worker Optional<MoveOnly> A(MoveOnly(3));
268*9880d681SAndroid Build Coastguard Worker MoveOnly::ResetCounts();
269*9880d681SAndroid Build Coastguard Worker Optional<MoveOnly> B(std::move(A));
270*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE((bool)A);
271*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE((bool)B);
272*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(3, B->val);
273*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(1u, MoveOnly::MoveConstructions);
274*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(0u, MoveOnly::MoveAssignments);
275*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(1u, MoveOnly::Destructions);
276*9880d681SAndroid Build Coastguard Worker }
277*9880d681SAndroid Build Coastguard Worker
TEST_F(OptionalTest,MoveOnlyAssignment)278*9880d681SAndroid Build Coastguard Worker TEST_F(OptionalTest, MoveOnlyAssignment) {
279*9880d681SAndroid Build Coastguard Worker MoveOnly::ResetCounts();
280*9880d681SAndroid Build Coastguard Worker Optional<MoveOnly> O;
281*9880d681SAndroid Build Coastguard Worker O = MoveOnly(3);
282*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE((bool)O);
283*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(3, O->val);
284*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(1u, MoveOnly::MoveConstructions);
285*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(0u, MoveOnly::MoveAssignments);
286*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(1u, MoveOnly::Destructions);
287*9880d681SAndroid Build Coastguard Worker }
288*9880d681SAndroid Build Coastguard Worker
TEST_F(OptionalTest,MoveOnlyInitializingAssignment)289*9880d681SAndroid Build Coastguard Worker TEST_F(OptionalTest, MoveOnlyInitializingAssignment) {
290*9880d681SAndroid Build Coastguard Worker Optional<MoveOnly> A(MoveOnly(3));
291*9880d681SAndroid Build Coastguard Worker Optional<MoveOnly> B;
292*9880d681SAndroid Build Coastguard Worker MoveOnly::ResetCounts();
293*9880d681SAndroid Build Coastguard Worker B = std::move(A);
294*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE((bool)A);
295*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE((bool)B);
296*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(3, B->val);
297*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(1u, MoveOnly::MoveConstructions);
298*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(0u, MoveOnly::MoveAssignments);
299*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(1u, MoveOnly::Destructions);
300*9880d681SAndroid Build Coastguard Worker }
301*9880d681SAndroid Build Coastguard Worker
TEST_F(OptionalTest,MoveOnlyNullingAssignment)302*9880d681SAndroid Build Coastguard Worker TEST_F(OptionalTest, MoveOnlyNullingAssignment) {
303*9880d681SAndroid Build Coastguard Worker Optional<MoveOnly> A;
304*9880d681SAndroid Build Coastguard Worker Optional<MoveOnly> B(MoveOnly(3));
305*9880d681SAndroid Build Coastguard Worker MoveOnly::ResetCounts();
306*9880d681SAndroid Build Coastguard Worker B = std::move(A);
307*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE((bool)A);
308*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE((bool)B);
309*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(0u, MoveOnly::MoveConstructions);
310*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(0u, MoveOnly::MoveAssignments);
311*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(1u, MoveOnly::Destructions);
312*9880d681SAndroid Build Coastguard Worker }
313*9880d681SAndroid Build Coastguard Worker
TEST_F(OptionalTest,MoveOnlyAssigningAssignment)314*9880d681SAndroid Build Coastguard Worker TEST_F(OptionalTest, MoveOnlyAssigningAssignment) {
315*9880d681SAndroid Build Coastguard Worker Optional<MoveOnly> A(MoveOnly(3));
316*9880d681SAndroid Build Coastguard Worker Optional<MoveOnly> B(MoveOnly(4));
317*9880d681SAndroid Build Coastguard Worker MoveOnly::ResetCounts();
318*9880d681SAndroid Build Coastguard Worker B = std::move(A);
319*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE((bool)A);
320*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE((bool)B);
321*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(3, B->val);
322*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(0u, MoveOnly::MoveConstructions);
323*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(1u, MoveOnly::MoveAssignments);
324*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(1u, MoveOnly::Destructions);
325*9880d681SAndroid Build Coastguard Worker }
326*9880d681SAndroid Build Coastguard Worker
327*9880d681SAndroid Build Coastguard Worker struct Immovable {
328*9880d681SAndroid Build Coastguard Worker static unsigned Constructions;
329*9880d681SAndroid Build Coastguard Worker static unsigned Destructions;
330*9880d681SAndroid Build Coastguard Worker int val;
Immovable__anonaea807520111::Immovable331*9880d681SAndroid Build Coastguard Worker explicit Immovable(int val) : val(val) {
332*9880d681SAndroid Build Coastguard Worker ++Constructions;
333*9880d681SAndroid Build Coastguard Worker }
~Immovable__anonaea807520111::Immovable334*9880d681SAndroid Build Coastguard Worker ~Immovable() {
335*9880d681SAndroid Build Coastguard Worker ++Destructions;
336*9880d681SAndroid Build Coastguard Worker }
ResetCounts__anonaea807520111::Immovable337*9880d681SAndroid Build Coastguard Worker static void ResetCounts() {
338*9880d681SAndroid Build Coastguard Worker Constructions = 0;
339*9880d681SAndroid Build Coastguard Worker Destructions = 0;
340*9880d681SAndroid Build Coastguard Worker }
341*9880d681SAndroid Build Coastguard Worker private:
342*9880d681SAndroid Build Coastguard Worker // This should disable all move/copy operations.
343*9880d681SAndroid Build Coastguard Worker Immovable(Immovable&& other) = delete;
344*9880d681SAndroid Build Coastguard Worker };
345*9880d681SAndroid Build Coastguard Worker
346*9880d681SAndroid Build Coastguard Worker unsigned Immovable::Constructions = 0;
347*9880d681SAndroid Build Coastguard Worker unsigned Immovable::Destructions = 0;
348*9880d681SAndroid Build Coastguard Worker
TEST_F(OptionalTest,ImmovableEmplace)349*9880d681SAndroid Build Coastguard Worker TEST_F(OptionalTest, ImmovableEmplace) {
350*9880d681SAndroid Build Coastguard Worker Optional<Immovable> A;
351*9880d681SAndroid Build Coastguard Worker Immovable::ResetCounts();
352*9880d681SAndroid Build Coastguard Worker A.emplace(4);
353*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE((bool)A);
354*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(4, A->val);
355*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(1u, Immovable::Constructions);
356*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(0u, Immovable::Destructions);
357*9880d681SAndroid Build Coastguard Worker }
358*9880d681SAndroid Build Coastguard Worker
359*9880d681SAndroid Build Coastguard Worker #if LLVM_HAS_RVALUE_REFERENCE_THIS
360*9880d681SAndroid Build Coastguard Worker
TEST_F(OptionalTest,MoveGetValueOr)361*9880d681SAndroid Build Coastguard Worker TEST_F(OptionalTest, MoveGetValueOr) {
362*9880d681SAndroid Build Coastguard Worker Optional<MoveOnly> A;
363*9880d681SAndroid Build Coastguard Worker
364*9880d681SAndroid Build Coastguard Worker MoveOnly::ResetCounts();
365*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(42, std::move(A).getValueOr(MoveOnly(42)).val);
366*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(1u, MoveOnly::MoveConstructions);
367*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(0u, MoveOnly::MoveAssignments);
368*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(2u, MoveOnly::Destructions);
369*9880d681SAndroid Build Coastguard Worker
370*9880d681SAndroid Build Coastguard Worker A = MoveOnly(5);
371*9880d681SAndroid Build Coastguard Worker MoveOnly::ResetCounts();
372*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(5, std::move(A).getValueOr(MoveOnly(42)).val);
373*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(1u, MoveOnly::MoveConstructions);
374*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(0u, MoveOnly::MoveAssignments);
375*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(2u, MoveOnly::Destructions);
376*9880d681SAndroid Build Coastguard Worker }
377*9880d681SAndroid Build Coastguard Worker
378*9880d681SAndroid Build Coastguard Worker #endif // LLVM_HAS_RVALUE_REFERENCE_THIS
379*9880d681SAndroid Build Coastguard Worker
TEST_F(OptionalTest,NoneComparison)380*9880d681SAndroid Build Coastguard Worker TEST_F(OptionalTest, NoneComparison) {
381*9880d681SAndroid Build Coastguard Worker Optional<int> o;
382*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(o, None);
383*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(None, o);
384*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(o != None);
385*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(None != o);
386*9880d681SAndroid Build Coastguard Worker o = 3;
387*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(o == None);
388*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(None == o);
389*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(o != None);
390*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(None != o);
391*9880d681SAndroid Build Coastguard Worker }
392*9880d681SAndroid Build Coastguard Worker
393*9880d681SAndroid Build Coastguard Worker } // end anonymous namespace
394*9880d681SAndroid Build Coastguard Worker
395