[PATCH] D61071: [Support] Add a GTest matcher for Optional<T>
Ilya Biryukov via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Wed Apr 24 08:36:47 PDT 2019
ilya-biryukov created this revision.
ilya-biryukov added a reviewer: sammccall.
Herald added a project: LLVM.
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D61071
Files:
llvm/include/llvm/Testing/Support/SupportHelpers.h
Index: llvm/include/llvm/Testing/Support/SupportHelpers.h
===================================================================
--- llvm/include/llvm/Testing/Support/SupportHelpers.h
+++ llvm/include/llvm/Testing/Support/SupportHelpers.h
@@ -9,9 +9,11 @@
#ifndef LLVM_TESTING_SUPPORT_SUPPORTHELPERS_H
#define LLVM_TESTING_SUPPORT_SUPPORTHELPERS_H
+#include "llvm/ADT/Optional.h"
#include "llvm/ADT/SmallString.h"
#include "llvm/Support/Error.h"
#include "llvm/Support/raw_os_ostream.h"
+#include "gmock/gmock-matchers.h"
#include "gtest/gtest-printers.h"
#include <string>
@@ -57,7 +59,57 @@
namespace unittest {
SmallString<128> getInputFileDirectory(const char *Argv0);
+
+/// Matches an llvm::Optional<T> with a value that conforms to an inner matcher.
+/// To match llvm::None you could use Eq(llvm::None).
+template <class InnerMatcher> class ValueIsMatcher {
+public:
+ explicit ValueIsMatcher(InnerMatcher ValueMatcher)
+ : ValueMatcher(ValueMatcher) {}
+
+ template <class T>
+ operator ::testing::Matcher<const llvm::Optional<T> &>() const {
+ return ::testing::MakeMatcher(
+ new Impl<T>(::testing::SafeMatcherCast<T>(ValueMatcher)));
+ }
+
+ template <class T>
+ class Impl : public ::testing::MatcherInterface<const llvm::Optional<T> &> {
+ public:
+ explicit Impl(const ::testing::Matcher<T> &ValueMatcher)
+ : ValueMatcher(ValueMatcher) {}
+
+ bool MatchAndExplain(const llvm::Optional<T> &Input,
+ testing::MatchResultListener *L) const override {
+ if (!Input) {
+ *L << "does not have a value";
+ return false;
+ }
+ return ValueMatcher.MatchAndExplain(Input.getValue(), L);
+ }
+
+ void DescribeTo(std::ostream *OS) const override {
+ *OS << "has a value that ";
+ ValueMatcher.DescribeTo(OS);
+ }
+ void DescribeNegationTo(std::ostream *OS) const override {
+ *OS << "does not have a value that ";
+ ValueMatcher.DescribeTo(OS);
+ }
+
+ private:
+ testing::Matcher<T> ValueMatcher;
+ };
+
+private:
+ InnerMatcher ValueMatcher;
+};
+
+template <class InnerMatcher>
+ValueIsMatcher<InnerMatcher> ValueIs(const InnerMatcher &ValueMatcher) {
+ return ValueIsMatcher<InnerMatcher>(ValueMatcher);
}
+} // namespace unittest
} // namespace llvm
#endif
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D61071.196461.patch
Type: text/x-patch
Size: 2313 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20190424/1b591962/attachment.bin>
More information about the llvm-commits
mailing list