[llvm] r359174 - [Support] Add a GTest matcher for Optional<T>
Ilya Biryukov via llvm-commits
llvm-commits at lists.llvm.org
Thu Apr 25 02:03:33 PDT 2019
Author: ibiryukov
Date: Thu Apr 25 02:03:32 2019
New Revision: 359174
URL: http://llvm.org/viewvc/llvm-project?rev=359174&view=rev
Log:
[Support] Add a GTest matcher for Optional<T>
Reviewers: sammccall
Reviewed By: sammccall
Subscribers: mgorny, llvm-commits
Tags: #llvm
Differential Revision: https://reviews.llvm.org/D61071
Added:
llvm/trunk/unittests/Support/MatchersTest.cpp
Modified:
llvm/trunk/include/llvm/Testing/Support/SupportHelpers.h
llvm/trunk/unittests/Support/CMakeLists.txt
Modified: llvm/trunk/include/llvm/Testing/Support/SupportHelpers.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Testing/Support/SupportHelpers.h?rev=359174&r1=359173&r2=359174&view=diff
==============================================================================
--- llvm/trunk/include/llvm/Testing/Support/SupportHelpers.h (original)
+++ llvm/trunk/include/llvm/Testing/Support/SupportHelpers.h Thu Apr 25 02:03:32 2019
@@ -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>
@@ -53,11 +55,56 @@ void PrintTo(const ExpectedHolder<T> &It
PrintTo(static_cast<const ErrorHolder &>(Item), Out);
}
}
+
+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 {
+ return Input && 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;
+};
} // namespace detail
+/// 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>
+detail::ValueIsMatcher<InnerMatcher> ValueIs(const InnerMatcher &ValueMatcher) {
+ return detail::ValueIsMatcher<InnerMatcher>(ValueMatcher);
+}
namespace unittest {
SmallString<128> getInputFileDirectory(const char *Argv0);
-}
+} // namespace unittest
} // namespace llvm
#endif
Modified: llvm/trunk/unittests/Support/CMakeLists.txt
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/Support/CMakeLists.txt?rev=359174&r1=359173&r2=359174&view=diff
==============================================================================
--- llvm/trunk/unittests/Support/CMakeLists.txt (original)
+++ llvm/trunk/unittests/Support/CMakeLists.txt Thu Apr 25 02:03:32 2019
@@ -39,6 +39,7 @@ add_llvm_unittest(SupportTests
LEB128Test.cpp
LineIteratorTest.cpp
LockFileManagerTest.cpp
+ MatchersTest.cpp
MD5Test.cpp
ManagedStatic.cpp
MathExtrasTest.cpp
Added: llvm/trunk/unittests/Support/MatchersTest.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/Support/MatchersTest.cpp?rev=359174&view=auto
==============================================================================
--- llvm/trunk/unittests/Support/MatchersTest.cpp (added)
+++ llvm/trunk/unittests/Support/MatchersTest.cpp Thu Apr 25 02:03:32 2019
@@ -0,0 +1,25 @@
+//===----- unittests/MatchersTest.cpp -------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "llvm/ADT/Optional.h"
+#include "llvm/Testing/Support/SupportHelpers.h"
+#include "gmock/gmock-matchers.h"
+
+using ::testing::_;
+using ::testing::AllOf;
+using ::testing::Gt;
+using ::testing::Lt;
+using ::testing::Not;
+
+namespace {
+TEST(MatchersTest, Optional) {
+ EXPECT_THAT(llvm::Optional<int>(llvm::None), Not(llvm::ValueIs(_)));
+ EXPECT_THAT(llvm::Optional<int>(10), llvm::ValueIs(10));
+ EXPECT_THAT(llvm::Optional<int>(10), llvm::ValueIs(AllOf(Lt(11), Gt(9))));
+}
+} // namespace
More information about the llvm-commits
mailing list