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(); |
Rafael Espindola | 98d3c10 | 2014-01-16 23:37:23 +0000 | [diff] [blame] | 23 | // FIXME: This is probably a bug in gtest. EXPECT_TRUE should expand to |
| 24 | // include the !! to make it friendly to explicit bool operators. |
| 25 | EXPECT_TRUE(!!a); |
Michael J. Spencer | 779c424 | 2013-01-20 20:32:30 +0000 | [diff] [blame] | 26 | EXPECT_EQ(1, *a); |
| 27 | |
Rafael Espindola | cd56deb | 2014-01-09 19:47:39 +0000 | [diff] [blame] | 28 | ErrorOr<int> b = a; |
| 29 | EXPECT_EQ(1, *b); |
| 30 | |
Michael J. Spencer | 779c424 | 2013-01-20 20:32:30 +0000 | [diff] [blame] | 31 | a = t2(); |
| 32 | EXPECT_FALSE(a); |
Rafael Espindola | 1c704b4 | 2014-01-08 22:03:39 +0000 | [diff] [blame] | 33 | EXPECT_EQ(errc::invalid_argument, a.getError()); |
NAKAMURA Takumi | 08e028e | 2013-01-22 04:02:41 +0000 | [diff] [blame] | 34 | #ifdef EXPECT_DEBUG_DEATH |
Michael J. Spencer | 779c424 | 2013-01-20 20:32:30 +0000 | [diff] [blame] | 35 | EXPECT_DEBUG_DEATH(*a, "Cannot get value when an error exists"); |
NAKAMURA Takumi | 08e028e | 2013-01-22 04:02:41 +0000 | [diff] [blame] | 36 | #endif |
Michael J. Spencer | 779c424 | 2013-01-20 20:32:30 +0000 | [diff] [blame] | 37 | } |
| 38 | |
Michael J. Spencer | 779c424 | 2013-01-20 20:32:30 +0000 | [diff] [blame] | 39 | ErrorOr<std::unique_ptr<int> > t3() { |
| 40 | return std::unique_ptr<int>(new int(3)); |
| 41 | } |
Michael J. Spencer | 779c424 | 2013-01-20 20:32:30 +0000 | [diff] [blame] | 42 | |
| 43 | TEST(ErrorOr, Types) { |
| 44 | int x; |
| 45 | ErrorOr<int&> a(x); |
| 46 | *a = 42; |
| 47 | EXPECT_EQ(42, x); |
| 48 | |
Michael J. Spencer | 779c424 | 2013-01-20 20:32:30 +0000 | [diff] [blame] | 49 | // Move only types. |
| 50 | EXPECT_EQ(3, **t3()); |
Michael J. Spencer | 779c424 | 2013-01-20 20:32:30 +0000 | [diff] [blame] | 51 | } |
Michael J. Spencer | 18131ae | 2013-02-06 22:28:53 +0000 | [diff] [blame] | 52 | |
| 53 | struct B {}; |
| 54 | struct D : B {}; |
| 55 | |
| 56 | TEST(ErrorOr, Covariant) { |
Craig Topper | 66f09ad | 2014-06-08 22:29:17 +0000 | [diff] [blame^] | 57 | ErrorOr<B*> b(ErrorOr<D*>(nullptr)); |
| 58 | b = ErrorOr<D*>(nullptr); |
Michael J. Spencer | 18131ae | 2013-02-06 22:28:53 +0000 | [diff] [blame] | 59 | |
Craig Topper | 66f09ad | 2014-06-08 22:29:17 +0000 | [diff] [blame^] | 60 | ErrorOr<std::unique_ptr<B> > b1(ErrorOr<std::unique_ptr<D> >(nullptr)); |
| 61 | b1 = ErrorOr<std::unique_ptr<D> >(nullptr); |
Michael J. Spencer | 18131ae | 2013-02-06 22:28:53 +0000 | [diff] [blame] | 62 | } |
Michael J. Spencer | 779c424 | 2013-01-20 20:32:30 +0000 | [diff] [blame] | 63 | } // end anon namespace |