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