diff options
Diffstat (limited to 'llvm/unittests/Support/ErrorTest.cpp')
-rw-r--r-- | llvm/unittests/Support/ErrorTest.cpp | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/llvm/unittests/Support/ErrorTest.cpp b/llvm/unittests/Support/ErrorTest.cpp index 852753f..db332eb 100644 --- a/llvm/unittests/Support/ErrorTest.cpp +++ b/llvm/unittests/Support/ErrorTest.cpp @@ -605,6 +605,59 @@ TEST(Error, ExpectedCovariance) { (void)!!A2; } +// Test that handleExpected just returns success values. +TEST(Error, HandleExpectedSuccess) { + auto ValOrErr = + handleExpected(Expected<int>(42), + []() { return Expected<int>(43); }); + EXPECT_TRUE(!!ValOrErr) + << "handleExpected should have returned a success value here"; + EXPECT_EQ(*ValOrErr, 42) + << "handleExpected should have returned the original success value here"; +} + +enum FooStrategy { Aggressive, Conservative }; + +static Expected<int> foo(FooStrategy S) { + if (S == Aggressive) + return make_error<CustomError>(7); + return 42; +} + +// Test that handleExpected invokes the error path if errors are not handled. +TEST(Error, HandleExpectedUnhandledError) { + // foo(Aggressive) should return a CustomError which should pass through as + // there is no handler for CustomError. + auto ValOrErr = + handleExpected( + foo(Aggressive), + []() { return foo(Conservative); }); + + EXPECT_FALSE(!!ValOrErr) + << "handleExpected should have returned an error here"; + auto Err = ValOrErr.takeError(); + EXPECT_TRUE(Err.isA<CustomError>()) + << "handleExpected should have returned the CustomError generated by " + "foo(Aggressive) here"; + consumeError(std::move(Err)); +} + +// Test that handleExpected invokes the fallback path if errors are handled. +TEST(Error, HandleExpectedHandledError) { + // foo(Aggressive) should return a CustomError which should handle triggering + // the fallback path. + auto ValOrErr = + handleExpected( + foo(Aggressive), + []() { return foo(Conservative); }, + [](const CustomError&) { /* do nothing */ }); + + EXPECT_TRUE(!!ValOrErr) + << "handleExpected should have returned a success value here"; + EXPECT_EQ(*ValOrErr, 42) + << "handleExpected returned the wrong success value"; +} + TEST(Error, ErrorCodeConversions) { // Round-trip a success value to check that it converts correctly. EXPECT_EQ(errorToErrorCode(errorCodeToError(std::error_code())), |