test/fmw/gtest/googlemock/include/gmock/gmock-spec-builders.h
author neliasso
Tue, 11 Jun 2019 09:27:51 +0200
changeset 55321 ddda023e6f66
parent 55049 4853b1ceb3d6
permissions -rw-r--r--
8225509: clean_catch_blocks must add preds first Reviewed-by: kvn
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
55049
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
     1
// Copyright 2007, Google Inc.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
     2
// All rights reserved.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
     3
//
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
     4
// Redistribution and use in source and binary forms, with or without
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
     5
// modification, are permitted provided that the following conditions are
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
     6
// met:
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
     7
//
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
     8
//     * Redistributions of source code must retain the above copyright
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
     9
// notice, this list of conditions and the following disclaimer.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    10
//     * Redistributions in binary form must reproduce the above
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    11
// copyright notice, this list of conditions and the following disclaimer
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    12
// in the documentation and/or other materials provided with the
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    13
// distribution.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    14
//     * Neither the name of Google Inc. nor the names of its
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    15
// contributors may be used to endorse or promote products derived from
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    16
// this software without specific prior written permission.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    17
//
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    18
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    19
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    20
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    21
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    22
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    23
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    24
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    25
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    26
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    27
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    28
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    29
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    30
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    31
// Google Mock - a framework for writing C++ mock classes.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    32
//
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    33
// This file implements the ON_CALL() and EXPECT_CALL() macros.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    34
//
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    35
// A user can use the ON_CALL() macro to specify the default action of
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    36
// a mock method.  The syntax is:
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    37
//
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    38
//   ON_CALL(mock_object, Method(argument-matchers))
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    39
//       .With(multi-argument-matcher)
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    40
//       .WillByDefault(action);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    41
//
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    42
//  where the .With() clause is optional.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    43
//
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    44
// A user can use the EXPECT_CALL() macro to specify an expectation on
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    45
// a mock method.  The syntax is:
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    46
//
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    47
//   EXPECT_CALL(mock_object, Method(argument-matchers))
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    48
//       .With(multi-argument-matchers)
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    49
//       .Times(cardinality)
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    50
//       .InSequence(sequences)
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    51
//       .After(expectations)
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    52
//       .WillOnce(action)
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    53
//       .WillRepeatedly(action)
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    54
//       .RetiresOnSaturation();
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    55
//
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    56
// where all clauses are optional, and .InSequence()/.After()/
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    57
// .WillOnce() can appear any number of times.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    58
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    59
// GOOGLETEST_CM0002 DO NOT DELETE
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    60
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    61
#ifndef GMOCK_INCLUDE_GMOCK_GMOCK_SPEC_BUILDERS_H_
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    62
#define GMOCK_INCLUDE_GMOCK_GMOCK_SPEC_BUILDERS_H_
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    63
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    64
#include <map>
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    65
#include <set>
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    66
#include <sstream>
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    67
#include <string>
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    68
#include <vector>
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    69
#include "gmock/gmock-actions.h"
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    70
#include "gmock/gmock-cardinalities.h"
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    71
#include "gmock/gmock-matchers.h"
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    72
#include "gmock/internal/gmock-internal-utils.h"
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    73
#include "gmock/internal/gmock-port.h"
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    74
#include "gtest/gtest.h"
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    75
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    76
#if GTEST_HAS_EXCEPTIONS
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    77
# include <stdexcept>  // NOLINT
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    78
#endif
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    79
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    80
GTEST_DISABLE_MSC_WARNINGS_PUSH_(4251 \
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    81
/* class A needs to have dll-interface to be used by clients of class B */)
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    82
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    83
namespace testing {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    84
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    85
// An abstract handle of an expectation.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    86
class Expectation;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    87
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    88
// A set of expectation handles.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    89
class ExpectationSet;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    90
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    91
// Anything inside the 'internal' namespace IS INTERNAL IMPLEMENTATION
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    92
// and MUST NOT BE USED IN USER CODE!!!
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    93
namespace internal {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    94
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    95
// Implements a mock function.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    96
template <typename F> class FunctionMocker;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    97
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    98
// Base class for expectations.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
    99
class ExpectationBase;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   100
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   101
// Implements an expectation.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   102
template <typename F> class TypedExpectation;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   103
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   104
// Helper class for testing the Expectation class template.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   105
class ExpectationTester;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   106
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   107
// Base class for function mockers.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   108
template <typename F> class FunctionMockerBase;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   109
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   110
// Protects the mock object registry (in class Mock), all function
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   111
// mockers, and all expectations.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   112
//
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   113
// The reason we don't use more fine-grained protection is: when a
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   114
// mock function Foo() is called, it needs to consult its expectations
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   115
// to see which one should be picked.  If another thread is allowed to
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   116
// call a mock function (either Foo() or a different one) at the same
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   117
// time, it could affect the "retired" attributes of Foo()'s
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   118
// expectations when InSequence() is used, and thus affect which
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   119
// expectation gets picked.  Therefore, we sequence all mock function
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   120
// calls to ensure the integrity of the mock objects' states.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   121
GTEST_API_ GTEST_DECLARE_STATIC_MUTEX_(g_gmock_mutex);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   122
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   123
// Untyped base class for ActionResultHolder<R>.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   124
class UntypedActionResultHolderBase;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   125
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   126
// Abstract base class of FunctionMockerBase.  This is the
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   127
// type-agnostic part of the function mocker interface.  Its pure
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   128
// virtual methods are implemented by FunctionMockerBase.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   129
class GTEST_API_ UntypedFunctionMockerBase {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   130
 public:
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   131
  UntypedFunctionMockerBase();
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   132
  virtual ~UntypedFunctionMockerBase();
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   133
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   134
  // Verifies that all expectations on this mock function have been
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   135
  // satisfied.  Reports one or more Google Test non-fatal failures
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   136
  // and returns false if not.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   137
  bool VerifyAndClearExpectationsLocked()
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   138
      GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   139
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   140
  // Clears the ON_CALL()s set on this mock function.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   141
  virtual void ClearDefaultActionsLocked()
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   142
      GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex) = 0;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   143
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   144
  // In all of the following Untyped* functions, it's the caller's
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   145
  // responsibility to guarantee the correctness of the arguments'
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   146
  // types.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   147
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   148
  // Performs the default action with the given arguments and returns
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   149
  // the action's result.  The call description string will be used in
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   150
  // the error message to describe the call in the case the default
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   151
  // action fails.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   152
  // L = *
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   153
  virtual UntypedActionResultHolderBase* UntypedPerformDefaultAction(
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   154
      void* untyped_args, const std::string& call_description) const = 0;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   155
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   156
  // Performs the given action with the given arguments and returns
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   157
  // the action's result.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   158
  // L = *
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   159
  virtual UntypedActionResultHolderBase* UntypedPerformAction(
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   160
      const void* untyped_action, void* untyped_args) const = 0;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   161
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   162
  // Writes a message that the call is uninteresting (i.e. neither
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   163
  // explicitly expected nor explicitly unexpected) to the given
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   164
  // ostream.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   165
  virtual void UntypedDescribeUninterestingCall(
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   166
      const void* untyped_args,
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   167
      ::std::ostream* os) const
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   168
          GTEST_LOCK_EXCLUDED_(g_gmock_mutex) = 0;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   169
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   170
  // Returns the expectation that matches the given function arguments
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   171
  // (or NULL is there's no match); when a match is found,
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   172
  // untyped_action is set to point to the action that should be
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   173
  // performed (or NULL if the action is "do default"), and
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   174
  // is_excessive is modified to indicate whether the call exceeds the
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   175
  // expected number.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   176
  virtual const ExpectationBase* UntypedFindMatchingExpectation(
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   177
      const void* untyped_args,
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   178
      const void** untyped_action, bool* is_excessive,
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   179
      ::std::ostream* what, ::std::ostream* why)
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   180
          GTEST_LOCK_EXCLUDED_(g_gmock_mutex) = 0;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   181
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   182
  // Prints the given function arguments to the ostream.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   183
  virtual void UntypedPrintArgs(const void* untyped_args,
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   184
                                ::std::ostream* os) const = 0;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   185
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   186
  // Sets the mock object this mock method belongs to, and registers
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   187
  // this information in the global mock registry.  Will be called
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   188
  // whenever an EXPECT_CALL() or ON_CALL() is executed on this mock
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   189
  // method.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   190
  // FIXME: rename to SetAndRegisterOwner().
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   191
  void RegisterOwner(const void* mock_obj)
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   192
      GTEST_LOCK_EXCLUDED_(g_gmock_mutex);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   193
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   194
  // Sets the mock object this mock method belongs to, and sets the
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   195
  // name of the mock function.  Will be called upon each invocation
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   196
  // of this mock function.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   197
  void SetOwnerAndName(const void* mock_obj, const char* name)
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   198
      GTEST_LOCK_EXCLUDED_(g_gmock_mutex);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   199
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   200
  // Returns the mock object this mock method belongs to.  Must be
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   201
  // called after RegisterOwner() or SetOwnerAndName() has been
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   202
  // called.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   203
  const void* MockObject() const
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   204
      GTEST_LOCK_EXCLUDED_(g_gmock_mutex);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   205
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   206
  // Returns the name of this mock method.  Must be called after
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   207
  // SetOwnerAndName() has been called.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   208
  const char* Name() const
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   209
      GTEST_LOCK_EXCLUDED_(g_gmock_mutex);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   210
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   211
  // Returns the result of invoking this mock function with the given
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   212
  // arguments.  This function can be safely called from multiple
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   213
  // threads concurrently.  The caller is responsible for deleting the
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   214
  // result.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   215
  UntypedActionResultHolderBase* UntypedInvokeWith(void* untyped_args)
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   216
      GTEST_LOCK_EXCLUDED_(g_gmock_mutex);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   217
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   218
 protected:
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   219
  typedef std::vector<const void*> UntypedOnCallSpecs;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   220
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   221
  typedef std::vector<internal::linked_ptr<ExpectationBase> >
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   222
  UntypedExpectations;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   223
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   224
  // Returns an Expectation object that references and co-owns exp,
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   225
  // which must be an expectation on this mock function.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   226
  Expectation GetHandleOf(ExpectationBase* exp);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   227
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   228
  // Address of the mock object this mock method belongs to.  Only
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   229
  // valid after this mock method has been called or
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   230
  // ON_CALL/EXPECT_CALL has been invoked on it.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   231
  const void* mock_obj_;  // Protected by g_gmock_mutex.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   232
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   233
  // Name of the function being mocked.  Only valid after this mock
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   234
  // method has been called.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   235
  const char* name_;  // Protected by g_gmock_mutex.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   236
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   237
  // All default action specs for this function mocker.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   238
  UntypedOnCallSpecs untyped_on_call_specs_;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   239
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   240
  // All expectations for this function mocker.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   241
  //
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   242
  // It's undefined behavior to interleave expectations (EXPECT_CALLs
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   243
  // or ON_CALLs) and mock function calls.  Also, the order of
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   244
  // expectations is important.  Therefore it's a logic race condition
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   245
  // to read/write untyped_expectations_ concurrently.  In order for
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   246
  // tools like tsan to catch concurrent read/write accesses to
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   247
  // untyped_expectations, we deliberately leave accesses to it
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   248
  // unprotected.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   249
  UntypedExpectations untyped_expectations_;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   250
};  // class UntypedFunctionMockerBase
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   251
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   252
// Untyped base class for OnCallSpec<F>.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   253
class UntypedOnCallSpecBase {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   254
 public:
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   255
  // The arguments are the location of the ON_CALL() statement.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   256
  UntypedOnCallSpecBase(const char* a_file, int a_line)
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   257
      : file_(a_file), line_(a_line), last_clause_(kNone) {}
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   258
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   259
  // Where in the source file was the default action spec defined?
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   260
  const char* file() const { return file_; }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   261
  int line() const { return line_; }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   262
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   263
 protected:
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   264
  // Gives each clause in the ON_CALL() statement a name.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   265
  enum Clause {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   266
    // Do not change the order of the enum members!  The run-time
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   267
    // syntax checking relies on it.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   268
    kNone,
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   269
    kWith,
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   270
    kWillByDefault
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   271
  };
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   272
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   273
  // Asserts that the ON_CALL() statement has a certain property.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   274
  void AssertSpecProperty(bool property,
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   275
                          const std::string& failure_message) const {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   276
    Assert(property, file_, line_, failure_message);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   277
  }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   278
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   279
  // Expects that the ON_CALL() statement has a certain property.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   280
  void ExpectSpecProperty(bool property,
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   281
                          const std::string& failure_message) const {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   282
    Expect(property, file_, line_, failure_message);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   283
  }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   284
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   285
  const char* file_;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   286
  int line_;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   287
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   288
  // The last clause in the ON_CALL() statement as seen so far.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   289
  // Initially kNone and changes as the statement is parsed.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   290
  Clause last_clause_;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   291
};  // class UntypedOnCallSpecBase
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   292
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   293
// This template class implements an ON_CALL spec.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   294
template <typename F>
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   295
class OnCallSpec : public UntypedOnCallSpecBase {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   296
 public:
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   297
  typedef typename Function<F>::ArgumentTuple ArgumentTuple;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   298
  typedef typename Function<F>::ArgumentMatcherTuple ArgumentMatcherTuple;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   299
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   300
  // Constructs an OnCallSpec object from the information inside
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   301
  // the parenthesis of an ON_CALL() statement.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   302
  OnCallSpec(const char* a_file, int a_line,
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   303
             const ArgumentMatcherTuple& matchers)
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   304
      : UntypedOnCallSpecBase(a_file, a_line),
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   305
        matchers_(matchers),
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   306
        // By default, extra_matcher_ should match anything.  However,
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   307
        // we cannot initialize it with _ as that triggers a compiler
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   308
        // bug in Symbian's C++ compiler (cannot decide between two
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   309
        // overloaded constructors of Matcher<const ArgumentTuple&>).
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   310
        extra_matcher_(A<const ArgumentTuple&>()) {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   311
  }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   312
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   313
  // Implements the .With() clause.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   314
  OnCallSpec& With(const Matcher<const ArgumentTuple&>& m) {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   315
    // Makes sure this is called at most once.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   316
    ExpectSpecProperty(last_clause_ < kWith,
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   317
                       ".With() cannot appear "
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   318
                       "more than once in an ON_CALL().");
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   319
    last_clause_ = kWith;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   320
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   321
    extra_matcher_ = m;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   322
    return *this;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   323
  }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   324
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   325
  // Implements the .WillByDefault() clause.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   326
  OnCallSpec& WillByDefault(const Action<F>& action) {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   327
    ExpectSpecProperty(last_clause_ < kWillByDefault,
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   328
                       ".WillByDefault() must appear "
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   329
                       "exactly once in an ON_CALL().");
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   330
    last_clause_ = kWillByDefault;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   331
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   332
    ExpectSpecProperty(!action.IsDoDefault(),
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   333
                       "DoDefault() cannot be used in ON_CALL().");
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   334
    action_ = action;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   335
    return *this;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   336
  }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   337
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   338
  // Returns true iff the given arguments match the matchers.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   339
  bool Matches(const ArgumentTuple& args) const {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   340
    return TupleMatches(matchers_, args) && extra_matcher_.Matches(args);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   341
  }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   342
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   343
  // Returns the action specified by the user.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   344
  const Action<F>& GetAction() const {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   345
    AssertSpecProperty(last_clause_ == kWillByDefault,
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   346
                       ".WillByDefault() must appear exactly "
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   347
                       "once in an ON_CALL().");
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   348
    return action_;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   349
  }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   350
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   351
 private:
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   352
  // The information in statement
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   353
  //
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   354
  //   ON_CALL(mock_object, Method(matchers))
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   355
  //       .With(multi-argument-matcher)
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   356
  //       .WillByDefault(action);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   357
  //
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   358
  // is recorded in the data members like this:
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   359
  //
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   360
  //   source file that contains the statement => file_
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   361
  //   line number of the statement            => line_
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   362
  //   matchers                                => matchers_
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   363
  //   multi-argument-matcher                  => extra_matcher_
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   364
  //   action                                  => action_
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   365
  ArgumentMatcherTuple matchers_;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   366
  Matcher<const ArgumentTuple&> extra_matcher_;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   367
  Action<F> action_;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   368
};  // class OnCallSpec
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   369
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   370
// Possible reactions on uninteresting calls.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   371
enum CallReaction {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   372
  kAllow,
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   373
  kWarn,
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   374
  kFail,
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   375
};
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   376
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   377
}  // namespace internal
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   378
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   379
// Utilities for manipulating mock objects.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   380
class GTEST_API_ Mock {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   381
 public:
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   382
  // The following public methods can be called concurrently.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   383
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   384
  // Tells Google Mock to ignore mock_obj when checking for leaked
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   385
  // mock objects.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   386
  static void AllowLeak(const void* mock_obj)
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   387
      GTEST_LOCK_EXCLUDED_(internal::g_gmock_mutex);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   388
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   389
  // Verifies and clears all expectations on the given mock object.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   390
  // If the expectations aren't satisfied, generates one or more
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   391
  // Google Test non-fatal failures and returns false.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   392
  static bool VerifyAndClearExpectations(void* mock_obj)
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   393
      GTEST_LOCK_EXCLUDED_(internal::g_gmock_mutex);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   394
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   395
  // Verifies all expectations on the given mock object and clears its
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   396
  // default actions and expectations.  Returns true iff the
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   397
  // verification was successful.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   398
  static bool VerifyAndClear(void* mock_obj)
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   399
      GTEST_LOCK_EXCLUDED_(internal::g_gmock_mutex);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   400
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   401
 private:
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   402
  friend class internal::UntypedFunctionMockerBase;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   403
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   404
  // Needed for a function mocker to register itself (so that we know
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   405
  // how to clear a mock object).
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   406
  template <typename F>
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   407
  friend class internal::FunctionMockerBase;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   408
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   409
  template <typename M>
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   410
  friend class NiceMock;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   411
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   412
  template <typename M>
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   413
  friend class NaggyMock;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   414
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   415
  template <typename M>
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   416
  friend class StrictMock;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   417
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   418
  // Tells Google Mock to allow uninteresting calls on the given mock
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   419
  // object.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   420
  static void AllowUninterestingCalls(const void* mock_obj)
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   421
      GTEST_LOCK_EXCLUDED_(internal::g_gmock_mutex);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   422
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   423
  // Tells Google Mock to warn the user about uninteresting calls on
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   424
  // the given mock object.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   425
  static void WarnUninterestingCalls(const void* mock_obj)
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   426
      GTEST_LOCK_EXCLUDED_(internal::g_gmock_mutex);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   427
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   428
  // Tells Google Mock to fail uninteresting calls on the given mock
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   429
  // object.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   430
  static void FailUninterestingCalls(const void* mock_obj)
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   431
      GTEST_LOCK_EXCLUDED_(internal::g_gmock_mutex);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   432
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   433
  // Tells Google Mock the given mock object is being destroyed and
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   434
  // its entry in the call-reaction table should be removed.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   435
  static void UnregisterCallReaction(const void* mock_obj)
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   436
      GTEST_LOCK_EXCLUDED_(internal::g_gmock_mutex);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   437
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   438
  // Returns the reaction Google Mock will have on uninteresting calls
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   439
  // made on the given mock object.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   440
  static internal::CallReaction GetReactionOnUninterestingCalls(
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   441
      const void* mock_obj)
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   442
          GTEST_LOCK_EXCLUDED_(internal::g_gmock_mutex);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   443
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   444
  // Verifies that all expectations on the given mock object have been
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   445
  // satisfied.  Reports one or more Google Test non-fatal failures
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   446
  // and returns false if not.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   447
  static bool VerifyAndClearExpectationsLocked(void* mock_obj)
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   448
      GTEST_EXCLUSIVE_LOCK_REQUIRED_(internal::g_gmock_mutex);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   449
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   450
  // Clears all ON_CALL()s set on the given mock object.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   451
  static void ClearDefaultActionsLocked(void* mock_obj)
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   452
      GTEST_EXCLUSIVE_LOCK_REQUIRED_(internal::g_gmock_mutex);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   453
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   454
  // Registers a mock object and a mock method it owns.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   455
  static void Register(
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   456
      const void* mock_obj,
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   457
      internal::UntypedFunctionMockerBase* mocker)
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   458
          GTEST_LOCK_EXCLUDED_(internal::g_gmock_mutex);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   459
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   460
  // Tells Google Mock where in the source code mock_obj is used in an
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   461
  // ON_CALL or EXPECT_CALL.  In case mock_obj is leaked, this
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   462
  // information helps the user identify which object it is.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   463
  static void RegisterUseByOnCallOrExpectCall(
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   464
      const void* mock_obj, const char* file, int line)
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   465
          GTEST_LOCK_EXCLUDED_(internal::g_gmock_mutex);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   466
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   467
  // Unregisters a mock method; removes the owning mock object from
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   468
  // the registry when the last mock method associated with it has
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   469
  // been unregistered.  This is called only in the destructor of
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   470
  // FunctionMockerBase.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   471
  static void UnregisterLocked(internal::UntypedFunctionMockerBase* mocker)
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   472
      GTEST_EXCLUSIVE_LOCK_REQUIRED_(internal::g_gmock_mutex);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   473
};  // class Mock
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   474
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   475
// An abstract handle of an expectation.  Useful in the .After()
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   476
// clause of EXPECT_CALL() for setting the (partial) order of
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   477
// expectations.  The syntax:
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   478
//
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   479
//   Expectation e1 = EXPECT_CALL(...)...;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   480
//   EXPECT_CALL(...).After(e1)...;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   481
//
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   482
// sets two expectations where the latter can only be matched after
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   483
// the former has been satisfied.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   484
//
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   485
// Notes:
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   486
//   - This class is copyable and has value semantics.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   487
//   - Constness is shallow: a const Expectation object itself cannot
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   488
//     be modified, but the mutable methods of the ExpectationBase
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   489
//     object it references can be called via expectation_base().
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   490
//   - The constructors and destructor are defined out-of-line because
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   491
//     the Symbian WINSCW compiler wants to otherwise instantiate them
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   492
//     when it sees this class definition, at which point it doesn't have
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   493
//     ExpectationBase available yet, leading to incorrect destruction
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   494
//     in the linked_ptr (or compilation errors if using a checking
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   495
//     linked_ptr).
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   496
class GTEST_API_ Expectation {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   497
 public:
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   498
  // Constructs a null object that doesn't reference any expectation.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   499
  Expectation();
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   500
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   501
  ~Expectation();
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   502
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   503
  // This single-argument ctor must not be explicit, in order to support the
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   504
  //   Expectation e = EXPECT_CALL(...);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   505
  // syntax.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   506
  //
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   507
  // A TypedExpectation object stores its pre-requisites as
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   508
  // Expectation objects, and needs to call the non-const Retire()
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   509
  // method on the ExpectationBase objects they reference.  Therefore
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   510
  // Expectation must receive a *non-const* reference to the
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   511
  // ExpectationBase object.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   512
  Expectation(internal::ExpectationBase& exp);  // NOLINT
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   513
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   514
  // The compiler-generated copy ctor and operator= work exactly as
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   515
  // intended, so we don't need to define our own.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   516
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   517
  // Returns true iff rhs references the same expectation as this object does.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   518
  bool operator==(const Expectation& rhs) const {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   519
    return expectation_base_ == rhs.expectation_base_;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   520
  }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   521
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   522
  bool operator!=(const Expectation& rhs) const { return !(*this == rhs); }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   523
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   524
 private:
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   525
  friend class ExpectationSet;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   526
  friend class Sequence;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   527
  friend class ::testing::internal::ExpectationBase;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   528
  friend class ::testing::internal::UntypedFunctionMockerBase;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   529
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   530
  template <typename F>
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   531
  friend class ::testing::internal::FunctionMockerBase;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   532
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   533
  template <typename F>
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   534
  friend class ::testing::internal::TypedExpectation;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   535
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   536
  // This comparator is needed for putting Expectation objects into a set.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   537
  class Less {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   538
   public:
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   539
    bool operator()(const Expectation& lhs, const Expectation& rhs) const {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   540
      return lhs.expectation_base_.get() < rhs.expectation_base_.get();
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   541
    }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   542
  };
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   543
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   544
  typedef ::std::set<Expectation, Less> Set;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   545
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   546
  Expectation(
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   547
      const internal::linked_ptr<internal::ExpectationBase>& expectation_base);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   548
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   549
  // Returns the expectation this object references.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   550
  const internal::linked_ptr<internal::ExpectationBase>&
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   551
  expectation_base() const {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   552
    return expectation_base_;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   553
  }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   554
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   555
  // A linked_ptr that co-owns the expectation this handle references.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   556
  internal::linked_ptr<internal::ExpectationBase> expectation_base_;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   557
};
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   558
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   559
// A set of expectation handles.  Useful in the .After() clause of
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   560
// EXPECT_CALL() for setting the (partial) order of expectations.  The
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   561
// syntax:
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   562
//
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   563
//   ExpectationSet es;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   564
//   es += EXPECT_CALL(...)...;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   565
//   es += EXPECT_CALL(...)...;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   566
//   EXPECT_CALL(...).After(es)...;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   567
//
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   568
// sets three expectations where the last one can only be matched
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   569
// after the first two have both been satisfied.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   570
//
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   571
// This class is copyable and has value semantics.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   572
class ExpectationSet {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   573
 public:
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   574
  // A bidirectional iterator that can read a const element in the set.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   575
  typedef Expectation::Set::const_iterator const_iterator;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   576
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   577
  // An object stored in the set.  This is an alias of Expectation.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   578
  typedef Expectation::Set::value_type value_type;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   579
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   580
  // Constructs an empty set.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   581
  ExpectationSet() {}
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   582
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   583
  // This single-argument ctor must not be explicit, in order to support the
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   584
  //   ExpectationSet es = EXPECT_CALL(...);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   585
  // syntax.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   586
  ExpectationSet(internal::ExpectationBase& exp) {  // NOLINT
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   587
    *this += Expectation(exp);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   588
  }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   589
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   590
  // This single-argument ctor implements implicit conversion from
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   591
  // Expectation and thus must not be explicit.  This allows either an
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   592
  // Expectation or an ExpectationSet to be used in .After().
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   593
  ExpectationSet(const Expectation& e) {  // NOLINT
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   594
    *this += e;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   595
  }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   596
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   597
  // The compiler-generator ctor and operator= works exactly as
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   598
  // intended, so we don't need to define our own.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   599
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   600
  // Returns true iff rhs contains the same set of Expectation objects
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   601
  // as this does.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   602
  bool operator==(const ExpectationSet& rhs) const {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   603
    return expectations_ == rhs.expectations_;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   604
  }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   605
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   606
  bool operator!=(const ExpectationSet& rhs) const { return !(*this == rhs); }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   607
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   608
  // Implements the syntax
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   609
  //   expectation_set += EXPECT_CALL(...);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   610
  ExpectationSet& operator+=(const Expectation& e) {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   611
    expectations_.insert(e);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   612
    return *this;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   613
  }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   614
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   615
  int size() const { return static_cast<int>(expectations_.size()); }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   616
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   617
  const_iterator begin() const { return expectations_.begin(); }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   618
  const_iterator end() const { return expectations_.end(); }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   619
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   620
 private:
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   621
  Expectation::Set expectations_;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   622
};
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   623
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   624
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   625
// Sequence objects are used by a user to specify the relative order
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   626
// in which the expectations should match.  They are copyable (we rely
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   627
// on the compiler-defined copy constructor and assignment operator).
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   628
class GTEST_API_ Sequence {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   629
 public:
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   630
  // Constructs an empty sequence.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   631
  Sequence() : last_expectation_(new Expectation) {}
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   632
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   633
  // Adds an expectation to this sequence.  The caller must ensure
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   634
  // that no other thread is accessing this Sequence object.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   635
  void AddExpectation(const Expectation& expectation) const;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   636
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   637
 private:
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   638
  // The last expectation in this sequence.  We use a linked_ptr here
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   639
  // because Sequence objects are copyable and we want the copies to
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   640
  // be aliases.  The linked_ptr allows the copies to co-own and share
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   641
  // the same Expectation object.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   642
  internal::linked_ptr<Expectation> last_expectation_;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   643
};  // class Sequence
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   644
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   645
// An object of this type causes all EXPECT_CALL() statements
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   646
// encountered in its scope to be put in an anonymous sequence.  The
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   647
// work is done in the constructor and destructor.  You should only
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   648
// create an InSequence object on the stack.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   649
//
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   650
// The sole purpose for this class is to support easy definition of
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   651
// sequential expectations, e.g.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   652
//
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   653
//   {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   654
//     InSequence dummy;  // The name of the object doesn't matter.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   655
//
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   656
//     // The following expectations must match in the order they appear.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   657
//     EXPECT_CALL(a, Bar())...;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   658
//     EXPECT_CALL(a, Baz())...;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   659
//     ...
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   660
//     EXPECT_CALL(b, Xyz())...;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   661
//   }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   662
//
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   663
// You can create InSequence objects in multiple threads, as long as
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   664
// they are used to affect different mock objects.  The idea is that
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   665
// each thread can create and set up its own mocks as if it's the only
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   666
// thread.  However, for clarity of your tests we recommend you to set
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   667
// up mocks in the main thread unless you have a good reason not to do
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   668
// so.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   669
class GTEST_API_ InSequence {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   670
 public:
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   671
  InSequence();
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   672
  ~InSequence();
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   673
 private:
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   674
  bool sequence_created_;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   675
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   676
  GTEST_DISALLOW_COPY_AND_ASSIGN_(InSequence);  // NOLINT
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   677
} GTEST_ATTRIBUTE_UNUSED_;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   678
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   679
namespace internal {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   680
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   681
// Points to the implicit sequence introduced by a living InSequence
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   682
// object (if any) in the current thread or NULL.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   683
GTEST_API_ extern ThreadLocal<Sequence*> g_gmock_implicit_sequence;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   684
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   685
// Base class for implementing expectations.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   686
//
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   687
// There are two reasons for having a type-agnostic base class for
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   688
// Expectation:
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   689
//
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   690
//   1. We need to store collections of expectations of different
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   691
//   types (e.g. all pre-requisites of a particular expectation, all
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   692
//   expectations in a sequence).  Therefore these expectation objects
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   693
//   must share a common base class.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   694
//
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   695
//   2. We can avoid binary code bloat by moving methods not depending
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   696
//   on the template argument of Expectation to the base class.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   697
//
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   698
// This class is internal and mustn't be used by user code directly.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   699
class GTEST_API_ ExpectationBase {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   700
 public:
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   701
  // source_text is the EXPECT_CALL(...) source that created this Expectation.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   702
  ExpectationBase(const char* file, int line, const std::string& source_text);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   703
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   704
  virtual ~ExpectationBase();
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   705
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   706
  // Where in the source file was the expectation spec defined?
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   707
  const char* file() const { return file_; }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   708
  int line() const { return line_; }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   709
  const char* source_text() const { return source_text_.c_str(); }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   710
  // Returns the cardinality specified in the expectation spec.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   711
  const Cardinality& cardinality() const { return cardinality_; }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   712
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   713
  // Describes the source file location of this expectation.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   714
  void DescribeLocationTo(::std::ostream* os) const {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   715
    *os << FormatFileLocation(file(), line()) << " ";
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   716
  }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   717
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   718
  // Describes how many times a function call matching this
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   719
  // expectation has occurred.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   720
  void DescribeCallCountTo(::std::ostream* os) const
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   721
      GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   722
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   723
  // If this mock method has an extra matcher (i.e. .With(matcher)),
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   724
  // describes it to the ostream.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   725
  virtual void MaybeDescribeExtraMatcherTo(::std::ostream* os) = 0;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   726
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   727
 protected:
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   728
  friend class ::testing::Expectation;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   729
  friend class UntypedFunctionMockerBase;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   730
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   731
  enum Clause {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   732
    // Don't change the order of the enum members!
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   733
    kNone,
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   734
    kWith,
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   735
    kTimes,
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   736
    kInSequence,
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   737
    kAfter,
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   738
    kWillOnce,
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   739
    kWillRepeatedly,
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   740
    kRetiresOnSaturation
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   741
  };
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   742
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   743
  typedef std::vector<const void*> UntypedActions;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   744
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   745
  // Returns an Expectation object that references and co-owns this
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   746
  // expectation.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   747
  virtual Expectation GetHandle() = 0;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   748
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   749
  // Asserts that the EXPECT_CALL() statement has the given property.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   750
  void AssertSpecProperty(bool property,
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   751
                          const std::string& failure_message) const {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   752
    Assert(property, file_, line_, failure_message);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   753
  }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   754
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   755
  // Expects that the EXPECT_CALL() statement has the given property.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   756
  void ExpectSpecProperty(bool property,
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   757
                          const std::string& failure_message) const {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   758
    Expect(property, file_, line_, failure_message);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   759
  }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   760
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   761
  // Explicitly specifies the cardinality of this expectation.  Used
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   762
  // by the subclasses to implement the .Times() clause.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   763
  void SpecifyCardinality(const Cardinality& cardinality);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   764
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   765
  // Returns true iff the user specified the cardinality explicitly
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   766
  // using a .Times().
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   767
  bool cardinality_specified() const { return cardinality_specified_; }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   768
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   769
  // Sets the cardinality of this expectation spec.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   770
  void set_cardinality(const Cardinality& a_cardinality) {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   771
    cardinality_ = a_cardinality;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   772
  }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   773
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   774
  // The following group of methods should only be called after the
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   775
  // EXPECT_CALL() statement, and only when g_gmock_mutex is held by
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   776
  // the current thread.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   777
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   778
  // Retires all pre-requisites of this expectation.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   779
  void RetireAllPreRequisites()
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   780
      GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   781
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   782
  // Returns true iff this expectation is retired.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   783
  bool is_retired() const
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   784
      GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex) {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   785
    g_gmock_mutex.AssertHeld();
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   786
    return retired_;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   787
  }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   788
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   789
  // Retires this expectation.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   790
  void Retire()
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   791
      GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex) {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   792
    g_gmock_mutex.AssertHeld();
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   793
    retired_ = true;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   794
  }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   795
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   796
  // Returns true iff this expectation is satisfied.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   797
  bool IsSatisfied() const
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   798
      GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex) {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   799
    g_gmock_mutex.AssertHeld();
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   800
    return cardinality().IsSatisfiedByCallCount(call_count_);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   801
  }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   802
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   803
  // Returns true iff this expectation is saturated.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   804
  bool IsSaturated() const
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   805
      GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex) {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   806
    g_gmock_mutex.AssertHeld();
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   807
    return cardinality().IsSaturatedByCallCount(call_count_);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   808
  }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   809
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   810
  // Returns true iff this expectation is over-saturated.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   811
  bool IsOverSaturated() const
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   812
      GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex) {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   813
    g_gmock_mutex.AssertHeld();
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   814
    return cardinality().IsOverSaturatedByCallCount(call_count_);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   815
  }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   816
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   817
  // Returns true iff all pre-requisites of this expectation are satisfied.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   818
  bool AllPrerequisitesAreSatisfied() const
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   819
      GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   820
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   821
  // Adds unsatisfied pre-requisites of this expectation to 'result'.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   822
  void FindUnsatisfiedPrerequisites(ExpectationSet* result) const
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   823
      GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   824
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   825
  // Returns the number this expectation has been invoked.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   826
  int call_count() const
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   827
      GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex) {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   828
    g_gmock_mutex.AssertHeld();
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   829
    return call_count_;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   830
  }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   831
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   832
  // Increments the number this expectation has been invoked.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   833
  void IncrementCallCount()
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   834
      GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex) {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   835
    g_gmock_mutex.AssertHeld();
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   836
    call_count_++;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   837
  }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   838
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   839
  // Checks the action count (i.e. the number of WillOnce() and
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   840
  // WillRepeatedly() clauses) against the cardinality if this hasn't
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   841
  // been done before.  Prints a warning if there are too many or too
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   842
  // few actions.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   843
  void CheckActionCountIfNotDone() const
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   844
      GTEST_LOCK_EXCLUDED_(mutex_);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   845
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   846
  friend class ::testing::Sequence;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   847
  friend class ::testing::internal::ExpectationTester;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   848
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   849
  template <typename Function>
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   850
  friend class TypedExpectation;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   851
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   852
  // Implements the .Times() clause.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   853
  void UntypedTimes(const Cardinality& a_cardinality);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   854
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   855
  // This group of fields are part of the spec and won't change after
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   856
  // an EXPECT_CALL() statement finishes.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   857
  const char* file_;          // The file that contains the expectation.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   858
  int line_;                  // The line number of the expectation.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   859
  const std::string source_text_;  // The EXPECT_CALL(...) source text.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   860
  // True iff the cardinality is specified explicitly.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   861
  bool cardinality_specified_;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   862
  Cardinality cardinality_;            // The cardinality of the expectation.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   863
  // The immediate pre-requisites (i.e. expectations that must be
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   864
  // satisfied before this expectation can be matched) of this
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   865
  // expectation.  We use linked_ptr in the set because we want an
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   866
  // Expectation object to be co-owned by its FunctionMocker and its
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   867
  // successors.  This allows multiple mock objects to be deleted at
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   868
  // different times.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   869
  ExpectationSet immediate_prerequisites_;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   870
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   871
  // This group of fields are the current state of the expectation,
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   872
  // and can change as the mock function is called.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   873
  int call_count_;  // How many times this expectation has been invoked.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   874
  bool retired_;    // True iff this expectation has retired.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   875
  UntypedActions untyped_actions_;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   876
  bool extra_matcher_specified_;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   877
  bool repeated_action_specified_;  // True if a WillRepeatedly() was specified.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   878
  bool retires_on_saturation_;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   879
  Clause last_clause_;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   880
  mutable bool action_count_checked_;  // Under mutex_.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   881
  mutable Mutex mutex_;  // Protects action_count_checked_.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   882
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   883
  GTEST_DISALLOW_ASSIGN_(ExpectationBase);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   884
};  // class ExpectationBase
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   885
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   886
// Impements an expectation for the given function type.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   887
template <typename F>
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   888
class TypedExpectation : public ExpectationBase {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   889
 public:
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   890
  typedef typename Function<F>::ArgumentTuple ArgumentTuple;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   891
  typedef typename Function<F>::ArgumentMatcherTuple ArgumentMatcherTuple;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   892
  typedef typename Function<F>::Result Result;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   893
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   894
  TypedExpectation(FunctionMockerBase<F>* owner, const char* a_file, int a_line,
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   895
                   const std::string& a_source_text,
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   896
                   const ArgumentMatcherTuple& m)
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   897
      : ExpectationBase(a_file, a_line, a_source_text),
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   898
        owner_(owner),
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   899
        matchers_(m),
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   900
        // By default, extra_matcher_ should match anything.  However,
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   901
        // we cannot initialize it with _ as that triggers a compiler
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   902
        // bug in Symbian's C++ compiler (cannot decide between two
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   903
        // overloaded constructors of Matcher<const ArgumentTuple&>).
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   904
        extra_matcher_(A<const ArgumentTuple&>()),
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   905
        repeated_action_(DoDefault()) {}
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   906
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   907
  virtual ~TypedExpectation() {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   908
    // Check the validity of the action count if it hasn't been done
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   909
    // yet (for example, if the expectation was never used).
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   910
    CheckActionCountIfNotDone();
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   911
    for (UntypedActions::const_iterator it = untyped_actions_.begin();
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   912
         it != untyped_actions_.end(); ++it) {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   913
      delete static_cast<const Action<F>*>(*it);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   914
    }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   915
  }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   916
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   917
  // Implements the .With() clause.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   918
  TypedExpectation& With(const Matcher<const ArgumentTuple&>& m) {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   919
    if (last_clause_ == kWith) {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   920
      ExpectSpecProperty(false,
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   921
                         ".With() cannot appear "
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   922
                         "more than once in an EXPECT_CALL().");
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   923
    } else {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   924
      ExpectSpecProperty(last_clause_ < kWith,
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   925
                         ".With() must be the first "
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   926
                         "clause in an EXPECT_CALL().");
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   927
    }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   928
    last_clause_ = kWith;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   929
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   930
    extra_matcher_ = m;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   931
    extra_matcher_specified_ = true;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   932
    return *this;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   933
  }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   934
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   935
  // Implements the .Times() clause.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   936
  TypedExpectation& Times(const Cardinality& a_cardinality) {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   937
    ExpectationBase::UntypedTimes(a_cardinality);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   938
    return *this;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   939
  }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   940
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   941
  // Implements the .Times() clause.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   942
  TypedExpectation& Times(int n) {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   943
    return Times(Exactly(n));
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   944
  }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   945
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   946
  // Implements the .InSequence() clause.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   947
  TypedExpectation& InSequence(const Sequence& s) {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   948
    ExpectSpecProperty(last_clause_ <= kInSequence,
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   949
                       ".InSequence() cannot appear after .After(),"
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   950
                       " .WillOnce(), .WillRepeatedly(), or "
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   951
                       ".RetiresOnSaturation().");
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   952
    last_clause_ = kInSequence;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   953
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   954
    s.AddExpectation(GetHandle());
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   955
    return *this;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   956
  }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   957
  TypedExpectation& InSequence(const Sequence& s1, const Sequence& s2) {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   958
    return InSequence(s1).InSequence(s2);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   959
  }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   960
  TypedExpectation& InSequence(const Sequence& s1, const Sequence& s2,
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   961
                               const Sequence& s3) {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   962
    return InSequence(s1, s2).InSequence(s3);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   963
  }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   964
  TypedExpectation& InSequence(const Sequence& s1, const Sequence& s2,
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   965
                               const Sequence& s3, const Sequence& s4) {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   966
    return InSequence(s1, s2, s3).InSequence(s4);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   967
  }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   968
  TypedExpectation& InSequence(const Sequence& s1, const Sequence& s2,
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   969
                               const Sequence& s3, const Sequence& s4,
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   970
                               const Sequence& s5) {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   971
    return InSequence(s1, s2, s3, s4).InSequence(s5);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   972
  }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   973
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   974
  // Implements that .After() clause.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   975
  TypedExpectation& After(const ExpectationSet& s) {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   976
    ExpectSpecProperty(last_clause_ <= kAfter,
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   977
                       ".After() cannot appear after .WillOnce(),"
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   978
                       " .WillRepeatedly(), or "
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   979
                       ".RetiresOnSaturation().");
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   980
    last_clause_ = kAfter;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   981
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   982
    for (ExpectationSet::const_iterator it = s.begin(); it != s.end(); ++it) {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   983
      immediate_prerequisites_ += *it;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   984
    }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   985
    return *this;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   986
  }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   987
  TypedExpectation& After(const ExpectationSet& s1, const ExpectationSet& s2) {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   988
    return After(s1).After(s2);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   989
  }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   990
  TypedExpectation& After(const ExpectationSet& s1, const ExpectationSet& s2,
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   991
                          const ExpectationSet& s3) {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   992
    return After(s1, s2).After(s3);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   993
  }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   994
  TypedExpectation& After(const ExpectationSet& s1, const ExpectationSet& s2,
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   995
                          const ExpectationSet& s3, const ExpectationSet& s4) {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   996
    return After(s1, s2, s3).After(s4);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   997
  }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   998
  TypedExpectation& After(const ExpectationSet& s1, const ExpectationSet& s2,
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
   999
                          const ExpectationSet& s3, const ExpectationSet& s4,
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1000
                          const ExpectationSet& s5) {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1001
    return After(s1, s2, s3, s4).After(s5);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1002
  }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1003
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1004
  // Implements the .WillOnce() clause.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1005
  TypedExpectation& WillOnce(const Action<F>& action) {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1006
    ExpectSpecProperty(last_clause_ <= kWillOnce,
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1007
                       ".WillOnce() cannot appear after "
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1008
                       ".WillRepeatedly() or .RetiresOnSaturation().");
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1009
    last_clause_ = kWillOnce;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1010
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1011
    untyped_actions_.push_back(new Action<F>(action));
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1012
    if (!cardinality_specified()) {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1013
      set_cardinality(Exactly(static_cast<int>(untyped_actions_.size())));
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1014
    }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1015
    return *this;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1016
  }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1017
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1018
  // Implements the .WillRepeatedly() clause.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1019
  TypedExpectation& WillRepeatedly(const Action<F>& action) {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1020
    if (last_clause_ == kWillRepeatedly) {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1021
      ExpectSpecProperty(false,
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1022
                         ".WillRepeatedly() cannot appear "
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1023
                         "more than once in an EXPECT_CALL().");
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1024
    } else {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1025
      ExpectSpecProperty(last_clause_ < kWillRepeatedly,
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1026
                         ".WillRepeatedly() cannot appear "
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1027
                         "after .RetiresOnSaturation().");
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1028
    }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1029
    last_clause_ = kWillRepeatedly;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1030
    repeated_action_specified_ = true;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1031
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1032
    repeated_action_ = action;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1033
    if (!cardinality_specified()) {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1034
      set_cardinality(AtLeast(static_cast<int>(untyped_actions_.size())));
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1035
    }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1036
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1037
    // Now that no more action clauses can be specified, we check
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1038
    // whether their count makes sense.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1039
    CheckActionCountIfNotDone();
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1040
    return *this;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1041
  }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1042
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1043
  // Implements the .RetiresOnSaturation() clause.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1044
  TypedExpectation& RetiresOnSaturation() {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1045
    ExpectSpecProperty(last_clause_ < kRetiresOnSaturation,
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1046
                       ".RetiresOnSaturation() cannot appear "
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1047
                       "more than once.");
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1048
    last_clause_ = kRetiresOnSaturation;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1049
    retires_on_saturation_ = true;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1050
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1051
    // Now that no more action clauses can be specified, we check
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1052
    // whether their count makes sense.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1053
    CheckActionCountIfNotDone();
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1054
    return *this;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1055
  }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1056
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1057
  // Returns the matchers for the arguments as specified inside the
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1058
  // EXPECT_CALL() macro.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1059
  const ArgumentMatcherTuple& matchers() const {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1060
    return matchers_;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1061
  }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1062
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1063
  // Returns the matcher specified by the .With() clause.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1064
  const Matcher<const ArgumentTuple&>& extra_matcher() const {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1065
    return extra_matcher_;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1066
  }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1067
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1068
  // Returns the action specified by the .WillRepeatedly() clause.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1069
  const Action<F>& repeated_action() const { return repeated_action_; }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1070
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1071
  // If this mock method has an extra matcher (i.e. .With(matcher)),
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1072
  // describes it to the ostream.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1073
  virtual void MaybeDescribeExtraMatcherTo(::std::ostream* os) {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1074
    if (extra_matcher_specified_) {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1075
      *os << "    Expected args: ";
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1076
      extra_matcher_.DescribeTo(os);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1077
      *os << "\n";
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1078
    }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1079
  }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1080
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1081
 private:
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1082
  template <typename Function>
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1083
  friend class FunctionMockerBase;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1084
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1085
  // Returns an Expectation object that references and co-owns this
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1086
  // expectation.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1087
  virtual Expectation GetHandle() {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1088
    return owner_->GetHandleOf(this);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1089
  }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1090
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1091
  // The following methods will be called only after the EXPECT_CALL()
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1092
  // statement finishes and when the current thread holds
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1093
  // g_gmock_mutex.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1094
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1095
  // Returns true iff this expectation matches the given arguments.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1096
  bool Matches(const ArgumentTuple& args) const
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1097
      GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex) {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1098
    g_gmock_mutex.AssertHeld();
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1099
    return TupleMatches(matchers_, args) && extra_matcher_.Matches(args);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1100
  }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1101
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1102
  // Returns true iff this expectation should handle the given arguments.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1103
  bool ShouldHandleArguments(const ArgumentTuple& args) const
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1104
      GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex) {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1105
    g_gmock_mutex.AssertHeld();
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1106
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1107
    // In case the action count wasn't checked when the expectation
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1108
    // was defined (e.g. if this expectation has no WillRepeatedly()
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1109
    // or RetiresOnSaturation() clause), we check it when the
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1110
    // expectation is used for the first time.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1111
    CheckActionCountIfNotDone();
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1112
    return !is_retired() && AllPrerequisitesAreSatisfied() && Matches(args);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1113
  }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1114
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1115
  // Describes the result of matching the arguments against this
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1116
  // expectation to the given ostream.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1117
  void ExplainMatchResultTo(
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1118
      const ArgumentTuple& args,
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1119
      ::std::ostream* os) const
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1120
          GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex) {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1121
    g_gmock_mutex.AssertHeld();
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1122
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1123
    if (is_retired()) {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1124
      *os << "         Expected: the expectation is active\n"
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1125
          << "           Actual: it is retired\n";
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1126
    } else if (!Matches(args)) {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1127
      if (!TupleMatches(matchers_, args)) {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1128
        ExplainMatchFailureTupleTo(matchers_, args, os);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1129
      }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1130
      StringMatchResultListener listener;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1131
      if (!extra_matcher_.MatchAndExplain(args, &listener)) {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1132
        *os << "    Expected args: ";
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1133
        extra_matcher_.DescribeTo(os);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1134
        *os << "\n           Actual: don't match";
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1135
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1136
        internal::PrintIfNotEmpty(listener.str(), os);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1137
        *os << "\n";
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1138
      }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1139
    } else if (!AllPrerequisitesAreSatisfied()) {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1140
      *os << "         Expected: all pre-requisites are satisfied\n"
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1141
          << "           Actual: the following immediate pre-requisites "
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1142
          << "are not satisfied:\n";
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1143
      ExpectationSet unsatisfied_prereqs;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1144
      FindUnsatisfiedPrerequisites(&unsatisfied_prereqs);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1145
      int i = 0;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1146
      for (ExpectationSet::const_iterator it = unsatisfied_prereqs.begin();
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1147
           it != unsatisfied_prereqs.end(); ++it) {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1148
        it->expectation_base()->DescribeLocationTo(os);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1149
        *os << "pre-requisite #" << i++ << "\n";
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1150
      }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1151
      *os << "                   (end of pre-requisites)\n";
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1152
    } else {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1153
      // This line is here just for completeness' sake.  It will never
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1154
      // be executed as currently the ExplainMatchResultTo() function
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1155
      // is called only when the mock function call does NOT match the
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1156
      // expectation.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1157
      *os << "The call matches the expectation.\n";
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1158
    }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1159
  }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1160
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1161
  // Returns the action that should be taken for the current invocation.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1162
  const Action<F>& GetCurrentAction(
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1163
      const FunctionMockerBase<F>* mocker,
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1164
      const ArgumentTuple& args) const
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1165
          GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex) {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1166
    g_gmock_mutex.AssertHeld();
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1167
    const int count = call_count();
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1168
    Assert(count >= 1, __FILE__, __LINE__,
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1169
           "call_count() is <= 0 when GetCurrentAction() is "
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1170
           "called - this should never happen.");
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1171
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1172
    const int action_count = static_cast<int>(untyped_actions_.size());
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1173
    if (action_count > 0 && !repeated_action_specified_ &&
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1174
        count > action_count) {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1175
      // If there is at least one WillOnce() and no WillRepeatedly(),
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1176
      // we warn the user when the WillOnce() clauses ran out.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1177
      ::std::stringstream ss;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1178
      DescribeLocationTo(&ss);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1179
      ss << "Actions ran out in " << source_text() << "...\n"
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1180
         << "Called " << count << " times, but only "
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1181
         << action_count << " WillOnce()"
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1182
         << (action_count == 1 ? " is" : "s are") << " specified - ";
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1183
      mocker->DescribeDefaultActionTo(args, &ss);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1184
      Log(kWarning, ss.str(), 1);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1185
    }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1186
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1187
    return count <= action_count ?
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1188
        *static_cast<const Action<F>*>(untyped_actions_[count - 1]) :
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1189
        repeated_action();
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1190
  }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1191
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1192
  // Given the arguments of a mock function call, if the call will
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1193
  // over-saturate this expectation, returns the default action;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1194
  // otherwise, returns the next action in this expectation.  Also
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1195
  // describes *what* happened to 'what', and explains *why* Google
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1196
  // Mock does it to 'why'.  This method is not const as it calls
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1197
  // IncrementCallCount().  A return value of NULL means the default
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1198
  // action.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1199
  const Action<F>* GetActionForArguments(
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1200
      const FunctionMockerBase<F>* mocker,
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1201
      const ArgumentTuple& args,
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1202
      ::std::ostream* what,
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1203
      ::std::ostream* why)
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1204
          GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex) {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1205
    g_gmock_mutex.AssertHeld();
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1206
    if (IsSaturated()) {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1207
      // We have an excessive call.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1208
      IncrementCallCount();
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1209
      *what << "Mock function called more times than expected - ";
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1210
      mocker->DescribeDefaultActionTo(args, what);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1211
      DescribeCallCountTo(why);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1212
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1213
      // FIXME: allow the user to control whether
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1214
      // unexpected calls should fail immediately or continue using a
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1215
      // flag --gmock_unexpected_calls_are_fatal.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1216
      return NULL;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1217
    }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1218
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1219
    IncrementCallCount();
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1220
    RetireAllPreRequisites();
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1221
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1222
    if (retires_on_saturation_ && IsSaturated()) {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1223
      Retire();
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1224
    }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1225
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1226
    // Must be done after IncrementCount()!
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1227
    *what << "Mock function call matches " << source_text() <<"...\n";
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1228
    return &(GetCurrentAction(mocker, args));
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1229
  }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1230
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1231
  // All the fields below won't change once the EXPECT_CALL()
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1232
  // statement finishes.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1233
  FunctionMockerBase<F>* const owner_;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1234
  ArgumentMatcherTuple matchers_;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1235
  Matcher<const ArgumentTuple&> extra_matcher_;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1236
  Action<F> repeated_action_;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1237
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1238
  GTEST_DISALLOW_COPY_AND_ASSIGN_(TypedExpectation);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1239
};  // class TypedExpectation
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1240
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1241
// A MockSpec object is used by ON_CALL() or EXPECT_CALL() for
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1242
// specifying the default behavior of, or expectation on, a mock
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1243
// function.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1244
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1245
// Note: class MockSpec really belongs to the ::testing namespace.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1246
// However if we define it in ::testing, MSVC will complain when
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1247
// classes in ::testing::internal declare it as a friend class
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1248
// template.  To workaround this compiler bug, we define MockSpec in
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1249
// ::testing::internal and import it into ::testing.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1250
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1251
// Logs a message including file and line number information.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1252
GTEST_API_ void LogWithLocation(testing::internal::LogSeverity severity,
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1253
                                const char* file, int line,
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1254
                                const std::string& message);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1255
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1256
template <typename F>
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1257
class MockSpec {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1258
 public:
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1259
  typedef typename internal::Function<F>::ArgumentTuple ArgumentTuple;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1260
  typedef typename internal::Function<F>::ArgumentMatcherTuple
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1261
      ArgumentMatcherTuple;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1262
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1263
  // Constructs a MockSpec object, given the function mocker object
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1264
  // that the spec is associated with.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1265
  MockSpec(internal::FunctionMockerBase<F>* function_mocker,
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1266
           const ArgumentMatcherTuple& matchers)
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1267
      : function_mocker_(function_mocker), matchers_(matchers) {}
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1268
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1269
  // Adds a new default action spec to the function mocker and returns
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1270
  // the newly created spec.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1271
  internal::OnCallSpec<F>& InternalDefaultActionSetAt(
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1272
      const char* file, int line, const char* obj, const char* call) {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1273
    LogWithLocation(internal::kInfo, file, line,
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1274
                    std::string("ON_CALL(") + obj + ", " + call + ") invoked");
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1275
    return function_mocker_->AddNewOnCallSpec(file, line, matchers_);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1276
  }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1277
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1278
  // Adds a new expectation spec to the function mocker and returns
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1279
  // the newly created spec.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1280
  internal::TypedExpectation<F>& InternalExpectedAt(
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1281
      const char* file, int line, const char* obj, const char* call) {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1282
    const std::string source_text(std::string("EXPECT_CALL(") + obj + ", " +
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1283
                                  call + ")");
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1284
    LogWithLocation(internal::kInfo, file, line, source_text + " invoked");
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1285
    return function_mocker_->AddNewExpectation(
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1286
        file, line, source_text, matchers_);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1287
  }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1288
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1289
  // This operator overload is used to swallow the superfluous parameter list
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1290
  // introduced by the ON/EXPECT_CALL macros. See the macro comments for more
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1291
  // explanation.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1292
  MockSpec<F>& operator()(const internal::WithoutMatchers&, void* const) {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1293
    return *this;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1294
  }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1295
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1296
 private:
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1297
  template <typename Function>
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1298
  friend class internal::FunctionMocker;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1299
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1300
  // The function mocker that owns this spec.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1301
  internal::FunctionMockerBase<F>* const function_mocker_;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1302
  // The argument matchers specified in the spec.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1303
  ArgumentMatcherTuple matchers_;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1304
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1305
  GTEST_DISALLOW_ASSIGN_(MockSpec);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1306
};  // class MockSpec
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1307
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1308
// Wrapper type for generically holding an ordinary value or lvalue reference.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1309
// If T is not a reference type, it must be copyable or movable.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1310
// ReferenceOrValueWrapper<T> is movable, and will also be copyable unless
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1311
// T is a move-only value type (which means that it will always be copyable
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1312
// if the current platform does not support move semantics).
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1313
//
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1314
// The primary template defines handling for values, but function header
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1315
// comments describe the contract for the whole template (including
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1316
// specializations).
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1317
template <typename T>
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1318
class ReferenceOrValueWrapper {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1319
 public:
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1320
  // Constructs a wrapper from the given value/reference.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1321
  explicit ReferenceOrValueWrapper(T value)
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1322
      : value_(::testing::internal::move(value)) {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1323
  }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1324
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1325
  // Unwraps and returns the underlying value/reference, exactly as
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1326
  // originally passed. The behavior of calling this more than once on
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1327
  // the same object is unspecified.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1328
  T Unwrap() { return ::testing::internal::move(value_); }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1329
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1330
  // Provides nondestructive access to the underlying value/reference.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1331
  // Always returns a const reference (more precisely,
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1332
  // const RemoveReference<T>&). The behavior of calling this after
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1333
  // calling Unwrap on the same object is unspecified.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1334
  const T& Peek() const {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1335
    return value_;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1336
  }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1337
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1338
 private:
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1339
  T value_;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1340
};
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1341
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1342
// Specialization for lvalue reference types. See primary template
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1343
// for documentation.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1344
template <typename T>
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1345
class ReferenceOrValueWrapper<T&> {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1346
 public:
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1347
  // Workaround for debatable pass-by-reference lint warning (c-library-team
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1348
  // policy precludes NOLINT in this context)
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1349
  typedef T& reference;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1350
  explicit ReferenceOrValueWrapper(reference ref)
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1351
      : value_ptr_(&ref) {}
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1352
  T& Unwrap() { return *value_ptr_; }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1353
  const T& Peek() const { return *value_ptr_; }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1354
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1355
 private:
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1356
  T* value_ptr_;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1357
};
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1358
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1359
// MSVC warns about using 'this' in base member initializer list, so
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1360
// we need to temporarily disable the warning.  We have to do it for
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1361
// the entire class to suppress the warning, even though it's about
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1362
// the constructor only.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1363
GTEST_DISABLE_MSC_WARNINGS_PUSH_(4355)
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1364
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1365
// C++ treats the void type specially.  For example, you cannot define
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1366
// a void-typed variable or pass a void value to a function.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1367
// ActionResultHolder<T> holds a value of type T, where T must be a
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1368
// copyable type or void (T doesn't need to be default-constructable).
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1369
// It hides the syntactic difference between void and other types, and
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1370
// is used to unify the code for invoking both void-returning and
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1371
// non-void-returning mock functions.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1372
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1373
// Untyped base class for ActionResultHolder<T>.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1374
class UntypedActionResultHolderBase {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1375
 public:
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1376
  virtual ~UntypedActionResultHolderBase() {}
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1377
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1378
  // Prints the held value as an action's result to os.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1379
  virtual void PrintAsActionResult(::std::ostream* os) const = 0;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1380
};
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1381
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1382
// This generic definition is used when T is not void.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1383
template <typename T>
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1384
class ActionResultHolder : public UntypedActionResultHolderBase {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1385
 public:
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1386
  // Returns the held value. Must not be called more than once.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1387
  T Unwrap() {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1388
    return result_.Unwrap();
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1389
  }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1390
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1391
  // Prints the held value as an action's result to os.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1392
  virtual void PrintAsActionResult(::std::ostream* os) const {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1393
    *os << "\n          Returns: ";
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1394
    // T may be a reference type, so we don't use UniversalPrint().
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1395
    UniversalPrinter<T>::Print(result_.Peek(), os);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1396
  }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1397
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1398
  // Performs the given mock function's default action and returns the
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1399
  // result in a new-ed ActionResultHolder.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1400
  template <typename F>
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1401
  static ActionResultHolder* PerformDefaultAction(
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1402
      const FunctionMockerBase<F>* func_mocker,
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1403
      typename RvalueRef<typename Function<F>::ArgumentTuple>::type args,
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1404
      const std::string& call_description) {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1405
    return new ActionResultHolder(Wrapper(func_mocker->PerformDefaultAction(
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1406
        internal::move(args), call_description)));
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1407
  }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1408
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1409
  // Performs the given action and returns the result in a new-ed
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1410
  // ActionResultHolder.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1411
  template <typename F>
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1412
  static ActionResultHolder* PerformAction(
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1413
      const Action<F>& action,
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1414
      typename RvalueRef<typename Function<F>::ArgumentTuple>::type args) {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1415
    return new ActionResultHolder(
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1416
        Wrapper(action.Perform(internal::move(args))));
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1417
  }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1418
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1419
 private:
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1420
  typedef ReferenceOrValueWrapper<T> Wrapper;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1421
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1422
  explicit ActionResultHolder(Wrapper result)
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1423
      : result_(::testing::internal::move(result)) {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1424
  }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1425
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1426
  Wrapper result_;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1427
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1428
  GTEST_DISALLOW_COPY_AND_ASSIGN_(ActionResultHolder);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1429
};
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1430
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1431
// Specialization for T = void.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1432
template <>
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1433
class ActionResultHolder<void> : public UntypedActionResultHolderBase {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1434
 public:
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1435
  void Unwrap() { }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1436
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1437
  virtual void PrintAsActionResult(::std::ostream* /* os */) const {}
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1438
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1439
  // Performs the given mock function's default action and returns ownership
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1440
  // of an empty ActionResultHolder*.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1441
  template <typename F>
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1442
  static ActionResultHolder* PerformDefaultAction(
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1443
      const FunctionMockerBase<F>* func_mocker,
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1444
      typename RvalueRef<typename Function<F>::ArgumentTuple>::type args,
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1445
      const std::string& call_description) {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1446
    func_mocker->PerformDefaultAction(internal::move(args), call_description);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1447
    return new ActionResultHolder;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1448
  }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1449
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1450
  // Performs the given action and returns ownership of an empty
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1451
  // ActionResultHolder*.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1452
  template <typename F>
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1453
  static ActionResultHolder* PerformAction(
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1454
      const Action<F>& action,
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1455
      typename RvalueRef<typename Function<F>::ArgumentTuple>::type args) {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1456
    action.Perform(internal::move(args));
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1457
    return new ActionResultHolder;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1458
  }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1459
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1460
 private:
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1461
  ActionResultHolder() {}
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1462
  GTEST_DISALLOW_COPY_AND_ASSIGN_(ActionResultHolder);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1463
};
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1464
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1465
// The base of the function mocker class for the given function type.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1466
// We put the methods in this class instead of its child to avoid code
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1467
// bloat.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1468
template <typename F>
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1469
class FunctionMockerBase : public UntypedFunctionMockerBase {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1470
 public:
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1471
  typedef typename Function<F>::Result Result;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1472
  typedef typename Function<F>::ArgumentTuple ArgumentTuple;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1473
  typedef typename Function<F>::ArgumentMatcherTuple ArgumentMatcherTuple;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1474
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1475
  FunctionMockerBase() {}
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1476
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1477
  // The destructor verifies that all expectations on this mock
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1478
  // function have been satisfied.  If not, it will report Google Test
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1479
  // non-fatal failures for the violations.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1480
  virtual ~FunctionMockerBase()
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1481
        GTEST_LOCK_EXCLUDED_(g_gmock_mutex) {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1482
    MutexLock l(&g_gmock_mutex);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1483
    VerifyAndClearExpectationsLocked();
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1484
    Mock::UnregisterLocked(this);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1485
    ClearDefaultActionsLocked();
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1486
  }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1487
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1488
  // Returns the ON_CALL spec that matches this mock function with the
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1489
  // given arguments; returns NULL if no matching ON_CALL is found.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1490
  // L = *
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1491
  const OnCallSpec<F>* FindOnCallSpec(
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1492
      const ArgumentTuple& args) const {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1493
    for (UntypedOnCallSpecs::const_reverse_iterator it
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1494
             = untyped_on_call_specs_.rbegin();
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1495
         it != untyped_on_call_specs_.rend(); ++it) {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1496
      const OnCallSpec<F>* spec = static_cast<const OnCallSpec<F>*>(*it);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1497
      if (spec->Matches(args))
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1498
        return spec;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1499
    }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1500
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1501
    return NULL;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1502
  }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1503
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1504
  // Performs the default action of this mock function on the given
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1505
  // arguments and returns the result. Asserts (or throws if
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1506
  // exceptions are enabled) with a helpful call descrption if there
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1507
  // is no valid return value. This method doesn't depend on the
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1508
  // mutable state of this object, and thus can be called concurrently
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1509
  // without locking.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1510
  // L = *
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1511
  Result PerformDefaultAction(
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1512
      typename RvalueRef<typename Function<F>::ArgumentTuple>::type args,
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1513
      const std::string& call_description) const {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1514
    const OnCallSpec<F>* const spec =
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1515
        this->FindOnCallSpec(args);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1516
    if (spec != NULL) {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1517
      return spec->GetAction().Perform(internal::move(args));
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1518
    }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1519
    const std::string message =
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1520
        call_description +
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1521
        "\n    The mock function has no default action "
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1522
        "set, and its return type has no default value set.";
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1523
#if GTEST_HAS_EXCEPTIONS
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1524
    if (!DefaultValue<Result>::Exists()) {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1525
      throw std::runtime_error(message);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1526
    }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1527
#else
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1528
    Assert(DefaultValue<Result>::Exists(), "", -1, message);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1529
#endif
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1530
    return DefaultValue<Result>::Get();
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1531
  }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1532
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1533
  // Performs the default action with the given arguments and returns
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1534
  // the action's result.  The call description string will be used in
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1535
  // the error message to describe the call in the case the default
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1536
  // action fails.  The caller is responsible for deleting the result.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1537
  // L = *
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1538
  virtual UntypedActionResultHolderBase* UntypedPerformDefaultAction(
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1539
      void* untyped_args,  // must point to an ArgumentTuple
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1540
      const std::string& call_description) const {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1541
    ArgumentTuple* args = static_cast<ArgumentTuple*>(untyped_args);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1542
    return ResultHolder::PerformDefaultAction(this, internal::move(*args),
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1543
                                              call_description);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1544
  }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1545
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1546
  // Performs the given action with the given arguments and returns
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1547
  // the action's result.  The caller is responsible for deleting the
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1548
  // result.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1549
  // L = *
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1550
  virtual UntypedActionResultHolderBase* UntypedPerformAction(
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1551
      const void* untyped_action, void* untyped_args) const {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1552
    // Make a copy of the action before performing it, in case the
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1553
    // action deletes the mock object (and thus deletes itself).
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1554
    const Action<F> action = *static_cast<const Action<F>*>(untyped_action);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1555
    ArgumentTuple* args = static_cast<ArgumentTuple*>(untyped_args);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1556
    return ResultHolder::PerformAction(action, internal::move(*args));
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1557
  }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1558
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1559
  // Implements UntypedFunctionMockerBase::ClearDefaultActionsLocked():
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1560
  // clears the ON_CALL()s set on this mock function.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1561
  virtual void ClearDefaultActionsLocked()
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1562
      GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex) {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1563
    g_gmock_mutex.AssertHeld();
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1564
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1565
    // Deleting our default actions may trigger other mock objects to be
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1566
    // deleted, for example if an action contains a reference counted smart
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1567
    // pointer to that mock object, and that is the last reference. So if we
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1568
    // delete our actions within the context of the global mutex we may deadlock
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1569
    // when this method is called again. Instead, make a copy of the set of
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1570
    // actions to delete, clear our set within the mutex, and then delete the
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1571
    // actions outside of the mutex.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1572
    UntypedOnCallSpecs specs_to_delete;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1573
    untyped_on_call_specs_.swap(specs_to_delete);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1574
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1575
    g_gmock_mutex.Unlock();
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1576
    for (UntypedOnCallSpecs::const_iterator it =
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1577
             specs_to_delete.begin();
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1578
         it != specs_to_delete.end(); ++it) {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1579
      delete static_cast<const OnCallSpec<F>*>(*it);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1580
    }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1581
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1582
    // Lock the mutex again, since the caller expects it to be locked when we
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1583
    // return.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1584
    g_gmock_mutex.Lock();
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1585
  }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1586
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1587
 protected:
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1588
  template <typename Function>
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1589
  friend class MockSpec;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1590
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1591
  typedef ActionResultHolder<Result> ResultHolder;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1592
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1593
  // Returns the result of invoking this mock function with the given
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1594
  // arguments.  This function can be safely called from multiple
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1595
  // threads concurrently.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1596
  Result InvokeWith(
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1597
      typename RvalueRef<typename Function<F>::ArgumentTuple>::type args)
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1598
      GTEST_LOCK_EXCLUDED_(g_gmock_mutex) {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1599
    // const_cast is required since in C++98 we still pass ArgumentTuple around
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1600
    // by const& instead of rvalue reference.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1601
    void* untyped_args = const_cast<void*>(static_cast<const void*>(&args));
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1602
    scoped_ptr<ResultHolder> holder(
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1603
        DownCast_<ResultHolder*>(this->UntypedInvokeWith(untyped_args)));
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1604
    return holder->Unwrap();
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1605
  }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1606
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1607
  // Adds and returns a default action spec for this mock function.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1608
  OnCallSpec<F>& AddNewOnCallSpec(
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1609
      const char* file, int line,
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1610
      const ArgumentMatcherTuple& m)
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1611
          GTEST_LOCK_EXCLUDED_(g_gmock_mutex) {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1612
    Mock::RegisterUseByOnCallOrExpectCall(MockObject(), file, line);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1613
    OnCallSpec<F>* const on_call_spec = new OnCallSpec<F>(file, line, m);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1614
    untyped_on_call_specs_.push_back(on_call_spec);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1615
    return *on_call_spec;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1616
  }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1617
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1618
  // Adds and returns an expectation spec for this mock function.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1619
  TypedExpectation<F>& AddNewExpectation(const char* file, int line,
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1620
                                         const std::string& source_text,
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1621
                                         const ArgumentMatcherTuple& m)
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1622
      GTEST_LOCK_EXCLUDED_(g_gmock_mutex) {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1623
    Mock::RegisterUseByOnCallOrExpectCall(MockObject(), file, line);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1624
    TypedExpectation<F>* const expectation =
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1625
        new TypedExpectation<F>(this, file, line, source_text, m);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1626
    const linked_ptr<ExpectationBase> untyped_expectation(expectation);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1627
    // See the definition of untyped_expectations_ for why access to
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1628
    // it is unprotected here.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1629
    untyped_expectations_.push_back(untyped_expectation);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1630
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1631
    // Adds this expectation into the implicit sequence if there is one.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1632
    Sequence* const implicit_sequence = g_gmock_implicit_sequence.get();
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1633
    if (implicit_sequence != NULL) {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1634
      implicit_sequence->AddExpectation(Expectation(untyped_expectation));
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1635
    }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1636
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1637
    return *expectation;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1638
  }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1639
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1640
 private:
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1641
  template <typename Func> friend class TypedExpectation;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1642
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1643
  // Some utilities needed for implementing UntypedInvokeWith().
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1644
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1645
  // Describes what default action will be performed for the given
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1646
  // arguments.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1647
  // L = *
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1648
  void DescribeDefaultActionTo(const ArgumentTuple& args,
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1649
                               ::std::ostream* os) const {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1650
    const OnCallSpec<F>* const spec = FindOnCallSpec(args);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1651
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1652
    if (spec == NULL) {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1653
      *os << (internal::type_equals<Result, void>::value ?
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1654
              "returning directly.\n" :
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1655
              "returning default value.\n");
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1656
    } else {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1657
      *os << "taking default action specified at:\n"
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1658
          << FormatFileLocation(spec->file(), spec->line()) << "\n";
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1659
    }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1660
  }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1661
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1662
  // Writes a message that the call is uninteresting (i.e. neither
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1663
  // explicitly expected nor explicitly unexpected) to the given
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1664
  // ostream.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1665
  virtual void UntypedDescribeUninterestingCall(
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1666
      const void* untyped_args,
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1667
      ::std::ostream* os) const
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1668
          GTEST_LOCK_EXCLUDED_(g_gmock_mutex) {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1669
    const ArgumentTuple& args =
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1670
        *static_cast<const ArgumentTuple*>(untyped_args);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1671
    *os << "Uninteresting mock function call - ";
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1672
    DescribeDefaultActionTo(args, os);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1673
    *os << "    Function call: " << Name();
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1674
    UniversalPrint(args, os);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1675
  }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1676
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1677
  // Returns the expectation that matches the given function arguments
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1678
  // (or NULL is there's no match); when a match is found,
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1679
  // untyped_action is set to point to the action that should be
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1680
  // performed (or NULL if the action is "do default"), and
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1681
  // is_excessive is modified to indicate whether the call exceeds the
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1682
  // expected number.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1683
  //
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1684
  // Critical section: We must find the matching expectation and the
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1685
  // corresponding action that needs to be taken in an ATOMIC
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1686
  // transaction.  Otherwise another thread may call this mock
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1687
  // method in the middle and mess up the state.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1688
  //
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1689
  // However, performing the action has to be left out of the critical
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1690
  // section.  The reason is that we have no control on what the
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1691
  // action does (it can invoke an arbitrary user function or even a
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1692
  // mock function) and excessive locking could cause a dead lock.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1693
  virtual const ExpectationBase* UntypedFindMatchingExpectation(
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1694
      const void* untyped_args,
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1695
      const void** untyped_action, bool* is_excessive,
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1696
      ::std::ostream* what, ::std::ostream* why)
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1697
          GTEST_LOCK_EXCLUDED_(g_gmock_mutex) {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1698
    const ArgumentTuple& args =
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1699
        *static_cast<const ArgumentTuple*>(untyped_args);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1700
    MutexLock l(&g_gmock_mutex);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1701
    TypedExpectation<F>* exp = this->FindMatchingExpectationLocked(args);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1702
    if (exp == NULL) {  // A match wasn't found.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1703
      this->FormatUnexpectedCallMessageLocked(args, what, why);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1704
      return NULL;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1705
    }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1706
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1707
    // This line must be done before calling GetActionForArguments(),
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1708
    // which will increment the call count for *exp and thus affect
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1709
    // its saturation status.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1710
    *is_excessive = exp->IsSaturated();
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1711
    const Action<F>* action = exp->GetActionForArguments(this, args, what, why);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1712
    if (action != NULL && action->IsDoDefault())
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1713
      action = NULL;  // Normalize "do default" to NULL.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1714
    *untyped_action = action;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1715
    return exp;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1716
  }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1717
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1718
  // Prints the given function arguments to the ostream.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1719
  virtual void UntypedPrintArgs(const void* untyped_args,
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1720
                                ::std::ostream* os) const {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1721
    const ArgumentTuple& args =
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1722
        *static_cast<const ArgumentTuple*>(untyped_args);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1723
    UniversalPrint(args, os);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1724
  }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1725
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1726
  // Returns the expectation that matches the arguments, or NULL if no
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1727
  // expectation matches them.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1728
  TypedExpectation<F>* FindMatchingExpectationLocked(
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1729
      const ArgumentTuple& args) const
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1730
          GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex) {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1731
    g_gmock_mutex.AssertHeld();
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1732
    // See the definition of untyped_expectations_ for why access to
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1733
    // it is unprotected here.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1734
    for (typename UntypedExpectations::const_reverse_iterator it =
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1735
             untyped_expectations_.rbegin();
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1736
         it != untyped_expectations_.rend(); ++it) {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1737
      TypedExpectation<F>* const exp =
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1738
          static_cast<TypedExpectation<F>*>(it->get());
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1739
      if (exp->ShouldHandleArguments(args)) {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1740
        return exp;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1741
      }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1742
    }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1743
    return NULL;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1744
  }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1745
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1746
  // Returns a message that the arguments don't match any expectation.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1747
  void FormatUnexpectedCallMessageLocked(
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1748
      const ArgumentTuple& args,
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1749
      ::std::ostream* os,
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1750
      ::std::ostream* why) const
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1751
          GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex) {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1752
    g_gmock_mutex.AssertHeld();
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1753
    *os << "\nUnexpected mock function call - ";
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1754
    DescribeDefaultActionTo(args, os);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1755
    PrintTriedExpectationsLocked(args, why);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1756
  }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1757
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1758
  // Prints a list of expectations that have been tried against the
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1759
  // current mock function call.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1760
  void PrintTriedExpectationsLocked(
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1761
      const ArgumentTuple& args,
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1762
      ::std::ostream* why) const
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1763
          GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex) {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1764
    g_gmock_mutex.AssertHeld();
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1765
    const int count = static_cast<int>(untyped_expectations_.size());
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1766
    *why << "Google Mock tried the following " << count << " "
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1767
         << (count == 1 ? "expectation, but it didn't match" :
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1768
             "expectations, but none matched")
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1769
         << ":\n";
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1770
    for (int i = 0; i < count; i++) {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1771
      TypedExpectation<F>* const expectation =
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1772
          static_cast<TypedExpectation<F>*>(untyped_expectations_[i].get());
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1773
      *why << "\n";
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1774
      expectation->DescribeLocationTo(why);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1775
      if (count > 1) {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1776
        *why << "tried expectation #" << i << ": ";
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1777
      }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1778
      *why << expectation->source_text() << "...\n";
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1779
      expectation->ExplainMatchResultTo(args, why);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1780
      expectation->DescribeCallCountTo(why);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1781
    }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1782
  }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1783
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1784
  // There is no generally useful and implementable semantics of
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1785
  // copying a mock object, so copying a mock is usually a user error.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1786
  // Thus we disallow copying function mockers.  If the user really
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1787
  // wants to copy a mock object, they should implement their own copy
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1788
  // operation, for example:
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1789
  //
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1790
  //   class MockFoo : public Foo {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1791
  //    public:
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1792
  //     // Defines a copy constructor explicitly.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1793
  //     MockFoo(const MockFoo& src) {}
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1794
  //     ...
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1795
  //   };
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1796
  GTEST_DISALLOW_COPY_AND_ASSIGN_(FunctionMockerBase);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1797
};  // class FunctionMockerBase
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1798
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1799
GTEST_DISABLE_MSC_WARNINGS_POP_()  //  4355
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1800
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1801
// Implements methods of FunctionMockerBase.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1802
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1803
// Verifies that all expectations on this mock function have been
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1804
// satisfied.  Reports one or more Google Test non-fatal failures and
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1805
// returns false if not.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1806
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1807
// Reports an uninteresting call (whose description is in msg) in the
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1808
// manner specified by 'reaction'.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1809
void ReportUninterestingCall(CallReaction reaction, const std::string& msg);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1810
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1811
}  // namespace internal
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1812
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1813
// The style guide prohibits "using" statements in a namespace scope
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1814
// inside a header file.  However, the MockSpec class template is
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1815
// meant to be defined in the ::testing namespace.  The following line
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1816
// is just a trick for working around a bug in MSVC 8.0, which cannot
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1817
// handle it if we define MockSpec in ::testing.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1818
using internal::MockSpec;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1819
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1820
// Const(x) is a convenient function for obtaining a const reference
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1821
// to x.  This is useful for setting expectations on an overloaded
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1822
// const mock method, e.g.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1823
//
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1824
//   class MockFoo : public FooInterface {
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1825
//    public:
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1826
//     MOCK_METHOD0(Bar, int());
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1827
//     MOCK_CONST_METHOD0(Bar, int&());
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1828
//   };
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1829
//
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1830
//   MockFoo foo;
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1831
//   // Expects a call to non-const MockFoo::Bar().
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1832
//   EXPECT_CALL(foo, Bar());
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1833
//   // Expects a call to const MockFoo::Bar().
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1834
//   EXPECT_CALL(Const(foo), Bar());
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1835
template <typename T>
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1836
inline const T& Const(const T& x) { return x; }
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1837
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1838
// Constructs an Expectation object that references and co-owns exp.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1839
inline Expectation::Expectation(internal::ExpectationBase& exp)  // NOLINT
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1840
    : expectation_base_(exp.GetHandle().expectation_base()) {}
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1841
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1842
}  // namespace testing
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1843
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1844
GTEST_DISABLE_MSC_WARNINGS_POP_()  //  4251
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1845
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1846
// Implementation for ON_CALL and EXPECT_CALL macros. A separate macro is
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1847
// required to avoid compile errors when the name of the method used in call is
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1848
// a result of macro expansion. See CompilesWithMethodNameExpandedFromMacro
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1849
// tests in internal/gmock-spec-builders_test.cc for more details.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1850
//
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1851
// This macro supports statements both with and without parameter matchers. If
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1852
// the parameter list is omitted, gMock will accept any parameters, which allows
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1853
// tests to be written that don't need to encode the number of method
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1854
// parameter. This technique may only be used for non-overloaded methods.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1855
//
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1856
//   // These are the same:
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1857
//   ON_CALL(mock, NoArgsMethod()).WillByDefault(...);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1858
//   ON_CALL(mock, NoArgsMethod).WillByDefault(...);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1859
//
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1860
//   // As are these:
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1861
//   ON_CALL(mock, TwoArgsMethod(_, _)).WillByDefault(...);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1862
//   ON_CALL(mock, TwoArgsMethod).WillByDefault(...);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1863
//
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1864
//   // Can also specify args if you want, of course:
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1865
//   ON_CALL(mock, TwoArgsMethod(_, 45)).WillByDefault(...);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1866
//
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1867
//   // Overloads work as long as you specify parameters:
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1868
//   ON_CALL(mock, OverloadedMethod(_)).WillByDefault(...);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1869
//   ON_CALL(mock, OverloadedMethod(_, _)).WillByDefault(...);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1870
//
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1871
//   // Oops! Which overload did you want?
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1872
//   ON_CALL(mock, OverloadedMethod).WillByDefault(...);
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1873
//     => ERROR: call to member function 'gmock_OverloadedMethod' is ambiguous
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1874
//
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1875
// How this works: The mock class uses two overloads of the gmock_Method
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1876
// expectation setter method plus an operator() overload on the MockSpec object.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1877
// In the matcher list form, the macro expands to:
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1878
//
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1879
//   // This statement:
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1880
//   ON_CALL(mock, TwoArgsMethod(_, 45))...
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1881
//
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1882
//   // ...expands to:
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1883
//   mock.gmock_TwoArgsMethod(_, 45)(WithoutMatchers(), nullptr)...
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1884
//   |-------------v---------------||------------v-------------|
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1885
//       invokes first overload        swallowed by operator()
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1886
//
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1887
//   // ...which is essentially:
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1888
//   mock.gmock_TwoArgsMethod(_, 45)...
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1889
//
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1890
// Whereas the form without a matcher list:
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1891
//
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1892
//   // This statement:
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1893
//   ON_CALL(mock, TwoArgsMethod)...
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1894
//
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1895
//   // ...expands to:
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1896
//   mock.gmock_TwoArgsMethod(WithoutMatchers(), nullptr)...
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1897
//   |-----------------------v--------------------------|
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1898
//                 invokes second overload
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1899
//
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1900
//   // ...which is essentially:
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1901
//   mock.gmock_TwoArgsMethod(_, _)...
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1902
//
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1903
// The WithoutMatchers() argument is used to disambiguate overloads and to
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1904
// block the caller from accidentally invoking the second overload directly. The
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1905
// second argument is an internal type derived from the method signature. The
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1906
// failure to disambiguate two overloads of this method in the ON_CALL statement
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1907
// is how we block callers from setting expectations on overloaded methods.
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1908
#define GMOCK_ON_CALL_IMPL_(mock_expr, Setter, call)                          \
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1909
  ((mock_expr).gmock_##call)(::testing::internal::GetWithoutMatchers(), NULL) \
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1910
      .Setter(__FILE__, __LINE__, #mock_expr, #call)
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1911
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1912
#define ON_CALL(obj, call) \
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1913
  GMOCK_ON_CALL_IMPL_(obj, InternalDefaultActionSetAt, call)
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1914
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1915
#define EXPECT_CALL(obj, call) \
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1916
  GMOCK_ON_CALL_IMPL_(obj, InternalExpectedAt, call)
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1917
4853b1ceb3d6 8222414: bring googlemock v1.8.1
iignatyev
parents:
diff changeset
  1918
#endif  // GMOCK_INCLUDE_GMOCK_GMOCK_SPEC_BUILDERS_H_