gmock-spec-builders.cc revision 53e08c44dd34857ba57581d7c5774d6c96a8d0e1
1e35fdd936d133bf8a48de140a3c666897588a05shiqian// Copyright 2007, Google Inc.
2e35fdd936d133bf8a48de140a3c666897588a05shiqian// All rights reserved.
3e35fdd936d133bf8a48de140a3c666897588a05shiqian//
4e35fdd936d133bf8a48de140a3c666897588a05shiqian// Redistribution and use in source and binary forms, with or without
5e35fdd936d133bf8a48de140a3c666897588a05shiqian// modification, are permitted provided that the following conditions are
6e35fdd936d133bf8a48de140a3c666897588a05shiqian// met:
7e35fdd936d133bf8a48de140a3c666897588a05shiqian//
8e35fdd936d133bf8a48de140a3c666897588a05shiqian//     * Redistributions of source code must retain the above copyright
9e35fdd936d133bf8a48de140a3c666897588a05shiqian// notice, this list of conditions and the following disclaimer.
10e35fdd936d133bf8a48de140a3c666897588a05shiqian//     * Redistributions in binary form must reproduce the above
11e35fdd936d133bf8a48de140a3c666897588a05shiqian// copyright notice, this list of conditions and the following disclaimer
12e35fdd936d133bf8a48de140a3c666897588a05shiqian// in the documentation and/or other materials provided with the
13e35fdd936d133bf8a48de140a3c666897588a05shiqian// distribution.
14e35fdd936d133bf8a48de140a3c666897588a05shiqian//     * Neither the name of Google Inc. nor the names of its
15e35fdd936d133bf8a48de140a3c666897588a05shiqian// contributors may be used to endorse or promote products derived from
16e35fdd936d133bf8a48de140a3c666897588a05shiqian// this software without specific prior written permission.
17e35fdd936d133bf8a48de140a3c666897588a05shiqian//
18e35fdd936d133bf8a48de140a3c666897588a05shiqian// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19e35fdd936d133bf8a48de140a3c666897588a05shiqian// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20e35fdd936d133bf8a48de140a3c666897588a05shiqian// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21e35fdd936d133bf8a48de140a3c666897588a05shiqian// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22e35fdd936d133bf8a48de140a3c666897588a05shiqian// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23e35fdd936d133bf8a48de140a3c666897588a05shiqian// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24e35fdd936d133bf8a48de140a3c666897588a05shiqian// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25e35fdd936d133bf8a48de140a3c666897588a05shiqian// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26e35fdd936d133bf8a48de140a3c666897588a05shiqian// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27e35fdd936d133bf8a48de140a3c666897588a05shiqian// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28e35fdd936d133bf8a48de140a3c666897588a05shiqian// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29e35fdd936d133bf8a48de140a3c666897588a05shiqian//
30e35fdd936d133bf8a48de140a3c666897588a05shiqian// Author: wan@google.com (Zhanyong Wan)
31e35fdd936d133bf8a48de140a3c666897588a05shiqian
32e35fdd936d133bf8a48de140a3c666897588a05shiqian// Google Mock - a framework for writing C++ mock classes.
33e35fdd936d133bf8a48de140a3c666897588a05shiqian//
34e35fdd936d133bf8a48de140a3c666897588a05shiqian// This file implements the spec builder syntax (ON_CALL and
35e35fdd936d133bf8a48de140a3c666897588a05shiqian// EXPECT_CALL).
36e35fdd936d133bf8a48de140a3c666897588a05shiqian
3753e08c44dd34857ba57581d7c5774d6c96a8d0e1zhanyong.wan#include "gmock/gmock-spec-builders.h"
38e35fdd936d133bf8a48de140a3c666897588a05shiqian
39df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan#include <stdlib.h>
40df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan#include <iostream>  // NOLINT
41df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan#include <map>
42e35fdd936d133bf8a48de140a3c666897588a05shiqian#include <set>
436c54a5e1f91e033fa937be5d647ce43dee597ad8vladlosev#include <string>
4453e08c44dd34857ba57581d7c5774d6c96a8d0e1zhanyong.wan#include "gmock/gmock.h"
4553e08c44dd34857ba57581d7c5774d6c96a8d0e1zhanyong.wan#include "gtest/gtest.h"
46e35fdd936d133bf8a48de140a3c666897588a05shiqian
47df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan#if GTEST_OS_CYGWIN || GTEST_OS_LINUX || GTEST_OS_MAC
48df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan#include <unistd.h>  // NOLINT
49df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan#endif
50df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan
51e35fdd936d133bf8a48de140a3c666897588a05shiqiannamespace testing {
52e35fdd936d133bf8a48de140a3c666897588a05shiqiannamespace internal {
53e35fdd936d133bf8a48de140a3c666897588a05shiqian
54e35fdd936d133bf8a48de140a3c666897588a05shiqian// Protects the mock object registry (in class Mock), all function
55e35fdd936d133bf8a48de140a3c666897588a05shiqian// mockers, and all expectations.
565905ba00fe78e522f7253e837ded3ddb5b946934zhanyong.wanGTEST_DEFINE_STATIC_MUTEX_(g_gmock_mutex);
57e35fdd936d133bf8a48de140a3c666897588a05shiqian
58e35fdd936d133bf8a48de140a3c666897588a05shiqian// Constructs an ExpectationBase object.
5932de5f53763125925e078498250f7e73a88de9edzhanyong.wanExpectationBase::ExpectationBase(const char* a_file,
6032de5f53763125925e078498250f7e73a88de9edzhanyong.wan                                 int a_line,
6132de5f53763125925e078498250f7e73a88de9edzhanyong.wan                                 const string& a_source_text)
6232de5f53763125925e078498250f7e73a88de9edzhanyong.wan    : file_(a_file),
6332de5f53763125925e078498250f7e73a88de9edzhanyong.wan      line_(a_line),
6432de5f53763125925e078498250f7e73a88de9edzhanyong.wan      source_text_(a_source_text),
65e35fdd936d133bf8a48de140a3c666897588a05shiqian      cardinality_specified_(false),
66e35fdd936d133bf8a48de140a3c666897588a05shiqian      cardinality_(Exactly(1)),
67e35fdd936d133bf8a48de140a3c666897588a05shiqian      call_count_(0),
68e35fdd936d133bf8a48de140a3c666897588a05shiqian      retired_(false) {
69e35fdd936d133bf8a48de140a3c666897588a05shiqian}
70e35fdd936d133bf8a48de140a3c666897588a05shiqian
71e35fdd936d133bf8a48de140a3c666897588a05shiqian// Destructs an ExpectationBase object.
72e35fdd936d133bf8a48de140a3c666897588a05shiqianExpectationBase::~ExpectationBase() {}
73e35fdd936d133bf8a48de140a3c666897588a05shiqian
74e35fdd936d133bf8a48de140a3c666897588a05shiqian// Explicitly specifies the cardinality of this expectation.  Used by
75e35fdd936d133bf8a48de140a3c666897588a05shiqian// the subclasses to implement the .Times() clause.
7632de5f53763125925e078498250f7e73a88de9edzhanyong.wanvoid ExpectationBase::SpecifyCardinality(const Cardinality& a_cardinality) {
77e35fdd936d133bf8a48de140a3c666897588a05shiqian  cardinality_specified_ = true;
7832de5f53763125925e078498250f7e73a88de9edzhanyong.wan  cardinality_ = a_cardinality;
79e35fdd936d133bf8a48de140a3c666897588a05shiqian}
80e35fdd936d133bf8a48de140a3c666897588a05shiqian
81e35fdd936d133bf8a48de140a3c666897588a05shiqian// Retires all pre-requisites of this expectation.
82e35fdd936d133bf8a48de140a3c666897588a05shiqianvoid ExpectationBase::RetireAllPreRequisites() {
83e35fdd936d133bf8a48de140a3c666897588a05shiqian  if (is_retired()) {
84e35fdd936d133bf8a48de140a3c666897588a05shiqian    // We can take this short-cut as we never retire an expectation
85e35fdd936d133bf8a48de140a3c666897588a05shiqian    // until we have retired all its pre-requisites.
86e35fdd936d133bf8a48de140a3c666897588a05shiqian    return;
87e35fdd936d133bf8a48de140a3c666897588a05shiqian  }
88e35fdd936d133bf8a48de140a3c666897588a05shiqian
8941b9b0b5614588d252d565646ae43e9607d46502zhanyong.wan  for (ExpectationSet::const_iterator it = immediate_prerequisites_.begin();
9041b9b0b5614588d252d565646ae43e9607d46502zhanyong.wan       it != immediate_prerequisites_.end(); ++it) {
9141b9b0b5614588d252d565646ae43e9607d46502zhanyong.wan    ExpectationBase* const prerequisite = it->expectation_base().get();
92e35fdd936d133bf8a48de140a3c666897588a05shiqian    if (!prerequisite->is_retired()) {
93e35fdd936d133bf8a48de140a3c666897588a05shiqian      prerequisite->RetireAllPreRequisites();
94e35fdd936d133bf8a48de140a3c666897588a05shiqian      prerequisite->Retire();
95e35fdd936d133bf8a48de140a3c666897588a05shiqian    }
96e35fdd936d133bf8a48de140a3c666897588a05shiqian  }
97e35fdd936d133bf8a48de140a3c666897588a05shiqian}
98e35fdd936d133bf8a48de140a3c666897588a05shiqian
99e35fdd936d133bf8a48de140a3c666897588a05shiqian// Returns true iff all pre-requisites of this expectation have been
100e35fdd936d133bf8a48de140a3c666897588a05shiqian// satisfied.
101e35fdd936d133bf8a48de140a3c666897588a05shiqian// L >= g_gmock_mutex
102e35fdd936d133bf8a48de140a3c666897588a05shiqianbool ExpectationBase::AllPrerequisitesAreSatisfied() const {
103e35fdd936d133bf8a48de140a3c666897588a05shiqian  g_gmock_mutex.AssertHeld();
10441b9b0b5614588d252d565646ae43e9607d46502zhanyong.wan  for (ExpectationSet::const_iterator it = immediate_prerequisites_.begin();
105e35fdd936d133bf8a48de140a3c666897588a05shiqian       it != immediate_prerequisites_.end(); ++it) {
10641b9b0b5614588d252d565646ae43e9607d46502zhanyong.wan    if (!(it->expectation_base()->IsSatisfied()) ||
10741b9b0b5614588d252d565646ae43e9607d46502zhanyong.wan        !(it->expectation_base()->AllPrerequisitesAreSatisfied()))
108e35fdd936d133bf8a48de140a3c666897588a05shiqian      return false;
109e35fdd936d133bf8a48de140a3c666897588a05shiqian  }
110e35fdd936d133bf8a48de140a3c666897588a05shiqian  return true;
111e35fdd936d133bf8a48de140a3c666897588a05shiqian}
112e35fdd936d133bf8a48de140a3c666897588a05shiqian
113e35fdd936d133bf8a48de140a3c666897588a05shiqian// Adds unsatisfied pre-requisites of this expectation to 'result'.
114e35fdd936d133bf8a48de140a3c666897588a05shiqian// L >= g_gmock_mutex
115e35fdd936d133bf8a48de140a3c666897588a05shiqianvoid ExpectationBase::FindUnsatisfiedPrerequisites(
11641b9b0b5614588d252d565646ae43e9607d46502zhanyong.wan    ExpectationSet* result) const {
117e35fdd936d133bf8a48de140a3c666897588a05shiqian  g_gmock_mutex.AssertHeld();
11841b9b0b5614588d252d565646ae43e9607d46502zhanyong.wan  for (ExpectationSet::const_iterator it = immediate_prerequisites_.begin();
119e35fdd936d133bf8a48de140a3c666897588a05shiqian       it != immediate_prerequisites_.end(); ++it) {
12041b9b0b5614588d252d565646ae43e9607d46502zhanyong.wan    if (it->expectation_base()->IsSatisfied()) {
121e35fdd936d133bf8a48de140a3c666897588a05shiqian      // If *it is satisfied and has a call count of 0, some of its
122e35fdd936d133bf8a48de140a3c666897588a05shiqian      // pre-requisites may not be satisfied yet.
12341b9b0b5614588d252d565646ae43e9607d46502zhanyong.wan      if (it->expectation_base()->call_count_ == 0) {
12441b9b0b5614588d252d565646ae43e9607d46502zhanyong.wan        it->expectation_base()->FindUnsatisfiedPrerequisites(result);
125e35fdd936d133bf8a48de140a3c666897588a05shiqian      }
126e35fdd936d133bf8a48de140a3c666897588a05shiqian    } else {
127e35fdd936d133bf8a48de140a3c666897588a05shiqian      // Now that we know *it is unsatisfied, we are not so interested
128e35fdd936d133bf8a48de140a3c666897588a05shiqian      // in whether its pre-requisites are satisfied.  Therefore we
129e35fdd936d133bf8a48de140a3c666897588a05shiqian      // don't recursively call FindUnsatisfiedPrerequisites() here.
13041b9b0b5614588d252d565646ae43e9607d46502zhanyong.wan      *result += *it;
131e35fdd936d133bf8a48de140a3c666897588a05shiqian    }
132e35fdd936d133bf8a48de140a3c666897588a05shiqian  }
133e35fdd936d133bf8a48de140a3c666897588a05shiqian}
134e35fdd936d133bf8a48de140a3c666897588a05shiqian
135e35fdd936d133bf8a48de140a3c666897588a05shiqian// Points to the implicit sequence introduced by a living InSequence
136e35fdd936d133bf8a48de140a3c666897588a05shiqian// object (if any) in the current thread or NULL.
137e35fdd936d133bf8a48de140a3c666897588a05shiqianThreadLocal<Sequence*> g_gmock_implicit_sequence;
138e35fdd936d133bf8a48de140a3c666897588a05shiqian
139e35fdd936d133bf8a48de140a3c666897588a05shiqian// Reports an uninteresting call (whose description is in msg) in the
140e35fdd936d133bf8a48de140a3c666897588a05shiqian// manner specified by 'reaction'.
141e35fdd936d133bf8a48de140a3c666897588a05shiqianvoid ReportUninterestingCall(CallReaction reaction, const string& msg) {
142e35fdd936d133bf8a48de140a3c666897588a05shiqian  switch (reaction) {
143e35fdd936d133bf8a48de140a3c666897588a05shiqian    case ALLOW:
1449413f2ff615ae1b933580576183d316c4cb6376czhanyong.wan      Log(INFO, msg, 3);
145e35fdd936d133bf8a48de140a3c666897588a05shiqian      break;
146e35fdd936d133bf8a48de140a3c666897588a05shiqian    case WARN:
1479413f2ff615ae1b933580576183d316c4cb6376czhanyong.wan      Log(WARNING, msg, 3);
148e35fdd936d133bf8a48de140a3c666897588a05shiqian      break;
149e35fdd936d133bf8a48de140a3c666897588a05shiqian    default:  // FAIL
150e35fdd936d133bf8a48de140a3c666897588a05shiqian      Expect(false, NULL, -1, msg);
151e35fdd936d133bf8a48de140a3c666897588a05shiqian  }
152e35fdd936d133bf8a48de140a3c666897588a05shiqian}
153e35fdd936d133bf8a48de140a3c666897588a05shiqian
154e35fdd936d133bf8a48de140a3c666897588a05shiqian}  // namespace internal
155e35fdd936d133bf8a48de140a3c666897588a05shiqian
156e35fdd936d133bf8a48de140a3c666897588a05shiqian// Class Mock.
157e35fdd936d133bf8a48de140a3c666897588a05shiqian
158e35fdd936d133bf8a48de140a3c666897588a05shiqiannamespace {
159e35fdd936d133bf8a48de140a3c666897588a05shiqian
160e35fdd936d133bf8a48de140a3c666897588a05shiqiantypedef std::set<internal::UntypedFunctionMockerBase*> FunctionMockers;
161e35fdd936d133bf8a48de140a3c666897588a05shiqian
162df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan// The current state of a mock object.  Such information is needed for
163df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan// detecting leaked mock objects and explicitly verifying a mock's
164df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan// expectations.
165df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wanstruct MockObjectState {
166df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan  MockObjectState()
167df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan      : first_used_file(NULL), first_used_line(-1), leakable(false) {}
168df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan
169df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan  // Where in the source file an ON_CALL or EXPECT_CALL is first
170df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan  // invoked on this mock object.
171df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan  const char* first_used_file;
172df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan  int first_used_line;
173e7bb5ededa4df6ec430c1e84154bc01bf84d4ecczhanyong.wan  ::std::string first_used_test_case;
174e7bb5ededa4df6ec430c1e84154bc01bf84d4ecczhanyong.wan  ::std::string first_used_test;
175df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan  bool leakable;  // true iff it's OK to leak the object.
176df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan  FunctionMockers function_mockers;  // All registered methods of the object.
177df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan};
178df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan
179df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan// A global registry holding the state of all mock objects that are
180df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan// alive.  A mock object is added to this registry the first time
181df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan// Mock::AllowLeak(), ON_CALL(), or EXPECT_CALL() is called on it.  It
182df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan// is removed from the registry in the mock object's destructor.
183df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wanclass MockObjectRegistry {
184df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan public:
185df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan  // Maps a mock object (identified by its address) to its state.
186df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan  typedef std::map<const void*, MockObjectState> StateMap;
187df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan
188df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan  // This destructor will be called when a program exits, after all
189df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan  // tests in it have been run.  By then, there should be no mock
190df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan  // object alive.  Therefore we report any living object as test
191df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan  // failure, unless the user explicitly asked us to ignore it.
192df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan  ~MockObjectRegistry() {
1939571b28675a5a602ed3c8a7acf270d03aca69c96zhanyong.wan
1949571b28675a5a602ed3c8a7acf270d03aca69c96zhanyong.wan    // "using ::std::cout;" doesn't work with Symbian's STLport, where cout is
1959571b28675a5a602ed3c8a7acf270d03aca69c96zhanyong.wan    // a macro.
196df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan
197df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan    if (!GMOCK_FLAG(catch_leaked_mocks))
198df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan      return;
199df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan
200df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan    int leaked_count = 0;
201df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan    for (StateMap::const_iterator it = states_.begin(); it != states_.end();
202df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan         ++it) {
203df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan      if (it->second.leakable)  // The user said it's fine to leak this object.
204df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan        continue;
205df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan
206df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan      // TODO(wan@google.com): Print the type of the leaked object.
207df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan      // This can help the user identify the leaked object.
2089571b28675a5a602ed3c8a7acf270d03aca69c96zhanyong.wan      std::cout << "\n";
209df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan      const MockObjectState& state = it->second;
210f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan      std::cout << internal::FormatFileLocation(state.first_used_file,
211f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan                                                state.first_used_line);
2129571b28675a5a602ed3c8a7acf270d03aca69c96zhanyong.wan      std::cout << " ERROR: this mock object";
213e7bb5ededa4df6ec430c1e84154bc01bf84d4ecczhanyong.wan      if (state.first_used_test != "") {
2149571b28675a5a602ed3c8a7acf270d03aca69c96zhanyong.wan        std::cout << " (used in test " << state.first_used_test_case << "."
215e7bb5ededa4df6ec430c1e84154bc01bf84d4ecczhanyong.wan             << state.first_used_test << ")";
216e7bb5ededa4df6ec430c1e84154bc01bf84d4ecczhanyong.wan      }
2179571b28675a5a602ed3c8a7acf270d03aca69c96zhanyong.wan      std::cout << " should be deleted but never is. Its address is @"
218e7bb5ededa4df6ec430c1e84154bc01bf84d4ecczhanyong.wan           << it->first << ".";
219df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan      leaked_count++;
220df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan    }
221df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan    if (leaked_count > 0) {
2229571b28675a5a602ed3c8a7acf270d03aca69c96zhanyong.wan      std::cout << "\nERROR: " << leaked_count
223df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan           << " leaked mock " << (leaked_count == 1 ? "object" : "objects")
224df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan           << " found at program exit.\n";
2259571b28675a5a602ed3c8a7acf270d03aca69c96zhanyong.wan      std::cout.flush();
226df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan      ::std::cerr.flush();
227df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan      // RUN_ALL_TESTS() has already returned when this destructor is
228df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan      // called.  Therefore we cannot use the normal Google Test
229df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan      // failure reporting mechanism.
230df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan      _exit(1);  // We cannot call exit() as it is not reentrant and
231df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan                 // may already have been called.
232df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan    }
233df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan  }
234df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan
235df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan  StateMap& states() { return states_; }
236df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan private:
237df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan  StateMap states_;
238df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan};
239df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan
240df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan// Protected by g_gmock_mutex.
241e35fdd936d133bf8a48de140a3c666897588a05shiqianMockObjectRegistry g_mock_object_registry;
242e35fdd936d133bf8a48de140a3c666897588a05shiqian
243e35fdd936d133bf8a48de140a3c666897588a05shiqian// Maps a mock object to the reaction Google Mock should have when an
244e35fdd936d133bf8a48de140a3c666897588a05shiqian// uninteresting method is called.  Protected by g_gmock_mutex.
245e35fdd936d133bf8a48de140a3c666897588a05shiqianstd::map<const void*, internal::CallReaction> g_uninteresting_call_reaction;
246e35fdd936d133bf8a48de140a3c666897588a05shiqian
247e35fdd936d133bf8a48de140a3c666897588a05shiqian// Sets the reaction Google Mock should have when an uninteresting
248e35fdd936d133bf8a48de140a3c666897588a05shiqian// method of the given mock object is called.
249e35fdd936d133bf8a48de140a3c666897588a05shiqian// L < g_gmock_mutex
250e35fdd936d133bf8a48de140a3c666897588a05shiqianvoid SetReactionOnUninterestingCalls(const void* mock_obj,
251e35fdd936d133bf8a48de140a3c666897588a05shiqian                                     internal::CallReaction reaction) {
252e35fdd936d133bf8a48de140a3c666897588a05shiqian  internal::MutexLock l(&internal::g_gmock_mutex);
253e35fdd936d133bf8a48de140a3c666897588a05shiqian  g_uninteresting_call_reaction[mock_obj] = reaction;
254e35fdd936d133bf8a48de140a3c666897588a05shiqian}
255e35fdd936d133bf8a48de140a3c666897588a05shiqian
256e35fdd936d133bf8a48de140a3c666897588a05shiqian}  // namespace
257e35fdd936d133bf8a48de140a3c666897588a05shiqian
258e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tells Google Mock to allow uninteresting calls on the given mock
259e35fdd936d133bf8a48de140a3c666897588a05shiqian// object.
260e35fdd936d133bf8a48de140a3c666897588a05shiqian// L < g_gmock_mutex
261e35fdd936d133bf8a48de140a3c666897588a05shiqianvoid Mock::AllowUninterestingCalls(const void* mock_obj) {
262e35fdd936d133bf8a48de140a3c666897588a05shiqian  SetReactionOnUninterestingCalls(mock_obj, internal::ALLOW);
263e35fdd936d133bf8a48de140a3c666897588a05shiqian}
264e35fdd936d133bf8a48de140a3c666897588a05shiqian
265e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tells Google Mock to warn the user about uninteresting calls on the
266e35fdd936d133bf8a48de140a3c666897588a05shiqian// given mock object.
267e35fdd936d133bf8a48de140a3c666897588a05shiqian// L < g_gmock_mutex
268e35fdd936d133bf8a48de140a3c666897588a05shiqianvoid Mock::WarnUninterestingCalls(const void* mock_obj) {
269e35fdd936d133bf8a48de140a3c666897588a05shiqian  SetReactionOnUninterestingCalls(mock_obj, internal::WARN);
270e35fdd936d133bf8a48de140a3c666897588a05shiqian}
271e35fdd936d133bf8a48de140a3c666897588a05shiqian
272e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tells Google Mock to fail uninteresting calls on the given mock
273e35fdd936d133bf8a48de140a3c666897588a05shiqian// object.
274e35fdd936d133bf8a48de140a3c666897588a05shiqian// L < g_gmock_mutex
275e35fdd936d133bf8a48de140a3c666897588a05shiqianvoid Mock::FailUninterestingCalls(const void* mock_obj) {
276e35fdd936d133bf8a48de140a3c666897588a05shiqian  SetReactionOnUninterestingCalls(mock_obj, internal::FAIL);
277e35fdd936d133bf8a48de140a3c666897588a05shiqian}
278e35fdd936d133bf8a48de140a3c666897588a05shiqian
279e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tells Google Mock the given mock object is being destroyed and its
280e35fdd936d133bf8a48de140a3c666897588a05shiqian// entry in the call-reaction table should be removed.
281e35fdd936d133bf8a48de140a3c666897588a05shiqian// L < g_gmock_mutex
282e35fdd936d133bf8a48de140a3c666897588a05shiqianvoid Mock::UnregisterCallReaction(const void* mock_obj) {
283e35fdd936d133bf8a48de140a3c666897588a05shiqian  internal::MutexLock l(&internal::g_gmock_mutex);
284e35fdd936d133bf8a48de140a3c666897588a05shiqian  g_uninteresting_call_reaction.erase(mock_obj);
285e35fdd936d133bf8a48de140a3c666897588a05shiqian}
286e35fdd936d133bf8a48de140a3c666897588a05shiqian
287e35fdd936d133bf8a48de140a3c666897588a05shiqian// Returns the reaction Google Mock will have on uninteresting calls
288e35fdd936d133bf8a48de140a3c666897588a05shiqian// made on the given mock object.
289e35fdd936d133bf8a48de140a3c666897588a05shiqian// L < g_gmock_mutex
290e35fdd936d133bf8a48de140a3c666897588a05shiqianinternal::CallReaction Mock::GetReactionOnUninterestingCalls(
291e35fdd936d133bf8a48de140a3c666897588a05shiqian    const void* mock_obj) {
292e35fdd936d133bf8a48de140a3c666897588a05shiqian  internal::MutexLock l(&internal::g_gmock_mutex);
293e35fdd936d133bf8a48de140a3c666897588a05shiqian  return (g_uninteresting_call_reaction.count(mock_obj) == 0) ?
294e35fdd936d133bf8a48de140a3c666897588a05shiqian      internal::WARN : g_uninteresting_call_reaction[mock_obj];
295e35fdd936d133bf8a48de140a3c666897588a05shiqian}
296e35fdd936d133bf8a48de140a3c666897588a05shiqian
297df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan// Tells Google Mock to ignore mock_obj when checking for leaked mock
298df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan// objects.
299df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan// L < g_gmock_mutex
300df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wanvoid Mock::AllowLeak(const void* mock_obj) {
301df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan  internal::MutexLock l(&internal::g_gmock_mutex);
302df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan  g_mock_object_registry.states()[mock_obj].leakable = true;
303df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan}
304df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan
305e35fdd936d133bf8a48de140a3c666897588a05shiqian// Verifies and clears all expectations on the given mock object.  If
306e35fdd936d133bf8a48de140a3c666897588a05shiqian// the expectations aren't satisfied, generates one or more Google
307e35fdd936d133bf8a48de140a3c666897588a05shiqian// Test non-fatal failures and returns false.
308e35fdd936d133bf8a48de140a3c666897588a05shiqian// L < g_gmock_mutex
309e35fdd936d133bf8a48de140a3c666897588a05shiqianbool Mock::VerifyAndClearExpectations(void* mock_obj) {
310e35fdd936d133bf8a48de140a3c666897588a05shiqian  internal::MutexLock l(&internal::g_gmock_mutex);
311e35fdd936d133bf8a48de140a3c666897588a05shiqian  return VerifyAndClearExpectationsLocked(mock_obj);
312e35fdd936d133bf8a48de140a3c666897588a05shiqian}
313e35fdd936d133bf8a48de140a3c666897588a05shiqian
314e35fdd936d133bf8a48de140a3c666897588a05shiqian// Verifies all expectations on the given mock object and clears its
315e35fdd936d133bf8a48de140a3c666897588a05shiqian// default actions and expectations.  Returns true iff the
316e35fdd936d133bf8a48de140a3c666897588a05shiqian// verification was successful.
317e35fdd936d133bf8a48de140a3c666897588a05shiqian// L < g_gmock_mutex
318e35fdd936d133bf8a48de140a3c666897588a05shiqianbool Mock::VerifyAndClear(void* mock_obj) {
319e35fdd936d133bf8a48de140a3c666897588a05shiqian  internal::MutexLock l(&internal::g_gmock_mutex);
320e35fdd936d133bf8a48de140a3c666897588a05shiqian  ClearDefaultActionsLocked(mock_obj);
321e35fdd936d133bf8a48de140a3c666897588a05shiqian  return VerifyAndClearExpectationsLocked(mock_obj);
322e35fdd936d133bf8a48de140a3c666897588a05shiqian}
323e35fdd936d133bf8a48de140a3c666897588a05shiqian
324e35fdd936d133bf8a48de140a3c666897588a05shiqian// Verifies and clears all expectations on the given mock object.  If
325e35fdd936d133bf8a48de140a3c666897588a05shiqian// the expectations aren't satisfied, generates one or more Google
326e35fdd936d133bf8a48de140a3c666897588a05shiqian// Test non-fatal failures and returns false.
327e35fdd936d133bf8a48de140a3c666897588a05shiqian// L >= g_gmock_mutex
328e35fdd936d133bf8a48de140a3c666897588a05shiqianbool Mock::VerifyAndClearExpectationsLocked(void* mock_obj) {
329e35fdd936d133bf8a48de140a3c666897588a05shiqian  internal::g_gmock_mutex.AssertHeld();
330df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan  if (g_mock_object_registry.states().count(mock_obj) == 0) {
331e35fdd936d133bf8a48de140a3c666897588a05shiqian    // No EXPECT_CALL() was set on the given mock object.
332e35fdd936d133bf8a48de140a3c666897588a05shiqian    return true;
333e35fdd936d133bf8a48de140a3c666897588a05shiqian  }
334e35fdd936d133bf8a48de140a3c666897588a05shiqian
335e35fdd936d133bf8a48de140a3c666897588a05shiqian  // Verifies and clears the expectations on each mock method in the
336e35fdd936d133bf8a48de140a3c666897588a05shiqian  // given mock object.
337e35fdd936d133bf8a48de140a3c666897588a05shiqian  bool expectations_met = true;
338df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan  FunctionMockers& mockers =
339df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan      g_mock_object_registry.states()[mock_obj].function_mockers;
340e35fdd936d133bf8a48de140a3c666897588a05shiqian  for (FunctionMockers::const_iterator it = mockers.begin();
341e35fdd936d133bf8a48de140a3c666897588a05shiqian       it != mockers.end(); ++it) {
342e35fdd936d133bf8a48de140a3c666897588a05shiqian    if (!(*it)->VerifyAndClearExpectationsLocked()) {
343e35fdd936d133bf8a48de140a3c666897588a05shiqian      expectations_met = false;
344e35fdd936d133bf8a48de140a3c666897588a05shiqian    }
345e35fdd936d133bf8a48de140a3c666897588a05shiqian  }
346e35fdd936d133bf8a48de140a3c666897588a05shiqian
347e35fdd936d133bf8a48de140a3c666897588a05shiqian  // We don't clear the content of mockers, as they may still be
348e35fdd936d133bf8a48de140a3c666897588a05shiqian  // needed by ClearDefaultActionsLocked().
349e35fdd936d133bf8a48de140a3c666897588a05shiqian  return expectations_met;
350e35fdd936d133bf8a48de140a3c666897588a05shiqian}
351e35fdd936d133bf8a48de140a3c666897588a05shiqian
352e35fdd936d133bf8a48de140a3c666897588a05shiqian// Registers a mock object and a mock method it owns.
353e35fdd936d133bf8a48de140a3c666897588a05shiqian// L < g_gmock_mutex
354e35fdd936d133bf8a48de140a3c666897588a05shiqianvoid Mock::Register(const void* mock_obj,
355e35fdd936d133bf8a48de140a3c666897588a05shiqian                    internal::UntypedFunctionMockerBase* mocker) {
356e35fdd936d133bf8a48de140a3c666897588a05shiqian  internal::MutexLock l(&internal::g_gmock_mutex);
357df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan  g_mock_object_registry.states()[mock_obj].function_mockers.insert(mocker);
358df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan}
359df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan
360df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan// Tells Google Mock where in the source code mock_obj is used in an
361df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan// ON_CALL or EXPECT_CALL.  In case mock_obj is leaked, this
362df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan// information helps the user identify which object it is.
363df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan// L < g_gmock_mutex
364df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wanvoid Mock::RegisterUseByOnCallOrExpectCall(
365df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan    const void* mock_obj, const char* file, int line) {
366df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan  internal::MutexLock l(&internal::g_gmock_mutex);
367df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan  MockObjectState& state = g_mock_object_registry.states()[mock_obj];
368df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan  if (state.first_used_file == NULL) {
369df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan    state.first_used_file = file;
370df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan    state.first_used_line = line;
371e7bb5ededa4df6ec430c1e84154bc01bf84d4ecczhanyong.wan    const TestInfo* const test_info =
372e7bb5ededa4df6ec430c1e84154bc01bf84d4ecczhanyong.wan        UnitTest::GetInstance()->current_test_info();
373e7bb5ededa4df6ec430c1e84154bc01bf84d4ecczhanyong.wan    if (test_info != NULL) {
374e7bb5ededa4df6ec430c1e84154bc01bf84d4ecczhanyong.wan      // TODO(wan@google.com): record the test case name when the
375e7bb5ededa4df6ec430c1e84154bc01bf84d4ecczhanyong.wan      // ON_CALL or EXPECT_CALL is invoked from SetUpTestCase() or
376e7bb5ededa4df6ec430c1e84154bc01bf84d4ecczhanyong.wan      // TearDownTestCase().
377e7bb5ededa4df6ec430c1e84154bc01bf84d4ecczhanyong.wan      state.first_used_test_case = test_info->test_case_name();
378e7bb5ededa4df6ec430c1e84154bc01bf84d4ecczhanyong.wan      state.first_used_test = test_info->name();
379e7bb5ededa4df6ec430c1e84154bc01bf84d4ecczhanyong.wan    }
380df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan  }
381e35fdd936d133bf8a48de140a3c666897588a05shiqian}
382e35fdd936d133bf8a48de140a3c666897588a05shiqian
383e35fdd936d133bf8a48de140a3c666897588a05shiqian// Unregisters a mock method; removes the owning mock object from the
384e35fdd936d133bf8a48de140a3c666897588a05shiqian// registry when the last mock method associated with it has been
385e35fdd936d133bf8a48de140a3c666897588a05shiqian// unregistered.  This is called only in the destructor of
386e35fdd936d133bf8a48de140a3c666897588a05shiqian// FunctionMockerBase.
387e35fdd936d133bf8a48de140a3c666897588a05shiqian// L >= g_gmock_mutex
388e35fdd936d133bf8a48de140a3c666897588a05shiqianvoid Mock::UnregisterLocked(internal::UntypedFunctionMockerBase* mocker) {
389e35fdd936d133bf8a48de140a3c666897588a05shiqian  internal::g_gmock_mutex.AssertHeld();
390df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan  for (MockObjectRegistry::StateMap::iterator it =
391df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan           g_mock_object_registry.states().begin();
392df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan       it != g_mock_object_registry.states().end(); ++it) {
393df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan    FunctionMockers& mockers = it->second.function_mockers;
394e35fdd936d133bf8a48de140a3c666897588a05shiqian    if (mockers.erase(mocker) > 0) {
395e35fdd936d133bf8a48de140a3c666897588a05shiqian      // mocker was in mockers and has been just removed.
396e35fdd936d133bf8a48de140a3c666897588a05shiqian      if (mockers.empty()) {
397df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan        g_mock_object_registry.states().erase(it);
398e35fdd936d133bf8a48de140a3c666897588a05shiqian      }
399e35fdd936d133bf8a48de140a3c666897588a05shiqian      return;
400e35fdd936d133bf8a48de140a3c666897588a05shiqian    }
401e35fdd936d133bf8a48de140a3c666897588a05shiqian  }
402e35fdd936d133bf8a48de140a3c666897588a05shiqian}
403e35fdd936d133bf8a48de140a3c666897588a05shiqian
404e35fdd936d133bf8a48de140a3c666897588a05shiqian// Clears all ON_CALL()s set on the given mock object.
405e35fdd936d133bf8a48de140a3c666897588a05shiqian// L >= g_gmock_mutex
406e35fdd936d133bf8a48de140a3c666897588a05shiqianvoid Mock::ClearDefaultActionsLocked(void* mock_obj) {
407e35fdd936d133bf8a48de140a3c666897588a05shiqian  internal::g_gmock_mutex.AssertHeld();
408e35fdd936d133bf8a48de140a3c666897588a05shiqian
409df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan  if (g_mock_object_registry.states().count(mock_obj) == 0) {
410e35fdd936d133bf8a48de140a3c666897588a05shiqian    // No ON_CALL() was set on the given mock object.
411e35fdd936d133bf8a48de140a3c666897588a05shiqian    return;
412e35fdd936d133bf8a48de140a3c666897588a05shiqian  }
413e35fdd936d133bf8a48de140a3c666897588a05shiqian
414e35fdd936d133bf8a48de140a3c666897588a05shiqian  // Clears the default actions for each mock method in the given mock
415e35fdd936d133bf8a48de140a3c666897588a05shiqian  // object.
416df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan  FunctionMockers& mockers =
417df35a763b9d98d7040a00fc1e5cffe91a80ba9e0zhanyong.wan      g_mock_object_registry.states()[mock_obj].function_mockers;
418e35fdd936d133bf8a48de140a3c666897588a05shiqian  for (FunctionMockers::const_iterator it = mockers.begin();
419e35fdd936d133bf8a48de140a3c666897588a05shiqian       it != mockers.end(); ++it) {
420e35fdd936d133bf8a48de140a3c666897588a05shiqian    (*it)->ClearDefaultActionsLocked();
421e35fdd936d133bf8a48de140a3c666897588a05shiqian  }
422e35fdd936d133bf8a48de140a3c666897588a05shiqian
423e35fdd936d133bf8a48de140a3c666897588a05shiqian  // We don't clear the content of mockers, as they may still be
424e35fdd936d133bf8a48de140a3c666897588a05shiqian  // needed by VerifyAndClearExpectationsLocked().
425e35fdd936d133bf8a48de140a3c666897588a05shiqian}
426e35fdd936d133bf8a48de140a3c666897588a05shiqian
4277c95d8346e9c62e9d6d7e8202fbcfb34c4404db9zhanyong.wanExpectation::Expectation() {}
4287c95d8346e9c62e9d6d7e8202fbcfb34c4404db9zhanyong.wan
4297c95d8346e9c62e9d6d7e8202fbcfb34c4404db9zhanyong.wanExpectation::Expectation(
43032de5f53763125925e078498250f7e73a88de9edzhanyong.wan    const internal::linked_ptr<internal::ExpectationBase>& an_expectation_base)
43132de5f53763125925e078498250f7e73a88de9edzhanyong.wan    : expectation_base_(an_expectation_base) {}
4327c95d8346e9c62e9d6d7e8202fbcfb34c4404db9zhanyong.wan
4337c95d8346e9c62e9d6d7e8202fbcfb34c4404db9zhanyong.wanExpectation::~Expectation() {}
4347c95d8346e9c62e9d6d7e8202fbcfb34c4404db9zhanyong.wan
435e35fdd936d133bf8a48de140a3c666897588a05shiqian// Adds an expectation to a sequence.
43641b9b0b5614588d252d565646ae43e9607d46502zhanyong.wanvoid Sequence::AddExpectation(const Expectation& expectation) const {
437e35fdd936d133bf8a48de140a3c666897588a05shiqian  if (*last_expectation_ != expectation) {
43841b9b0b5614588d252d565646ae43e9607d46502zhanyong.wan    if (last_expectation_->expectation_base() != NULL) {
43941b9b0b5614588d252d565646ae43e9607d46502zhanyong.wan      expectation.expectation_base()->immediate_prerequisites_
44041b9b0b5614588d252d565646ae43e9607d46502zhanyong.wan          += *last_expectation_;
441e35fdd936d133bf8a48de140a3c666897588a05shiqian    }
442e35fdd936d133bf8a48de140a3c666897588a05shiqian    *last_expectation_ = expectation;
443e35fdd936d133bf8a48de140a3c666897588a05shiqian  }
444e35fdd936d133bf8a48de140a3c666897588a05shiqian}
445e35fdd936d133bf8a48de140a3c666897588a05shiqian
446e35fdd936d133bf8a48de140a3c666897588a05shiqian// Creates the implicit sequence if there isn't one.
447e35fdd936d133bf8a48de140a3c666897588a05shiqianInSequence::InSequence() {
448e35fdd936d133bf8a48de140a3c666897588a05shiqian  if (internal::g_gmock_implicit_sequence.get() == NULL) {
449e35fdd936d133bf8a48de140a3c666897588a05shiqian    internal::g_gmock_implicit_sequence.set(new Sequence);
450e35fdd936d133bf8a48de140a3c666897588a05shiqian    sequence_created_ = true;
451e35fdd936d133bf8a48de140a3c666897588a05shiqian  } else {
452e35fdd936d133bf8a48de140a3c666897588a05shiqian    sequence_created_ = false;
453e35fdd936d133bf8a48de140a3c666897588a05shiqian  }
454e35fdd936d133bf8a48de140a3c666897588a05shiqian}
455e35fdd936d133bf8a48de140a3c666897588a05shiqian
456e35fdd936d133bf8a48de140a3c666897588a05shiqian// Deletes the implicit sequence if it was created by the constructor
457e35fdd936d133bf8a48de140a3c666897588a05shiqian// of this object.
458e35fdd936d133bf8a48de140a3c666897588a05shiqianInSequence::~InSequence() {
459e35fdd936d133bf8a48de140a3c666897588a05shiqian  if (sequence_created_) {
460e35fdd936d133bf8a48de140a3c666897588a05shiqian    delete internal::g_gmock_implicit_sequence.get();
461e35fdd936d133bf8a48de140a3c666897588a05shiqian    internal::g_gmock_implicit_sequence.set(NULL);
462e35fdd936d133bf8a48de140a3c666897588a05shiqian  }
463e35fdd936d133bf8a48de140a3c666897588a05shiqian}
464e35fdd936d133bf8a48de140a3c666897588a05shiqian
465e35fdd936d133bf8a48de140a3c666897588a05shiqian}  // namespace testing
466