[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