github.com/jlmucb/cloudproxy@v0.0.0-20170830161738-b5aa0b619bc4/src/third_party/googlemock/include/gmock/gmock-generated-function-mockers.h.pump (about)

     1  $$ -*- mode: c++; -*-
     2  $$ This is a Pump source file.  Please use Pump to convert it to
     3  $$ gmock-generated-function-mockers.h.
     4  $$
     5  $var n = 10  $$ The maximum arity we support.
     6  // Copyright 2007, Google Inc.
     7  // All rights reserved.
     8  //
     9  // Redistribution and use in source and binary forms, with or without
    10  // modification, are permitted provided that the following conditions are
    11  // met:
    12  //
    13  //     * Redistributions of source code must retain the above copyright
    14  // notice, this list of conditions and the following disclaimer.
    15  //     * Redistributions in binary form must reproduce the above
    16  // copyright notice, this list of conditions and the following disclaimer
    17  // in the documentation and/or other materials provided with the
    18  // distribution.
    19  //     * Neither the name of Google Inc. nor the names of its
    20  // contributors may be used to endorse or promote products derived from
    21  // this software without specific prior written permission.
    22  //
    23  // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
    24  // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
    25  // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
    26  // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
    27  // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
    28  // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
    29  // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
    30  // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
    31  // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
    32  // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
    33  // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
    34  //
    35  // Author: wan@google.com (Zhanyong Wan)
    36  
    37  // Google Mock - a framework for writing C++ mock classes.
    38  //
    39  // This file implements function mockers of various arities.
    40  
    41  #ifndef GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_FUNCTION_MOCKERS_H_
    42  #define GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_FUNCTION_MOCKERS_H_
    43  
    44  #include "gmock/gmock-spec-builders.h"
    45  #include "gmock/internal/gmock-internal-utils.h"
    46  
    47  namespace testing {
    48  namespace internal {
    49  
    50  template <typename F>
    51  class FunctionMockerBase;
    52  
    53  // Note: class FunctionMocker really belongs to the ::testing
    54  // namespace.  However if we define it in ::testing, MSVC will
    55  // complain when classes in ::testing::internal declare it as a
    56  // friend class template.  To workaround this compiler bug, we define
    57  // FunctionMocker in ::testing::internal and import it into ::testing.
    58  template <typename F>
    59  class FunctionMocker;
    60  
    61  
    62  $range i 0..n
    63  $for i [[
    64  $range j 1..i
    65  $var typename_As = [[$for j [[, typename A$j]]]]
    66  $var As = [[$for j, [[A$j]]]]
    67  $var as = [[$for j, [[a$j]]]]
    68  $var Aas = [[$for j, [[A$j a$j]]]]
    69  $var ms = [[$for j, [[m$j]]]]
    70  $var matchers = [[$for j, [[const Matcher<A$j>& m$j]]]]
    71  template <typename R$typename_As>
    72  class FunctionMocker<R($As)> : public
    73      internal::FunctionMockerBase<R($As)> {
    74   public:
    75    typedef R F($As);
    76    typedef typename internal::Function<F>::ArgumentTuple ArgumentTuple;
    77  
    78    MockSpec<F>& With($matchers) {
    79  
    80  $if i >= 1 [[
    81      this->current_spec().SetMatchers(::std::tr1::make_tuple($ms));
    82  
    83  ]]
    84      return this->current_spec();
    85    }
    86  
    87    R Invoke($Aas) {
    88      // Even though gcc and MSVC don't enforce it, 'this->' is required
    89      // by the C++ standard [14.6.4] here, as the base class type is
    90      // dependent on the template argument (and thus shouldn't be
    91      // looked into when resolving InvokeWith).
    92      return this->InvokeWith(ArgumentTuple($as));
    93    }
    94  };
    95  
    96  
    97  ]]
    98  }  // namespace internal
    99  
   100  // The style guide prohibits "using" statements in a namespace scope
   101  // inside a header file.  However, the FunctionMocker class template
   102  // is meant to be defined in the ::testing namespace.  The following
   103  // line is just a trick for working around a bug in MSVC 8.0, which
   104  // cannot handle it if we define FunctionMocker in ::testing.
   105  using internal::FunctionMocker;
   106  
   107  // GMOCK_RESULT_(tn, F) expands to the result type of function type F.
   108  // We define this as a variadic macro in case F contains unprotected
   109  // commas (the same reason that we use variadic macros in other places
   110  // in this file).
   111  // INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!!
   112  #define GMOCK_RESULT_(tn, ...) \
   113      tn ::testing::internal::Function<__VA_ARGS__>::Result
   114  
   115  // The type of argument N of the given function type.
   116  // INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!!
   117  #define GMOCK_ARG_(tn, N, ...) \
   118      tn ::testing::internal::Function<__VA_ARGS__>::Argument##N
   119  
   120  // The matcher type for argument N of the given function type.
   121  // INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!!
   122  #define GMOCK_MATCHER_(tn, N, ...) \
   123      const ::testing::Matcher<GMOCK_ARG_(tn, N, __VA_ARGS__)>&
   124  
   125  // The variable for mocking the given method.
   126  // INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!!
   127  #define GMOCK_MOCKER_(arity, constness, Method) \
   128      GTEST_CONCAT_TOKEN_(gmock##constness##arity##_##Method##_, __LINE__)
   129  
   130  
   131  $for i [[
   132  $range j 1..i
   133  $var arg_as = [[$for j, \
   134        [[GMOCK_ARG_(tn, $j, __VA_ARGS__) gmock_a$j]]]]
   135  $var as = [[$for j, [[gmock_a$j]]]]
   136  $var matcher_as = [[$for j, \
   137                       [[GMOCK_MATCHER_(tn, $j, __VA_ARGS__) gmock_a$j]]]]
   138  // INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!!
   139  #define GMOCK_METHOD$i[[]]_(tn, constness, ct, Method, ...) \
   140    GMOCK_RESULT_(tn, __VA_ARGS__) ct Method( \
   141        $arg_as) constness { \
   142      GTEST_COMPILE_ASSERT_((::std::tr1::tuple_size<                          \
   143          tn ::testing::internal::Function<__VA_ARGS__>::ArgumentTuple>::value == $i), \
   144          this_method_does_not_take_$i[[]]_argument[[$if i != 1 [[s]]]]); \
   145      GMOCK_MOCKER_($i, constness, Method).SetOwnerAndName(this, #Method); \
   146      return GMOCK_MOCKER_($i, constness, Method).Invoke($as); \
   147    } \
   148    ::testing::MockSpec<__VA_ARGS__>& \
   149        gmock_##Method($matcher_as) constness { \
   150      GMOCK_MOCKER_($i, constness, Method).RegisterOwner(this); \
   151      return GMOCK_MOCKER_($i, constness, Method).With($as); \
   152    } \
   153    mutable ::testing::FunctionMocker<__VA_ARGS__> GMOCK_MOCKER_($i, constness, Method)
   154  
   155  
   156  ]]
   157  $for i [[
   158  #define MOCK_METHOD$i(m, ...) GMOCK_METHOD$i[[]]_(, , , m, __VA_ARGS__)
   159  
   160  ]]
   161  
   162  
   163  $for i [[
   164  #define MOCK_CONST_METHOD$i(m, ...) GMOCK_METHOD$i[[]]_(, const, , m, __VA_ARGS__)
   165  
   166  ]]
   167  
   168  
   169  $for i [[
   170  #define MOCK_METHOD$i[[]]_T(m, ...) GMOCK_METHOD$i[[]]_(typename, , , m, __VA_ARGS__)
   171  
   172  ]]
   173  
   174  
   175  $for i [[
   176  #define MOCK_CONST_METHOD$i[[]]_T(m, ...) \
   177      GMOCK_METHOD$i[[]]_(typename, const, , m, __VA_ARGS__)
   178  
   179  ]]
   180  
   181  
   182  $for i [[
   183  #define MOCK_METHOD$i[[]]_WITH_CALLTYPE(ct, m, ...) \
   184      GMOCK_METHOD$i[[]]_(, , ct, m, __VA_ARGS__)
   185  
   186  ]]
   187  
   188  
   189  $for i [[
   190  #define MOCK_CONST_METHOD$i[[]]_WITH_CALLTYPE(ct, m, ...) \
   191      GMOCK_METHOD$i[[]]_(, const, ct, m, __VA_ARGS__)
   192  
   193  ]]
   194  
   195  
   196  $for i [[
   197  #define MOCK_METHOD$i[[]]_T_WITH_CALLTYPE(ct, m, ...) \
   198      GMOCK_METHOD$i[[]]_(typename, , ct, m, __VA_ARGS__)
   199  
   200  ]]
   201  
   202  
   203  $for i [[
   204  #define MOCK_CONST_METHOD$i[[]]_T_WITH_CALLTYPE(ct, m, ...) \
   205      GMOCK_METHOD$i[[]]_(typename, const, ct, m, __VA_ARGS__)
   206  
   207  ]]
   208  
   209  // A MockFunction<F> class has one mock method whose type is F.  It is
   210  // useful when you just want your test code to emit some messages and
   211  // have Google Mock verify the right messages are sent (and perhaps at
   212  // the right times).  For example, if you are exercising code:
   213  //
   214  //   Foo(1);
   215  //   Foo(2);
   216  //   Foo(3);
   217  //
   218  // and want to verify that Foo(1) and Foo(3) both invoke
   219  // mock.Bar("a"), but Foo(2) doesn't invoke anything, you can write:
   220  //
   221  // TEST(FooTest, InvokesBarCorrectly) {
   222  //   MyMock mock;
   223  //   MockFunction<void(string check_point_name)> check;
   224  //   {
   225  //     InSequence s;
   226  //
   227  //     EXPECT_CALL(mock, Bar("a"));
   228  //     EXPECT_CALL(check, Call("1"));
   229  //     EXPECT_CALL(check, Call("2"));
   230  //     EXPECT_CALL(mock, Bar("a"));
   231  //   }
   232  //   Foo(1);
   233  //   check.Call("1");
   234  //   Foo(2);
   235  //   check.Call("2");
   236  //   Foo(3);
   237  // }
   238  //
   239  // The expectation spec says that the first Bar("a") must happen
   240  // before check point "1", the second Bar("a") must happen after check
   241  // point "2", and nothing should happen between the two check
   242  // points. The explicit check points make it easy to tell which
   243  // Bar("a") is called by which call to Foo().
   244  template <typename F>
   245  class MockFunction;
   246  
   247  
   248  $for i [[
   249  $range j 0..i-1
   250  template <typename R$for j [[, typename A$j]]>
   251  class MockFunction<R($for j, [[A$j]])> {
   252   public:
   253    MockFunction() {}
   254  
   255    MOCK_METHOD$i[[]]_T(Call, R($for j, [[A$j]]));
   256  
   257   private:
   258    GTEST_DISALLOW_COPY_AND_ASSIGN_(MockFunction);
   259  };
   260  
   261  
   262  ]]
   263  }  // namespace testing
   264  
   265  #endif  // GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_FUNCTION_MOCKERS_H_