summaryrefslogtreecommitdiff
path: root/include/llvm/Testing/Support/Error.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/llvm/Testing/Support/Error.h')
-rw-r--r--include/llvm/Testing/Support/Error.h69
1 files changed, 69 insertions, 0 deletions
diff --git a/include/llvm/Testing/Support/Error.h b/include/llvm/Testing/Support/Error.h
new file mode 100644
index 0000000000000..d527529015933
--- /dev/null
+++ b/include/llvm/Testing/Support/Error.h
@@ -0,0 +1,69 @@
+//===- llvm/Testing/Support/Error.h ---------------------------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_TESTING_SUPPORT_ERROR_H
+#define LLVM_TESTING_SUPPORT_ERROR_H
+
+#include "llvm/ADT/Optional.h"
+#include "llvm/Support/Error.h"
+#include "llvm/Testing/Support/SupportHelpers.h"
+
+#include "gmock/gmock.h"
+#include <ostream>
+
+namespace llvm {
+namespace detail {
+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;
+}
+
+template <typename T> ExpectedHolder<T> TakeExpected(const Expected<T> &Exp) {
+ return TakeExpected(const_cast<Expected<T> &>(Exp));
+}
+} // namespace detail
+
+#define EXPECT_THAT_ERROR(Err, Matcher) \
+ EXPECT_THAT(llvm::detail::TakeError(Err), Matcher)
+#define ASSERT_THAT_ERROR(Err, Matcher) \
+ ASSERT_THAT(llvm::detail::TakeError(Err), Matcher)
+
+#define EXPECT_THAT_EXPECTED(Err, Matcher) \
+ EXPECT_THAT(llvm::detail::TakeExpected(Err), Matcher)
+#define ASSERT_THAT_EXPECTED(Err, Matcher) \
+ ASSERT_THAT(llvm::detail::TakeExpected(Err), Matcher)
+
+MATCHER(Succeeded, "") { return arg.Success; }
+MATCHER(Failed, "") { return !arg.Success; }
+
+MATCHER_P(HasValue, 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);
+ return false;
+ }
+
+ return true;
+}
+} // namespace llvm
+
+#endif