ErrorHolder TakeError(Error Err);
template <typename T> ExpectedHolder<T> TakeExpected(Expected<T> &Exp) {
- llvm::detail::ExpectedHolder<T> Result;
- auto &EH = static_cast<llvm::detail::ErrorHolder &>(Result);
- EH = TakeError(Exp.takeError());
- if (Result.Success)
- Result.Value = &(*Exp);
- return Result;
+ return {TakeError(Exp.takeError()), Exp};
}
template <typename T> ExpectedHolder<T> TakeExpected(Expected<T> &&Exp) {
MATCHER(Failed, "") { return !arg.Success; }
MATCHER_P(HasValue, value,
- "succeeded with value " + testing::PrintToString(value)) {
+ "succeeded with value \"" + testing::PrintToString(value) + '"') {
if (!arg.Success) {
*result_listener << "operation failed";
return false;
}
- assert(arg.Value.hasValue());
- if (**arg.Value != value) {
- *result_listener << "but \"" + testing::PrintToString(**arg.Value) +
- "\" != " + testing::PrintToString(value);
+ if (*arg.Exp != value) {
+ *result_listener << "but \"" + testing::PrintToString(*arg.Exp) +
+ "\" != \"" + testing::PrintToString(value) + '"';
return false;
}
};
template <typename T> struct ExpectedHolder : public ErrorHolder {
- Optional<T *> Value;
+ ExpectedHolder(ErrorHolder Err, Expected<T> &Exp)
+ : ErrorHolder(std::move(Err)), Exp(Exp) {}
+
+ Expected<T> &Exp;
};
inline void PrintTo(const ErrorHolder &Err, std::ostream *Out) {
template <typename T>
void PrintTo(const ExpectedHolder<T> &Item, std::ostream *Out) {
if (Item.Success) {
- *Out << "succeeded with value \"" << ::testing::PrintToString(**Item.Value)
+ *Out << "succeeded with value \"" << ::testing::PrintToString(*Item.Exp)
<< "\"";
} else {
PrintTo(static_cast<const ErrorHolder &>(Item), Out);
#include "llvm/ADT/Twine.h"
#include "llvm/Support/Errc.h"
#include "llvm/Support/ErrorHandling.h"
+#include "llvm/Testing/Support/Error.h"
+#include "gtest/gtest-spi.h"
#include "gtest/gtest.h"
#include <memory>
0);
}
+TEST(Error, ErrorMatchers) {
+ EXPECT_THAT_ERROR(Error::success(), Succeeded());
+ EXPECT_NONFATAL_FAILURE(
+ EXPECT_THAT_ERROR(make_error<CustomError>(0), Succeeded()),
+ "Expected: succeeded\n Actual: failed (CustomError { 0})");
+
+ EXPECT_THAT_ERROR(make_error<CustomError>(0), Failed());
+ EXPECT_NONFATAL_FAILURE(EXPECT_THAT_ERROR(Error::success(), Failed()),
+ "Expected: failed\n Actual: succeeded");
+
+ EXPECT_THAT_EXPECTED(Expected<int>(0), Succeeded());
+ EXPECT_NONFATAL_FAILURE(
+ EXPECT_THAT_EXPECTED(Expected<int>(make_error<CustomError>(0)),
+ Succeeded()),
+ "Expected: succeeded\n Actual: failed (CustomError { 0})");
+
+ EXPECT_THAT_EXPECTED(Expected<int>(make_error<CustomError>(0)), Failed());
+ EXPECT_NONFATAL_FAILURE(
+ EXPECT_THAT_EXPECTED(Expected<int>(0), Failed()),
+ "Expected: failed\n Actual: succeeded with value \"0\"");
+
+ EXPECT_THAT_EXPECTED(Expected<int>(0), HasValue(0));
+ EXPECT_NONFATAL_FAILURE(
+ EXPECT_THAT_EXPECTED(Expected<int>(make_error<CustomError>(0)),
+ HasValue(0)),
+ "Expected: succeeded with value \"0\"\n"
+ " Actual: failed (CustomError { 0})");
+ EXPECT_NONFATAL_FAILURE(
+ EXPECT_THAT_EXPECTED(Expected<int>(1), HasValue(0)),
+ "Expected: succeeded with value \"0\"\n"
+ " Actual: succeeded with value \"1\", but \"1\" != \"0\"");
+
+ EXPECT_THAT_EXPECTED(Expected<int &>(make_error<CustomError>(0)), Failed());
+ int a = 1;
+ EXPECT_THAT_EXPECTED(Expected<int &>(a), Succeeded());
+ EXPECT_THAT_EXPECTED(Expected<int &>(a), HasValue(1));
+}
+
} // end anon namespace