Index: testing/gmock/include/gmock/gmock-spec-builders.h |
diff --git a/testing/gmock/include/gmock/gmock-spec-builders.h b/testing/gmock/include/gmock/gmock-spec-builders.h |
index 765e06d9b501b0911e9a1e7d4141f70008aee76e..9aa0a9eedda70cfade4254dd788ef073b9a06039 100644 |
--- a/testing/gmock/include/gmock/gmock-spec-builders.h |
+++ b/testing/gmock/include/gmock/gmock-spec-builders.h |
@@ -142,10 +142,10 @@ class DefaultActionSpec { |
// Constructs a DefaultActionSpec object from the information inside |
// the parenthesis of an ON_CALL() statement. |
- DefaultActionSpec(const char* file, int line, |
+ DefaultActionSpec(const char* a_file, int a_line, |
const ArgumentMatcherTuple& matchers) |
- : file_(file), |
- line_(line), |
+ : file_(a_file), |
+ line_(a_line), |
matchers_(matchers), |
// By default, extra_matcher_ should match anything. However, |
// we cannot initialize it with _ as that triggers a compiler |
@@ -196,6 +196,7 @@ class DefaultActionSpec { |
"once in an ON_CALL()."); |
return action_; |
} |
+ |
private: |
// Gives each clause in the ON_CALL() statement a name. |
enum Clause { |
@@ -561,14 +562,15 @@ extern ThreadLocal<Sequence*> g_gmock_implicit_sequence; |
// This class is internal and mustn't be used by user code directly. |
class ExpectationBase { |
public: |
- ExpectationBase(const char* file, int line); |
+ // source_text is the EXPECT_CALL(...) source that created this Expectation. |
+ ExpectationBase(const char* file, int line, const string& source_text); |
virtual ~ExpectationBase(); |
// Where in the source file was the expectation spec defined? |
const char* file() const { return file_; } |
int line() const { return line_; } |
- |
+ const char* source_text() const { return source_text_.c_str(); } |
// Returns the cardinality specified in the expectation spec. |
const Cardinality& cardinality() const { return cardinality_; } |
@@ -581,6 +583,7 @@ class ExpectationBase { |
// expectation has occurred. |
// L >= g_gmock_mutex |
virtual void DescribeCallCountTo(::std::ostream* os) const = 0; |
+ |
protected: |
friend class ::testing::Expectation; |
@@ -619,8 +622,8 @@ class ExpectationBase { |
bool cardinality_specified() const { return cardinality_specified_; } |
// Sets the cardinality of this expectation spec. |
- void set_cardinality(const Cardinality& cardinality) { |
- cardinality_ = cardinality; |
+ void set_cardinality(const Cardinality& a_cardinality) { |
+ cardinality_ = a_cardinality; |
} |
// The following group of methods should only be called after the |
@@ -697,8 +700,9 @@ class ExpectationBase { |
// This group of fields are part of the spec and won't change after |
// an EXPECT_CALL() statement finishes. |
- const char* file_; // The file that contains the expectation. |
- int line_; // The line number of the expectation. |
+ const char* file_; // The file that contains the expectation. |
+ int line_; // The line number of the expectation. |
+ const string source_text_; // The EXPECT_CALL(...) source text. |
// True iff the cardinality is specified explicitly. |
bool cardinality_specified_; |
Cardinality cardinality_; // The cardinality of the expectation. |
@@ -714,6 +718,8 @@ class ExpectationBase { |
// and can change as the mock function is called. |
int call_count_; // How many times this expectation has been invoked. |
bool retired_; // True iff this expectation has retired. |
+ |
+ GTEST_DISALLOW_ASSIGN_(ExpectationBase); |
}; // class ExpectationBase |
// Impements an expectation for the given function type. |
@@ -724,11 +730,13 @@ class TypedExpectation : public ExpectationBase { |
typedef typename Function<F>::ArgumentMatcherTuple ArgumentMatcherTuple; |
typedef typename Function<F>::Result Result; |
- TypedExpectation(FunctionMockerBase<F>* owner, const char* file, int line, |
+ TypedExpectation(FunctionMockerBase<F>* owner, |
+ const char* a_file, int a_line, const string& a_source_text, |
const ArgumentMatcherTuple& m) |
- : ExpectationBase(file, line), |
+ : ExpectationBase(a_file, a_line, a_source_text), |
owner_(owner), |
matchers_(m), |
+ extra_matcher_specified_(false), |
// By default, extra_matcher_ should match anything. However, |
// we cannot initialize it with _ as that triggers a compiler |
// bug in Symbian's C++ compiler (cannot decide between two |
@@ -760,11 +768,12 @@ class TypedExpectation : public ExpectationBase { |
last_clause_ = kWith; |
extra_matcher_ = m; |
+ extra_matcher_specified_ = true; |
return *this; |
} |
// Implements the .Times() clause. |
- TypedExpectation& Times(const Cardinality& cardinality) { |
+ TypedExpectation& Times(const Cardinality& a_cardinality) { |
if (last_clause_ ==kTimes) { |
ExpectSpecProperty(false, |
".Times() cannot appear " |
@@ -777,7 +786,7 @@ class TypedExpectation : public ExpectationBase { |
} |
last_clause_ = kTimes; |
- ExpectationBase::SpecifyCardinality(cardinality); |
+ ExpectationBase::SpecifyCardinality(a_cardinality); |
return *this; |
} |
@@ -938,6 +947,15 @@ class TypedExpectation : public ExpectationBase { |
<< " and " |
<< (is_retired() ? "retired" : "active"); |
} |
+ |
+ void MaybeDescribeExtraMatcherTo(::std::ostream* os) { |
+ if (extra_matcher_specified_) { |
+ *os << " Expected args: "; |
+ extra_matcher_.DescribeTo(os); |
+ *os << "\n"; |
+ } |
+ } |
+ |
private: |
template <typename Function> |
friend class FunctionMockerBase; |
@@ -1034,7 +1052,7 @@ class TypedExpectation : public ExpectationBase { |
// we warn the user when the WillOnce() clauses ran out. |
::std::stringstream ss; |
DescribeLocationTo(&ss); |
- ss << "Actions ran out.\n" |
+ ss << "Actions ran out in " << source_text() << "...\n" |
<< "Called " << count << " times, but only " |
<< action_count << " WillOnce()" |
<< (action_count == 1 ? " is" : "s are") << " specified - "; |
@@ -1078,7 +1096,7 @@ class TypedExpectation : public ExpectationBase { |
} |
// Must be done after IncrementCount()! |
- *what << "Expected mock function call.\n"; |
+ *what << "Mock function call matches " << source_text() <<"...\n"; |
return GetCurrentAction(mocker, args); |
} |
@@ -1123,7 +1141,7 @@ class TypedExpectation : public ExpectationBase { |
::std::stringstream ss; |
DescribeLocationTo(&ss); |
ss << "Too " << (too_many ? "many" : "few") |
- << " actions specified.\n" |
+ << " actions specified in " << source_text() << "...\n" |
<< "Expected to be "; |
cardinality().DescribeTo(&ss); |
ss << ", but has " << (too_many ? "" : "only ") |
@@ -1141,6 +1159,7 @@ class TypedExpectation : public ExpectationBase { |
// statement finishes. |
FunctionMockerBase<F>* const owner_; |
ArgumentMatcherTuple matchers_; |
+ bool extra_matcher_specified_; |
Matcher<const ArgumentTuple&> extra_matcher_; |
std::vector<Action<F> > actions_; |
bool repeated_action_specified_; // True if a WillRepeatedly() was specified. |
@@ -1149,6 +1168,8 @@ class TypedExpectation : public ExpectationBase { |
Clause last_clause_; |
mutable bool action_count_checked_; // Under mutex_. |
mutable Mutex mutex_; // Protects action_count_checked_. |
+ |
+ GTEST_DISALLOW_COPY_AND_ASSIGN_(TypedExpectation); |
}; // class TypedExpectation |
// A MockSpec object is used by ON_CALL() or EXPECT_CALL() for |
@@ -1186,9 +1207,10 @@ class MockSpec { |
// the newly created spec. |
internal::TypedExpectation<F>& InternalExpectedAt( |
const char* file, int line, const char* obj, const char* call) { |
- LogWithLocation(internal::INFO, file, line, |
- string("EXPECT_CALL(") + obj + ", " + call + ") invoked"); |
- return function_mocker_->AddNewExpectation(file, line, matchers_); |
+ const string source_text(string("EXPECT_CALL(") + obj + ", " + call + ")"); |
+ LogWithLocation(internal::INFO, file, line, source_text + " invoked"); |
+ return function_mocker_->AddNewExpectation( |
+ file, line, source_text, matchers_); |
} |
private: |
@@ -1212,6 +1234,8 @@ class MockSpec { |
internal::FunctionMockerBase<F>* const function_mocker_; |
// The argument matchers specified in the spec. |
ArgumentMatcherTuple matchers_; |
+ |
+ GTEST_DISALLOW_ASSIGN_(MockSpec); |
}; // class MockSpec |
// MSVC warns about using 'this' in base member initializer list, so |
@@ -1235,7 +1259,7 @@ class MockSpec { |
template <typename T> |
class ActionResultHolder { |
public: |
- explicit ActionResultHolder(T value) : value_(value) {} |
+ explicit ActionResultHolder(T a_value) : value_(a_value) {} |
// The compiler-generated copy constructor and assignment operator |
// are exactly what we need, so we don't need to define them. |
@@ -1269,6 +1293,9 @@ class ActionResultHolder { |
private: |
T value_; |
+ |
+ // T could be a reference type, so = isn't supported. |
+ GTEST_DISALLOW_ASSIGN_(ActionResultHolder); |
}; |
// Specialization for T = void. |
@@ -1417,6 +1444,7 @@ class FunctionMockerBase : public UntypedFunctionMockerBase { |
} |
return name; |
} |
+ |
protected: |
template <typename Function> |
friend class MockSpec; |
@@ -1440,11 +1468,13 @@ class FunctionMockerBase : public UntypedFunctionMockerBase { |
// Adds and returns an expectation spec for this mock function. |
// L < g_gmock_mutex |
TypedExpectation<F>& AddNewExpectation( |
- const char* file, int line, |
+ const char* file, |
+ int line, |
+ const string& source_text, |
const ArgumentMatcherTuple& m) { |
Mock::RegisterUseByOnCallOrExpectCall(MockObject(), file, line); |
const linked_ptr<TypedExpectation<F> > expectation( |
- new TypedExpectation<F>(this, file, line, m)); |
+ new TypedExpectation<F>(this, file, line, source_text, m)); |
expectations_.push_back(expectation); |
// Adds this expectation into the implicit sequence if there is one. |
@@ -1459,6 +1489,7 @@ class FunctionMockerBase : public UntypedFunctionMockerBase { |
// The current spec (either default action spec or expectation spec) |
// being described on this function mocker. |
MockSpec<F>& current_spec() { return current_spec_; } |
+ |
private: |
template <typename Func> friend class TypedExpectation; |
@@ -1584,9 +1615,9 @@ class FunctionMockerBase : public UntypedFunctionMockerBase { |
*why << "\n"; |
expectations_[i]->DescribeLocationTo(why); |
if (count > 1) { |
- *why << "tried expectation #" << i; |
+ *why << "tried expectation #" << i << ": "; |
} |
- *why << "\n"; |
+ *why << expectations_[i]->source_text() << "...\n"; |
expectations_[i]->DescribeMatchResultTo(args, why); |
expectations_[i]->DescribeCallCountTo(why); |
} |
@@ -1651,10 +1682,12 @@ bool FunctionMockerBase<F>::VerifyAndClearExpectationsLocked() { |
} else if (!exp->IsSatisfied()) { |
expectations_met = false; |
::std::stringstream ss; |
- ss << "Actual function call count doesn't match this expectation.\n"; |
+ ss << "Actual function call count doesn't match " |
+ << exp->source_text() << "...\n"; |
// No need to show the source file location of the expectation |
// in the description, as the Expect() call that follows already |
// takes care of it. |
+ exp->MaybeDescribeExtraMatcherTo(&ss); |
exp->DescribeCallCountTo(&ss); |
Expect(false, exp->file(), exp->line(), ss.str()); |
} |