xref: /aosp_15_r20/external/abseil-cpp/absl/status/statusor_test.cc (revision 9356374a3709195abf420251b3e825997ff56c0f)
1*9356374aSAndroid Build Coastguard Worker // Copyright 2020 The Abseil Authors.
2*9356374aSAndroid Build Coastguard Worker //
3*9356374aSAndroid Build Coastguard Worker // Licensed under the Apache License, Version 2.0 (the "License");
4*9356374aSAndroid Build Coastguard Worker // you may not use this file except in compliance with the License.
5*9356374aSAndroid Build Coastguard Worker // You may obtain a copy of the License at
6*9356374aSAndroid Build Coastguard Worker //
7*9356374aSAndroid Build Coastguard Worker //      https://www.apache.org/licenses/LICENSE-2.0
8*9356374aSAndroid Build Coastguard Worker //
9*9356374aSAndroid Build Coastguard Worker // Unless required by applicable law or agreed to in writing, software
10*9356374aSAndroid Build Coastguard Worker // distributed under the License is distributed on an "AS IS" BASIS,
11*9356374aSAndroid Build Coastguard Worker // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*9356374aSAndroid Build Coastguard Worker // See the License for the specific language governing permissions and
13*9356374aSAndroid Build Coastguard Worker // limitations under the License.
14*9356374aSAndroid Build Coastguard Worker 
15*9356374aSAndroid Build Coastguard Worker #include "absl/status/statusor.h"
16*9356374aSAndroid Build Coastguard Worker 
17*9356374aSAndroid Build Coastguard Worker #include <array>
18*9356374aSAndroid Build Coastguard Worker #include <cstddef>
19*9356374aSAndroid Build Coastguard Worker #include <initializer_list>
20*9356374aSAndroid Build Coastguard Worker #include <map>
21*9356374aSAndroid Build Coastguard Worker #include <memory>
22*9356374aSAndroid Build Coastguard Worker #include <ostream>
23*9356374aSAndroid Build Coastguard Worker #include <sstream>
24*9356374aSAndroid Build Coastguard Worker #include <string>
25*9356374aSAndroid Build Coastguard Worker #include <type_traits>
26*9356374aSAndroid Build Coastguard Worker #include <utility>
27*9356374aSAndroid Build Coastguard Worker #include <vector>
28*9356374aSAndroid Build Coastguard Worker 
29*9356374aSAndroid Build Coastguard Worker #include "gmock/gmock.h"
30*9356374aSAndroid Build Coastguard Worker #include "gtest/gtest.h"
31*9356374aSAndroid Build Coastguard Worker #include "absl/base/casts.h"
32*9356374aSAndroid Build Coastguard Worker #include "absl/memory/memory.h"
33*9356374aSAndroid Build Coastguard Worker #include "absl/status/status.h"
34*9356374aSAndroid Build Coastguard Worker #include "absl/status/status_matchers.h"
35*9356374aSAndroid Build Coastguard Worker #include "absl/strings/str_cat.h"
36*9356374aSAndroid Build Coastguard Worker #include "absl/strings/string_view.h"
37*9356374aSAndroid Build Coastguard Worker #include "absl/types/any.h"
38*9356374aSAndroid Build Coastguard Worker #include "absl/types/variant.h"
39*9356374aSAndroid Build Coastguard Worker #include "absl/utility/utility.h"
40*9356374aSAndroid Build Coastguard Worker 
41*9356374aSAndroid Build Coastguard Worker namespace {
42*9356374aSAndroid Build Coastguard Worker 
43*9356374aSAndroid Build Coastguard Worker using ::absl_testing::IsOk;
44*9356374aSAndroid Build Coastguard Worker using ::absl_testing::IsOkAndHolds;
45*9356374aSAndroid Build Coastguard Worker using ::testing::AllOf;
46*9356374aSAndroid Build Coastguard Worker using ::testing::AnyOf;
47*9356374aSAndroid Build Coastguard Worker using ::testing::AnyWith;
48*9356374aSAndroid Build Coastguard Worker using ::testing::ElementsAre;
49*9356374aSAndroid Build Coastguard Worker using ::testing::EndsWith;
50*9356374aSAndroid Build Coastguard Worker using ::testing::Field;
51*9356374aSAndroid Build Coastguard Worker using ::testing::HasSubstr;
52*9356374aSAndroid Build Coastguard Worker using ::testing::Ne;
53*9356374aSAndroid Build Coastguard Worker using ::testing::Not;
54*9356374aSAndroid Build Coastguard Worker using ::testing::Pointee;
55*9356374aSAndroid Build Coastguard Worker using ::testing::StartsWith;
56*9356374aSAndroid Build Coastguard Worker using ::testing::VariantWith;
57*9356374aSAndroid Build Coastguard Worker 
58*9356374aSAndroid Build Coastguard Worker struct CopyDetector {
59*9356374aSAndroid Build Coastguard Worker   CopyDetector() = default;
CopyDetector__anonfda0c6120111::CopyDetector60*9356374aSAndroid Build Coastguard Worker   explicit CopyDetector(int xx) : x(xx) {}
CopyDetector__anonfda0c6120111::CopyDetector61*9356374aSAndroid Build Coastguard Worker   CopyDetector(CopyDetector&& d) noexcept
62*9356374aSAndroid Build Coastguard Worker       : x(d.x), copied(false), moved(true) {}
CopyDetector__anonfda0c6120111::CopyDetector63*9356374aSAndroid Build Coastguard Worker   CopyDetector(const CopyDetector& d) : x(d.x), copied(true), moved(false) {}
operator =__anonfda0c6120111::CopyDetector64*9356374aSAndroid Build Coastguard Worker   CopyDetector& operator=(const CopyDetector& c) {
65*9356374aSAndroid Build Coastguard Worker     x = c.x;
66*9356374aSAndroid Build Coastguard Worker     copied = true;
67*9356374aSAndroid Build Coastguard Worker     moved = false;
68*9356374aSAndroid Build Coastguard Worker     return *this;
69*9356374aSAndroid Build Coastguard Worker   }
operator =__anonfda0c6120111::CopyDetector70*9356374aSAndroid Build Coastguard Worker   CopyDetector& operator=(CopyDetector&& c) noexcept {
71*9356374aSAndroid Build Coastguard Worker     x = c.x;
72*9356374aSAndroid Build Coastguard Worker     copied = false;
73*9356374aSAndroid Build Coastguard Worker     moved = true;
74*9356374aSAndroid Build Coastguard Worker     return *this;
75*9356374aSAndroid Build Coastguard Worker   }
76*9356374aSAndroid Build Coastguard Worker   int x = 0;
77*9356374aSAndroid Build Coastguard Worker   bool copied = false;
78*9356374aSAndroid Build Coastguard Worker   bool moved = false;
79*9356374aSAndroid Build Coastguard Worker };
80*9356374aSAndroid Build Coastguard Worker 
CopyDetectorHas(int a,bool b,bool c)81*9356374aSAndroid Build Coastguard Worker testing::Matcher<const CopyDetector&> CopyDetectorHas(int a, bool b, bool c) {
82*9356374aSAndroid Build Coastguard Worker   return AllOf(Field(&CopyDetector::x, a), Field(&CopyDetector::moved, b),
83*9356374aSAndroid Build Coastguard Worker                Field(&CopyDetector::copied, c));
84*9356374aSAndroid Build Coastguard Worker }
85*9356374aSAndroid Build Coastguard Worker 
86*9356374aSAndroid Build Coastguard Worker class Base1 {
87*9356374aSAndroid Build Coastguard Worker  public:
~Base1()88*9356374aSAndroid Build Coastguard Worker   virtual ~Base1() {}
89*9356374aSAndroid Build Coastguard Worker   int pad;
90*9356374aSAndroid Build Coastguard Worker };
91*9356374aSAndroid Build Coastguard Worker 
92*9356374aSAndroid Build Coastguard Worker class Base2 {
93*9356374aSAndroid Build Coastguard Worker  public:
~Base2()94*9356374aSAndroid Build Coastguard Worker   virtual ~Base2() {}
95*9356374aSAndroid Build Coastguard Worker   int yetotherpad;
96*9356374aSAndroid Build Coastguard Worker };
97*9356374aSAndroid Build Coastguard Worker 
98*9356374aSAndroid Build Coastguard Worker class Derived : public Base1, public Base2 {
99*9356374aSAndroid Build Coastguard Worker  public:
~Derived()100*9356374aSAndroid Build Coastguard Worker   virtual ~Derived() {}
101*9356374aSAndroid Build Coastguard Worker   int evenmorepad;
102*9356374aSAndroid Build Coastguard Worker };
103*9356374aSAndroid Build Coastguard Worker 
104*9356374aSAndroid Build Coastguard Worker class CopyNoAssign {
105*9356374aSAndroid Build Coastguard Worker  public:
CopyNoAssign(int value)106*9356374aSAndroid Build Coastguard Worker   explicit CopyNoAssign(int value) : foo(value) {}
CopyNoAssign(const CopyNoAssign & other)107*9356374aSAndroid Build Coastguard Worker   CopyNoAssign(const CopyNoAssign& other) : foo(other.foo) {}
108*9356374aSAndroid Build Coastguard Worker   int foo;
109*9356374aSAndroid Build Coastguard Worker 
110*9356374aSAndroid Build Coastguard Worker  private:
111*9356374aSAndroid Build Coastguard Worker   const CopyNoAssign& operator=(const CopyNoAssign&);
112*9356374aSAndroid Build Coastguard Worker };
113*9356374aSAndroid Build Coastguard Worker 
ReturnUniquePtr()114*9356374aSAndroid Build Coastguard Worker absl::StatusOr<std::unique_ptr<int>> ReturnUniquePtr() {
115*9356374aSAndroid Build Coastguard Worker   // Uses implicit constructor from T&&
116*9356374aSAndroid Build Coastguard Worker   return absl::make_unique<int>(0);
117*9356374aSAndroid Build Coastguard Worker }
118*9356374aSAndroid Build Coastguard Worker 
TEST(StatusOr,ElementType)119*9356374aSAndroid Build Coastguard Worker TEST(StatusOr, ElementType) {
120*9356374aSAndroid Build Coastguard Worker   static_assert(std::is_same<absl::StatusOr<int>::value_type, int>(), "");
121*9356374aSAndroid Build Coastguard Worker   static_assert(std::is_same<absl::StatusOr<char>::value_type, char>(), "");
122*9356374aSAndroid Build Coastguard Worker }
123*9356374aSAndroid Build Coastguard Worker 
TEST(StatusOr,TestMoveOnlyInitialization)124*9356374aSAndroid Build Coastguard Worker TEST(StatusOr, TestMoveOnlyInitialization) {
125*9356374aSAndroid Build Coastguard Worker   absl::StatusOr<std::unique_ptr<int>> thing(ReturnUniquePtr());
126*9356374aSAndroid Build Coastguard Worker   ASSERT_TRUE(thing.ok());
127*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(0, **thing);
128*9356374aSAndroid Build Coastguard Worker   int* previous = thing->get();
129*9356374aSAndroid Build Coastguard Worker 
130*9356374aSAndroid Build Coastguard Worker   thing = ReturnUniquePtr();
131*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(thing.ok());
132*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(0, **thing);
133*9356374aSAndroid Build Coastguard Worker   EXPECT_NE(previous, thing->get());
134*9356374aSAndroid Build Coastguard Worker }
135*9356374aSAndroid Build Coastguard Worker 
TEST(StatusOr,TestMoveOnlyValueExtraction)136*9356374aSAndroid Build Coastguard Worker TEST(StatusOr, TestMoveOnlyValueExtraction) {
137*9356374aSAndroid Build Coastguard Worker   absl::StatusOr<std::unique_ptr<int>> thing(ReturnUniquePtr());
138*9356374aSAndroid Build Coastguard Worker   ASSERT_TRUE(thing.ok());
139*9356374aSAndroid Build Coastguard Worker   std::unique_ptr<int> ptr = *std::move(thing);
140*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(0, *ptr);
141*9356374aSAndroid Build Coastguard Worker 
142*9356374aSAndroid Build Coastguard Worker   thing = std::move(ptr);
143*9356374aSAndroid Build Coastguard Worker   ptr = std::move(*thing);
144*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(0, *ptr);
145*9356374aSAndroid Build Coastguard Worker }
146*9356374aSAndroid Build Coastguard Worker 
TEST(StatusOr,TestMoveOnlyInitializationFromTemporaryByValueOrDie)147*9356374aSAndroid Build Coastguard Worker TEST(StatusOr, TestMoveOnlyInitializationFromTemporaryByValueOrDie) {
148*9356374aSAndroid Build Coastguard Worker   std::unique_ptr<int> ptr(*ReturnUniquePtr());
149*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(0, *ptr);
150*9356374aSAndroid Build Coastguard Worker }
151*9356374aSAndroid Build Coastguard Worker 
TEST(StatusOr,TestValueOrDieOverloadForConstTemporary)152*9356374aSAndroid Build Coastguard Worker TEST(StatusOr, TestValueOrDieOverloadForConstTemporary) {
153*9356374aSAndroid Build Coastguard Worker   static_assert(
154*9356374aSAndroid Build Coastguard Worker       std::is_same<
155*9356374aSAndroid Build Coastguard Worker           const int&&,
156*9356374aSAndroid Build Coastguard Worker           decltype(std::declval<const absl::StatusOr<int>&&>().value())>(),
157*9356374aSAndroid Build Coastguard Worker       "value() for const temporaries should return const T&&");
158*9356374aSAndroid Build Coastguard Worker }
159*9356374aSAndroid Build Coastguard Worker 
TEST(StatusOr,TestMoveOnlyConversion)160*9356374aSAndroid Build Coastguard Worker TEST(StatusOr, TestMoveOnlyConversion) {
161*9356374aSAndroid Build Coastguard Worker   absl::StatusOr<std::unique_ptr<const int>> const_thing(ReturnUniquePtr());
162*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(const_thing.ok());
163*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(0, **const_thing);
164*9356374aSAndroid Build Coastguard Worker 
165*9356374aSAndroid Build Coastguard Worker   // Test rvalue converting assignment
166*9356374aSAndroid Build Coastguard Worker   const int* const_previous = const_thing->get();
167*9356374aSAndroid Build Coastguard Worker   const_thing = ReturnUniquePtr();
168*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(const_thing.ok());
169*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(0, **const_thing);
170*9356374aSAndroid Build Coastguard Worker   EXPECT_NE(const_previous, const_thing->get());
171*9356374aSAndroid Build Coastguard Worker }
172*9356374aSAndroid Build Coastguard Worker 
TEST(StatusOr,TestMoveOnlyVector)173*9356374aSAndroid Build Coastguard Worker TEST(StatusOr, TestMoveOnlyVector) {
174*9356374aSAndroid Build Coastguard Worker   // Sanity check that absl::StatusOr<MoveOnly> works in vector.
175*9356374aSAndroid Build Coastguard Worker   std::vector<absl::StatusOr<std::unique_ptr<int>>> vec;
176*9356374aSAndroid Build Coastguard Worker   vec.push_back(ReturnUniquePtr());
177*9356374aSAndroid Build Coastguard Worker   vec.resize(2);
178*9356374aSAndroid Build Coastguard Worker   auto another_vec = std::move(vec);
179*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(0, **another_vec[0]);
180*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::UnknownError(""), another_vec[1].status());
181*9356374aSAndroid Build Coastguard Worker }
182*9356374aSAndroid Build Coastguard Worker 
TEST(StatusOr,TestDefaultCtor)183*9356374aSAndroid Build Coastguard Worker TEST(StatusOr, TestDefaultCtor) {
184*9356374aSAndroid Build Coastguard Worker   absl::StatusOr<int> thing;
185*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(thing.ok());
186*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(thing.status().code(), absl::StatusCode::kUnknown);
187*9356374aSAndroid Build Coastguard Worker }
188*9356374aSAndroid Build Coastguard Worker 
TEST(StatusOr,StatusCtorForwards)189*9356374aSAndroid Build Coastguard Worker TEST(StatusOr, StatusCtorForwards) {
190*9356374aSAndroid Build Coastguard Worker   absl::Status status(absl::StatusCode::kInternal, "Some error");
191*9356374aSAndroid Build Coastguard Worker 
192*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::StatusOr<int>(status).status().message(), "Some error");
193*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(status.message(), "Some error");
194*9356374aSAndroid Build Coastguard Worker 
195*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::StatusOr<int>(std::move(status)).status().message(),
196*9356374aSAndroid Build Coastguard Worker             "Some error");
197*9356374aSAndroid Build Coastguard Worker   EXPECT_NE(status.message(), "Some error");
198*9356374aSAndroid Build Coastguard Worker }
199*9356374aSAndroid Build Coastguard Worker 
TEST(BadStatusOrAccessTest,CopyConstructionWhatOk)200*9356374aSAndroid Build Coastguard Worker TEST(BadStatusOrAccessTest, CopyConstructionWhatOk) {
201*9356374aSAndroid Build Coastguard Worker   absl::Status error =
202*9356374aSAndroid Build Coastguard Worker       absl::InternalError("some arbitrary message too big for the sso buffer");
203*9356374aSAndroid Build Coastguard Worker   absl::BadStatusOrAccess e1{error};
204*9356374aSAndroid Build Coastguard Worker   absl::BadStatusOrAccess e2{e1};
205*9356374aSAndroid Build Coastguard Worker   EXPECT_THAT(e1.what(), HasSubstr(error.ToString()));
206*9356374aSAndroid Build Coastguard Worker   EXPECT_THAT(e2.what(), HasSubstr(error.ToString()));
207*9356374aSAndroid Build Coastguard Worker }
208*9356374aSAndroid Build Coastguard Worker 
TEST(BadStatusOrAccessTest,CopyAssignmentWhatOk)209*9356374aSAndroid Build Coastguard Worker TEST(BadStatusOrAccessTest, CopyAssignmentWhatOk) {
210*9356374aSAndroid Build Coastguard Worker   absl::Status error =
211*9356374aSAndroid Build Coastguard Worker       absl::InternalError("some arbitrary message too big for the sso buffer");
212*9356374aSAndroid Build Coastguard Worker   absl::BadStatusOrAccess e1{error};
213*9356374aSAndroid Build Coastguard Worker   absl::BadStatusOrAccess e2{absl::InternalError("other")};
214*9356374aSAndroid Build Coastguard Worker   e2 = e1;
215*9356374aSAndroid Build Coastguard Worker   EXPECT_THAT(e1.what(), HasSubstr(error.ToString()));
216*9356374aSAndroid Build Coastguard Worker   EXPECT_THAT(e2.what(), HasSubstr(error.ToString()));
217*9356374aSAndroid Build Coastguard Worker }
218*9356374aSAndroid Build Coastguard Worker 
TEST(BadStatusOrAccessTest,MoveConstructionWhatOk)219*9356374aSAndroid Build Coastguard Worker TEST(BadStatusOrAccessTest, MoveConstructionWhatOk) {
220*9356374aSAndroid Build Coastguard Worker   absl::Status error =
221*9356374aSAndroid Build Coastguard Worker       absl::InternalError("some arbitrary message too big for the sso buffer");
222*9356374aSAndroid Build Coastguard Worker   absl::BadStatusOrAccess e1{error};
223*9356374aSAndroid Build Coastguard Worker   absl::BadStatusOrAccess e2{std::move(e1)};
224*9356374aSAndroid Build Coastguard Worker   EXPECT_THAT(e2.what(), HasSubstr(error.ToString()));
225*9356374aSAndroid Build Coastguard Worker }
226*9356374aSAndroid Build Coastguard Worker 
TEST(BadStatusOrAccessTest,MoveAssignmentWhatOk)227*9356374aSAndroid Build Coastguard Worker TEST(BadStatusOrAccessTest, MoveAssignmentWhatOk) {
228*9356374aSAndroid Build Coastguard Worker   absl::Status error =
229*9356374aSAndroid Build Coastguard Worker       absl::InternalError("some arbitrary message too big for the sso buffer");
230*9356374aSAndroid Build Coastguard Worker   absl::BadStatusOrAccess e1{error};
231*9356374aSAndroid Build Coastguard Worker   absl::BadStatusOrAccess e2{absl::InternalError("other")};
232*9356374aSAndroid Build Coastguard Worker   e2 = std::move(e1);
233*9356374aSAndroid Build Coastguard Worker   EXPECT_THAT(e2.what(), HasSubstr(error.ToString()));
234*9356374aSAndroid Build Coastguard Worker }
235*9356374aSAndroid Build Coastguard Worker 
236*9356374aSAndroid Build Coastguard Worker // Define `EXPECT_DEATH_OR_THROW` to test the behavior of `StatusOr::value`,
237*9356374aSAndroid Build Coastguard Worker // which either throws `BadStatusOrAccess` or `LOG(FATAL)` based on whether
238*9356374aSAndroid Build Coastguard Worker // exceptions are enabled.
239*9356374aSAndroid Build Coastguard Worker #ifdef ABSL_HAVE_EXCEPTIONS
240*9356374aSAndroid Build Coastguard Worker #define EXPECT_DEATH_OR_THROW(statement, status_)                  \
241*9356374aSAndroid Build Coastguard Worker   EXPECT_THROW(                                                    \
242*9356374aSAndroid Build Coastguard Worker       {                                                            \
243*9356374aSAndroid Build Coastguard Worker         try {                                                      \
244*9356374aSAndroid Build Coastguard Worker           statement;                                               \
245*9356374aSAndroid Build Coastguard Worker         } catch (const absl::BadStatusOrAccess& e) {               \
246*9356374aSAndroid Build Coastguard Worker           EXPECT_EQ(e.status(), status_);                          \
247*9356374aSAndroid Build Coastguard Worker           EXPECT_THAT(e.what(), HasSubstr(e.status().ToString())); \
248*9356374aSAndroid Build Coastguard Worker           throw;                                                   \
249*9356374aSAndroid Build Coastguard Worker         }                                                          \
250*9356374aSAndroid Build Coastguard Worker       },                                                           \
251*9356374aSAndroid Build Coastguard Worker       absl::BadStatusOrAccess);
252*9356374aSAndroid Build Coastguard Worker #else  // ABSL_HAVE_EXCEPTIONS
253*9356374aSAndroid Build Coastguard Worker #define EXPECT_DEATH_OR_THROW(statement, status) \
254*9356374aSAndroid Build Coastguard Worker   EXPECT_DEATH_IF_SUPPORTED(statement, status.ToString());
255*9356374aSAndroid Build Coastguard Worker #endif  // ABSL_HAVE_EXCEPTIONS
256*9356374aSAndroid Build Coastguard Worker 
TEST(StatusOrDeathTest,TestDefaultCtorValue)257*9356374aSAndroid Build Coastguard Worker TEST(StatusOrDeathTest, TestDefaultCtorValue) {
258*9356374aSAndroid Build Coastguard Worker   absl::StatusOr<int> thing;
259*9356374aSAndroid Build Coastguard Worker   EXPECT_DEATH_OR_THROW(thing.value(), absl::UnknownError(""));
260*9356374aSAndroid Build Coastguard Worker   const absl::StatusOr<int> thing2;
261*9356374aSAndroid Build Coastguard Worker   EXPECT_DEATH_OR_THROW(thing2.value(), absl::UnknownError(""));
262*9356374aSAndroid Build Coastguard Worker }
263*9356374aSAndroid Build Coastguard Worker 
TEST(StatusOrDeathTest,TestValueNotOk)264*9356374aSAndroid Build Coastguard Worker TEST(StatusOrDeathTest, TestValueNotOk) {
265*9356374aSAndroid Build Coastguard Worker   absl::StatusOr<int> thing(absl::CancelledError());
266*9356374aSAndroid Build Coastguard Worker   EXPECT_DEATH_OR_THROW(thing.value(), absl::CancelledError());
267*9356374aSAndroid Build Coastguard Worker }
268*9356374aSAndroid Build Coastguard Worker 
TEST(StatusOrDeathTest,TestValueNotOkConst)269*9356374aSAndroid Build Coastguard Worker TEST(StatusOrDeathTest, TestValueNotOkConst) {
270*9356374aSAndroid Build Coastguard Worker   const absl::StatusOr<int> thing(absl::UnknownError(""));
271*9356374aSAndroid Build Coastguard Worker   EXPECT_DEATH_OR_THROW(thing.value(), absl::UnknownError(""));
272*9356374aSAndroid Build Coastguard Worker }
273*9356374aSAndroid Build Coastguard Worker 
TEST(StatusOrDeathTest,TestPointerDefaultCtorValue)274*9356374aSAndroid Build Coastguard Worker TEST(StatusOrDeathTest, TestPointerDefaultCtorValue) {
275*9356374aSAndroid Build Coastguard Worker   absl::StatusOr<int*> thing;
276*9356374aSAndroid Build Coastguard Worker   EXPECT_DEATH_OR_THROW(thing.value(), absl::UnknownError(""));
277*9356374aSAndroid Build Coastguard Worker }
278*9356374aSAndroid Build Coastguard Worker 
TEST(StatusOrDeathTest,TestPointerValueNotOk)279*9356374aSAndroid Build Coastguard Worker TEST(StatusOrDeathTest, TestPointerValueNotOk) {
280*9356374aSAndroid Build Coastguard Worker   absl::StatusOr<int*> thing(absl::CancelledError());
281*9356374aSAndroid Build Coastguard Worker   EXPECT_DEATH_OR_THROW(thing.value(), absl::CancelledError());
282*9356374aSAndroid Build Coastguard Worker }
283*9356374aSAndroid Build Coastguard Worker 
TEST(StatusOrDeathTest,TestPointerValueNotOkConst)284*9356374aSAndroid Build Coastguard Worker TEST(StatusOrDeathTest, TestPointerValueNotOkConst) {
285*9356374aSAndroid Build Coastguard Worker   const absl::StatusOr<int*> thing(absl::CancelledError());
286*9356374aSAndroid Build Coastguard Worker   EXPECT_DEATH_OR_THROW(thing.value(), absl::CancelledError());
287*9356374aSAndroid Build Coastguard Worker }
288*9356374aSAndroid Build Coastguard Worker 
289*9356374aSAndroid Build Coastguard Worker #if GTEST_HAS_DEATH_TEST
TEST(StatusOrDeathTest,TestStatusCtorStatusOk)290*9356374aSAndroid Build Coastguard Worker TEST(StatusOrDeathTest, TestStatusCtorStatusOk) {
291*9356374aSAndroid Build Coastguard Worker   EXPECT_DEBUG_DEATH(
292*9356374aSAndroid Build Coastguard Worker       {
293*9356374aSAndroid Build Coastguard Worker         // This will DCHECK
294*9356374aSAndroid Build Coastguard Worker         absl::StatusOr<int> thing(absl::OkStatus());
295*9356374aSAndroid Build Coastguard Worker         // In optimized mode, we are actually going to get error::INTERNAL for
296*9356374aSAndroid Build Coastguard Worker         // status here, rather than crashing, so check that.
297*9356374aSAndroid Build Coastguard Worker         EXPECT_FALSE(thing.ok());
298*9356374aSAndroid Build Coastguard Worker         EXPECT_EQ(thing.status().code(), absl::StatusCode::kInternal);
299*9356374aSAndroid Build Coastguard Worker       },
300*9356374aSAndroid Build Coastguard Worker       "An OK status is not a valid constructor argument");
301*9356374aSAndroid Build Coastguard Worker }
302*9356374aSAndroid Build Coastguard Worker 
TEST(StatusOrDeathTest,TestPointerStatusCtorStatusOk)303*9356374aSAndroid Build Coastguard Worker TEST(StatusOrDeathTest, TestPointerStatusCtorStatusOk) {
304*9356374aSAndroid Build Coastguard Worker   EXPECT_DEBUG_DEATH(
305*9356374aSAndroid Build Coastguard Worker       {
306*9356374aSAndroid Build Coastguard Worker         absl::StatusOr<int*> thing(absl::OkStatus());
307*9356374aSAndroid Build Coastguard Worker         // In optimized mode, we are actually going to get error::INTERNAL for
308*9356374aSAndroid Build Coastguard Worker         // status here, rather than crashing, so check that.
309*9356374aSAndroid Build Coastguard Worker         EXPECT_FALSE(thing.ok());
310*9356374aSAndroid Build Coastguard Worker         EXPECT_EQ(thing.status().code(), absl::StatusCode::kInternal);
311*9356374aSAndroid Build Coastguard Worker       },
312*9356374aSAndroid Build Coastguard Worker       "An OK status is not a valid constructor argument");
313*9356374aSAndroid Build Coastguard Worker }
314*9356374aSAndroid Build Coastguard Worker #endif
315*9356374aSAndroid Build Coastguard Worker 
TEST(StatusOr,ValueAccessor)316*9356374aSAndroid Build Coastguard Worker TEST(StatusOr, ValueAccessor) {
317*9356374aSAndroid Build Coastguard Worker   const int kIntValue = 110;
318*9356374aSAndroid Build Coastguard Worker   {
319*9356374aSAndroid Build Coastguard Worker     absl::StatusOr<int> status_or(kIntValue);
320*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(kIntValue, status_or.value());
321*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(kIntValue, std::move(status_or).value());
322*9356374aSAndroid Build Coastguard Worker   }
323*9356374aSAndroid Build Coastguard Worker   {
324*9356374aSAndroid Build Coastguard Worker     absl::StatusOr<CopyDetector> status_or(kIntValue);
325*9356374aSAndroid Build Coastguard Worker     EXPECT_THAT(status_or,
326*9356374aSAndroid Build Coastguard Worker                 IsOkAndHolds(CopyDetectorHas(kIntValue, false, false)));
327*9356374aSAndroid Build Coastguard Worker     CopyDetector copy_detector = status_or.value();
328*9356374aSAndroid Build Coastguard Worker     EXPECT_THAT(copy_detector, CopyDetectorHas(kIntValue, false, true));
329*9356374aSAndroid Build Coastguard Worker     copy_detector = std::move(status_or).value();
330*9356374aSAndroid Build Coastguard Worker     EXPECT_THAT(copy_detector, CopyDetectorHas(kIntValue, true, false));
331*9356374aSAndroid Build Coastguard Worker   }
332*9356374aSAndroid Build Coastguard Worker }
333*9356374aSAndroid Build Coastguard Worker 
TEST(StatusOr,BadValueAccess)334*9356374aSAndroid Build Coastguard Worker TEST(StatusOr, BadValueAccess) {
335*9356374aSAndroid Build Coastguard Worker   const absl::Status kError = absl::CancelledError("message");
336*9356374aSAndroid Build Coastguard Worker   absl::StatusOr<int> status_or(kError);
337*9356374aSAndroid Build Coastguard Worker   EXPECT_DEATH_OR_THROW(status_or.value(), kError);
338*9356374aSAndroid Build Coastguard Worker }
339*9356374aSAndroid Build Coastguard Worker 
TEST(StatusOr,TestStatusCtor)340*9356374aSAndroid Build Coastguard Worker TEST(StatusOr, TestStatusCtor) {
341*9356374aSAndroid Build Coastguard Worker   absl::StatusOr<int> thing(absl::CancelledError());
342*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(thing.ok());
343*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(thing.status().code(), absl::StatusCode::kCancelled);
344*9356374aSAndroid Build Coastguard Worker }
345*9356374aSAndroid Build Coastguard Worker 
TEST(StatusOr,TestValueCtor)346*9356374aSAndroid Build Coastguard Worker TEST(StatusOr, TestValueCtor) {
347*9356374aSAndroid Build Coastguard Worker   const int kI = 4;
348*9356374aSAndroid Build Coastguard Worker   const absl::StatusOr<int> thing(kI);
349*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(thing.ok());
350*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(kI, *thing);
351*9356374aSAndroid Build Coastguard Worker }
352*9356374aSAndroid Build Coastguard Worker 
353*9356374aSAndroid Build Coastguard Worker struct Foo {
354*9356374aSAndroid Build Coastguard Worker   const int x;
Foo__anonfda0c6120111::Foo355*9356374aSAndroid Build Coastguard Worker   explicit Foo(int y) : x(y) {}
356*9356374aSAndroid Build Coastguard Worker };
357*9356374aSAndroid Build Coastguard Worker 
TEST(StatusOr,InPlaceConstruction)358*9356374aSAndroid Build Coastguard Worker TEST(StatusOr, InPlaceConstruction) {
359*9356374aSAndroid Build Coastguard Worker   EXPECT_THAT(absl::StatusOr<Foo>(absl::in_place, 10),
360*9356374aSAndroid Build Coastguard Worker               IsOkAndHolds(Field(&Foo::x, 10)));
361*9356374aSAndroid Build Coastguard Worker }
362*9356374aSAndroid Build Coastguard Worker 
363*9356374aSAndroid Build Coastguard Worker struct InPlaceHelper {
InPlaceHelper__anonfda0c6120111::InPlaceHelper364*9356374aSAndroid Build Coastguard Worker   InPlaceHelper(std::initializer_list<int> xs, std::unique_ptr<int> yy)
365*9356374aSAndroid Build Coastguard Worker       : x(xs), y(std::move(yy)) {}
366*9356374aSAndroid Build Coastguard Worker   const std::vector<int> x;
367*9356374aSAndroid Build Coastguard Worker   std::unique_ptr<int> y;
368*9356374aSAndroid Build Coastguard Worker };
369*9356374aSAndroid Build Coastguard Worker 
TEST(StatusOr,InPlaceInitListConstruction)370*9356374aSAndroid Build Coastguard Worker TEST(StatusOr, InPlaceInitListConstruction) {
371*9356374aSAndroid Build Coastguard Worker   absl::StatusOr<InPlaceHelper> status_or(absl::in_place, {10, 11, 12},
372*9356374aSAndroid Build Coastguard Worker                                           absl::make_unique<int>(13));
373*9356374aSAndroid Build Coastguard Worker   EXPECT_THAT(status_or, IsOkAndHolds(AllOf(
374*9356374aSAndroid Build Coastguard Worker                              Field(&InPlaceHelper::x, ElementsAre(10, 11, 12)),
375*9356374aSAndroid Build Coastguard Worker                              Field(&InPlaceHelper::y, Pointee(13)))));
376*9356374aSAndroid Build Coastguard Worker }
377*9356374aSAndroid Build Coastguard Worker 
TEST(StatusOr,Emplace)378*9356374aSAndroid Build Coastguard Worker TEST(StatusOr, Emplace) {
379*9356374aSAndroid Build Coastguard Worker   absl::StatusOr<Foo> status_or_foo(10);
380*9356374aSAndroid Build Coastguard Worker   status_or_foo.emplace(20);
381*9356374aSAndroid Build Coastguard Worker   EXPECT_THAT(status_or_foo, IsOkAndHolds(Field(&Foo::x, 20)));
382*9356374aSAndroid Build Coastguard Worker   status_or_foo = absl::InvalidArgumentError("msg");
383*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(status_or_foo.ok());
384*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(status_or_foo.status().code(), absl::StatusCode::kInvalidArgument);
385*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(status_or_foo.status().message(), "msg");
386*9356374aSAndroid Build Coastguard Worker   status_or_foo.emplace(20);
387*9356374aSAndroid Build Coastguard Worker   EXPECT_THAT(status_or_foo, IsOkAndHolds(Field(&Foo::x, 20)));
388*9356374aSAndroid Build Coastguard Worker }
389*9356374aSAndroid Build Coastguard Worker 
TEST(StatusOr,EmplaceInitializerList)390*9356374aSAndroid Build Coastguard Worker TEST(StatusOr, EmplaceInitializerList) {
391*9356374aSAndroid Build Coastguard Worker   absl::StatusOr<InPlaceHelper> status_or(absl::in_place, {10, 11, 12},
392*9356374aSAndroid Build Coastguard Worker                                           absl::make_unique<int>(13));
393*9356374aSAndroid Build Coastguard Worker   status_or.emplace({1, 2, 3}, absl::make_unique<int>(4));
394*9356374aSAndroid Build Coastguard Worker   EXPECT_THAT(status_or,
395*9356374aSAndroid Build Coastguard Worker               IsOkAndHolds(AllOf(Field(&InPlaceHelper::x, ElementsAre(1, 2, 3)),
396*9356374aSAndroid Build Coastguard Worker                                  Field(&InPlaceHelper::y, Pointee(4)))));
397*9356374aSAndroid Build Coastguard Worker   status_or = absl::InvalidArgumentError("msg");
398*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(status_or.ok());
399*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(status_or.status().code(), absl::StatusCode::kInvalidArgument);
400*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(status_or.status().message(), "msg");
401*9356374aSAndroid Build Coastguard Worker   status_or.emplace({1, 2, 3}, absl::make_unique<int>(4));
402*9356374aSAndroid Build Coastguard Worker   EXPECT_THAT(status_or,
403*9356374aSAndroid Build Coastguard Worker               IsOkAndHolds(AllOf(Field(&InPlaceHelper::x, ElementsAre(1, 2, 3)),
404*9356374aSAndroid Build Coastguard Worker                                  Field(&InPlaceHelper::y, Pointee(4)))));
405*9356374aSAndroid Build Coastguard Worker }
406*9356374aSAndroid Build Coastguard Worker 
TEST(StatusOr,TestCopyCtorStatusOk)407*9356374aSAndroid Build Coastguard Worker TEST(StatusOr, TestCopyCtorStatusOk) {
408*9356374aSAndroid Build Coastguard Worker   const int kI = 4;
409*9356374aSAndroid Build Coastguard Worker   const absl::StatusOr<int> original(kI);
410*9356374aSAndroid Build Coastguard Worker   const absl::StatusOr<int> copy(original);
411*9356374aSAndroid Build Coastguard Worker   EXPECT_THAT(copy.status(), IsOk());
412*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(*original, *copy);
413*9356374aSAndroid Build Coastguard Worker }
414*9356374aSAndroid Build Coastguard Worker 
TEST(StatusOr,TestCopyCtorStatusNotOk)415*9356374aSAndroid Build Coastguard Worker TEST(StatusOr, TestCopyCtorStatusNotOk) {
416*9356374aSAndroid Build Coastguard Worker   absl::StatusOr<int> original(absl::CancelledError());
417*9356374aSAndroid Build Coastguard Worker   absl::StatusOr<int> copy(original);
418*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(copy.status().code(), absl::StatusCode::kCancelled);
419*9356374aSAndroid Build Coastguard Worker }
420*9356374aSAndroid Build Coastguard Worker 
TEST(StatusOr,TestCopyCtorNonAssignable)421*9356374aSAndroid Build Coastguard Worker TEST(StatusOr, TestCopyCtorNonAssignable) {
422*9356374aSAndroid Build Coastguard Worker   const int kI = 4;
423*9356374aSAndroid Build Coastguard Worker   CopyNoAssign value(kI);
424*9356374aSAndroid Build Coastguard Worker   absl::StatusOr<CopyNoAssign> original(value);
425*9356374aSAndroid Build Coastguard Worker   absl::StatusOr<CopyNoAssign> copy(original);
426*9356374aSAndroid Build Coastguard Worker   EXPECT_THAT(copy.status(), IsOk());
427*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(original->foo, copy->foo);
428*9356374aSAndroid Build Coastguard Worker }
429*9356374aSAndroid Build Coastguard Worker 
TEST(StatusOr,TestCopyCtorStatusOKConverting)430*9356374aSAndroid Build Coastguard Worker TEST(StatusOr, TestCopyCtorStatusOKConverting) {
431*9356374aSAndroid Build Coastguard Worker   const int kI = 4;
432*9356374aSAndroid Build Coastguard Worker   absl::StatusOr<int> original(kI);
433*9356374aSAndroid Build Coastguard Worker   absl::StatusOr<double> copy(original);
434*9356374aSAndroid Build Coastguard Worker   EXPECT_THAT(copy.status(), IsOk());
435*9356374aSAndroid Build Coastguard Worker   EXPECT_DOUBLE_EQ(*original, *copy);
436*9356374aSAndroid Build Coastguard Worker }
437*9356374aSAndroid Build Coastguard Worker 
TEST(StatusOr,TestCopyCtorStatusNotOkConverting)438*9356374aSAndroid Build Coastguard Worker TEST(StatusOr, TestCopyCtorStatusNotOkConverting) {
439*9356374aSAndroid Build Coastguard Worker   absl::StatusOr<int> original(absl::CancelledError());
440*9356374aSAndroid Build Coastguard Worker   absl::StatusOr<double> copy(original);
441*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(copy.status(), original.status());
442*9356374aSAndroid Build Coastguard Worker }
443*9356374aSAndroid Build Coastguard Worker 
TEST(StatusOr,TestAssignmentStatusOk)444*9356374aSAndroid Build Coastguard Worker TEST(StatusOr, TestAssignmentStatusOk) {
445*9356374aSAndroid Build Coastguard Worker   // Copy assignmment
446*9356374aSAndroid Build Coastguard Worker   {
447*9356374aSAndroid Build Coastguard Worker     const auto p = std::make_shared<int>(17);
448*9356374aSAndroid Build Coastguard Worker     absl::StatusOr<std::shared_ptr<int>> source(p);
449*9356374aSAndroid Build Coastguard Worker 
450*9356374aSAndroid Build Coastguard Worker     absl::StatusOr<std::shared_ptr<int>> target;
451*9356374aSAndroid Build Coastguard Worker     target = source;
452*9356374aSAndroid Build Coastguard Worker 
453*9356374aSAndroid Build Coastguard Worker     ASSERT_TRUE(target.ok());
454*9356374aSAndroid Build Coastguard Worker     EXPECT_THAT(target.status(), IsOk());
455*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(p, *target);
456*9356374aSAndroid Build Coastguard Worker 
457*9356374aSAndroid Build Coastguard Worker     ASSERT_TRUE(source.ok());
458*9356374aSAndroid Build Coastguard Worker     EXPECT_THAT(source.status(), IsOk());
459*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(p, *source);
460*9356374aSAndroid Build Coastguard Worker   }
461*9356374aSAndroid Build Coastguard Worker 
462*9356374aSAndroid Build Coastguard Worker   // Move asssignment
463*9356374aSAndroid Build Coastguard Worker   {
464*9356374aSAndroid Build Coastguard Worker     const auto p = std::make_shared<int>(17);
465*9356374aSAndroid Build Coastguard Worker     absl::StatusOr<std::shared_ptr<int>> source(p);
466*9356374aSAndroid Build Coastguard Worker 
467*9356374aSAndroid Build Coastguard Worker     absl::StatusOr<std::shared_ptr<int>> target;
468*9356374aSAndroid Build Coastguard Worker     target = std::move(source);
469*9356374aSAndroid Build Coastguard Worker 
470*9356374aSAndroid Build Coastguard Worker     ASSERT_TRUE(target.ok());
471*9356374aSAndroid Build Coastguard Worker     EXPECT_THAT(target.status(), IsOk());
472*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(p, *target);
473*9356374aSAndroid Build Coastguard Worker 
474*9356374aSAndroid Build Coastguard Worker     ASSERT_TRUE(source.ok());
475*9356374aSAndroid Build Coastguard Worker     EXPECT_THAT(source.status(), IsOk());
476*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(nullptr, *source);
477*9356374aSAndroid Build Coastguard Worker   }
478*9356374aSAndroid Build Coastguard Worker }
479*9356374aSAndroid Build Coastguard Worker 
TEST(StatusOr,TestAssignmentStatusNotOk)480*9356374aSAndroid Build Coastguard Worker TEST(StatusOr, TestAssignmentStatusNotOk) {
481*9356374aSAndroid Build Coastguard Worker   // Copy assignment
482*9356374aSAndroid Build Coastguard Worker   {
483*9356374aSAndroid Build Coastguard Worker     const absl::Status expected = absl::CancelledError();
484*9356374aSAndroid Build Coastguard Worker     absl::StatusOr<int> source(expected);
485*9356374aSAndroid Build Coastguard Worker 
486*9356374aSAndroid Build Coastguard Worker     absl::StatusOr<int> target;
487*9356374aSAndroid Build Coastguard Worker     target = source;
488*9356374aSAndroid Build Coastguard Worker 
489*9356374aSAndroid Build Coastguard Worker     EXPECT_FALSE(target.ok());
490*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(expected, target.status());
491*9356374aSAndroid Build Coastguard Worker 
492*9356374aSAndroid Build Coastguard Worker     EXPECT_FALSE(source.ok());
493*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(expected, source.status());
494*9356374aSAndroid Build Coastguard Worker   }
495*9356374aSAndroid Build Coastguard Worker 
496*9356374aSAndroid Build Coastguard Worker   // Move assignment
497*9356374aSAndroid Build Coastguard Worker   {
498*9356374aSAndroid Build Coastguard Worker     const absl::Status expected = absl::CancelledError();
499*9356374aSAndroid Build Coastguard Worker     absl::StatusOr<int> source(expected);
500*9356374aSAndroid Build Coastguard Worker 
501*9356374aSAndroid Build Coastguard Worker     absl::StatusOr<int> target;
502*9356374aSAndroid Build Coastguard Worker     target = std::move(source);
503*9356374aSAndroid Build Coastguard Worker 
504*9356374aSAndroid Build Coastguard Worker     EXPECT_FALSE(target.ok());
505*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(expected, target.status());
506*9356374aSAndroid Build Coastguard Worker 
507*9356374aSAndroid Build Coastguard Worker     EXPECT_FALSE(source.ok());
508*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(source.status().code(), absl::StatusCode::kInternal);
509*9356374aSAndroid Build Coastguard Worker   }
510*9356374aSAndroid Build Coastguard Worker }
511*9356374aSAndroid Build Coastguard Worker 
TEST(StatusOr,TestAssignmentStatusOKConverting)512*9356374aSAndroid Build Coastguard Worker TEST(StatusOr, TestAssignmentStatusOKConverting) {
513*9356374aSAndroid Build Coastguard Worker   // Copy assignment
514*9356374aSAndroid Build Coastguard Worker   {
515*9356374aSAndroid Build Coastguard Worker     const int kI = 4;
516*9356374aSAndroid Build Coastguard Worker     absl::StatusOr<int> source(kI);
517*9356374aSAndroid Build Coastguard Worker 
518*9356374aSAndroid Build Coastguard Worker     absl::StatusOr<double> target;
519*9356374aSAndroid Build Coastguard Worker     target = source;
520*9356374aSAndroid Build Coastguard Worker 
521*9356374aSAndroid Build Coastguard Worker     ASSERT_TRUE(target.ok());
522*9356374aSAndroid Build Coastguard Worker     EXPECT_THAT(target.status(), IsOk());
523*9356374aSAndroid Build Coastguard Worker     EXPECT_DOUBLE_EQ(kI, *target);
524*9356374aSAndroid Build Coastguard Worker 
525*9356374aSAndroid Build Coastguard Worker     ASSERT_TRUE(source.ok());
526*9356374aSAndroid Build Coastguard Worker     EXPECT_THAT(source.status(), IsOk());
527*9356374aSAndroid Build Coastguard Worker     EXPECT_DOUBLE_EQ(kI, *source);
528*9356374aSAndroid Build Coastguard Worker   }
529*9356374aSAndroid Build Coastguard Worker 
530*9356374aSAndroid Build Coastguard Worker   // Move assignment
531*9356374aSAndroid Build Coastguard Worker   {
532*9356374aSAndroid Build Coastguard Worker     const auto p = new int(17);
533*9356374aSAndroid Build Coastguard Worker     absl::StatusOr<std::unique_ptr<int>> source(absl::WrapUnique(p));
534*9356374aSAndroid Build Coastguard Worker 
535*9356374aSAndroid Build Coastguard Worker     absl::StatusOr<std::shared_ptr<int>> target;
536*9356374aSAndroid Build Coastguard Worker     target = std::move(source);
537*9356374aSAndroid Build Coastguard Worker 
538*9356374aSAndroid Build Coastguard Worker     ASSERT_TRUE(target.ok());
539*9356374aSAndroid Build Coastguard Worker     EXPECT_THAT(target.status(), IsOk());
540*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(p, target->get());
541*9356374aSAndroid Build Coastguard Worker 
542*9356374aSAndroid Build Coastguard Worker     ASSERT_TRUE(source.ok());
543*9356374aSAndroid Build Coastguard Worker     EXPECT_THAT(source.status(), IsOk());
544*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(nullptr, source->get());
545*9356374aSAndroid Build Coastguard Worker   }
546*9356374aSAndroid Build Coastguard Worker }
547*9356374aSAndroid Build Coastguard Worker 
548*9356374aSAndroid Build Coastguard Worker struct A {
549*9356374aSAndroid Build Coastguard Worker   int x;
550*9356374aSAndroid Build Coastguard Worker };
551*9356374aSAndroid Build Coastguard Worker 
552*9356374aSAndroid Build Coastguard Worker struct ImplicitConstructibleFromA {
553*9356374aSAndroid Build Coastguard Worker   int x;
554*9356374aSAndroid Build Coastguard Worker   bool moved;
ImplicitConstructibleFromA__anonfda0c6120111::ImplicitConstructibleFromA555*9356374aSAndroid Build Coastguard Worker   ImplicitConstructibleFromA(const A& a)  // NOLINT
556*9356374aSAndroid Build Coastguard Worker       : x(a.x), moved(false) {}
ImplicitConstructibleFromA__anonfda0c6120111::ImplicitConstructibleFromA557*9356374aSAndroid Build Coastguard Worker   ImplicitConstructibleFromA(A&& a)  // NOLINT
558*9356374aSAndroid Build Coastguard Worker       : x(a.x), moved(true) {}
559*9356374aSAndroid Build Coastguard Worker };
560*9356374aSAndroid Build Coastguard Worker 
TEST(StatusOr,ImplicitConvertingConstructor)561*9356374aSAndroid Build Coastguard Worker TEST(StatusOr, ImplicitConvertingConstructor) {
562*9356374aSAndroid Build Coastguard Worker   EXPECT_THAT(
563*9356374aSAndroid Build Coastguard Worker       absl::implicit_cast<absl::StatusOr<ImplicitConstructibleFromA>>(
564*9356374aSAndroid Build Coastguard Worker           absl::StatusOr<A>(A{11})),
565*9356374aSAndroid Build Coastguard Worker       IsOkAndHolds(AllOf(Field(&ImplicitConstructibleFromA::x, 11),
566*9356374aSAndroid Build Coastguard Worker                          Field(&ImplicitConstructibleFromA::moved, true))));
567*9356374aSAndroid Build Coastguard Worker   absl::StatusOr<A> a(A{12});
568*9356374aSAndroid Build Coastguard Worker   EXPECT_THAT(
569*9356374aSAndroid Build Coastguard Worker       absl::implicit_cast<absl::StatusOr<ImplicitConstructibleFromA>>(a),
570*9356374aSAndroid Build Coastguard Worker       IsOkAndHolds(AllOf(Field(&ImplicitConstructibleFromA::x, 12),
571*9356374aSAndroid Build Coastguard Worker                          Field(&ImplicitConstructibleFromA::moved, false))));
572*9356374aSAndroid Build Coastguard Worker }
573*9356374aSAndroid Build Coastguard Worker 
574*9356374aSAndroid Build Coastguard Worker struct ExplicitConstructibleFromA {
575*9356374aSAndroid Build Coastguard Worker   int x;
576*9356374aSAndroid Build Coastguard Worker   bool moved;
ExplicitConstructibleFromA__anonfda0c6120111::ExplicitConstructibleFromA577*9356374aSAndroid Build Coastguard Worker   explicit ExplicitConstructibleFromA(const A& a) : x(a.x), moved(false) {}
ExplicitConstructibleFromA__anonfda0c6120111::ExplicitConstructibleFromA578*9356374aSAndroid Build Coastguard Worker   explicit ExplicitConstructibleFromA(A&& a) : x(a.x), moved(true) {}
579*9356374aSAndroid Build Coastguard Worker };
580*9356374aSAndroid Build Coastguard Worker 
TEST(StatusOr,ExplicitConvertingConstructor)581*9356374aSAndroid Build Coastguard Worker TEST(StatusOr, ExplicitConvertingConstructor) {
582*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(
583*9356374aSAndroid Build Coastguard Worker       (std::is_convertible<const absl::StatusOr<A>&,
584*9356374aSAndroid Build Coastguard Worker                            absl::StatusOr<ExplicitConstructibleFromA>>::value));
585*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(
586*9356374aSAndroid Build Coastguard Worker       (std::is_convertible<absl::StatusOr<A>&&,
587*9356374aSAndroid Build Coastguard Worker                            absl::StatusOr<ExplicitConstructibleFromA>>::value));
588*9356374aSAndroid Build Coastguard Worker   EXPECT_THAT(
589*9356374aSAndroid Build Coastguard Worker       absl::StatusOr<ExplicitConstructibleFromA>(absl::StatusOr<A>(A{11})),
590*9356374aSAndroid Build Coastguard Worker       IsOkAndHolds(AllOf(Field(&ExplicitConstructibleFromA::x, 11),
591*9356374aSAndroid Build Coastguard Worker                          Field(&ExplicitConstructibleFromA::moved, true))));
592*9356374aSAndroid Build Coastguard Worker   absl::StatusOr<A> a(A{12});
593*9356374aSAndroid Build Coastguard Worker   EXPECT_THAT(
594*9356374aSAndroid Build Coastguard Worker       absl::StatusOr<ExplicitConstructibleFromA>(a),
595*9356374aSAndroid Build Coastguard Worker       IsOkAndHolds(AllOf(Field(&ExplicitConstructibleFromA::x, 12),
596*9356374aSAndroid Build Coastguard Worker                          Field(&ExplicitConstructibleFromA::moved, false))));
597*9356374aSAndroid Build Coastguard Worker }
598*9356374aSAndroid Build Coastguard Worker 
599*9356374aSAndroid Build Coastguard Worker struct ImplicitConstructibleFromBool {
ImplicitConstructibleFromBool__anonfda0c6120111::ImplicitConstructibleFromBool600*9356374aSAndroid Build Coastguard Worker   ImplicitConstructibleFromBool(bool y) : x(y) {}  // NOLINT
601*9356374aSAndroid Build Coastguard Worker   bool x = false;
602*9356374aSAndroid Build Coastguard Worker };
603*9356374aSAndroid Build Coastguard Worker 
604*9356374aSAndroid Build Coastguard Worker struct ConvertibleToBool {
ConvertibleToBool__anonfda0c6120111::ConvertibleToBool605*9356374aSAndroid Build Coastguard Worker   explicit ConvertibleToBool(bool y) : x(y) {}
operator bool__anonfda0c6120111::ConvertibleToBool606*9356374aSAndroid Build Coastguard Worker   operator bool() const { return x; }  // NOLINT
607*9356374aSAndroid Build Coastguard Worker   bool x = false;
608*9356374aSAndroid Build Coastguard Worker };
609*9356374aSAndroid Build Coastguard Worker 
TEST(StatusOr,ImplicitBooleanConstructionWithImplicitCasts)610*9356374aSAndroid Build Coastguard Worker TEST(StatusOr, ImplicitBooleanConstructionWithImplicitCasts) {
611*9356374aSAndroid Build Coastguard Worker   EXPECT_THAT(absl::StatusOr<bool>(absl::StatusOr<ConvertibleToBool>(true)),
612*9356374aSAndroid Build Coastguard Worker               IsOkAndHolds(true));
613*9356374aSAndroid Build Coastguard Worker   EXPECT_THAT(absl::StatusOr<bool>(absl::StatusOr<ConvertibleToBool>(false)),
614*9356374aSAndroid Build Coastguard Worker               IsOkAndHolds(false));
615*9356374aSAndroid Build Coastguard Worker   EXPECT_THAT(
616*9356374aSAndroid Build Coastguard Worker       absl::implicit_cast<absl::StatusOr<ImplicitConstructibleFromBool>>(
617*9356374aSAndroid Build Coastguard Worker           absl::StatusOr<bool>(false)),
618*9356374aSAndroid Build Coastguard Worker       IsOkAndHolds(Field(&ImplicitConstructibleFromBool::x, false)));
619*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE((std::is_convertible<
620*9356374aSAndroid Build Coastguard Worker                 absl::StatusOr<ConvertibleToBool>,
621*9356374aSAndroid Build Coastguard Worker                 absl::StatusOr<ImplicitConstructibleFromBool>>::value));
622*9356374aSAndroid Build Coastguard Worker }
623*9356374aSAndroid Build Coastguard Worker 
TEST(StatusOr,BooleanConstructionWithImplicitCasts)624*9356374aSAndroid Build Coastguard Worker TEST(StatusOr, BooleanConstructionWithImplicitCasts) {
625*9356374aSAndroid Build Coastguard Worker   EXPECT_THAT(absl::StatusOr<bool>(absl::StatusOr<ConvertibleToBool>(true)),
626*9356374aSAndroid Build Coastguard Worker               IsOkAndHolds(true));
627*9356374aSAndroid Build Coastguard Worker   EXPECT_THAT(absl::StatusOr<bool>(absl::StatusOr<ConvertibleToBool>(false)),
628*9356374aSAndroid Build Coastguard Worker               IsOkAndHolds(false));
629*9356374aSAndroid Build Coastguard Worker   EXPECT_THAT(
630*9356374aSAndroid Build Coastguard Worker       absl::StatusOr<ImplicitConstructibleFromBool>{
631*9356374aSAndroid Build Coastguard Worker           absl::StatusOr<bool>(false)},
632*9356374aSAndroid Build Coastguard Worker       IsOkAndHolds(Field(&ImplicitConstructibleFromBool::x, false)));
633*9356374aSAndroid Build Coastguard Worker   EXPECT_THAT(
634*9356374aSAndroid Build Coastguard Worker       absl::StatusOr<ImplicitConstructibleFromBool>{
635*9356374aSAndroid Build Coastguard Worker           absl::StatusOr<bool>(absl::InvalidArgumentError(""))},
636*9356374aSAndroid Build Coastguard Worker       Not(IsOk()));
637*9356374aSAndroid Build Coastguard Worker 
638*9356374aSAndroid Build Coastguard Worker   EXPECT_THAT(
639*9356374aSAndroid Build Coastguard Worker       absl::StatusOr<ImplicitConstructibleFromBool>{
640*9356374aSAndroid Build Coastguard Worker           absl::StatusOr<ConvertibleToBool>(ConvertibleToBool{false})},
641*9356374aSAndroid Build Coastguard Worker       IsOkAndHolds(Field(&ImplicitConstructibleFromBool::x, false)));
642*9356374aSAndroid Build Coastguard Worker   EXPECT_THAT(
643*9356374aSAndroid Build Coastguard Worker       absl::StatusOr<ImplicitConstructibleFromBool>{
644*9356374aSAndroid Build Coastguard Worker           absl::StatusOr<ConvertibleToBool>(absl::InvalidArgumentError(""))},
645*9356374aSAndroid Build Coastguard Worker       Not(IsOk()));
646*9356374aSAndroid Build Coastguard Worker }
647*9356374aSAndroid Build Coastguard Worker 
TEST(StatusOr,ConstImplicitCast)648*9356374aSAndroid Build Coastguard Worker TEST(StatusOr, ConstImplicitCast) {
649*9356374aSAndroid Build Coastguard Worker   EXPECT_THAT(absl::implicit_cast<absl::StatusOr<bool>>(
650*9356374aSAndroid Build Coastguard Worker                   absl::StatusOr<const bool>(true)),
651*9356374aSAndroid Build Coastguard Worker               IsOkAndHolds(true));
652*9356374aSAndroid Build Coastguard Worker   EXPECT_THAT(absl::implicit_cast<absl::StatusOr<bool>>(
653*9356374aSAndroid Build Coastguard Worker                   absl::StatusOr<const bool>(false)),
654*9356374aSAndroid Build Coastguard Worker               IsOkAndHolds(false));
655*9356374aSAndroid Build Coastguard Worker   EXPECT_THAT(absl::implicit_cast<absl::StatusOr<const bool>>(
656*9356374aSAndroid Build Coastguard Worker                   absl::StatusOr<bool>(true)),
657*9356374aSAndroid Build Coastguard Worker               IsOkAndHolds(true));
658*9356374aSAndroid Build Coastguard Worker   EXPECT_THAT(absl::implicit_cast<absl::StatusOr<const bool>>(
659*9356374aSAndroid Build Coastguard Worker                   absl::StatusOr<bool>(false)),
660*9356374aSAndroid Build Coastguard Worker               IsOkAndHolds(false));
661*9356374aSAndroid Build Coastguard Worker   EXPECT_THAT(absl::implicit_cast<absl::StatusOr<const std::string>>(
662*9356374aSAndroid Build Coastguard Worker                   absl::StatusOr<std::string>("foo")),
663*9356374aSAndroid Build Coastguard Worker               IsOkAndHolds("foo"));
664*9356374aSAndroid Build Coastguard Worker   EXPECT_THAT(absl::implicit_cast<absl::StatusOr<std::string>>(
665*9356374aSAndroid Build Coastguard Worker                   absl::StatusOr<const std::string>("foo")),
666*9356374aSAndroid Build Coastguard Worker               IsOkAndHolds("foo"));
667*9356374aSAndroid Build Coastguard Worker   EXPECT_THAT(
668*9356374aSAndroid Build Coastguard Worker       absl::implicit_cast<absl::StatusOr<std::shared_ptr<const std::string>>>(
669*9356374aSAndroid Build Coastguard Worker           absl::StatusOr<std::shared_ptr<std::string>>(
670*9356374aSAndroid Build Coastguard Worker               std::make_shared<std::string>("foo"))),
671*9356374aSAndroid Build Coastguard Worker       IsOkAndHolds(Pointee(std::string("foo"))));
672*9356374aSAndroid Build Coastguard Worker }
673*9356374aSAndroid Build Coastguard Worker 
TEST(StatusOr,ConstExplicitConstruction)674*9356374aSAndroid Build Coastguard Worker TEST(StatusOr, ConstExplicitConstruction) {
675*9356374aSAndroid Build Coastguard Worker   EXPECT_THAT(absl::StatusOr<bool>(absl::StatusOr<const bool>(true)),
676*9356374aSAndroid Build Coastguard Worker               IsOkAndHolds(true));
677*9356374aSAndroid Build Coastguard Worker   EXPECT_THAT(absl::StatusOr<bool>(absl::StatusOr<const bool>(false)),
678*9356374aSAndroid Build Coastguard Worker               IsOkAndHolds(false));
679*9356374aSAndroid Build Coastguard Worker   EXPECT_THAT(absl::StatusOr<const bool>(absl::StatusOr<bool>(true)),
680*9356374aSAndroid Build Coastguard Worker               IsOkAndHolds(true));
681*9356374aSAndroid Build Coastguard Worker   EXPECT_THAT(absl::StatusOr<const bool>(absl::StatusOr<bool>(false)),
682*9356374aSAndroid Build Coastguard Worker               IsOkAndHolds(false));
683*9356374aSAndroid Build Coastguard Worker }
684*9356374aSAndroid Build Coastguard Worker 
685*9356374aSAndroid Build Coastguard Worker struct ExplicitConstructibleFromInt {
686*9356374aSAndroid Build Coastguard Worker   int x;
ExplicitConstructibleFromInt__anonfda0c6120111::ExplicitConstructibleFromInt687*9356374aSAndroid Build Coastguard Worker   explicit ExplicitConstructibleFromInt(int y) : x(y) {}
688*9356374aSAndroid Build Coastguard Worker };
689*9356374aSAndroid Build Coastguard Worker 
TEST(StatusOr,ExplicitConstruction)690*9356374aSAndroid Build Coastguard Worker TEST(StatusOr, ExplicitConstruction) {
691*9356374aSAndroid Build Coastguard Worker   EXPECT_THAT(absl::StatusOr<ExplicitConstructibleFromInt>(10),
692*9356374aSAndroid Build Coastguard Worker               IsOkAndHolds(Field(&ExplicitConstructibleFromInt::x, 10)));
693*9356374aSAndroid Build Coastguard Worker }
694*9356374aSAndroid Build Coastguard Worker 
TEST(StatusOr,ImplicitConstruction)695*9356374aSAndroid Build Coastguard Worker TEST(StatusOr, ImplicitConstruction) {
696*9356374aSAndroid Build Coastguard Worker   // Check implicit casting works.
697*9356374aSAndroid Build Coastguard Worker   auto status_or =
698*9356374aSAndroid Build Coastguard Worker       absl::implicit_cast<absl::StatusOr<absl::variant<int, std::string>>>(10);
699*9356374aSAndroid Build Coastguard Worker   EXPECT_THAT(status_or, IsOkAndHolds(VariantWith<int>(10)));
700*9356374aSAndroid Build Coastguard Worker }
701*9356374aSAndroid Build Coastguard Worker 
TEST(StatusOr,ImplicitConstructionFromInitliazerList)702*9356374aSAndroid Build Coastguard Worker TEST(StatusOr, ImplicitConstructionFromInitliazerList) {
703*9356374aSAndroid Build Coastguard Worker   // Note: dropping the explicit std::initializer_list<int> is not supported
704*9356374aSAndroid Build Coastguard Worker   // by absl::StatusOr or absl::optional.
705*9356374aSAndroid Build Coastguard Worker   auto status_or =
706*9356374aSAndroid Build Coastguard Worker       absl::implicit_cast<absl::StatusOr<std::vector<int>>>({{10, 20, 30}});
707*9356374aSAndroid Build Coastguard Worker   EXPECT_THAT(status_or, IsOkAndHolds(ElementsAre(10, 20, 30)));
708*9356374aSAndroid Build Coastguard Worker }
709*9356374aSAndroid Build Coastguard Worker 
TEST(StatusOr,UniquePtrImplicitConstruction)710*9356374aSAndroid Build Coastguard Worker TEST(StatusOr, UniquePtrImplicitConstruction) {
711*9356374aSAndroid Build Coastguard Worker   auto status_or = absl::implicit_cast<absl::StatusOr<std::unique_ptr<Base1>>>(
712*9356374aSAndroid Build Coastguard Worker       absl::make_unique<Derived>());
713*9356374aSAndroid Build Coastguard Worker   EXPECT_THAT(status_or, IsOkAndHolds(Ne(nullptr)));
714*9356374aSAndroid Build Coastguard Worker }
715*9356374aSAndroid Build Coastguard Worker 
TEST(StatusOr,NestedStatusOrCopyAndMoveConstructorTests)716*9356374aSAndroid Build Coastguard Worker TEST(StatusOr, NestedStatusOrCopyAndMoveConstructorTests) {
717*9356374aSAndroid Build Coastguard Worker   absl::StatusOr<absl::StatusOr<CopyDetector>> status_or = CopyDetector(10);
718*9356374aSAndroid Build Coastguard Worker   absl::StatusOr<absl::StatusOr<CopyDetector>> status_error =
719*9356374aSAndroid Build Coastguard Worker       absl::InvalidArgumentError("foo");
720*9356374aSAndroid Build Coastguard Worker   EXPECT_THAT(status_or,
721*9356374aSAndroid Build Coastguard Worker               IsOkAndHolds(IsOkAndHolds(CopyDetectorHas(10, true, false))));
722*9356374aSAndroid Build Coastguard Worker   absl::StatusOr<absl::StatusOr<CopyDetector>> a = status_or;
723*9356374aSAndroid Build Coastguard Worker   EXPECT_THAT(a, IsOkAndHolds(IsOkAndHolds(CopyDetectorHas(10, false, true))));
724*9356374aSAndroid Build Coastguard Worker   absl::StatusOr<absl::StatusOr<CopyDetector>> a_err = status_error;
725*9356374aSAndroid Build Coastguard Worker   EXPECT_THAT(a_err, Not(IsOk()));
726*9356374aSAndroid Build Coastguard Worker 
727*9356374aSAndroid Build Coastguard Worker   const absl::StatusOr<absl::StatusOr<CopyDetector>>& cref = status_or;
728*9356374aSAndroid Build Coastguard Worker   absl::StatusOr<absl::StatusOr<CopyDetector>> b = cref;  // NOLINT
729*9356374aSAndroid Build Coastguard Worker   EXPECT_THAT(b, IsOkAndHolds(IsOkAndHolds(CopyDetectorHas(10, false, true))));
730*9356374aSAndroid Build Coastguard Worker   const absl::StatusOr<absl::StatusOr<CopyDetector>>& cref_err = status_error;
731*9356374aSAndroid Build Coastguard Worker   absl::StatusOr<absl::StatusOr<CopyDetector>> b_err = cref_err;  // NOLINT
732*9356374aSAndroid Build Coastguard Worker   EXPECT_THAT(b_err, Not(IsOk()));
733*9356374aSAndroid Build Coastguard Worker 
734*9356374aSAndroid Build Coastguard Worker   absl::StatusOr<absl::StatusOr<CopyDetector>> c = std::move(status_or);
735*9356374aSAndroid Build Coastguard Worker   EXPECT_THAT(c, IsOkAndHolds(IsOkAndHolds(CopyDetectorHas(10, true, false))));
736*9356374aSAndroid Build Coastguard Worker   absl::StatusOr<absl::StatusOr<CopyDetector>> c_err = std::move(status_error);
737*9356374aSAndroid Build Coastguard Worker   EXPECT_THAT(c_err, Not(IsOk()));
738*9356374aSAndroid Build Coastguard Worker }
739*9356374aSAndroid Build Coastguard Worker 
TEST(StatusOr,NestedStatusOrCopyAndMoveAssignment)740*9356374aSAndroid Build Coastguard Worker TEST(StatusOr, NestedStatusOrCopyAndMoveAssignment) {
741*9356374aSAndroid Build Coastguard Worker   absl::StatusOr<absl::StatusOr<CopyDetector>> status_or = CopyDetector(10);
742*9356374aSAndroid Build Coastguard Worker   absl::StatusOr<absl::StatusOr<CopyDetector>> status_error =
743*9356374aSAndroid Build Coastguard Worker       absl::InvalidArgumentError("foo");
744*9356374aSAndroid Build Coastguard Worker   absl::StatusOr<absl::StatusOr<CopyDetector>> a;
745*9356374aSAndroid Build Coastguard Worker   a = status_or;
746*9356374aSAndroid Build Coastguard Worker   EXPECT_THAT(a, IsOkAndHolds(IsOkAndHolds(CopyDetectorHas(10, false, true))));
747*9356374aSAndroid Build Coastguard Worker   a = status_error;
748*9356374aSAndroid Build Coastguard Worker   EXPECT_THAT(a, Not(IsOk()));
749*9356374aSAndroid Build Coastguard Worker 
750*9356374aSAndroid Build Coastguard Worker   const absl::StatusOr<absl::StatusOr<CopyDetector>>& cref = status_or;
751*9356374aSAndroid Build Coastguard Worker   a = cref;
752*9356374aSAndroid Build Coastguard Worker   EXPECT_THAT(a, IsOkAndHolds(IsOkAndHolds(CopyDetectorHas(10, false, true))));
753*9356374aSAndroid Build Coastguard Worker   const absl::StatusOr<absl::StatusOr<CopyDetector>>& cref_err = status_error;
754*9356374aSAndroid Build Coastguard Worker   a = cref_err;
755*9356374aSAndroid Build Coastguard Worker   EXPECT_THAT(a, Not(IsOk()));
756*9356374aSAndroid Build Coastguard Worker   a = std::move(status_or);
757*9356374aSAndroid Build Coastguard Worker   EXPECT_THAT(a, IsOkAndHolds(IsOkAndHolds(CopyDetectorHas(10, true, false))));
758*9356374aSAndroid Build Coastguard Worker   a = std::move(status_error);
759*9356374aSAndroid Build Coastguard Worker   EXPECT_THAT(a, Not(IsOk()));
760*9356374aSAndroid Build Coastguard Worker }
761*9356374aSAndroid Build Coastguard Worker 
762*9356374aSAndroid Build Coastguard Worker struct Copyable {
Copyable__anonfda0c6120111::Copyable763*9356374aSAndroid Build Coastguard Worker   Copyable() {}
Copyable__anonfda0c6120111::Copyable764*9356374aSAndroid Build Coastguard Worker   Copyable(const Copyable&) {}
operator =__anonfda0c6120111::Copyable765*9356374aSAndroid Build Coastguard Worker   Copyable& operator=(const Copyable&) { return *this; }
766*9356374aSAndroid Build Coastguard Worker };
767*9356374aSAndroid Build Coastguard Worker 
768*9356374aSAndroid Build Coastguard Worker struct MoveOnly {
MoveOnly__anonfda0c6120111::MoveOnly769*9356374aSAndroid Build Coastguard Worker   MoveOnly() {}
MoveOnly__anonfda0c6120111::MoveOnly770*9356374aSAndroid Build Coastguard Worker   MoveOnly(MoveOnly&&) {}
operator =__anonfda0c6120111::MoveOnly771*9356374aSAndroid Build Coastguard Worker   MoveOnly& operator=(MoveOnly&&) { return *this; }
772*9356374aSAndroid Build Coastguard Worker };
773*9356374aSAndroid Build Coastguard Worker 
774*9356374aSAndroid Build Coastguard Worker struct NonMovable {
NonMovable__anonfda0c6120111::NonMovable775*9356374aSAndroid Build Coastguard Worker   NonMovable() {}
776*9356374aSAndroid Build Coastguard Worker   NonMovable(const NonMovable&) = delete;
777*9356374aSAndroid Build Coastguard Worker   NonMovable(NonMovable&&) = delete;
778*9356374aSAndroid Build Coastguard Worker   NonMovable& operator=(const NonMovable&) = delete;
779*9356374aSAndroid Build Coastguard Worker   NonMovable& operator=(NonMovable&&) = delete;
780*9356374aSAndroid Build Coastguard Worker };
781*9356374aSAndroid Build Coastguard Worker 
TEST(StatusOr,CopyAndMoveAbility)782*9356374aSAndroid Build Coastguard Worker TEST(StatusOr, CopyAndMoveAbility) {
783*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(std::is_copy_constructible<Copyable>::value);
784*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(std::is_copy_assignable<Copyable>::value);
785*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(std::is_move_constructible<Copyable>::value);
786*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(std::is_move_assignable<Copyable>::value);
787*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(std::is_copy_constructible<MoveOnly>::value);
788*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(std::is_copy_assignable<MoveOnly>::value);
789*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(std::is_move_constructible<MoveOnly>::value);
790*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(std::is_move_assignable<MoveOnly>::value);
791*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(std::is_copy_constructible<NonMovable>::value);
792*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(std::is_copy_assignable<NonMovable>::value);
793*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(std::is_move_constructible<NonMovable>::value);
794*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(std::is_move_assignable<NonMovable>::value);
795*9356374aSAndroid Build Coastguard Worker }
796*9356374aSAndroid Build Coastguard Worker 
TEST(StatusOr,StatusOrAnyCopyAndMoveConstructorTests)797*9356374aSAndroid Build Coastguard Worker TEST(StatusOr, StatusOrAnyCopyAndMoveConstructorTests) {
798*9356374aSAndroid Build Coastguard Worker   absl::StatusOr<absl::any> status_or = CopyDetector(10);
799*9356374aSAndroid Build Coastguard Worker   absl::StatusOr<absl::any> status_error = absl::InvalidArgumentError("foo");
800*9356374aSAndroid Build Coastguard Worker   EXPECT_THAT(
801*9356374aSAndroid Build Coastguard Worker       status_or,
802*9356374aSAndroid Build Coastguard Worker       IsOkAndHolds(AnyWith<CopyDetector>(CopyDetectorHas(10, true, false))));
803*9356374aSAndroid Build Coastguard Worker   absl::StatusOr<absl::any> a = status_or;
804*9356374aSAndroid Build Coastguard Worker   EXPECT_THAT(
805*9356374aSAndroid Build Coastguard Worker       a, IsOkAndHolds(AnyWith<CopyDetector>(CopyDetectorHas(10, false, true))));
806*9356374aSAndroid Build Coastguard Worker   absl::StatusOr<absl::any> a_err = status_error;
807*9356374aSAndroid Build Coastguard Worker   EXPECT_THAT(a_err, Not(IsOk()));
808*9356374aSAndroid Build Coastguard Worker 
809*9356374aSAndroid Build Coastguard Worker   const absl::StatusOr<absl::any>& cref = status_or;
810*9356374aSAndroid Build Coastguard Worker   // No lint for no-change copy.
811*9356374aSAndroid Build Coastguard Worker   absl::StatusOr<absl::any> b = cref;  // NOLINT
812*9356374aSAndroid Build Coastguard Worker   EXPECT_THAT(
813*9356374aSAndroid Build Coastguard Worker       b, IsOkAndHolds(AnyWith<CopyDetector>(CopyDetectorHas(10, false, true))));
814*9356374aSAndroid Build Coastguard Worker   const absl::StatusOr<absl::any>& cref_err = status_error;
815*9356374aSAndroid Build Coastguard Worker   // No lint for no-change copy.
816*9356374aSAndroid Build Coastguard Worker   absl::StatusOr<absl::any> b_err = cref_err;  // NOLINT
817*9356374aSAndroid Build Coastguard Worker   EXPECT_THAT(b_err, Not(IsOk()));
818*9356374aSAndroid Build Coastguard Worker 
819*9356374aSAndroid Build Coastguard Worker   absl::StatusOr<absl::any> c = std::move(status_or);
820*9356374aSAndroid Build Coastguard Worker   EXPECT_THAT(
821*9356374aSAndroid Build Coastguard Worker       c, IsOkAndHolds(AnyWith<CopyDetector>(CopyDetectorHas(10, true, false))));
822*9356374aSAndroid Build Coastguard Worker   absl::StatusOr<absl::any> c_err = std::move(status_error);
823*9356374aSAndroid Build Coastguard Worker   EXPECT_THAT(c_err, Not(IsOk()));
824*9356374aSAndroid Build Coastguard Worker }
825*9356374aSAndroid Build Coastguard Worker 
TEST(StatusOr,StatusOrAnyCopyAndMoveAssignment)826*9356374aSAndroid Build Coastguard Worker TEST(StatusOr, StatusOrAnyCopyAndMoveAssignment) {
827*9356374aSAndroid Build Coastguard Worker   absl::StatusOr<absl::any> status_or = CopyDetector(10);
828*9356374aSAndroid Build Coastguard Worker   absl::StatusOr<absl::any> status_error = absl::InvalidArgumentError("foo");
829*9356374aSAndroid Build Coastguard Worker   absl::StatusOr<absl::any> a;
830*9356374aSAndroid Build Coastguard Worker   a = status_or;
831*9356374aSAndroid Build Coastguard Worker   EXPECT_THAT(
832*9356374aSAndroid Build Coastguard Worker       a, IsOkAndHolds(AnyWith<CopyDetector>(CopyDetectorHas(10, false, true))));
833*9356374aSAndroid Build Coastguard Worker   a = status_error;
834*9356374aSAndroid Build Coastguard Worker   EXPECT_THAT(a, Not(IsOk()));
835*9356374aSAndroid Build Coastguard Worker 
836*9356374aSAndroid Build Coastguard Worker   const absl::StatusOr<absl::any>& cref = status_or;
837*9356374aSAndroid Build Coastguard Worker   a = cref;
838*9356374aSAndroid Build Coastguard Worker   EXPECT_THAT(
839*9356374aSAndroid Build Coastguard Worker       a, IsOkAndHolds(AnyWith<CopyDetector>(CopyDetectorHas(10, false, true))));
840*9356374aSAndroid Build Coastguard Worker   const absl::StatusOr<absl::any>& cref_err = status_error;
841*9356374aSAndroid Build Coastguard Worker   a = cref_err;
842*9356374aSAndroid Build Coastguard Worker   EXPECT_THAT(a, Not(IsOk()));
843*9356374aSAndroid Build Coastguard Worker   a = std::move(status_or);
844*9356374aSAndroid Build Coastguard Worker   EXPECT_THAT(
845*9356374aSAndroid Build Coastguard Worker       a, IsOkAndHolds(AnyWith<CopyDetector>(CopyDetectorHas(10, true, false))));
846*9356374aSAndroid Build Coastguard Worker   a = std::move(status_error);
847*9356374aSAndroid Build Coastguard Worker   EXPECT_THAT(a, Not(IsOk()));
848*9356374aSAndroid Build Coastguard Worker }
849*9356374aSAndroid Build Coastguard Worker 
TEST(StatusOr,StatusOrCopyAndMoveTestsConstructor)850*9356374aSAndroid Build Coastguard Worker TEST(StatusOr, StatusOrCopyAndMoveTestsConstructor) {
851*9356374aSAndroid Build Coastguard Worker   absl::StatusOr<CopyDetector> status_or(10);
852*9356374aSAndroid Build Coastguard Worker   ASSERT_THAT(status_or, IsOkAndHolds(CopyDetectorHas(10, false, false)));
853*9356374aSAndroid Build Coastguard Worker   absl::StatusOr<CopyDetector> a(status_or);
854*9356374aSAndroid Build Coastguard Worker   EXPECT_THAT(a, IsOkAndHolds(CopyDetectorHas(10, false, true)));
855*9356374aSAndroid Build Coastguard Worker   const absl::StatusOr<CopyDetector>& cref = status_or;
856*9356374aSAndroid Build Coastguard Worker   absl::StatusOr<CopyDetector> b(cref);  // NOLINT
857*9356374aSAndroid Build Coastguard Worker   EXPECT_THAT(b, IsOkAndHolds(CopyDetectorHas(10, false, true)));
858*9356374aSAndroid Build Coastguard Worker   absl::StatusOr<CopyDetector> c(std::move(status_or));
859*9356374aSAndroid Build Coastguard Worker   EXPECT_THAT(c, IsOkAndHolds(CopyDetectorHas(10, true, false)));
860*9356374aSAndroid Build Coastguard Worker }
861*9356374aSAndroid Build Coastguard Worker 
TEST(StatusOr,StatusOrCopyAndMoveTestsAssignment)862*9356374aSAndroid Build Coastguard Worker TEST(StatusOr, StatusOrCopyAndMoveTestsAssignment) {
863*9356374aSAndroid Build Coastguard Worker   absl::StatusOr<CopyDetector> status_or(10);
864*9356374aSAndroid Build Coastguard Worker   ASSERT_THAT(status_or, IsOkAndHolds(CopyDetectorHas(10, false, false)));
865*9356374aSAndroid Build Coastguard Worker   absl::StatusOr<CopyDetector> a;
866*9356374aSAndroid Build Coastguard Worker   a = status_or;
867*9356374aSAndroid Build Coastguard Worker   EXPECT_THAT(a, IsOkAndHolds(CopyDetectorHas(10, false, true)));
868*9356374aSAndroid Build Coastguard Worker   const absl::StatusOr<CopyDetector>& cref = status_or;
869*9356374aSAndroid Build Coastguard Worker   absl::StatusOr<CopyDetector> b;
870*9356374aSAndroid Build Coastguard Worker   b = cref;
871*9356374aSAndroid Build Coastguard Worker   EXPECT_THAT(b, IsOkAndHolds(CopyDetectorHas(10, false, true)));
872*9356374aSAndroid Build Coastguard Worker   absl::StatusOr<CopyDetector> c;
873*9356374aSAndroid Build Coastguard Worker   c = std::move(status_or);
874*9356374aSAndroid Build Coastguard Worker   EXPECT_THAT(c, IsOkAndHolds(CopyDetectorHas(10, true, false)));
875*9356374aSAndroid Build Coastguard Worker }
876*9356374aSAndroid Build Coastguard Worker 
TEST(StatusOr,AbslAnyAssignment)877*9356374aSAndroid Build Coastguard Worker TEST(StatusOr, AbslAnyAssignment) {
878*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE((std::is_assignable<absl::StatusOr<absl::any>,
879*9356374aSAndroid Build Coastguard Worker                                    absl::StatusOr<int>>::value));
880*9356374aSAndroid Build Coastguard Worker   absl::StatusOr<absl::any> status_or;
881*9356374aSAndroid Build Coastguard Worker   status_or = absl::InvalidArgumentError("foo");
882*9356374aSAndroid Build Coastguard Worker   EXPECT_THAT(status_or, Not(IsOk()));
883*9356374aSAndroid Build Coastguard Worker }
884*9356374aSAndroid Build Coastguard Worker 
TEST(StatusOr,ImplicitAssignment)885*9356374aSAndroid Build Coastguard Worker TEST(StatusOr, ImplicitAssignment) {
886*9356374aSAndroid Build Coastguard Worker   absl::StatusOr<absl::variant<int, std::string>> status_or;
887*9356374aSAndroid Build Coastguard Worker   status_or = 10;
888*9356374aSAndroid Build Coastguard Worker   EXPECT_THAT(status_or, IsOkAndHolds(VariantWith<int>(10)));
889*9356374aSAndroid Build Coastguard Worker }
890*9356374aSAndroid Build Coastguard Worker 
TEST(StatusOr,SelfDirectInitAssignment)891*9356374aSAndroid Build Coastguard Worker TEST(StatusOr, SelfDirectInitAssignment) {
892*9356374aSAndroid Build Coastguard Worker   absl::StatusOr<std::vector<int>> status_or = {{10, 20, 30}};
893*9356374aSAndroid Build Coastguard Worker   status_or = *status_or;
894*9356374aSAndroid Build Coastguard Worker   EXPECT_THAT(status_or, IsOkAndHolds(ElementsAre(10, 20, 30)));
895*9356374aSAndroid Build Coastguard Worker }
896*9356374aSAndroid Build Coastguard Worker 
TEST(StatusOr,ImplicitCastFromInitializerList)897*9356374aSAndroid Build Coastguard Worker TEST(StatusOr, ImplicitCastFromInitializerList) {
898*9356374aSAndroid Build Coastguard Worker   absl::StatusOr<std::vector<int>> status_or = {{10, 20, 30}};
899*9356374aSAndroid Build Coastguard Worker   EXPECT_THAT(status_or, IsOkAndHolds(ElementsAre(10, 20, 30)));
900*9356374aSAndroid Build Coastguard Worker }
901*9356374aSAndroid Build Coastguard Worker 
TEST(StatusOr,UniquePtrImplicitAssignment)902*9356374aSAndroid Build Coastguard Worker TEST(StatusOr, UniquePtrImplicitAssignment) {
903*9356374aSAndroid Build Coastguard Worker   absl::StatusOr<std::unique_ptr<Base1>> status_or;
904*9356374aSAndroid Build Coastguard Worker   status_or = absl::make_unique<Derived>();
905*9356374aSAndroid Build Coastguard Worker   EXPECT_THAT(status_or, IsOkAndHolds(Ne(nullptr)));
906*9356374aSAndroid Build Coastguard Worker }
907*9356374aSAndroid Build Coastguard Worker 
TEST(StatusOr,Pointer)908*9356374aSAndroid Build Coastguard Worker TEST(StatusOr, Pointer) {
909*9356374aSAndroid Build Coastguard Worker   struct A {};
910*9356374aSAndroid Build Coastguard Worker   struct B : public A {};
911*9356374aSAndroid Build Coastguard Worker   struct C : private A {};
912*9356374aSAndroid Build Coastguard Worker 
913*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE((std::is_constructible<absl::StatusOr<A*>, B*>::value));
914*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE((std::is_convertible<B*, absl::StatusOr<A*>>::value));
915*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE((std::is_constructible<absl::StatusOr<A*>, C*>::value));
916*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE((std::is_convertible<C*, absl::StatusOr<A*>>::value));
917*9356374aSAndroid Build Coastguard Worker }
918*9356374aSAndroid Build Coastguard Worker 
TEST(StatusOr,TestAssignmentStatusNotOkConverting)919*9356374aSAndroid Build Coastguard Worker TEST(StatusOr, TestAssignmentStatusNotOkConverting) {
920*9356374aSAndroid Build Coastguard Worker   // Copy assignment
921*9356374aSAndroid Build Coastguard Worker   {
922*9356374aSAndroid Build Coastguard Worker     const absl::Status expected = absl::CancelledError();
923*9356374aSAndroid Build Coastguard Worker     absl::StatusOr<int> source(expected);
924*9356374aSAndroid Build Coastguard Worker 
925*9356374aSAndroid Build Coastguard Worker     absl::StatusOr<double> target;
926*9356374aSAndroid Build Coastguard Worker     target = source;
927*9356374aSAndroid Build Coastguard Worker 
928*9356374aSAndroid Build Coastguard Worker     EXPECT_FALSE(target.ok());
929*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(expected, target.status());
930*9356374aSAndroid Build Coastguard Worker 
931*9356374aSAndroid Build Coastguard Worker     EXPECT_FALSE(source.ok());
932*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(expected, source.status());
933*9356374aSAndroid Build Coastguard Worker   }
934*9356374aSAndroid Build Coastguard Worker 
935*9356374aSAndroid Build Coastguard Worker   // Move assignment
936*9356374aSAndroid Build Coastguard Worker   {
937*9356374aSAndroid Build Coastguard Worker     const absl::Status expected = absl::CancelledError();
938*9356374aSAndroid Build Coastguard Worker     absl::StatusOr<int> source(expected);
939*9356374aSAndroid Build Coastguard Worker 
940*9356374aSAndroid Build Coastguard Worker     absl::StatusOr<double> target;
941*9356374aSAndroid Build Coastguard Worker     target = std::move(source);
942*9356374aSAndroid Build Coastguard Worker 
943*9356374aSAndroid Build Coastguard Worker     EXPECT_FALSE(target.ok());
944*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(expected, target.status());
945*9356374aSAndroid Build Coastguard Worker 
946*9356374aSAndroid Build Coastguard Worker     EXPECT_FALSE(source.ok());
947*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(source.status().code(), absl::StatusCode::kInternal);
948*9356374aSAndroid Build Coastguard Worker   }
949*9356374aSAndroid Build Coastguard Worker }
950*9356374aSAndroid Build Coastguard Worker 
TEST(StatusOr,SelfAssignment)951*9356374aSAndroid Build Coastguard Worker TEST(StatusOr, SelfAssignment) {
952*9356374aSAndroid Build Coastguard Worker   // Copy-assignment, status OK
953*9356374aSAndroid Build Coastguard Worker   {
954*9356374aSAndroid Build Coastguard Worker     // A string long enough that it's likely to defeat any inline representation
955*9356374aSAndroid Build Coastguard Worker     // optimization.
956*9356374aSAndroid Build Coastguard Worker     const std::string long_str(128, 'a');
957*9356374aSAndroid Build Coastguard Worker 
958*9356374aSAndroid Build Coastguard Worker     absl::StatusOr<std::string> so = long_str;
959*9356374aSAndroid Build Coastguard Worker     so = *&so;
960*9356374aSAndroid Build Coastguard Worker 
961*9356374aSAndroid Build Coastguard Worker     ASSERT_TRUE(so.ok());
962*9356374aSAndroid Build Coastguard Worker     EXPECT_THAT(so.status(), IsOk());
963*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(long_str, *so);
964*9356374aSAndroid Build Coastguard Worker   }
965*9356374aSAndroid Build Coastguard Worker 
966*9356374aSAndroid Build Coastguard Worker   // Copy-assignment, error status
967*9356374aSAndroid Build Coastguard Worker   {
968*9356374aSAndroid Build Coastguard Worker     absl::StatusOr<int> so = absl::NotFoundError("taco");
969*9356374aSAndroid Build Coastguard Worker     so = *&so;
970*9356374aSAndroid Build Coastguard Worker 
971*9356374aSAndroid Build Coastguard Worker     EXPECT_FALSE(so.ok());
972*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(so.status().code(), absl::StatusCode::kNotFound);
973*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(so.status().message(), "taco");
974*9356374aSAndroid Build Coastguard Worker   }
975*9356374aSAndroid Build Coastguard Worker 
976*9356374aSAndroid Build Coastguard Worker   // Move-assignment with copyable type, status OK
977*9356374aSAndroid Build Coastguard Worker   {
978*9356374aSAndroid Build Coastguard Worker     absl::StatusOr<int> so = 17;
979*9356374aSAndroid Build Coastguard Worker 
980*9356374aSAndroid Build Coastguard Worker     // Fool the compiler, which otherwise complains.
981*9356374aSAndroid Build Coastguard Worker     auto& same = so;
982*9356374aSAndroid Build Coastguard Worker     so = std::move(same);
983*9356374aSAndroid Build Coastguard Worker 
984*9356374aSAndroid Build Coastguard Worker     ASSERT_TRUE(so.ok());
985*9356374aSAndroid Build Coastguard Worker     EXPECT_THAT(so.status(), IsOk());
986*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(17, *so);
987*9356374aSAndroid Build Coastguard Worker   }
988*9356374aSAndroid Build Coastguard Worker 
989*9356374aSAndroid Build Coastguard Worker   // Move-assignment with copyable type, error status
990*9356374aSAndroid Build Coastguard Worker   {
991*9356374aSAndroid Build Coastguard Worker     absl::StatusOr<int> so = absl::NotFoundError("taco");
992*9356374aSAndroid Build Coastguard Worker 
993*9356374aSAndroid Build Coastguard Worker     // Fool the compiler, which otherwise complains.
994*9356374aSAndroid Build Coastguard Worker     auto& same = so;
995*9356374aSAndroid Build Coastguard Worker     so = std::move(same);
996*9356374aSAndroid Build Coastguard Worker 
997*9356374aSAndroid Build Coastguard Worker     EXPECT_FALSE(so.ok());
998*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(so.status().code(), absl::StatusCode::kNotFound);
999*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(so.status().message(), "taco");
1000*9356374aSAndroid Build Coastguard Worker   }
1001*9356374aSAndroid Build Coastguard Worker 
1002*9356374aSAndroid Build Coastguard Worker   // Move-assignment with non-copyable type, status OK
1003*9356374aSAndroid Build Coastguard Worker   {
1004*9356374aSAndroid Build Coastguard Worker     const auto raw = new int(17);
1005*9356374aSAndroid Build Coastguard Worker     absl::StatusOr<std::unique_ptr<int>> so = absl::WrapUnique(raw);
1006*9356374aSAndroid Build Coastguard Worker 
1007*9356374aSAndroid Build Coastguard Worker     // Fool the compiler, which otherwise complains.
1008*9356374aSAndroid Build Coastguard Worker     auto& same = so;
1009*9356374aSAndroid Build Coastguard Worker     so = std::move(same);
1010*9356374aSAndroid Build Coastguard Worker 
1011*9356374aSAndroid Build Coastguard Worker     ASSERT_TRUE(so.ok());
1012*9356374aSAndroid Build Coastguard Worker     EXPECT_THAT(so.status(), IsOk());
1013*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(raw, so->get());
1014*9356374aSAndroid Build Coastguard Worker   }
1015*9356374aSAndroid Build Coastguard Worker 
1016*9356374aSAndroid Build Coastguard Worker   // Move-assignment with non-copyable type, error status
1017*9356374aSAndroid Build Coastguard Worker   {
1018*9356374aSAndroid Build Coastguard Worker     absl::StatusOr<std::unique_ptr<int>> so = absl::NotFoundError("taco");
1019*9356374aSAndroid Build Coastguard Worker 
1020*9356374aSAndroid Build Coastguard Worker     // Fool the compiler, which otherwise complains.
1021*9356374aSAndroid Build Coastguard Worker     auto& same = so;
1022*9356374aSAndroid Build Coastguard Worker     so = std::move(same);
1023*9356374aSAndroid Build Coastguard Worker 
1024*9356374aSAndroid Build Coastguard Worker     EXPECT_FALSE(so.ok());
1025*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(so.status().code(), absl::StatusCode::kNotFound);
1026*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(so.status().message(), "taco");
1027*9356374aSAndroid Build Coastguard Worker   }
1028*9356374aSAndroid Build Coastguard Worker }
1029*9356374aSAndroid Build Coastguard Worker 
1030*9356374aSAndroid Build Coastguard Worker // These types form the overload sets of the constructors and the assignment
1031*9356374aSAndroid Build Coastguard Worker // operators of `MockValue`. They distinguish construction from assignment,
1032*9356374aSAndroid Build Coastguard Worker // lvalue from rvalue.
1033*9356374aSAndroid Build Coastguard Worker struct FromConstructibleAssignableLvalue {};
1034*9356374aSAndroid Build Coastguard Worker struct FromConstructibleAssignableRvalue {};
1035*9356374aSAndroid Build Coastguard Worker struct FromImplicitConstructibleOnly {};
1036*9356374aSAndroid Build Coastguard Worker struct FromAssignableOnly {};
1037*9356374aSAndroid Build Coastguard Worker 
1038*9356374aSAndroid Build Coastguard Worker // This class is for testing the forwarding value assignments of `StatusOr`.
1039*9356374aSAndroid Build Coastguard Worker // `from_rvalue` indicates whether the constructor or the assignment taking
1040*9356374aSAndroid Build Coastguard Worker // rvalue reference is called. `from_assignment` indicates whether any
1041*9356374aSAndroid Build Coastguard Worker // assignment is called.
1042*9356374aSAndroid Build Coastguard Worker struct MockValue {
1043*9356374aSAndroid Build Coastguard Worker   // Constructs `MockValue` from `FromConstructibleAssignableLvalue`.
MockValue__anonfda0c6120111::MockValue1044*9356374aSAndroid Build Coastguard Worker   MockValue(const FromConstructibleAssignableLvalue&)  // NOLINT
1045*9356374aSAndroid Build Coastguard Worker       : from_rvalue(false), assigned(false) {}
1046*9356374aSAndroid Build Coastguard Worker   // Constructs `MockValue` from `FromConstructibleAssignableRvalue`.
MockValue__anonfda0c6120111::MockValue1047*9356374aSAndroid Build Coastguard Worker   MockValue(FromConstructibleAssignableRvalue&&)  // NOLINT
1048*9356374aSAndroid Build Coastguard Worker       : from_rvalue(true), assigned(false) {}
1049*9356374aSAndroid Build Coastguard Worker   // Constructs `MockValue` from `FromImplicitConstructibleOnly`.
1050*9356374aSAndroid Build Coastguard Worker   // `MockValue` is not assignable from `FromImplicitConstructibleOnly`.
MockValue__anonfda0c6120111::MockValue1051*9356374aSAndroid Build Coastguard Worker   MockValue(const FromImplicitConstructibleOnly&)  // NOLINT
1052*9356374aSAndroid Build Coastguard Worker       : from_rvalue(false), assigned(false) {}
1053*9356374aSAndroid Build Coastguard Worker   // Assigns `FromConstructibleAssignableLvalue`.
operator =__anonfda0c6120111::MockValue1054*9356374aSAndroid Build Coastguard Worker   MockValue& operator=(const FromConstructibleAssignableLvalue&) {
1055*9356374aSAndroid Build Coastguard Worker     from_rvalue = false;
1056*9356374aSAndroid Build Coastguard Worker     assigned = true;
1057*9356374aSAndroid Build Coastguard Worker     return *this;
1058*9356374aSAndroid Build Coastguard Worker   }
1059*9356374aSAndroid Build Coastguard Worker   // Assigns `FromConstructibleAssignableRvalue` (rvalue only).
operator =__anonfda0c6120111::MockValue1060*9356374aSAndroid Build Coastguard Worker   MockValue& operator=(FromConstructibleAssignableRvalue&&) {
1061*9356374aSAndroid Build Coastguard Worker     from_rvalue = true;
1062*9356374aSAndroid Build Coastguard Worker     assigned = true;
1063*9356374aSAndroid Build Coastguard Worker     return *this;
1064*9356374aSAndroid Build Coastguard Worker   }
1065*9356374aSAndroid Build Coastguard Worker   // Assigns `FromAssignableOnly`, but not constructible from
1066*9356374aSAndroid Build Coastguard Worker   // `FromAssignableOnly`.
operator =__anonfda0c6120111::MockValue1067*9356374aSAndroid Build Coastguard Worker   MockValue& operator=(const FromAssignableOnly&) {
1068*9356374aSAndroid Build Coastguard Worker     from_rvalue = false;
1069*9356374aSAndroid Build Coastguard Worker     assigned = true;
1070*9356374aSAndroid Build Coastguard Worker     return *this;
1071*9356374aSAndroid Build Coastguard Worker   }
1072*9356374aSAndroid Build Coastguard Worker   bool from_rvalue;
1073*9356374aSAndroid Build Coastguard Worker   bool assigned;
1074*9356374aSAndroid Build Coastguard Worker };
1075*9356374aSAndroid Build Coastguard Worker 
1076*9356374aSAndroid Build Coastguard Worker // operator=(U&&)
TEST(StatusOr,PerfectForwardingAssignment)1077*9356374aSAndroid Build Coastguard Worker TEST(StatusOr, PerfectForwardingAssignment) {
1078*9356374aSAndroid Build Coastguard Worker   // U == T
1079*9356374aSAndroid Build Coastguard Worker   constexpr int kValue1 = 10, kValue2 = 20;
1080*9356374aSAndroid Build Coastguard Worker   absl::StatusOr<CopyDetector> status_or;
1081*9356374aSAndroid Build Coastguard Worker   CopyDetector lvalue(kValue1);
1082*9356374aSAndroid Build Coastguard Worker   status_or = lvalue;
1083*9356374aSAndroid Build Coastguard Worker   EXPECT_THAT(status_or, IsOkAndHolds(CopyDetectorHas(kValue1, false, true)));
1084*9356374aSAndroid Build Coastguard Worker   status_or = CopyDetector(kValue2);
1085*9356374aSAndroid Build Coastguard Worker   EXPECT_THAT(status_or, IsOkAndHolds(CopyDetectorHas(kValue2, true, false)));
1086*9356374aSAndroid Build Coastguard Worker 
1087*9356374aSAndroid Build Coastguard Worker   // U != T
1088*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(
1089*9356374aSAndroid Build Coastguard Worker       (std::is_assignable<absl::StatusOr<MockValue>&,
1090*9356374aSAndroid Build Coastguard Worker                           const FromConstructibleAssignableLvalue&>::value));
1091*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE((std::is_assignable<absl::StatusOr<MockValue>&,
1092*9356374aSAndroid Build Coastguard Worker                                   FromConstructibleAssignableLvalue&&>::value));
1093*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(
1094*9356374aSAndroid Build Coastguard Worker       (std::is_assignable<absl::StatusOr<MockValue>&,
1095*9356374aSAndroid Build Coastguard Worker                           const FromConstructibleAssignableRvalue&>::value));
1096*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE((std::is_assignable<absl::StatusOr<MockValue>&,
1097*9356374aSAndroid Build Coastguard Worker                                   FromConstructibleAssignableRvalue&&>::value));
1098*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(
1099*9356374aSAndroid Build Coastguard Worker       (std::is_assignable<absl::StatusOr<MockValue>&,
1100*9356374aSAndroid Build Coastguard Worker                           const FromImplicitConstructibleOnly&>::value));
1101*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE((std::is_assignable<absl::StatusOr<MockValue>&,
1102*9356374aSAndroid Build Coastguard Worker                                    const FromAssignableOnly&>::value));
1103*9356374aSAndroid Build Coastguard Worker 
1104*9356374aSAndroid Build Coastguard Worker   absl::StatusOr<MockValue> from_lvalue(FromConstructibleAssignableLvalue{});
1105*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(from_lvalue->from_rvalue);
1106*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(from_lvalue->assigned);
1107*9356374aSAndroid Build Coastguard Worker   from_lvalue = FromConstructibleAssignableLvalue{};
1108*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(from_lvalue->from_rvalue);
1109*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(from_lvalue->assigned);
1110*9356374aSAndroid Build Coastguard Worker 
1111*9356374aSAndroid Build Coastguard Worker   absl::StatusOr<MockValue> from_rvalue(FromConstructibleAssignableRvalue{});
1112*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(from_rvalue->from_rvalue);
1113*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(from_rvalue->assigned);
1114*9356374aSAndroid Build Coastguard Worker   from_rvalue = FromConstructibleAssignableRvalue{};
1115*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(from_rvalue->from_rvalue);
1116*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(from_rvalue->assigned);
1117*9356374aSAndroid Build Coastguard Worker 
1118*9356374aSAndroid Build Coastguard Worker   absl::StatusOr<MockValue> from_implicit_constructible(
1119*9356374aSAndroid Build Coastguard Worker       FromImplicitConstructibleOnly{});
1120*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(from_implicit_constructible->from_rvalue);
1121*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(from_implicit_constructible->assigned);
1122*9356374aSAndroid Build Coastguard Worker   // construct a temporary `StatusOr` object and invoke the `StatusOr` move
1123*9356374aSAndroid Build Coastguard Worker   // assignment operator.
1124*9356374aSAndroid Build Coastguard Worker   from_implicit_constructible = FromImplicitConstructibleOnly{};
1125*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(from_implicit_constructible->from_rvalue);
1126*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(from_implicit_constructible->assigned);
1127*9356374aSAndroid Build Coastguard Worker }
1128*9356374aSAndroid Build Coastguard Worker 
TEST(StatusOr,TestStatus)1129*9356374aSAndroid Build Coastguard Worker TEST(StatusOr, TestStatus) {
1130*9356374aSAndroid Build Coastguard Worker   absl::StatusOr<int> good(4);
1131*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(good.ok());
1132*9356374aSAndroid Build Coastguard Worker   absl::StatusOr<int> bad(absl::CancelledError());
1133*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(bad.ok());
1134*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(bad.status().code(), absl::StatusCode::kCancelled);
1135*9356374aSAndroid Build Coastguard Worker }
1136*9356374aSAndroid Build Coastguard Worker 
TEST(StatusOr,OperatorStarRefQualifiers)1137*9356374aSAndroid Build Coastguard Worker TEST(StatusOr, OperatorStarRefQualifiers) {
1138*9356374aSAndroid Build Coastguard Worker   static_assert(
1139*9356374aSAndroid Build Coastguard Worker       std::is_same<const int&,
1140*9356374aSAndroid Build Coastguard Worker                    decltype(*std::declval<const absl::StatusOr<int>&>())>(),
1141*9356374aSAndroid Build Coastguard Worker       "Unexpected ref-qualifiers");
1142*9356374aSAndroid Build Coastguard Worker   static_assert(
1143*9356374aSAndroid Build Coastguard Worker       std::is_same<int&, decltype(*std::declval<absl::StatusOr<int>&>())>(),
1144*9356374aSAndroid Build Coastguard Worker       "Unexpected ref-qualifiers");
1145*9356374aSAndroid Build Coastguard Worker   static_assert(
1146*9356374aSAndroid Build Coastguard Worker       std::is_same<const int&&,
1147*9356374aSAndroid Build Coastguard Worker                    decltype(*std::declval<const absl::StatusOr<int>&&>())>(),
1148*9356374aSAndroid Build Coastguard Worker       "Unexpected ref-qualifiers");
1149*9356374aSAndroid Build Coastguard Worker   static_assert(
1150*9356374aSAndroid Build Coastguard Worker       std::is_same<int&&, decltype(*std::declval<absl::StatusOr<int>&&>())>(),
1151*9356374aSAndroid Build Coastguard Worker       "Unexpected ref-qualifiers");
1152*9356374aSAndroid Build Coastguard Worker }
1153*9356374aSAndroid Build Coastguard Worker 
TEST(StatusOr,OperatorStar)1154*9356374aSAndroid Build Coastguard Worker TEST(StatusOr, OperatorStar) {
1155*9356374aSAndroid Build Coastguard Worker   const absl::StatusOr<std::string> const_lvalue("hello");
1156*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("hello", *const_lvalue);
1157*9356374aSAndroid Build Coastguard Worker 
1158*9356374aSAndroid Build Coastguard Worker   absl::StatusOr<std::string> lvalue("hello");
1159*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("hello", *lvalue);
1160*9356374aSAndroid Build Coastguard Worker 
1161*9356374aSAndroid Build Coastguard Worker   // Note: Recall that std::move() is equivalent to a static_cast to an rvalue
1162*9356374aSAndroid Build Coastguard Worker   // reference type.
1163*9356374aSAndroid Build Coastguard Worker   const absl::StatusOr<std::string> const_rvalue("hello");
1164*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("hello", *std::move(const_rvalue));  // NOLINT
1165*9356374aSAndroid Build Coastguard Worker 
1166*9356374aSAndroid Build Coastguard Worker   absl::StatusOr<std::string> rvalue("hello");
1167*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("hello", *std::move(rvalue));
1168*9356374aSAndroid Build Coastguard Worker }
1169*9356374aSAndroid Build Coastguard Worker 
TEST(StatusOr,OperatorArrowQualifiers)1170*9356374aSAndroid Build Coastguard Worker TEST(StatusOr, OperatorArrowQualifiers) {
1171*9356374aSAndroid Build Coastguard Worker   static_assert(
1172*9356374aSAndroid Build Coastguard Worker       std::is_same<
1173*9356374aSAndroid Build Coastguard Worker           const int*,
1174*9356374aSAndroid Build Coastguard Worker           decltype(std::declval<const absl::StatusOr<int>&>().operator->())>(),
1175*9356374aSAndroid Build Coastguard Worker       "Unexpected qualifiers");
1176*9356374aSAndroid Build Coastguard Worker   static_assert(
1177*9356374aSAndroid Build Coastguard Worker       std::is_same<
1178*9356374aSAndroid Build Coastguard Worker           int*, decltype(std::declval<absl::StatusOr<int>&>().operator->())>(),
1179*9356374aSAndroid Build Coastguard Worker       "Unexpected qualifiers");
1180*9356374aSAndroid Build Coastguard Worker   static_assert(
1181*9356374aSAndroid Build Coastguard Worker       std::is_same<
1182*9356374aSAndroid Build Coastguard Worker           const int*,
1183*9356374aSAndroid Build Coastguard Worker           decltype(std::declval<const absl::StatusOr<int>&&>().operator->())>(),
1184*9356374aSAndroid Build Coastguard Worker       "Unexpected qualifiers");
1185*9356374aSAndroid Build Coastguard Worker   static_assert(
1186*9356374aSAndroid Build Coastguard Worker       std::is_same<
1187*9356374aSAndroid Build Coastguard Worker           int*, decltype(std::declval<absl::StatusOr<int>&&>().operator->())>(),
1188*9356374aSAndroid Build Coastguard Worker       "Unexpected qualifiers");
1189*9356374aSAndroid Build Coastguard Worker }
1190*9356374aSAndroid Build Coastguard Worker 
TEST(StatusOr,OperatorArrow)1191*9356374aSAndroid Build Coastguard Worker TEST(StatusOr, OperatorArrow) {
1192*9356374aSAndroid Build Coastguard Worker   const absl::StatusOr<std::string> const_lvalue("hello");
1193*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(std::string("hello"), const_lvalue->c_str());
1194*9356374aSAndroid Build Coastguard Worker 
1195*9356374aSAndroid Build Coastguard Worker   absl::StatusOr<std::string> lvalue("hello");
1196*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(std::string("hello"), lvalue->c_str());
1197*9356374aSAndroid Build Coastguard Worker }
1198*9356374aSAndroid Build Coastguard Worker 
TEST(StatusOr,RValueStatus)1199*9356374aSAndroid Build Coastguard Worker TEST(StatusOr, RValueStatus) {
1200*9356374aSAndroid Build Coastguard Worker   absl::StatusOr<int> so(absl::NotFoundError("taco"));
1201*9356374aSAndroid Build Coastguard Worker   const absl::Status s = std::move(so).status();
1202*9356374aSAndroid Build Coastguard Worker 
1203*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(s.code(), absl::StatusCode::kNotFound);
1204*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(s.message(), "taco");
1205*9356374aSAndroid Build Coastguard Worker 
1206*9356374aSAndroid Build Coastguard Worker   // Check that !ok() still implies !status().ok(), even after moving out of the
1207*9356374aSAndroid Build Coastguard Worker   // object. See the note on the rvalue ref-qualified status method.
1208*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(so.ok());  // NOLINT
1209*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(so.status().ok());
1210*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(so.status().code(), absl::StatusCode::kInternal);
1211*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(so.status().message(), "Status accessed after move.");
1212*9356374aSAndroid Build Coastguard Worker }
1213*9356374aSAndroid Build Coastguard Worker 
TEST(StatusOr,TestValue)1214*9356374aSAndroid Build Coastguard Worker TEST(StatusOr, TestValue) {
1215*9356374aSAndroid Build Coastguard Worker   const int kI = 4;
1216*9356374aSAndroid Build Coastguard Worker   absl::StatusOr<int> thing(kI);
1217*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(kI, *thing);
1218*9356374aSAndroid Build Coastguard Worker }
1219*9356374aSAndroid Build Coastguard Worker 
TEST(StatusOr,TestValueConst)1220*9356374aSAndroid Build Coastguard Worker TEST(StatusOr, TestValueConst) {
1221*9356374aSAndroid Build Coastguard Worker   const int kI = 4;
1222*9356374aSAndroid Build Coastguard Worker   const absl::StatusOr<int> thing(kI);
1223*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(kI, *thing);
1224*9356374aSAndroid Build Coastguard Worker }
1225*9356374aSAndroid Build Coastguard Worker 
TEST(StatusOr,TestPointerDefaultCtor)1226*9356374aSAndroid Build Coastguard Worker TEST(StatusOr, TestPointerDefaultCtor) {
1227*9356374aSAndroid Build Coastguard Worker   absl::StatusOr<int*> thing;
1228*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(thing.ok());
1229*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(thing.status().code(), absl::StatusCode::kUnknown);
1230*9356374aSAndroid Build Coastguard Worker }
1231*9356374aSAndroid Build Coastguard Worker 
TEST(StatusOr,TestPointerStatusCtor)1232*9356374aSAndroid Build Coastguard Worker TEST(StatusOr, TestPointerStatusCtor) {
1233*9356374aSAndroid Build Coastguard Worker   absl::StatusOr<int*> thing(absl::CancelledError());
1234*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(thing.ok());
1235*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(thing.status().code(), absl::StatusCode::kCancelled);
1236*9356374aSAndroid Build Coastguard Worker }
1237*9356374aSAndroid Build Coastguard Worker 
TEST(StatusOr,TestPointerValueCtor)1238*9356374aSAndroid Build Coastguard Worker TEST(StatusOr, TestPointerValueCtor) {
1239*9356374aSAndroid Build Coastguard Worker   const int kI = 4;
1240*9356374aSAndroid Build Coastguard Worker 
1241*9356374aSAndroid Build Coastguard Worker   // Construction from a non-null pointer
1242*9356374aSAndroid Build Coastguard Worker   {
1243*9356374aSAndroid Build Coastguard Worker     absl::StatusOr<const int*> so(&kI);
1244*9356374aSAndroid Build Coastguard Worker     EXPECT_TRUE(so.ok());
1245*9356374aSAndroid Build Coastguard Worker     EXPECT_THAT(so.status(), IsOk());
1246*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(&kI, *so);
1247*9356374aSAndroid Build Coastguard Worker   }
1248*9356374aSAndroid Build Coastguard Worker 
1249*9356374aSAndroid Build Coastguard Worker   // Construction from a null pointer constant
1250*9356374aSAndroid Build Coastguard Worker   {
1251*9356374aSAndroid Build Coastguard Worker     absl::StatusOr<const int*> so(nullptr);
1252*9356374aSAndroid Build Coastguard Worker     EXPECT_TRUE(so.ok());
1253*9356374aSAndroid Build Coastguard Worker     EXPECT_THAT(so.status(), IsOk());
1254*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(nullptr, *so);
1255*9356374aSAndroid Build Coastguard Worker   }
1256*9356374aSAndroid Build Coastguard Worker 
1257*9356374aSAndroid Build Coastguard Worker   // Construction from a non-literal null pointer
1258*9356374aSAndroid Build Coastguard Worker   {
1259*9356374aSAndroid Build Coastguard Worker     const int* const p = nullptr;
1260*9356374aSAndroid Build Coastguard Worker 
1261*9356374aSAndroid Build Coastguard Worker     absl::StatusOr<const int*> so(p);
1262*9356374aSAndroid Build Coastguard Worker     EXPECT_TRUE(so.ok());
1263*9356374aSAndroid Build Coastguard Worker     EXPECT_THAT(so.status(), IsOk());
1264*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(nullptr, *so);
1265*9356374aSAndroid Build Coastguard Worker   }
1266*9356374aSAndroid Build Coastguard Worker }
1267*9356374aSAndroid Build Coastguard Worker 
TEST(StatusOr,TestPointerCopyCtorStatusOk)1268*9356374aSAndroid Build Coastguard Worker TEST(StatusOr, TestPointerCopyCtorStatusOk) {
1269*9356374aSAndroid Build Coastguard Worker   const int kI = 0;
1270*9356374aSAndroid Build Coastguard Worker   absl::StatusOr<const int*> original(&kI);
1271*9356374aSAndroid Build Coastguard Worker   absl::StatusOr<const int*> copy(original);
1272*9356374aSAndroid Build Coastguard Worker   EXPECT_THAT(copy.status(), IsOk());
1273*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(*original, *copy);
1274*9356374aSAndroid Build Coastguard Worker }
1275*9356374aSAndroid Build Coastguard Worker 
TEST(StatusOr,TestPointerCopyCtorStatusNotOk)1276*9356374aSAndroid Build Coastguard Worker TEST(StatusOr, TestPointerCopyCtorStatusNotOk) {
1277*9356374aSAndroid Build Coastguard Worker   absl::StatusOr<int*> original(absl::CancelledError());
1278*9356374aSAndroid Build Coastguard Worker   absl::StatusOr<int*> copy(original);
1279*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(copy.status().code(), absl::StatusCode::kCancelled);
1280*9356374aSAndroid Build Coastguard Worker }
1281*9356374aSAndroid Build Coastguard Worker 
TEST(StatusOr,TestPointerCopyCtorStatusOKConverting)1282*9356374aSAndroid Build Coastguard Worker TEST(StatusOr, TestPointerCopyCtorStatusOKConverting) {
1283*9356374aSAndroid Build Coastguard Worker   Derived derived;
1284*9356374aSAndroid Build Coastguard Worker   absl::StatusOr<Derived*> original(&derived);
1285*9356374aSAndroid Build Coastguard Worker   absl::StatusOr<Base2*> copy(original);
1286*9356374aSAndroid Build Coastguard Worker   EXPECT_THAT(copy.status(), IsOk());
1287*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(static_cast<const Base2*>(*original), *copy);
1288*9356374aSAndroid Build Coastguard Worker }
1289*9356374aSAndroid Build Coastguard Worker 
TEST(StatusOr,TestPointerCopyCtorStatusNotOkConverting)1290*9356374aSAndroid Build Coastguard Worker TEST(StatusOr, TestPointerCopyCtorStatusNotOkConverting) {
1291*9356374aSAndroid Build Coastguard Worker   absl::StatusOr<Derived*> original(absl::CancelledError());
1292*9356374aSAndroid Build Coastguard Worker   absl::StatusOr<Base2*> copy(original);
1293*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(copy.status().code(), absl::StatusCode::kCancelled);
1294*9356374aSAndroid Build Coastguard Worker }
1295*9356374aSAndroid Build Coastguard Worker 
TEST(StatusOr,TestPointerAssignmentStatusOk)1296*9356374aSAndroid Build Coastguard Worker TEST(StatusOr, TestPointerAssignmentStatusOk) {
1297*9356374aSAndroid Build Coastguard Worker   const int kI = 0;
1298*9356374aSAndroid Build Coastguard Worker   absl::StatusOr<const int*> source(&kI);
1299*9356374aSAndroid Build Coastguard Worker   absl::StatusOr<const int*> target;
1300*9356374aSAndroid Build Coastguard Worker   target = source;
1301*9356374aSAndroid Build Coastguard Worker   EXPECT_THAT(target.status(), IsOk());
1302*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(*source, *target);
1303*9356374aSAndroid Build Coastguard Worker }
1304*9356374aSAndroid Build Coastguard Worker 
TEST(StatusOr,TestPointerAssignmentStatusNotOk)1305*9356374aSAndroid Build Coastguard Worker TEST(StatusOr, TestPointerAssignmentStatusNotOk) {
1306*9356374aSAndroid Build Coastguard Worker   absl::StatusOr<int*> source(absl::CancelledError());
1307*9356374aSAndroid Build Coastguard Worker   absl::StatusOr<int*> target;
1308*9356374aSAndroid Build Coastguard Worker   target = source;
1309*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(target.status().code(), absl::StatusCode::kCancelled);
1310*9356374aSAndroid Build Coastguard Worker }
1311*9356374aSAndroid Build Coastguard Worker 
TEST(StatusOr,TestPointerAssignmentStatusOKConverting)1312*9356374aSAndroid Build Coastguard Worker TEST(StatusOr, TestPointerAssignmentStatusOKConverting) {
1313*9356374aSAndroid Build Coastguard Worker   Derived derived;
1314*9356374aSAndroid Build Coastguard Worker   absl::StatusOr<Derived*> source(&derived);
1315*9356374aSAndroid Build Coastguard Worker   absl::StatusOr<Base2*> target;
1316*9356374aSAndroid Build Coastguard Worker   target = source;
1317*9356374aSAndroid Build Coastguard Worker   EXPECT_THAT(target.status(), IsOk());
1318*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(static_cast<const Base2*>(*source), *target);
1319*9356374aSAndroid Build Coastguard Worker }
1320*9356374aSAndroid Build Coastguard Worker 
TEST(StatusOr,TestPointerAssignmentStatusNotOkConverting)1321*9356374aSAndroid Build Coastguard Worker TEST(StatusOr, TestPointerAssignmentStatusNotOkConverting) {
1322*9356374aSAndroid Build Coastguard Worker   absl::StatusOr<Derived*> source(absl::CancelledError());
1323*9356374aSAndroid Build Coastguard Worker   absl::StatusOr<Base2*> target;
1324*9356374aSAndroid Build Coastguard Worker   target = source;
1325*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(target.status(), source.status());
1326*9356374aSAndroid Build Coastguard Worker }
1327*9356374aSAndroid Build Coastguard Worker 
TEST(StatusOr,TestPointerStatus)1328*9356374aSAndroid Build Coastguard Worker TEST(StatusOr, TestPointerStatus) {
1329*9356374aSAndroid Build Coastguard Worker   const int kI = 0;
1330*9356374aSAndroid Build Coastguard Worker   absl::StatusOr<const int*> good(&kI);
1331*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(good.ok());
1332*9356374aSAndroid Build Coastguard Worker   absl::StatusOr<const int*> bad(absl::CancelledError());
1333*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(bad.status().code(), absl::StatusCode::kCancelled);
1334*9356374aSAndroid Build Coastguard Worker }
1335*9356374aSAndroid Build Coastguard Worker 
TEST(StatusOr,TestPointerValue)1336*9356374aSAndroid Build Coastguard Worker TEST(StatusOr, TestPointerValue) {
1337*9356374aSAndroid Build Coastguard Worker   const int kI = 0;
1338*9356374aSAndroid Build Coastguard Worker   absl::StatusOr<const int*> thing(&kI);
1339*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(&kI, *thing);
1340*9356374aSAndroid Build Coastguard Worker }
1341*9356374aSAndroid Build Coastguard Worker 
TEST(StatusOr,TestPointerValueConst)1342*9356374aSAndroid Build Coastguard Worker TEST(StatusOr, TestPointerValueConst) {
1343*9356374aSAndroid Build Coastguard Worker   const int kI = 0;
1344*9356374aSAndroid Build Coastguard Worker   const absl::StatusOr<const int*> thing(&kI);
1345*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(&kI, *thing);
1346*9356374aSAndroid Build Coastguard Worker }
1347*9356374aSAndroid Build Coastguard Worker 
TEST(StatusOr,StatusOrVectorOfUniquePointerCanReserveAndResize)1348*9356374aSAndroid Build Coastguard Worker TEST(StatusOr, StatusOrVectorOfUniquePointerCanReserveAndResize) {
1349*9356374aSAndroid Build Coastguard Worker   using EvilType = std::vector<std::unique_ptr<int>>;
1350*9356374aSAndroid Build Coastguard Worker   static_assert(std::is_copy_constructible<EvilType>::value, "");
1351*9356374aSAndroid Build Coastguard Worker   std::vector<::absl::StatusOr<EvilType>> v(5);
1352*9356374aSAndroid Build Coastguard Worker   v.reserve(v.capacity() + 10);
1353*9356374aSAndroid Build Coastguard Worker   v.resize(v.capacity() + 10);
1354*9356374aSAndroid Build Coastguard Worker }
1355*9356374aSAndroid Build Coastguard Worker 
TEST(StatusOr,ConstPayload)1356*9356374aSAndroid Build Coastguard Worker TEST(StatusOr, ConstPayload) {
1357*9356374aSAndroid Build Coastguard Worker   // A reduced version of a problematic type found in the wild. All of the
1358*9356374aSAndroid Build Coastguard Worker   // operations below should compile.
1359*9356374aSAndroid Build Coastguard Worker   absl::StatusOr<const int> a;
1360*9356374aSAndroid Build Coastguard Worker 
1361*9356374aSAndroid Build Coastguard Worker   // Copy-construction
1362*9356374aSAndroid Build Coastguard Worker   absl::StatusOr<const int> b(a);
1363*9356374aSAndroid Build Coastguard Worker 
1364*9356374aSAndroid Build Coastguard Worker   // Copy-assignment
1365*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(std::is_copy_assignable<absl::StatusOr<const int>>::value);
1366*9356374aSAndroid Build Coastguard Worker 
1367*9356374aSAndroid Build Coastguard Worker   // Move-construction
1368*9356374aSAndroid Build Coastguard Worker   absl::StatusOr<const int> c(std::move(a));
1369*9356374aSAndroid Build Coastguard Worker 
1370*9356374aSAndroid Build Coastguard Worker   // Move-assignment
1371*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(std::is_move_assignable<absl::StatusOr<const int>>::value);
1372*9356374aSAndroid Build Coastguard Worker }
1373*9356374aSAndroid Build Coastguard Worker 
TEST(StatusOr,MapToStatusOrUniquePtr)1374*9356374aSAndroid Build Coastguard Worker TEST(StatusOr, MapToStatusOrUniquePtr) {
1375*9356374aSAndroid Build Coastguard Worker   // A reduced version of a problematic type found in the wild. All of the
1376*9356374aSAndroid Build Coastguard Worker   // operations below should compile.
1377*9356374aSAndroid Build Coastguard Worker   using MapType = std::map<std::string, absl::StatusOr<std::unique_ptr<int>>>;
1378*9356374aSAndroid Build Coastguard Worker 
1379*9356374aSAndroid Build Coastguard Worker   MapType a;
1380*9356374aSAndroid Build Coastguard Worker 
1381*9356374aSAndroid Build Coastguard Worker   // Move-construction
1382*9356374aSAndroid Build Coastguard Worker   MapType b(std::move(a));
1383*9356374aSAndroid Build Coastguard Worker 
1384*9356374aSAndroid Build Coastguard Worker   // Move-assignment
1385*9356374aSAndroid Build Coastguard Worker   a = std::move(b);
1386*9356374aSAndroid Build Coastguard Worker }
1387*9356374aSAndroid Build Coastguard Worker 
TEST(StatusOr,ValueOrOk)1388*9356374aSAndroid Build Coastguard Worker TEST(StatusOr, ValueOrOk) {
1389*9356374aSAndroid Build Coastguard Worker   const absl::StatusOr<int> status_or = 0;
1390*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(status_or.value_or(-1), 0);
1391*9356374aSAndroid Build Coastguard Worker }
1392*9356374aSAndroid Build Coastguard Worker 
TEST(StatusOr,ValueOrDefault)1393*9356374aSAndroid Build Coastguard Worker TEST(StatusOr, ValueOrDefault) {
1394*9356374aSAndroid Build Coastguard Worker   const absl::StatusOr<int> status_or = absl::CancelledError();
1395*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(status_or.value_or(-1), -1);
1396*9356374aSAndroid Build Coastguard Worker }
1397*9356374aSAndroid Build Coastguard Worker 
TEST(StatusOr,MoveOnlyValueOrOk)1398*9356374aSAndroid Build Coastguard Worker TEST(StatusOr, MoveOnlyValueOrOk) {
1399*9356374aSAndroid Build Coastguard Worker   EXPECT_THAT(absl::StatusOr<std::unique_ptr<int>>(absl::make_unique<int>(0))
1400*9356374aSAndroid Build Coastguard Worker                   .value_or(absl::make_unique<int>(-1)),
1401*9356374aSAndroid Build Coastguard Worker               Pointee(0));
1402*9356374aSAndroid Build Coastguard Worker }
1403*9356374aSAndroid Build Coastguard Worker 
TEST(StatusOr,MoveOnlyValueOrDefault)1404*9356374aSAndroid Build Coastguard Worker TEST(StatusOr, MoveOnlyValueOrDefault) {
1405*9356374aSAndroid Build Coastguard Worker   EXPECT_THAT(absl::StatusOr<std::unique_ptr<int>>(absl::CancelledError())
1406*9356374aSAndroid Build Coastguard Worker                   .value_or(absl::make_unique<int>(-1)),
1407*9356374aSAndroid Build Coastguard Worker               Pointee(-1));
1408*9356374aSAndroid Build Coastguard Worker }
1409*9356374aSAndroid Build Coastguard Worker 
MakeStatus()1410*9356374aSAndroid Build Coastguard Worker static absl::StatusOr<int> MakeStatus() { return 100; }
1411*9356374aSAndroid Build Coastguard Worker 
TEST(StatusOr,TestIgnoreError)1412*9356374aSAndroid Build Coastguard Worker TEST(StatusOr, TestIgnoreError) { MakeStatus().IgnoreError(); }
1413*9356374aSAndroid Build Coastguard Worker 
TEST(StatusOr,EqualityOperator)1414*9356374aSAndroid Build Coastguard Worker TEST(StatusOr, EqualityOperator) {
1415*9356374aSAndroid Build Coastguard Worker   constexpr size_t kNumCases = 4;
1416*9356374aSAndroid Build Coastguard Worker   std::array<absl::StatusOr<int>, kNumCases> group1 = {
1417*9356374aSAndroid Build Coastguard Worker       absl::StatusOr<int>(1), absl::StatusOr<int>(2),
1418*9356374aSAndroid Build Coastguard Worker       absl::StatusOr<int>(absl::InvalidArgumentError("msg")),
1419*9356374aSAndroid Build Coastguard Worker       absl::StatusOr<int>(absl::InternalError("msg"))};
1420*9356374aSAndroid Build Coastguard Worker   std::array<absl::StatusOr<int>, kNumCases> group2 = {
1421*9356374aSAndroid Build Coastguard Worker       absl::StatusOr<int>(1), absl::StatusOr<int>(2),
1422*9356374aSAndroid Build Coastguard Worker       absl::StatusOr<int>(absl::InvalidArgumentError("msg")),
1423*9356374aSAndroid Build Coastguard Worker       absl::StatusOr<int>(absl::InternalError("msg"))};
1424*9356374aSAndroid Build Coastguard Worker   for (size_t i = 0; i < kNumCases; ++i) {
1425*9356374aSAndroid Build Coastguard Worker     for (size_t j = 0; j < kNumCases; ++j) {
1426*9356374aSAndroid Build Coastguard Worker       if (i == j) {
1427*9356374aSAndroid Build Coastguard Worker         EXPECT_TRUE(group1[i] == group2[j]);
1428*9356374aSAndroid Build Coastguard Worker         EXPECT_FALSE(group1[i] != group2[j]);
1429*9356374aSAndroid Build Coastguard Worker       } else {
1430*9356374aSAndroid Build Coastguard Worker         EXPECT_FALSE(group1[i] == group2[j]);
1431*9356374aSAndroid Build Coastguard Worker         EXPECT_TRUE(group1[i] != group2[j]);
1432*9356374aSAndroid Build Coastguard Worker       }
1433*9356374aSAndroid Build Coastguard Worker     }
1434*9356374aSAndroid Build Coastguard Worker   }
1435*9356374aSAndroid Build Coastguard Worker }
1436*9356374aSAndroid Build Coastguard Worker 
1437*9356374aSAndroid Build Coastguard Worker struct MyType {
operator ==__anonfda0c6120111::MyType1438*9356374aSAndroid Build Coastguard Worker   bool operator==(const MyType&) const { return true; }
1439*9356374aSAndroid Build Coastguard Worker };
1440*9356374aSAndroid Build Coastguard Worker 
1441*9356374aSAndroid Build Coastguard Worker enum class ConvTraits { kNone = 0, kImplicit = 1, kExplicit = 2 };
1442*9356374aSAndroid Build Coastguard Worker 
1443*9356374aSAndroid Build Coastguard Worker // This class has conversion operator to `StatusOr<T>` based on value of
1444*9356374aSAndroid Build Coastguard Worker // `conv_traits`.
1445*9356374aSAndroid Build Coastguard Worker template <typename T, ConvTraits conv_traits = ConvTraits::kNone>
1446*9356374aSAndroid Build Coastguard Worker struct StatusOrConversionBase {};
1447*9356374aSAndroid Build Coastguard Worker 
1448*9356374aSAndroid Build Coastguard Worker template <typename T>
1449*9356374aSAndroid Build Coastguard Worker struct StatusOrConversionBase<T, ConvTraits::kImplicit> {
operator absl::StatusOr<T>__anonfda0c6120111::StatusOrConversionBase1450*9356374aSAndroid Build Coastguard Worker   operator absl::StatusOr<T>() const& {  // NOLINT
1451*9356374aSAndroid Build Coastguard Worker     return absl::InvalidArgumentError("conversion to absl::StatusOr");
1452*9356374aSAndroid Build Coastguard Worker   }
operator absl::StatusOr<T>__anonfda0c6120111::StatusOrConversionBase1453*9356374aSAndroid Build Coastguard Worker   operator absl::StatusOr<T>() && {  // NOLINT
1454*9356374aSAndroid Build Coastguard Worker     return absl::InvalidArgumentError("conversion to absl::StatusOr");
1455*9356374aSAndroid Build Coastguard Worker   }
1456*9356374aSAndroid Build Coastguard Worker };
1457*9356374aSAndroid Build Coastguard Worker 
1458*9356374aSAndroid Build Coastguard Worker template <typename T>
1459*9356374aSAndroid Build Coastguard Worker struct StatusOrConversionBase<T, ConvTraits::kExplicit> {
operator absl::StatusOr<T>__anonfda0c6120111::StatusOrConversionBase1460*9356374aSAndroid Build Coastguard Worker   explicit operator absl::StatusOr<T>() const& {
1461*9356374aSAndroid Build Coastguard Worker     return absl::InvalidArgumentError("conversion to absl::StatusOr");
1462*9356374aSAndroid Build Coastguard Worker   }
operator absl::StatusOr<T>__anonfda0c6120111::StatusOrConversionBase1463*9356374aSAndroid Build Coastguard Worker   explicit operator absl::StatusOr<T>() && {
1464*9356374aSAndroid Build Coastguard Worker     return absl::InvalidArgumentError("conversion to absl::StatusOr");
1465*9356374aSAndroid Build Coastguard Worker   }
1466*9356374aSAndroid Build Coastguard Worker };
1467*9356374aSAndroid Build Coastguard Worker 
1468*9356374aSAndroid Build Coastguard Worker // This class has conversion operator to `T` based on the value of
1469*9356374aSAndroid Build Coastguard Worker // `conv_traits`.
1470*9356374aSAndroid Build Coastguard Worker template <typename T, ConvTraits conv_traits = ConvTraits::kNone>
1471*9356374aSAndroid Build Coastguard Worker struct ConversionBase {};
1472*9356374aSAndroid Build Coastguard Worker 
1473*9356374aSAndroid Build Coastguard Worker template <typename T>
1474*9356374aSAndroid Build Coastguard Worker struct ConversionBase<T, ConvTraits::kImplicit> {
operator T__anonfda0c6120111::ConversionBase1475*9356374aSAndroid Build Coastguard Worker   operator T() const& { return t; }         // NOLINT
operator T__anonfda0c6120111::ConversionBase1476*9356374aSAndroid Build Coastguard Worker   operator T() && { return std::move(t); }  // NOLINT
1477*9356374aSAndroid Build Coastguard Worker   T t;
1478*9356374aSAndroid Build Coastguard Worker };
1479*9356374aSAndroid Build Coastguard Worker 
1480*9356374aSAndroid Build Coastguard Worker template <typename T>
1481*9356374aSAndroid Build Coastguard Worker struct ConversionBase<T, ConvTraits::kExplicit> {
operator T__anonfda0c6120111::ConversionBase1482*9356374aSAndroid Build Coastguard Worker   explicit operator T() const& { return t; }
operator T__anonfda0c6120111::ConversionBase1483*9356374aSAndroid Build Coastguard Worker   explicit operator T() && { return std::move(t); }
1484*9356374aSAndroid Build Coastguard Worker   T t;
1485*9356374aSAndroid Build Coastguard Worker };
1486*9356374aSAndroid Build Coastguard Worker 
1487*9356374aSAndroid Build Coastguard Worker // This class has conversion operator to `absl::Status` based on the value of
1488*9356374aSAndroid Build Coastguard Worker // `conv_traits`.
1489*9356374aSAndroid Build Coastguard Worker template <ConvTraits conv_traits = ConvTraits::kNone>
1490*9356374aSAndroid Build Coastguard Worker struct StatusConversionBase {};
1491*9356374aSAndroid Build Coastguard Worker 
1492*9356374aSAndroid Build Coastguard Worker template <>
1493*9356374aSAndroid Build Coastguard Worker struct StatusConversionBase<ConvTraits::kImplicit> {
operator absl::Status__anonfda0c6120111::StatusConversionBase1494*9356374aSAndroid Build Coastguard Worker   operator absl::Status() const& {  // NOLINT
1495*9356374aSAndroid Build Coastguard Worker     return absl::InternalError("conversion to Status");
1496*9356374aSAndroid Build Coastguard Worker   }
operator absl::Status__anonfda0c6120111::StatusConversionBase1497*9356374aSAndroid Build Coastguard Worker   operator absl::Status() && {  // NOLINT
1498*9356374aSAndroid Build Coastguard Worker     return absl::InternalError("conversion to Status");
1499*9356374aSAndroid Build Coastguard Worker   }
1500*9356374aSAndroid Build Coastguard Worker };
1501*9356374aSAndroid Build Coastguard Worker 
1502*9356374aSAndroid Build Coastguard Worker template <>
1503*9356374aSAndroid Build Coastguard Worker struct StatusConversionBase<ConvTraits::kExplicit> {
operator absl::Status__anonfda0c6120111::StatusConversionBase1504*9356374aSAndroid Build Coastguard Worker   explicit operator absl::Status() const& {  // NOLINT
1505*9356374aSAndroid Build Coastguard Worker     return absl::InternalError("conversion to Status");
1506*9356374aSAndroid Build Coastguard Worker   }
operator absl::Status__anonfda0c6120111::StatusConversionBase1507*9356374aSAndroid Build Coastguard Worker   explicit operator absl::Status() && {  // NOLINT
1508*9356374aSAndroid Build Coastguard Worker     return absl::InternalError("conversion to Status");
1509*9356374aSAndroid Build Coastguard Worker   }
1510*9356374aSAndroid Build Coastguard Worker };
1511*9356374aSAndroid Build Coastguard Worker 
1512*9356374aSAndroid Build Coastguard Worker static constexpr int kConvToStatus = 1;
1513*9356374aSAndroid Build Coastguard Worker static constexpr int kConvToStatusOr = 2;
1514*9356374aSAndroid Build Coastguard Worker static constexpr int kConvToT = 4;
1515*9356374aSAndroid Build Coastguard Worker static constexpr int kConvExplicit = 8;
1516*9356374aSAndroid Build Coastguard Worker 
GetConvTraits(int bit,int config)1517*9356374aSAndroid Build Coastguard Worker constexpr ConvTraits GetConvTraits(int bit, int config) {
1518*9356374aSAndroid Build Coastguard Worker   return (config & bit) == 0
1519*9356374aSAndroid Build Coastguard Worker              ? ConvTraits::kNone
1520*9356374aSAndroid Build Coastguard Worker              : ((config & kConvExplicit) == 0 ? ConvTraits::kImplicit
1521*9356374aSAndroid Build Coastguard Worker                                               : ConvTraits::kExplicit);
1522*9356374aSAndroid Build Coastguard Worker }
1523*9356374aSAndroid Build Coastguard Worker 
1524*9356374aSAndroid Build Coastguard Worker // This class conditionally has conversion operator to `absl::Status`, `T`,
1525*9356374aSAndroid Build Coastguard Worker // `StatusOr<T>`, based on values of the template parameters.
1526*9356374aSAndroid Build Coastguard Worker template <typename T, int config>
1527*9356374aSAndroid Build Coastguard Worker struct CustomType
1528*9356374aSAndroid Build Coastguard Worker     : StatusOrConversionBase<T, GetConvTraits(kConvToStatusOr, config)>,
1529*9356374aSAndroid Build Coastguard Worker       ConversionBase<T, GetConvTraits(kConvToT, config)>,
1530*9356374aSAndroid Build Coastguard Worker       StatusConversionBase<GetConvTraits(kConvToStatus, config)> {};
1531*9356374aSAndroid Build Coastguard Worker 
1532*9356374aSAndroid Build Coastguard Worker struct ConvertibleToAnyStatusOr {
1533*9356374aSAndroid Build Coastguard Worker   template <typename T>
operator absl::StatusOr<T>__anonfda0c6120111::ConvertibleToAnyStatusOr1534*9356374aSAndroid Build Coastguard Worker   operator absl::StatusOr<T>() const {  // NOLINT
1535*9356374aSAndroid Build Coastguard Worker     return absl::InvalidArgumentError("Conversion to absl::StatusOr");
1536*9356374aSAndroid Build Coastguard Worker   }
1537*9356374aSAndroid Build Coastguard Worker };
1538*9356374aSAndroid Build Coastguard Worker 
1539*9356374aSAndroid Build Coastguard Worker // Test the rank of overload resolution for `StatusOr<T>` constructor and
1540*9356374aSAndroid Build Coastguard Worker // assignment, from highest to lowest:
1541*9356374aSAndroid Build Coastguard Worker // 1. T/Status
1542*9356374aSAndroid Build Coastguard Worker // 2. U that has conversion operator to absl::StatusOr<T>
1543*9356374aSAndroid Build Coastguard Worker // 3. U that is convertible to Status
1544*9356374aSAndroid Build Coastguard Worker // 4. U that is convertible to T
TEST(StatusOr,ConstructionFromT)1545*9356374aSAndroid Build Coastguard Worker TEST(StatusOr, ConstructionFromT) {
1546*9356374aSAndroid Build Coastguard Worker   // Construct absl::StatusOr<T> from T when T is convertible to
1547*9356374aSAndroid Build Coastguard Worker   // absl::StatusOr<T>
1548*9356374aSAndroid Build Coastguard Worker   {
1549*9356374aSAndroid Build Coastguard Worker     ConvertibleToAnyStatusOr v;
1550*9356374aSAndroid Build Coastguard Worker     absl::StatusOr<ConvertibleToAnyStatusOr> statusor(v);
1551*9356374aSAndroid Build Coastguard Worker     EXPECT_TRUE(statusor.ok());
1552*9356374aSAndroid Build Coastguard Worker   }
1553*9356374aSAndroid Build Coastguard Worker   {
1554*9356374aSAndroid Build Coastguard Worker     ConvertibleToAnyStatusOr v;
1555*9356374aSAndroid Build Coastguard Worker     absl::StatusOr<ConvertibleToAnyStatusOr> statusor = v;
1556*9356374aSAndroid Build Coastguard Worker     EXPECT_TRUE(statusor.ok());
1557*9356374aSAndroid Build Coastguard Worker   }
1558*9356374aSAndroid Build Coastguard Worker   // Construct absl::StatusOr<T> from T when T is explicitly convertible to
1559*9356374aSAndroid Build Coastguard Worker   // Status
1560*9356374aSAndroid Build Coastguard Worker   {
1561*9356374aSAndroid Build Coastguard Worker     CustomType<MyType, kConvToStatus | kConvExplicit> v;
1562*9356374aSAndroid Build Coastguard Worker     absl::StatusOr<CustomType<MyType, kConvToStatus | kConvExplicit>> statusor(
1563*9356374aSAndroid Build Coastguard Worker         v);
1564*9356374aSAndroid Build Coastguard Worker     EXPECT_TRUE(statusor.ok());
1565*9356374aSAndroid Build Coastguard Worker   }
1566*9356374aSAndroid Build Coastguard Worker   {
1567*9356374aSAndroid Build Coastguard Worker     CustomType<MyType, kConvToStatus | kConvExplicit> v;
1568*9356374aSAndroid Build Coastguard Worker     absl::StatusOr<CustomType<MyType, kConvToStatus | kConvExplicit>> statusor =
1569*9356374aSAndroid Build Coastguard Worker         v;
1570*9356374aSAndroid Build Coastguard Worker     EXPECT_TRUE(statusor.ok());
1571*9356374aSAndroid Build Coastguard Worker   }
1572*9356374aSAndroid Build Coastguard Worker }
1573*9356374aSAndroid Build Coastguard Worker 
1574*9356374aSAndroid Build Coastguard Worker // Construct absl::StatusOr<T> from U when U is explicitly convertible to T
TEST(StatusOr,ConstructionFromTypeConvertibleToT)1575*9356374aSAndroid Build Coastguard Worker TEST(StatusOr, ConstructionFromTypeConvertibleToT) {
1576*9356374aSAndroid Build Coastguard Worker   {
1577*9356374aSAndroid Build Coastguard Worker     CustomType<MyType, kConvToT | kConvExplicit> v;
1578*9356374aSAndroid Build Coastguard Worker     absl::StatusOr<MyType> statusor(v);
1579*9356374aSAndroid Build Coastguard Worker     EXPECT_TRUE(statusor.ok());
1580*9356374aSAndroid Build Coastguard Worker   }
1581*9356374aSAndroid Build Coastguard Worker   {
1582*9356374aSAndroid Build Coastguard Worker     CustomType<MyType, kConvToT> v;
1583*9356374aSAndroid Build Coastguard Worker     absl::StatusOr<MyType> statusor = v;
1584*9356374aSAndroid Build Coastguard Worker     EXPECT_TRUE(statusor.ok());
1585*9356374aSAndroid Build Coastguard Worker   }
1586*9356374aSAndroid Build Coastguard Worker }
1587*9356374aSAndroid Build Coastguard Worker 
1588*9356374aSAndroid Build Coastguard Worker // Construct absl::StatusOr<T> from U when U has explicit conversion operator to
1589*9356374aSAndroid Build Coastguard Worker // absl::StatusOr<T>
TEST(StatusOr,ConstructionFromTypeWithConversionOperatorToStatusOrT)1590*9356374aSAndroid Build Coastguard Worker TEST(StatusOr, ConstructionFromTypeWithConversionOperatorToStatusOrT) {
1591*9356374aSAndroid Build Coastguard Worker   {
1592*9356374aSAndroid Build Coastguard Worker     CustomType<MyType, kConvToStatusOr | kConvExplicit> v;
1593*9356374aSAndroid Build Coastguard Worker     absl::StatusOr<MyType> statusor(v);
1594*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(statusor, v.operator absl::StatusOr<MyType>());
1595*9356374aSAndroid Build Coastguard Worker   }
1596*9356374aSAndroid Build Coastguard Worker   {
1597*9356374aSAndroid Build Coastguard Worker     CustomType<MyType, kConvToT | kConvToStatusOr | kConvExplicit> v;
1598*9356374aSAndroid Build Coastguard Worker     absl::StatusOr<MyType> statusor(v);
1599*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(statusor, v.operator absl::StatusOr<MyType>());
1600*9356374aSAndroid Build Coastguard Worker   }
1601*9356374aSAndroid Build Coastguard Worker   {
1602*9356374aSAndroid Build Coastguard Worker     CustomType<MyType, kConvToStatusOr | kConvToStatus | kConvExplicit> v;
1603*9356374aSAndroid Build Coastguard Worker     absl::StatusOr<MyType> statusor(v);
1604*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(statusor, v.operator absl::StatusOr<MyType>());
1605*9356374aSAndroid Build Coastguard Worker   }
1606*9356374aSAndroid Build Coastguard Worker   {
1607*9356374aSAndroid Build Coastguard Worker     CustomType<MyType,
1608*9356374aSAndroid Build Coastguard Worker                kConvToT | kConvToStatusOr | kConvToStatus | kConvExplicit>
1609*9356374aSAndroid Build Coastguard Worker         v;
1610*9356374aSAndroid Build Coastguard Worker     absl::StatusOr<MyType> statusor(v);
1611*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(statusor, v.operator absl::StatusOr<MyType>());
1612*9356374aSAndroid Build Coastguard Worker   }
1613*9356374aSAndroid Build Coastguard Worker   {
1614*9356374aSAndroid Build Coastguard Worker     CustomType<MyType, kConvToStatusOr> v;
1615*9356374aSAndroid Build Coastguard Worker     absl::StatusOr<MyType> statusor = v;
1616*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(statusor, v.operator absl::StatusOr<MyType>());
1617*9356374aSAndroid Build Coastguard Worker   }
1618*9356374aSAndroid Build Coastguard Worker   {
1619*9356374aSAndroid Build Coastguard Worker     CustomType<MyType, kConvToT | kConvToStatusOr> v;
1620*9356374aSAndroid Build Coastguard Worker     absl::StatusOr<MyType> statusor = v;
1621*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(statusor, v.operator absl::StatusOr<MyType>());
1622*9356374aSAndroid Build Coastguard Worker   }
1623*9356374aSAndroid Build Coastguard Worker   {
1624*9356374aSAndroid Build Coastguard Worker     CustomType<MyType, kConvToStatusOr | kConvToStatus> v;
1625*9356374aSAndroid Build Coastguard Worker     absl::StatusOr<MyType> statusor = v;
1626*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(statusor, v.operator absl::StatusOr<MyType>());
1627*9356374aSAndroid Build Coastguard Worker   }
1628*9356374aSAndroid Build Coastguard Worker   {
1629*9356374aSAndroid Build Coastguard Worker     CustomType<MyType, kConvToT | kConvToStatusOr | kConvToStatus> v;
1630*9356374aSAndroid Build Coastguard Worker     absl::StatusOr<MyType> statusor = v;
1631*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(statusor, v.operator absl::StatusOr<MyType>());
1632*9356374aSAndroid Build Coastguard Worker   }
1633*9356374aSAndroid Build Coastguard Worker }
1634*9356374aSAndroid Build Coastguard Worker 
TEST(StatusOr,ConstructionFromTypeConvertibleToStatus)1635*9356374aSAndroid Build Coastguard Worker TEST(StatusOr, ConstructionFromTypeConvertibleToStatus) {
1636*9356374aSAndroid Build Coastguard Worker   // Construction fails because conversion to `Status` is explicit.
1637*9356374aSAndroid Build Coastguard Worker   {
1638*9356374aSAndroid Build Coastguard Worker     CustomType<MyType, kConvToStatus | kConvExplicit> v;
1639*9356374aSAndroid Build Coastguard Worker     absl::StatusOr<MyType> statusor(v);
1640*9356374aSAndroid Build Coastguard Worker     EXPECT_FALSE(statusor.ok());
1641*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(statusor.status(), static_cast<absl::Status>(v));
1642*9356374aSAndroid Build Coastguard Worker   }
1643*9356374aSAndroid Build Coastguard Worker   {
1644*9356374aSAndroid Build Coastguard Worker     CustomType<MyType, kConvToT | kConvToStatus | kConvExplicit> v;
1645*9356374aSAndroid Build Coastguard Worker     absl::StatusOr<MyType> statusor(v);
1646*9356374aSAndroid Build Coastguard Worker     EXPECT_FALSE(statusor.ok());
1647*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(statusor.status(), static_cast<absl::Status>(v));
1648*9356374aSAndroid Build Coastguard Worker   }
1649*9356374aSAndroid Build Coastguard Worker   {
1650*9356374aSAndroid Build Coastguard Worker     CustomType<MyType, kConvToStatus> v;
1651*9356374aSAndroid Build Coastguard Worker     absl::StatusOr<MyType> statusor = v;
1652*9356374aSAndroid Build Coastguard Worker     EXPECT_FALSE(statusor.ok());
1653*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(statusor.status(), static_cast<absl::Status>(v));
1654*9356374aSAndroid Build Coastguard Worker   }
1655*9356374aSAndroid Build Coastguard Worker   {
1656*9356374aSAndroid Build Coastguard Worker     CustomType<MyType, kConvToT | kConvToStatus> v;
1657*9356374aSAndroid Build Coastguard Worker     absl::StatusOr<MyType> statusor = v;
1658*9356374aSAndroid Build Coastguard Worker     EXPECT_FALSE(statusor.ok());
1659*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(statusor.status(), static_cast<absl::Status>(v));
1660*9356374aSAndroid Build Coastguard Worker   }
1661*9356374aSAndroid Build Coastguard Worker }
1662*9356374aSAndroid Build Coastguard Worker 
TEST(StatusOr,AssignmentFromT)1663*9356374aSAndroid Build Coastguard Worker TEST(StatusOr, AssignmentFromT) {
1664*9356374aSAndroid Build Coastguard Worker   // Assign to absl::StatusOr<T> from T when T is convertible to
1665*9356374aSAndroid Build Coastguard Worker   // absl::StatusOr<T>
1666*9356374aSAndroid Build Coastguard Worker   {
1667*9356374aSAndroid Build Coastguard Worker     ConvertibleToAnyStatusOr v;
1668*9356374aSAndroid Build Coastguard Worker     absl::StatusOr<ConvertibleToAnyStatusOr> statusor;
1669*9356374aSAndroid Build Coastguard Worker     statusor = v;
1670*9356374aSAndroid Build Coastguard Worker     EXPECT_TRUE(statusor.ok());
1671*9356374aSAndroid Build Coastguard Worker   }
1672*9356374aSAndroid Build Coastguard Worker   // Assign to absl::StatusOr<T> from T when T is convertible to Status
1673*9356374aSAndroid Build Coastguard Worker   {
1674*9356374aSAndroid Build Coastguard Worker     CustomType<MyType, kConvToStatus> v;
1675*9356374aSAndroid Build Coastguard Worker     absl::StatusOr<CustomType<MyType, kConvToStatus>> statusor;
1676*9356374aSAndroid Build Coastguard Worker     statusor = v;
1677*9356374aSAndroid Build Coastguard Worker     EXPECT_TRUE(statusor.ok());
1678*9356374aSAndroid Build Coastguard Worker   }
1679*9356374aSAndroid Build Coastguard Worker }
1680*9356374aSAndroid Build Coastguard Worker 
TEST(StatusOr,AssignmentFromTypeConvertibleToT)1681*9356374aSAndroid Build Coastguard Worker TEST(StatusOr, AssignmentFromTypeConvertibleToT) {
1682*9356374aSAndroid Build Coastguard Worker   // Assign to absl::StatusOr<T> from U when U is convertible to T
1683*9356374aSAndroid Build Coastguard Worker   {
1684*9356374aSAndroid Build Coastguard Worker     CustomType<MyType, kConvToT> v;
1685*9356374aSAndroid Build Coastguard Worker     absl::StatusOr<MyType> statusor;
1686*9356374aSAndroid Build Coastguard Worker     statusor = v;
1687*9356374aSAndroid Build Coastguard Worker     EXPECT_TRUE(statusor.ok());
1688*9356374aSAndroid Build Coastguard Worker   }
1689*9356374aSAndroid Build Coastguard Worker }
1690*9356374aSAndroid Build Coastguard Worker 
TEST(StatusOr,AssignmentFromTypeWithConversionOperatortoStatusOrT)1691*9356374aSAndroid Build Coastguard Worker TEST(StatusOr, AssignmentFromTypeWithConversionOperatortoStatusOrT) {
1692*9356374aSAndroid Build Coastguard Worker   // Assign to absl::StatusOr<T> from U when U has conversion operator to
1693*9356374aSAndroid Build Coastguard Worker   // absl::StatusOr<T>
1694*9356374aSAndroid Build Coastguard Worker   {
1695*9356374aSAndroid Build Coastguard Worker     CustomType<MyType, kConvToStatusOr> v;
1696*9356374aSAndroid Build Coastguard Worker     absl::StatusOr<MyType> statusor;
1697*9356374aSAndroid Build Coastguard Worker     statusor = v;
1698*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(statusor, v.operator absl::StatusOr<MyType>());
1699*9356374aSAndroid Build Coastguard Worker   }
1700*9356374aSAndroid Build Coastguard Worker   {
1701*9356374aSAndroid Build Coastguard Worker     CustomType<MyType, kConvToT | kConvToStatusOr> v;
1702*9356374aSAndroid Build Coastguard Worker     absl::StatusOr<MyType> statusor;
1703*9356374aSAndroid Build Coastguard Worker     statusor = v;
1704*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(statusor, v.operator absl::StatusOr<MyType>());
1705*9356374aSAndroid Build Coastguard Worker   }
1706*9356374aSAndroid Build Coastguard Worker   {
1707*9356374aSAndroid Build Coastguard Worker     CustomType<MyType, kConvToStatusOr | kConvToStatus> v;
1708*9356374aSAndroid Build Coastguard Worker     absl::StatusOr<MyType> statusor;
1709*9356374aSAndroid Build Coastguard Worker     statusor = v;
1710*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(statusor, v.operator absl::StatusOr<MyType>());
1711*9356374aSAndroid Build Coastguard Worker   }
1712*9356374aSAndroid Build Coastguard Worker   {
1713*9356374aSAndroid Build Coastguard Worker     CustomType<MyType, kConvToT | kConvToStatusOr | kConvToStatus> v;
1714*9356374aSAndroid Build Coastguard Worker     absl::StatusOr<MyType> statusor;
1715*9356374aSAndroid Build Coastguard Worker     statusor = v;
1716*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(statusor, v.operator absl::StatusOr<MyType>());
1717*9356374aSAndroid Build Coastguard Worker   }
1718*9356374aSAndroid Build Coastguard Worker }
1719*9356374aSAndroid Build Coastguard Worker 
TEST(StatusOr,AssignmentFromTypeConvertibleToStatus)1720*9356374aSAndroid Build Coastguard Worker TEST(StatusOr, AssignmentFromTypeConvertibleToStatus) {
1721*9356374aSAndroid Build Coastguard Worker   // Assign to absl::StatusOr<T> from U when U is convertible to Status
1722*9356374aSAndroid Build Coastguard Worker   {
1723*9356374aSAndroid Build Coastguard Worker     CustomType<MyType, kConvToStatus> v;
1724*9356374aSAndroid Build Coastguard Worker     absl::StatusOr<MyType> statusor;
1725*9356374aSAndroid Build Coastguard Worker     statusor = v;
1726*9356374aSAndroid Build Coastguard Worker     EXPECT_FALSE(statusor.ok());
1727*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(statusor.status(), static_cast<absl::Status>(v));
1728*9356374aSAndroid Build Coastguard Worker   }
1729*9356374aSAndroid Build Coastguard Worker   {
1730*9356374aSAndroid Build Coastguard Worker     CustomType<MyType, kConvToT | kConvToStatus> v;
1731*9356374aSAndroid Build Coastguard Worker     absl::StatusOr<MyType> statusor;
1732*9356374aSAndroid Build Coastguard Worker     statusor = v;
1733*9356374aSAndroid Build Coastguard Worker     EXPECT_FALSE(statusor.ok());
1734*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(statusor.status(), static_cast<absl::Status>(v));
1735*9356374aSAndroid Build Coastguard Worker   }
1736*9356374aSAndroid Build Coastguard Worker }
1737*9356374aSAndroid Build Coastguard Worker 
TEST(StatusOr,StatusAssignmentFromStatusError)1738*9356374aSAndroid Build Coastguard Worker TEST(StatusOr, StatusAssignmentFromStatusError) {
1739*9356374aSAndroid Build Coastguard Worker   absl::StatusOr<absl::Status> statusor;
1740*9356374aSAndroid Build Coastguard Worker   statusor.AssignStatus(absl::CancelledError());
1741*9356374aSAndroid Build Coastguard Worker 
1742*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(statusor.ok());
1743*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(statusor.status(), absl::CancelledError());
1744*9356374aSAndroid Build Coastguard Worker }
1745*9356374aSAndroid Build Coastguard Worker 
1746*9356374aSAndroid Build Coastguard Worker #if GTEST_HAS_DEATH_TEST
TEST(StatusOr,StatusAssignmentFromStatusOk)1747*9356374aSAndroid Build Coastguard Worker TEST(StatusOr, StatusAssignmentFromStatusOk) {
1748*9356374aSAndroid Build Coastguard Worker   EXPECT_DEBUG_DEATH(
1749*9356374aSAndroid Build Coastguard Worker       {
1750*9356374aSAndroid Build Coastguard Worker         absl::StatusOr<absl::Status> statusor;
1751*9356374aSAndroid Build Coastguard Worker         // This will DCHECK.
1752*9356374aSAndroid Build Coastguard Worker         statusor.AssignStatus(absl::OkStatus());
1753*9356374aSAndroid Build Coastguard Worker         // In optimized mode, we are actually going to get error::INTERNAL for
1754*9356374aSAndroid Build Coastguard Worker         // status here, rather than crashing, so check that.
1755*9356374aSAndroid Build Coastguard Worker         EXPECT_FALSE(statusor.ok());
1756*9356374aSAndroid Build Coastguard Worker         EXPECT_EQ(statusor.status().code(), absl::StatusCode::kInternal);
1757*9356374aSAndroid Build Coastguard Worker       },
1758*9356374aSAndroid Build Coastguard Worker       "An OK status is not a valid constructor argument to StatusOr<T>");
1759*9356374aSAndroid Build Coastguard Worker }
1760*9356374aSAndroid Build Coastguard Worker #endif
1761*9356374aSAndroid Build Coastguard Worker 
TEST(StatusOr,StatusAssignmentFromTypeConvertibleToStatus)1762*9356374aSAndroid Build Coastguard Worker TEST(StatusOr, StatusAssignmentFromTypeConvertibleToStatus) {
1763*9356374aSAndroid Build Coastguard Worker   CustomType<MyType, kConvToStatus> v;
1764*9356374aSAndroid Build Coastguard Worker   absl::StatusOr<MyType> statusor;
1765*9356374aSAndroid Build Coastguard Worker   statusor.AssignStatus(v);
1766*9356374aSAndroid Build Coastguard Worker 
1767*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(statusor.ok());
1768*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(statusor.status(), static_cast<absl::Status>(v));
1769*9356374aSAndroid Build Coastguard Worker }
1770*9356374aSAndroid Build Coastguard Worker 
1771*9356374aSAndroid Build Coastguard Worker struct PrintTestStruct {
operator <<(std::ostream & os,const PrintTestStruct &)1772*9356374aSAndroid Build Coastguard Worker   friend std::ostream& operator<<(std::ostream& os, const PrintTestStruct&) {
1773*9356374aSAndroid Build Coastguard Worker     return os << "ostream";
1774*9356374aSAndroid Build Coastguard Worker   }
1775*9356374aSAndroid Build Coastguard Worker 
1776*9356374aSAndroid Build Coastguard Worker   template <typename Sink>
AbslStringify(Sink & sink,const PrintTestStruct &)1777*9356374aSAndroid Build Coastguard Worker   friend void AbslStringify(Sink& sink, const PrintTestStruct&) {
1778*9356374aSAndroid Build Coastguard Worker     sink.Append("stringify");
1779*9356374aSAndroid Build Coastguard Worker   }
1780*9356374aSAndroid Build Coastguard Worker };
1781*9356374aSAndroid Build Coastguard Worker 
TEST(StatusOr,OkPrinting)1782*9356374aSAndroid Build Coastguard Worker TEST(StatusOr, OkPrinting) {
1783*9356374aSAndroid Build Coastguard Worker   absl::StatusOr<PrintTestStruct> print_me = PrintTestStruct{};
1784*9356374aSAndroid Build Coastguard Worker   std::stringstream stream;
1785*9356374aSAndroid Build Coastguard Worker   stream << print_me;
1786*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(stream.str(), "ostream");
1787*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::StrCat(print_me), "stringify");
1788*9356374aSAndroid Build Coastguard Worker }
1789*9356374aSAndroid Build Coastguard Worker 
TEST(StatusOr,ErrorPrinting)1790*9356374aSAndroid Build Coastguard Worker TEST(StatusOr, ErrorPrinting) {
1791*9356374aSAndroid Build Coastguard Worker   absl::StatusOr<PrintTestStruct> print_me = absl::UnknownError("error");
1792*9356374aSAndroid Build Coastguard Worker   std::stringstream stream;
1793*9356374aSAndroid Build Coastguard Worker   stream << print_me;
1794*9356374aSAndroid Build Coastguard Worker   const auto error_matcher =
1795*9356374aSAndroid Build Coastguard Worker       AllOf(HasSubstr("UNKNOWN"), HasSubstr("error"),
1796*9356374aSAndroid Build Coastguard Worker             AnyOf(AllOf(StartsWith("("), EndsWith(")")),
1797*9356374aSAndroid Build Coastguard Worker                   AllOf(StartsWith("["), EndsWith("]"))));
1798*9356374aSAndroid Build Coastguard Worker   EXPECT_THAT(stream.str(), error_matcher);
1799*9356374aSAndroid Build Coastguard Worker   EXPECT_THAT(absl::StrCat(print_me), error_matcher);
1800*9356374aSAndroid Build Coastguard Worker }
1801*9356374aSAndroid Build Coastguard Worker 
1802*9356374aSAndroid Build Coastguard Worker }  // namespace
1803