diff options
-rw-r--r-- | llvm/include/llvm/Testing/Support/SupportHelpers.h | 49 | ||||
-rw-r--r-- | llvm/unittests/Support/CMakeLists.txt | 1 | ||||
-rw-r--r-- | llvm/unittests/Support/MatchersTest.cpp | 25 |
3 files changed, 74 insertions, 1 deletions
diff --git a/llvm/include/llvm/Testing/Support/SupportHelpers.h b/llvm/include/llvm/Testing/Support/SupportHelpers.h index a0f034d50fa..38726b1cfaf 100644 --- a/llvm/include/llvm/Testing/Support/SupportHelpers.h +++ b/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> @@ -53,11 +55,56 @@ void PrintTo(const ExpectedHolder<T> &Item, std::ostream *Out) { 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 diff --git a/llvm/unittests/Support/CMakeLists.txt b/llvm/unittests/Support/CMakeLists.txt index 70fc40d883a..fd839bc90b4 100644 --- a/llvm/unittests/Support/CMakeLists.txt +++ b/llvm/unittests/Support/CMakeLists.txt @@ -39,6 +39,7 @@ add_llvm_unittest(SupportTests LEB128Test.cpp LineIteratorTest.cpp LockFileManagerTest.cpp + MatchersTest.cpp MD5Test.cpp ManagedStatic.cpp MathExtrasTest.cpp diff --git a/llvm/unittests/Support/MatchersTest.cpp b/llvm/unittests/Support/MatchersTest.cpp new file mode 100644 index 00000000000..3248686fba9 --- /dev/null +++ b/llvm/unittests/Support/MatchersTest.cpp @@ -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 |