Michael J. Spencer | 779c424 | 2013-01-20 20:32:30 +0000 | [diff] [blame] | 1 | //===- unittests/ErrorOrTest.cpp - ErrorOr.h tests ------------------------===// |
| 2 | // |
| 3 | // The LLVM Compiler Infrastructure |
| 4 | // |
| 5 | // This file is distributed under the University of Illinois Open Source |
| 6 | // License. See LICENSE.TXT for details. |
| 7 | // |
| 8 | //===----------------------------------------------------------------------===// |
| 9 | |
| 10 | #include "llvm/Support/ErrorOr.h" |
Michael J. Spencer | 779c424 | 2013-01-20 20:32:30 +0000 | [diff] [blame] | 11 | #include "gtest/gtest.h" |
Michael J. Spencer | 779c424 | 2013-01-20 20:32:30 +0000 | [diff] [blame] | 12 | #include <memory> |
| 13 | |
| 14 | using namespace llvm; |
| 15 | |
| 16 | namespace { |
| 17 | |
| 18 | ErrorOr<int> t1() {return 1;} |
Michael J. Spencer | 12e3dfc | 2013-02-28 01:44:26 +0000 | [diff] [blame] | 19 | ErrorOr<int> t2() { return errc::invalid_argument; } |
Michael J. Spencer | 779c424 | 2013-01-20 20:32:30 +0000 | [diff] [blame] | 20 | |
| 21 | TEST(ErrorOr, SimpleValue) { |
| 22 | ErrorOr<int> a = t1(); |
| 23 | EXPECT_TRUE(a); |
| 24 | EXPECT_EQ(1, *a); |
| 25 | |
Rafael Espindola | cd56deb | 2014-01-09 19:47:39 +0000 | [diff] [blame^] | 26 | ErrorOr<int> b = a; |
| 27 | EXPECT_EQ(1, *b); |
| 28 | |
Michael J. Spencer | 779c424 | 2013-01-20 20:32:30 +0000 | [diff] [blame] | 29 | a = t2(); |
| 30 | EXPECT_FALSE(a); |
Rafael Espindola | 1c704b4 | 2014-01-08 22:03:39 +0000 | [diff] [blame] | 31 | EXPECT_EQ(errc::invalid_argument, a.getError()); |
NAKAMURA Takumi | 08e028e | 2013-01-22 04:02:41 +0000 | [diff] [blame] | 32 | #ifdef EXPECT_DEBUG_DEATH |
Michael J. Spencer | 779c424 | 2013-01-20 20:32:30 +0000 | [diff] [blame] | 33 | EXPECT_DEBUG_DEATH(*a, "Cannot get value when an error exists"); |
NAKAMURA Takumi | 08e028e | 2013-01-22 04:02:41 +0000 | [diff] [blame] | 34 | #endif |
Michael J. Spencer | 779c424 | 2013-01-20 20:32:30 +0000 | [diff] [blame] | 35 | } |
| 36 | |
| 37 | #if LLVM_HAS_CXX11_STDLIB |
| 38 | ErrorOr<std::unique_ptr<int> > t3() { |
| 39 | return std::unique_ptr<int>(new int(3)); |
| 40 | } |
| 41 | #endif |
| 42 | |
| 43 | TEST(ErrorOr, Types) { |
| 44 | int x; |
| 45 | ErrorOr<int&> a(x); |
| 46 | *a = 42; |
| 47 | EXPECT_EQ(42, x); |
| 48 | |
| 49 | #if LLVM_HAS_CXX11_STDLIB |
| 50 | // Move only types. |
| 51 | EXPECT_EQ(3, **t3()); |
| 52 | #endif |
| 53 | } |
Michael J. Spencer | 18131ae | 2013-02-06 22:28:53 +0000 | [diff] [blame] | 54 | |
| 55 | struct B {}; |
| 56 | struct D : B {}; |
| 57 | |
| 58 | TEST(ErrorOr, Covariant) { |
| 59 | ErrorOr<B*> b(ErrorOr<D*>(0)); |
| 60 | b = ErrorOr<D*>(0); |
| 61 | |
| 62 | #if LLVM_HAS_CXX11_STDLIB |
| 63 | ErrorOr<std::unique_ptr<B> > b1(ErrorOr<std::unique_ptr<D> >(0)); |
| 64 | b1 = ErrorOr<std::unique_ptr<D> >(0); |
| 65 | #endif |
| 66 | } |
Michael J. Spencer | 779c424 | 2013-01-20 20:32:30 +0000 | [diff] [blame] | 67 | } // end anon namespace |