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