Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
yangql
googletest
Commits
ecf94595
Commit
ecf94595
authored
Aug 26, 2015
by
Billy Donahue
Browse files
Merge remote-tracking branch 'google/master'
parents
c8044924
bf5753ac
Changes
93
Hide whitespace changes
Inline
Side-by-side
Showing
20 changed files
with
9333 additions
and
0 deletions
+9333
-0
googlemock/include/gmock/gmock-generated-matchers.h.pump
googlemock/include/gmock/gmock-generated-matchers.h.pump
+672
-0
googlemock/include/gmock/gmock-generated-nice-strict.h
googlemock/include/gmock/gmock-generated-nice-strict.h
+397
-0
googlemock/include/gmock/gmock-generated-nice-strict.h.pump
googlemock/include/gmock/gmock-generated-nice-strict.h.pump
+161
-0
googlemock/include/gmock/gmock-matchers.h
googlemock/include/gmock/gmock-matchers.h
+4399
-0
googlemock/include/gmock/gmock-more-actions.h
googlemock/include/gmock/gmock-more-actions.h
+246
-0
googlemock/include/gmock/gmock-more-matchers.h
googlemock/include/gmock/gmock-more-matchers.h
+58
-0
googlemock/include/gmock/gmock-spec-builders.h
googlemock/include/gmock/gmock-spec-builders.h
+1847
-0
googlemock/include/gmock/gmock.h
googlemock/include/gmock/gmock.h
+94
-0
googlemock/include/gmock/internal/custom/gmock-generated-actions.h
...k/include/gmock/internal/custom/gmock-generated-actions.h
+8
-0
googlemock/include/gmock/internal/custom/gmock-generated-actions.h.pump
...lude/gmock/internal/custom/gmock-generated-actions.h.pump
+10
-0
googlemock/include/gmock/internal/custom/gmock-matchers.h
googlemock/include/gmock/internal/custom/gmock-matchers.h
+39
-0
googlemock/include/gmock/internal/custom/gmock-port.h
googlemock/include/gmock/internal/custom/gmock-port.h
+46
-0
googlemock/include/gmock/internal/gmock-generated-internal-utils.h
...k/include/gmock/internal/gmock-generated-internal-utils.h
+279
-0
googlemock/include/gmock/internal/gmock-generated-internal-utils.h.pump
...lude/gmock/internal/gmock-generated-internal-utils.h.pump
+136
-0
googlemock/include/gmock/internal/gmock-internal-utils.h
googlemock/include/gmock/internal/gmock-internal-utils.h
+511
-0
googlemock/include/gmock/internal/gmock-port.h
googlemock/include/gmock/internal/gmock-port.h
+91
-0
googlemock/make/Makefile
googlemock/make/Makefile
+101
-0
googlemock/msvc/2005/gmock.sln
googlemock/msvc/2005/gmock.sln
+32
-0
googlemock/msvc/2005/gmock.vcproj
googlemock/msvc/2005/gmock.vcproj
+191
-0
googlemock/msvc/2005/gmock_config.vsprops
googlemock/msvc/2005/gmock_config.vsprops
+15
-0
No files found.
Too many changes to show.
To preserve performance only
93 of 93+
files are displayed.
Plain diff
Email patch
googlemock/include/gmock/gmock-generated-matchers.h.pump
0 → 100644
View file @
ecf94595
$$
-*-
mode
:
c
++
;
-*-
$$
This
is
a
Pump
source
file
.
Please
use
Pump
to
convert
it
to
$$
gmock
-
generated
-
actions
.
h
.
$$
$
var
n
=
10
$$
The
maximum
arity
we
support
.
$$
}}
This
line
fixes
auto
-
indentation
of
the
following
code
in
Emacs
.
// Copyright 2008, Google Inc.
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
// * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following disclaimer
// in the documentation and/or other materials provided with the
// distribution.
// * Neither the name of Google Inc. nor the names of its
// contributors may be used to endorse or promote products derived from
// this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
// Google Mock - a framework for writing C++ mock classes.
//
// This file implements some commonly used variadic matchers.
#ifndef GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_MATCHERS_H_
#define GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_MATCHERS_H_
#include <iterator>
#include <sstream>
#include <string>
#include <vector>
#include "gmock/gmock-matchers.h"
namespace
testing
{
namespace
internal
{
$
range
i
0.
.
n
-
1
// The type of the i-th (0-based) field of Tuple.
#define GMOCK_FIELD_TYPE_(Tuple, i) \
typename ::testing::tuple_element<i, Tuple>::type
// TupleFields<Tuple, k0, ..., kn> is for selecting fields from a
// tuple of type Tuple. It has two members:
//
// type: a tuple type whose i-th field is the ki-th field of Tuple.
// GetSelectedFields(t): returns fields k0, ..., and kn of t as a tuple.
//
// For example, in class TupleFields<tuple<bool, char, int>, 2, 0>, we have:
//
// type is tuple<int, bool>, and
// GetSelectedFields(make_tuple(true, 'a', 42)) is (42, true).
template
<
class
Tuple
$
for
i
[[,
int
k
$
i
=
-
1
]]>
class
TupleFields
;
// This generic version is used when there are $n selectors.
template
<
class
Tuple
$
for
i
[[,
int
k
$
i
]]>
class
TupleFields
{
public:
typedef
::
testing
::
tuple
<
$
for
i
,
[[
GMOCK_FIELD_TYPE_
(
Tuple
,
k
$
i
)]]
>
type
;
static
type
GetSelectedFields
(
const
Tuple
&
t
)
{
return
type
(
$
for
i
,
[[
get
<
k
$
i
>
(
t
)]]);
}
};
// The following specialization is used for 0 ~ $(n-1) selectors.
$
for
i
[[
$$
}}
}
$
range
j
0.
.
i
-
1
$
range
k
0.
.
n
-
1
template
<
class
Tuple
$
for
j
[[,
int
k
$
j
]]>
class
TupleFields
<
Tuple
,
$
for
k
,
[[
$
if
k
<
i
[[
k
$
k
]]
$
else
[[
-
1
]]]]
>
{
public:
typedef
::
testing
::
tuple
<
$
for
j
,
[[
GMOCK_FIELD_TYPE_
(
Tuple
,
k
$
j
)]]
>
type
;
static
type
GetSelectedFields
(
const
Tuple
&
$
if
i
==
0
[[
/* t */
]]
$
else
[[
t
]])
{
return
type
(
$
for
j
,
[[
get
<
k
$
j
>
(
t
)]]);
}
};
]]
#undef GMOCK_FIELD_TYPE_
// Implements the Args() matcher.
$
var
ks
=
[[
$
for
i
,
[[
k
$
i
]]]]
template
<
class
ArgsTuple
$
for
i
[[,
int
k
$
i
=
-
1
]]>
class
ArgsMatcherImpl
:
public
MatcherInterface
<
ArgsTuple
>
{
public:
// ArgsTuple may have top-level const or reference modifiers.
typedef
GTEST_REMOVE_REFERENCE_AND_CONST_
(
ArgsTuple
)
RawArgsTuple
;
typedef
typename
internal
::
TupleFields
<
RawArgsTuple
,
$
ks
>::
type
SelectedArgs
;
typedef
Matcher
<
const
SelectedArgs
&>
MonomorphicInnerMatcher
;
template
<
typename
InnerMatcher
>
explicit
ArgsMatcherImpl
(
const
InnerMatcher
&
inner_matcher
)
:
inner_matcher_
(
SafeMatcherCast
<
const
SelectedArgs
&>
(
inner_matcher
))
{}
virtual
bool
MatchAndExplain
(
ArgsTuple
args
,
MatchResultListener
*
listener
)
const
{
const
SelectedArgs
&
selected_args
=
GetSelectedArgs
(
args
);
if
(
!
listener
->
IsInterested
())
return
inner_matcher_
.
Matches
(
selected_args
);
PrintIndices
(
listener
->
stream
());
*
listener
<<
"are "
<<
PrintToString
(
selected_args
);
StringMatchResultListener
inner_listener
;
const
bool
match
=
inner_matcher_
.
MatchAndExplain
(
selected_args
,
&
inner_listener
);
PrintIfNotEmpty
(
inner_listener
.
str
(),
listener
->
stream
());
return
match
;
}
virtual
void
DescribeTo
(
::
std
::
ostream
*
os
)
const
{
*
os
<<
"are a tuple "
;
PrintIndices
(
os
);
inner_matcher_
.
DescribeTo
(
os
);
}
virtual
void
DescribeNegationTo
(
::
std
::
ostream
*
os
)
const
{
*
os
<<
"are a tuple "
;
PrintIndices
(
os
);
inner_matcher_
.
DescribeNegationTo
(
os
);
}
private:
static
SelectedArgs
GetSelectedArgs
(
ArgsTuple
args
)
{
return
TupleFields
<
RawArgsTuple
,
$
ks
>::
GetSelectedFields
(
args
);
}
// Prints the indices of the selected fields.
static
void
PrintIndices
(
::
std
::
ostream
*
os
)
{
*
os
<<
"whose fields ("
;
const
int
indices
[
$
n
]
=
{
$
ks
};
for
(
int
i
=
0
;
i
<
$
n
;
i
++
)
{
if
(
indices
[
i
]
<
0
)
break
;
if
(
i
>=
1
)
*
os
<<
", "
;
*
os
<<
"#"
<<
indices
[
i
];
}
*
os
<<
") "
;
}
const
MonomorphicInnerMatcher
inner_matcher_
;
GTEST_DISALLOW_ASSIGN_
(
ArgsMatcherImpl
);
};
template
<
class
InnerMatcher
$
for
i
[[,
int
k
$
i
=
-
1
]]>
class
ArgsMatcher
{
public:
explicit
ArgsMatcher
(
const
InnerMatcher
&
inner_matcher
)
:
inner_matcher_
(
inner_matcher
)
{}
template
<
typename
ArgsTuple
>
operator
Matcher
<
ArgsTuple
>
()
const
{
return
MakeMatcher
(
new
ArgsMatcherImpl
<
ArgsTuple
,
$
ks
>
(
inner_matcher_
));
}
private:
const
InnerMatcher
inner_matcher_
;
GTEST_DISALLOW_ASSIGN_
(
ArgsMatcher
);
};
// A set of metafunctions for computing the result type of AllOf.
// AllOf(m1, ..., mN) returns
// AllOfResultN<decltype(m1), ..., decltype(mN)>::type.
// Although AllOf isn't defined for one argument, AllOfResult1 is defined
// to simplify the implementation.
template
<
typename
M1
>
struct
AllOfResult1
{
typedef
M1
type
;
};
$
range
i
1.
.
n
$
range
i
2.
.
n
$
for
i
[[
$
range
j
2.
.
i
$
var
m
=
i
/
2
$
range
k
1.
.
m
$
range
t
m
+
1.
.
i
template
<
typename
M1
$
for
j
[[,
typename
M
$
j
]]>
struct
AllOfResult
$
i
{
typedef
BothOfMatcher
<
typename
AllOfResult
$
m
<
$
for
k
,
[[
M
$
k
]]
>::
type
,
typename
AllOfResult
$
(
i
-
m
)
<
$
for
t
,
[[
M
$
t
]]
>::
type
>
type
;
};
]]
// A set of metafunctions for computing the result type of AnyOf.
// AnyOf(m1, ..., mN) returns
// AnyOfResultN<decltype(m1), ..., decltype(mN)>::type.
// Although AnyOf isn't defined for one argument, AnyOfResult1 is defined
// to simplify the implementation.
template
<
typename
M1
>
struct
AnyOfResult1
{
typedef
M1
type
;
};
$
range
i
1.
.
n
$
range
i
2.
.
n
$
for
i
[[
$
range
j
2.
.
i
$
var
m
=
i
/
2
$
range
k
1.
.
m
$
range
t
m
+
1.
.
i
template
<
typename
M1
$
for
j
[[,
typename
M
$
j
]]>
struct
AnyOfResult
$
i
{
typedef
EitherOfMatcher
<
typename
AnyOfResult
$
m
<
$
for
k
,
[[
M
$
k
]]
>::
type
,
typename
AnyOfResult
$
(
i
-
m
)
<
$
for
t
,
[[
M
$
t
]]
>::
type
>
type
;
};
]]
}
// namespace internal
// Args<N1, N2, ..., Nk>(a_matcher) matches a tuple if the selected
// fields of it matches a_matcher. C++ doesn't support default
// arguments for function templates, so we have to overload it.
$
range
i
0.
.
n
$
for
i
[[
$
range
j
1.
.
i
template
<
$
for
j
[[
int
k
$
j
,
]]
typename
InnerMatcher
>
inline
internal
::
ArgsMatcher
<
InnerMatcher
$
for
j
[[,
k
$
j
]]
>
Args
(
const
InnerMatcher
&
matcher
)
{
return
internal
::
ArgsMatcher
<
InnerMatcher
$
for
j
[[,
k
$
j
]]
>
(
matcher
);
}
]]
// ElementsAre(e_1, e_2, ... e_n) matches an STL-style container with
// n elements, where the i-th element in the container must
// match the i-th argument in the list. Each argument of
// ElementsAre() can be either a value or a matcher. We support up to
// $n arguments.
//
// The use of DecayArray in the implementation allows ElementsAre()
// to accept string literals, whose type is const char[N], but we
// want to treat them as const char*.
//
// NOTE: Since ElementsAre() cares about the order of the elements, it
// must not be used with containers whose elements's order is
// undefined (e.g. hash_map).
$
range
i
0.
.
n
$
for
i
[[
$
range
j
1.
.
i
$
if
i
>
0
[[
template
<
$
for
j
,
[[
typename
T
$
j
]]>
]]
inline
internal
::
ElementsAreMatcher
<
::
testing
::
tuple
<
$
for
j
,
[[
typename
internal
::
DecayArray
<
T
$
j
[[]]
>::
type
]]
>
>
ElementsAre
(
$
for
j
,
[[
const
T
$
j
&
e
$
j
]])
{
typedef
::
testing
::
tuple
<
$
for
j
,
[[
typename
internal
::
DecayArray
<
T
$
j
[[]]
>::
type
]]
>
Args
;
return
internal
::
ElementsAreMatcher
<
Args
>
(
Args
(
$
for
j
,
[[
e
$
j
]]));
}
]]
// UnorderedElementsAre(e_1, e_2, ..., e_n) is an ElementsAre extension
// that matches n elements in any order. We support up to n=$n arguments.
$
range
i
0.
.
n
$
for
i
[[
$
range
j
1.
.
i
$
if
i
>
0
[[
template
<
$
for
j
,
[[
typename
T
$
j
]]>
]]
inline
internal
::
UnorderedElementsAreMatcher
<
::
testing
::
tuple
<
$
for
j
,
[[
typename
internal
::
DecayArray
<
T
$
j
[[]]
>::
type
]]
>
>
UnorderedElementsAre
(
$
for
j
,
[[
const
T
$
j
&
e
$
j
]])
{
typedef
::
testing
::
tuple
<
$
for
j
,
[[
typename
internal
::
DecayArray
<
T
$
j
[[]]
>::
type
]]
>
Args
;
return
internal
::
UnorderedElementsAreMatcher
<
Args
>
(
Args
(
$
for
j
,
[[
e
$
j
]]));
}
]]
// AllOf(m1, m2, ..., mk) matches any value that matches all of the given
// sub-matchers. AllOf is called fully qualified to prevent ADL from firing.
$
range
i
2.
.
n
$
for
i
[[
$
range
j
1.
.
i
$
var
m
=
i
/
2
$
range
k
1.
.
m
$
range
t
m
+
1.
.
i
template
<
$
for
j
,
[[
typename
M
$
j
]]>
inline
typename
internal
::
AllOfResult
$
i
<
$
for
j
,
[[
M
$
j
]]
>::
type
AllOf
(
$
for
j
,
[[
M
$
j
m
$
j
]])
{
return
typename
internal
::
AllOfResult
$
i
<
$
for
j
,
[[
M
$
j
]]
>::
type
(
$
if
m
==
1
[[
m1
]]
$
else
[[
::
testing
::
AllOf
(
$
for
k
,
[[
m
$
k
]])]],
$
if
m
+
1
==
i
[[
m
$
i
]]
$
else
[[
::
testing
::
AllOf
(
$
for
t
,
[[
m
$
t
]])]]);
}
]]
// AnyOf(m1, m2, ..., mk) matches any value that matches any of the given
// sub-matchers. AnyOf is called fully qualified to prevent ADL from firing.
$
range
i
2.
.
n
$
for
i
[[
$
range
j
1.
.
i
$
var
m
=
i
/
2
$
range
k
1.
.
m
$
range
t
m
+
1.
.
i
template
<
$
for
j
,
[[
typename
M
$
j
]]>
inline
typename
internal
::
AnyOfResult
$
i
<
$
for
j
,
[[
M
$
j
]]
>::
type
AnyOf
(
$
for
j
,
[[
M
$
j
m
$
j
]])
{
return
typename
internal
::
AnyOfResult
$
i
<
$
for
j
,
[[
M
$
j
]]
>::
type
(
$
if
m
==
1
[[
m1
]]
$
else
[[
::
testing
::
AnyOf
(
$
for
k
,
[[
m
$
k
]])]],
$
if
m
+
1
==
i
[[
m
$
i
]]
$
else
[[
::
testing
::
AnyOf
(
$
for
t
,
[[
m
$
t
]])]]);
}
]]
}
// namespace testing
$$
}
// This Pump meta comment fixes auto-indentation in Emacs. It will not
$$
// show up in the generated code.
// The MATCHER* family of macros can be used in a namespace scope to
// define custom matchers easily.
//
// Basic Usage
// ===========
//
// The syntax
//
// MATCHER(name, description_string) { statements; }
//
// defines a matcher with the given name that executes the statements,
// which must return a bool to indicate if the match succeeds. Inside
// the statements, you can refer to the value being matched by 'arg',
// and refer to its type by 'arg_type'.
//
// The description string documents what the matcher does, and is used
// to generate the failure message when the match fails. Since a
// MATCHER() is usually defined in a header file shared by multiple
// C++ source files, we require the description to be a C-string
// literal to avoid possible side effects. It can be empty, in which
// case we'll use the sequence of words in the matcher name as the
// description.
//
// For example:
//
// MATCHER(IsEven, "") { return (arg % 2) == 0; }
//
// allows you to write
//
// // Expects mock_foo.Bar(n) to be called where n is even.
// EXPECT_CALL(mock_foo, Bar(IsEven()));
//
// or,
//
// // Verifies that the value of some_expression is even.
// EXPECT_THAT(some_expression, IsEven());
//
// If the above assertion fails, it will print something like:
//
// Value of: some_expression
// Expected: is even
// Actual: 7
//
// where the description "is even" is automatically calculated from the
// matcher name IsEven.
//
// Argument Type
// =============
//
// Note that the type of the value being matched (arg_type) is
// determined by the context in which you use the matcher and is
// supplied to you by the compiler, so you don't need to worry about
// declaring it (nor can you). This allows the matcher to be
// polymorphic. For example, IsEven() can be used to match any type
// where the value of "(arg % 2) == 0" can be implicitly converted to
// a bool. In the "Bar(IsEven())" example above, if method Bar()
// takes an int, 'arg_type' will be int; if it takes an unsigned long,
// 'arg_type' will be unsigned long; and so on.
//
// Parameterizing Matchers
// =======================
//
// Sometimes you'll want to parameterize the matcher. For that you
// can use another macro:
//
// MATCHER_P(name, param_name, description_string) { statements; }
//
// For example:
//
// MATCHER_P(HasAbsoluteValue, value, "") { return abs(arg) == value; }
//
// will allow you to write:
//
// EXPECT_THAT(Blah("a"), HasAbsoluteValue(n));
//
// which may lead to this message (assuming n is 10):
//
// Value of: Blah("a")
// Expected: has absolute value 10
// Actual: -9
//
// Note that both the matcher description and its parameter are
// printed, making the message human-friendly.
//
// In the matcher definition body, you can write 'foo_type' to
// reference the type of a parameter named 'foo'. For example, in the
// body of MATCHER_P(HasAbsoluteValue, value) above, you can write
// 'value_type' to refer to the type of 'value'.
//
// We also provide MATCHER_P2, MATCHER_P3, ..., up to MATCHER_P$n to
// support multi-parameter matchers.
//
// Describing Parameterized Matchers
// =================================
//
// The last argument to MATCHER*() is a string-typed expression. The
// expression can reference all of the matcher's parameters and a
// special bool-typed variable named 'negation'. When 'negation' is
// false, the expression should evaluate to the matcher's description;
// otherwise it should evaluate to the description of the negation of
// the matcher. For example,
//
// using testing::PrintToString;
//
// MATCHER_P2(InClosedRange, low, hi,
// string(negation ? "is not" : "is") + " in range [" +
// PrintToString(low) + ", " + PrintToString(hi) + "]") {
// return low <= arg && arg <= hi;
// }
// ...
// EXPECT_THAT(3, InClosedRange(4, 6));
// EXPECT_THAT(3, Not(InClosedRange(2, 4)));
//
// would generate two failures that contain the text:
//
// Expected: is in range [4, 6]
// ...
// Expected: is not in range [2, 4]
//
// If you specify "" as the description, the failure message will
// contain the sequence of words in the matcher name followed by the
// parameter values printed as a tuple. For example,
//
// MATCHER_P2(InClosedRange, low, hi, "") { ... }
// ...
// EXPECT_THAT(3, InClosedRange(4, 6));
// EXPECT_THAT(3, Not(InClosedRange(2, 4)));
//
// would generate two failures that contain the text:
//
// Expected: in closed range (4, 6)
// ...
// Expected: not (in closed range (2, 4))
//
// Types of Matcher Parameters
// ===========================
//
// For the purpose of typing, you can view
//
// MATCHER_Pk(Foo, p1, ..., pk, description_string) { ... }
//
// as shorthand for
//
// template <typename p1_type, ..., typename pk_type>
// FooMatcherPk<p1_type, ..., pk_type>
// Foo(p1_type p1, ..., pk_type pk) { ... }
//
// When you write Foo(v1, ..., vk), the compiler infers the types of
// the parameters v1, ..., and vk for you. If you are not happy with
// the result of the type inference, you can specify the types by
// explicitly instantiating the template, as in Foo<long, bool>(5,
// false). As said earlier, you don't get to (or need to) specify
// 'arg_type' as that's determined by the context in which the matcher
// is used. You can assign the result of expression Foo(p1, ..., pk)
// to a variable of type FooMatcherPk<p1_type, ..., pk_type>. This
// can be useful when composing matchers.
//
// While you can instantiate a matcher template with reference types,
// passing the parameters by pointer usually makes your code more
// readable. If, however, you still want to pass a parameter by
// reference, be aware that in the failure message generated by the
// matcher you will see the value of the referenced object but not its
// address.
//
// Explaining Match Results
// ========================
//
// Sometimes the matcher description alone isn't enough to explain why
// the match has failed or succeeded. For example, when expecting a
// long string, it can be very helpful to also print the diff between
// the expected string and the actual one. To achieve that, you can
// optionally stream additional information to a special variable
// named result_listener, whose type is a pointer to class
// MatchResultListener:
//
// MATCHER_P(EqualsLongString, str, "") {
// if (arg == str) return true;
//
// *result_listener << "the difference: "
/// << DiffStrings(str, arg);
// return false;
// }
//
// Overloading Matchers
// ====================
//
// You can overload matchers with different numbers of parameters:
//
// MATCHER_P(Blah, a, description_string1) { ... }
// MATCHER_P2(Blah, a, b, description_string2) { ... }
//
// Caveats
// =======
//
// When defining a new matcher, you should also consider implementing
// MatcherInterface or using MakePolymorphicMatcher(). These
// approaches require more work than the MATCHER* macros, but also
// give you more control on the types of the value being matched and
// the matcher parameters, which may leads to better compiler error
// messages when the matcher is used wrong. They also allow
// overloading matchers based on parameter types (as opposed to just
// based on the number of parameters).
//
// MATCHER*() can only be used in a namespace scope. The reason is
// that C++ doesn't yet allow function-local types to be used to
// instantiate templates. The up-coming C++0x standard will fix this.
// Once that's done, we'll consider supporting using MATCHER*() inside
// a function.
//
// More Information
// ================
//
// To learn more about using these macros, please search for 'MATCHER'
// on http://code.google.com/p/googlemock/wiki/CookBook.
$
range
i
0.
.
n
$
for
i
[[
$
var
macro_name
=
[[
$
if
i
==
0
[[
MATCHER
]]
$
elif
i
==
1
[[
MATCHER_P
]]
$
else
[[
MATCHER_P
$
i
]]]]
$
var
class_name
=
[[
name
##
Matcher
[[
$
if
i
==
0
[[]]
$
elif
i
==
1
[[
P
]]
$
else
[[
P
$
i
]]]]]]
$
range
j
0.
.
i
-
1
$
var
template
=
[[
$
if
i
==
0
[[]]
$
else
[[
template
<
$
for
j
,
[[
typename
p
$
j
##
_type
]]>
\
]]]]
$
var
ctor_param_list
=
[[
$
for
j
,
[[
p
$
j
##
_type
gmock_p
$
j
]]]]
$
var
impl_ctor_param_list
=
[[
$
for
j
,
[[
p
$
j
##
_type
gmock_p
$
j
]]]]
$
var
impl_inits
=
[[
$
if
i
==
0
[[]]
$
else
[[
:
$
for
j
,
[[
p
$
j
(
gmock_p
$
j
)]]]]]]
$
var
inits
=
[[
$
if
i
==
0
[[]]
$
else
[[
:
$
for
j
,
[[
p
$
j
(
gmock_p
$
j
)]]]]]]
$
var
params
=
[[
$
for
j
,
[[
p
$
j
]]]]
$
var
param_types
=
[[
$
if
i
==
0
[[]]
$
else
[[
<
$
for
j
,
[[
p
$
j
##
_type
]]>]]]]
$
var
param_types_and_names
=
[[
$
for
j
,
[[
p
$
j
##
_type
p
$
j
]]]]
$
var
param_field_decls
=
[[
$
for
j
[[
p
$
j
##
_type
p
$
j
;
\
]]]]
$
var
param_field_decls2
=
[[
$
for
j
[[
p
$
j
##
_type
p
$
j
;
\
]]]]
#define $macro_name(name$for j [[, p$j]], description)\$template
class
$
class_name
{
\
public
:
\
template
<
typename
arg_type
>
\
class
gmock_Impl
:
public
::
testing
::
MatcherInterface
<
arg_type
>
{
\
public
:
\
[[
$
if
i
==
1
[[
explicit
]]]]
gmock_Impl
(
$
impl_ctor_param_list
)
\
$
impl_inits
{}
\
virtual
bool
MatchAndExplain
(
\
arg_type
arg
,
::
testing
::
MatchResultListener
*
result_listener
)
const
;
\
virtual
void
DescribeTo
(
::
std
::
ostream
*
gmock_os
)
const
{
\
*
gmock_os
<<
FormatDescription
(
false
);
\
}
\
virtual
void
DescribeNegationTo
(
::
std
::
ostream
*
gmock_os
)
const
{
\
*
gmock_os
<<
FormatDescription
(
true
);
\
}
\$
param_field_decls
private:
\
::
testing
::
internal
::
string
FormatDescription
(
bool
negation
)
const
{
\
const
::
testing
::
internal
::
string
gmock_description
=
(
description
);
\
if
(
!
gmock_description
.
empty
())
\
return
gmock_description
;
\
return
::
testing
::
internal
::
FormatMatcherDescription
(
\
negation
,
#
name
,
\
::
testing
::
internal
::
UniversalTersePrintTupleFieldsToStrings
(
\
::
testing
::
tuple
<
$
for
j
,
[[
p
$
j
##
_type
]]
>
(
$
for
j
,
[[
p
$
j
]])));
\
}
\
GTEST_DISALLOW_ASSIGN_
(
gmock_Impl
);
\
};
\
template
<
typename
arg_type
>
\
operator
::
testing
::
Matcher
<
arg_type
>
()
const
{
\
return
::
testing
::
Matcher
<
arg_type
>
(
\
new
gmock_Impl
<
arg_type
>
(
$
params
));
\
}
\
[[
$
if
i
==
1
[[
explicit
]]]]
$
class_name
(
$
ctor_param_list
)
$
inits
{
\
}
\$
param_field_decls2
private:
\
GTEST_DISALLOW_ASSIGN_
(
$
class_name
);
\
};
\$
template
inline
$
class_name
$
param_types
name
(
$
param_types_and_names
)
{
\
return
$
class_name
$
param_types
(
$
params
);
\
}\$
template
template
<
typename
arg_type
>
\
bool
$
class_name
$
param_types
::
gmock_Impl
<
arg_type
>
::
MatchAndExplain
(
\
arg_type
arg
,
\
::
testing
::
MatchResultListener
*
result_listener
GTEST_ATTRIBUTE_UNUSED_
)
\
const
]]
#endif // GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_MATCHERS_H_
googlemock/include/gmock/gmock-generated-nice-strict.h
0 → 100644
View file @
ecf94595
// This file was GENERATED by command:
// pump.py gmock-generated-nice-strict.h.pump
// DO NOT EDIT BY HAND!!!
// Copyright 2008, Google Inc.
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
// * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following disclaimer
// in the documentation and/or other materials provided with the
// distribution.
// * Neither the name of Google Inc. nor the names of its
// contributors may be used to endorse or promote products derived from
// this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//
// Author: wan@google.com (Zhanyong Wan)
// Implements class templates NiceMock, NaggyMock, and StrictMock.
//
// Given a mock class MockFoo that is created using Google Mock,
// NiceMock<MockFoo> is a subclass of MockFoo that allows
// uninteresting calls (i.e. calls to mock methods that have no
// EXPECT_CALL specs), NaggyMock<MockFoo> is a subclass of MockFoo
// that prints a warning when an uninteresting call occurs, and
// StrictMock<MockFoo> is a subclass of MockFoo that treats all
// uninteresting calls as errors.
//
// Currently a mock is naggy by default, so MockFoo and
// NaggyMock<MockFoo> behave like the same. However, we will soon
// switch the default behavior of mocks to be nice, as that in general
// leads to more maintainable tests. When that happens, MockFoo will
// stop behaving like NaggyMock<MockFoo> and start behaving like
// NiceMock<MockFoo>.
//
// NiceMock, NaggyMock, and StrictMock "inherit" the constructors of
// their respective base class, with up-to 10 arguments. Therefore
// you can write NiceMock<MockFoo>(5, "a") to construct a nice mock
// where MockFoo has a constructor that accepts (int, const char*),
// for example.
//
// A known limitation is that NiceMock<MockFoo>, NaggyMock<MockFoo>,
// and StrictMock<MockFoo> only works for mock methods defined using
// the MOCK_METHOD* family of macros DIRECTLY in the MockFoo class.
// If a mock method is defined in a base class of MockFoo, the "nice"
// or "strict" modifier may not affect it, depending on the compiler.
// In particular, nesting NiceMock, NaggyMock, and StrictMock is NOT
// supported.
//
// Another known limitation is that the constructors of the base mock
// cannot have arguments passed by non-const reference, which are
// banned by the Google C++ style guide anyway.
#ifndef GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_NICE_STRICT_H_
#define GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_NICE_STRICT_H_
#include "gmock/gmock-spec-builders.h"
#include "gmock/internal/gmock-port.h"
namespace
testing
{
template
<
class
MockClass
>
class
NiceMock
:
public
MockClass
{
public:
// We don't factor out the constructor body to a common method, as
// we have to avoid a possible clash with members of MockClass.
NiceMock
()
{
::
testing
::
Mock
::
AllowUninterestingCalls
(
internal
::
ImplicitCast_
<
MockClass
*>
(
this
));
}
// C++ doesn't (yet) allow inheritance of constructors, so we have
// to define it for each arity.
template
<
typename
A1
>
explicit
NiceMock
(
const
A1
&
a1
)
:
MockClass
(
a1
)
{
::
testing
::
Mock
::
AllowUninterestingCalls
(
internal
::
ImplicitCast_
<
MockClass
*>
(
this
));
}
template
<
typename
A1
,
typename
A2
>
NiceMock
(
const
A1
&
a1
,
const
A2
&
a2
)
:
MockClass
(
a1
,
a2
)
{
::
testing
::
Mock
::
AllowUninterestingCalls
(
internal
::
ImplicitCast_
<
MockClass
*>
(
this
));
}
template
<
typename
A1
,
typename
A2
,
typename
A3
>
NiceMock
(
const
A1
&
a1
,
const
A2
&
a2
,
const
A3
&
a3
)
:
MockClass
(
a1
,
a2
,
a3
)
{
::
testing
::
Mock
::
AllowUninterestingCalls
(
internal
::
ImplicitCast_
<
MockClass
*>
(
this
));
}
template
<
typename
A1
,
typename
A2
,
typename
A3
,
typename
A4
>
NiceMock
(
const
A1
&
a1
,
const
A2
&
a2
,
const
A3
&
a3
,
const
A4
&
a4
)
:
MockClass
(
a1
,
a2
,
a3
,
a4
)
{
::
testing
::
Mock
::
AllowUninterestingCalls
(
internal
::
ImplicitCast_
<
MockClass
*>
(
this
));
}
template
<
typename
A1
,
typename
A2
,
typename
A3
,
typename
A4
,
typename
A5
>
NiceMock
(
const
A1
&
a1
,
const
A2
&
a2
,
const
A3
&
a3
,
const
A4
&
a4
,
const
A5
&
a5
)
:
MockClass
(
a1
,
a2
,
a3
,
a4
,
a5
)
{
::
testing
::
Mock
::
AllowUninterestingCalls
(
internal
::
ImplicitCast_
<
MockClass
*>
(
this
));
}
template
<
typename
A1
,
typename
A2
,
typename
A3
,
typename
A4
,
typename
A5
,
typename
A6
>
NiceMock
(
const
A1
&
a1
,
const
A2
&
a2
,
const
A3
&
a3
,
const
A4
&
a4
,
const
A5
&
a5
,
const
A6
&
a6
)
:
MockClass
(
a1
,
a2
,
a3
,
a4
,
a5
,
a6
)
{
::
testing
::
Mock
::
AllowUninterestingCalls
(
internal
::
ImplicitCast_
<
MockClass
*>
(
this
));
}
template
<
typename
A1
,
typename
A2
,
typename
A3
,
typename
A4
,
typename
A5
,
typename
A6
,
typename
A7
>
NiceMock
(
const
A1
&
a1
,
const
A2
&
a2
,
const
A3
&
a3
,
const
A4
&
a4
,
const
A5
&
a5
,
const
A6
&
a6
,
const
A7
&
a7
)
:
MockClass
(
a1
,
a2
,
a3
,
a4
,
a5
,
a6
,
a7
)
{
::
testing
::
Mock
::
AllowUninterestingCalls
(
internal
::
ImplicitCast_
<
MockClass
*>
(
this
));
}
template
<
typename
A1
,
typename
A2
,
typename
A3
,
typename
A4
,
typename
A5
,
typename
A6
,
typename
A7
,
typename
A8
>
NiceMock
(
const
A1
&
a1
,
const
A2
&
a2
,
const
A3
&
a3
,
const
A4
&
a4
,
const
A5
&
a5
,
const
A6
&
a6
,
const
A7
&
a7
,
const
A8
&
a8
)
:
MockClass
(
a1
,
a2
,
a3
,
a4
,
a5
,
a6
,
a7
,
a8
)
{
::
testing
::
Mock
::
AllowUninterestingCalls
(
internal
::
ImplicitCast_
<
MockClass
*>
(
this
));
}
template
<
typename
A1
,
typename
A2
,
typename
A3
,
typename
A4
,
typename
A5
,
typename
A6
,
typename
A7
,
typename
A8
,
typename
A9
>
NiceMock
(
const
A1
&
a1
,
const
A2
&
a2
,
const
A3
&
a3
,
const
A4
&
a4
,
const
A5
&
a5
,
const
A6
&
a6
,
const
A7
&
a7
,
const
A8
&
a8
,
const
A9
&
a9
)
:
MockClass
(
a1
,
a2
,
a3
,
a4
,
a5
,
a6
,
a7
,
a8
,
a9
)
{
::
testing
::
Mock
::
AllowUninterestingCalls
(
internal
::
ImplicitCast_
<
MockClass
*>
(
this
));
}
template
<
typename
A1
,
typename
A2
,
typename
A3
,
typename
A4
,
typename
A5
,
typename
A6
,
typename
A7
,
typename
A8
,
typename
A9
,
typename
A10
>
NiceMock
(
const
A1
&
a1
,
const
A2
&
a2
,
const
A3
&
a3
,
const
A4
&
a4
,
const
A5
&
a5
,
const
A6
&
a6
,
const
A7
&
a7
,
const
A8
&
a8
,
const
A9
&
a9
,
const
A10
&
a10
)
:
MockClass
(
a1
,
a2
,
a3
,
a4
,
a5
,
a6
,
a7
,
a8
,
a9
,
a10
)
{
::
testing
::
Mock
::
AllowUninterestingCalls
(
internal
::
ImplicitCast_
<
MockClass
*>
(
this
));
}
virtual
~
NiceMock
()
{
::
testing
::
Mock
::
UnregisterCallReaction
(
internal
::
ImplicitCast_
<
MockClass
*>
(
this
));
}
private:
GTEST_DISALLOW_COPY_AND_ASSIGN_
(
NiceMock
);
};
template
<
class
MockClass
>
class
NaggyMock
:
public
MockClass
{
public:
// We don't factor out the constructor body to a common method, as
// we have to avoid a possible clash with members of MockClass.
NaggyMock
()
{
::
testing
::
Mock
::
WarnUninterestingCalls
(
internal
::
ImplicitCast_
<
MockClass
*>
(
this
));
}
// C++ doesn't (yet) allow inheritance of constructors, so we have
// to define it for each arity.
template
<
typename
A1
>
explicit
NaggyMock
(
const
A1
&
a1
)
:
MockClass
(
a1
)
{
::
testing
::
Mock
::
WarnUninterestingCalls
(
internal
::
ImplicitCast_
<
MockClass
*>
(
this
));
}
template
<
typename
A1
,
typename
A2
>
NaggyMock
(
const
A1
&
a1
,
const
A2
&
a2
)
:
MockClass
(
a1
,
a2
)
{
::
testing
::
Mock
::
WarnUninterestingCalls
(
internal
::
ImplicitCast_
<
MockClass
*>
(
this
));
}
template
<
typename
A1
,
typename
A2
,
typename
A3
>
NaggyMock
(
const
A1
&
a1
,
const
A2
&
a2
,
const
A3
&
a3
)
:
MockClass
(
a1
,
a2
,
a3
)
{
::
testing
::
Mock
::
WarnUninterestingCalls
(
internal
::
ImplicitCast_
<
MockClass
*>
(
this
));
}
template
<
typename
A1
,
typename
A2
,
typename
A3
,
typename
A4
>
NaggyMock
(
const
A1
&
a1
,
const
A2
&
a2
,
const
A3
&
a3
,
const
A4
&
a4
)
:
MockClass
(
a1
,
a2
,
a3
,
a4
)
{
::
testing
::
Mock
::
WarnUninterestingCalls
(
internal
::
ImplicitCast_
<
MockClass
*>
(
this
));
}
template
<
typename
A1
,
typename
A2
,
typename
A3
,
typename
A4
,
typename
A5
>
NaggyMock
(
const
A1
&
a1
,
const
A2
&
a2
,
const
A3
&
a3
,
const
A4
&
a4
,
const
A5
&
a5
)
:
MockClass
(
a1
,
a2
,
a3
,
a4
,
a5
)
{
::
testing
::
Mock
::
WarnUninterestingCalls
(
internal
::
ImplicitCast_
<
MockClass
*>
(
this
));
}
template
<
typename
A1
,
typename
A2
,
typename
A3
,
typename
A4
,
typename
A5
,
typename
A6
>
NaggyMock
(
const
A1
&
a1
,
const
A2
&
a2
,
const
A3
&
a3
,
const
A4
&
a4
,
const
A5
&
a5
,
const
A6
&
a6
)
:
MockClass
(
a1
,
a2
,
a3
,
a4
,
a5
,
a6
)
{
::
testing
::
Mock
::
WarnUninterestingCalls
(
internal
::
ImplicitCast_
<
MockClass
*>
(
this
));
}
template
<
typename
A1
,
typename
A2
,
typename
A3
,
typename
A4
,
typename
A5
,
typename
A6
,
typename
A7
>
NaggyMock
(
const
A1
&
a1
,
const
A2
&
a2
,
const
A3
&
a3
,
const
A4
&
a4
,
const
A5
&
a5
,
const
A6
&
a6
,
const
A7
&
a7
)
:
MockClass
(
a1
,
a2
,
a3
,
a4
,
a5
,
a6
,
a7
)
{
::
testing
::
Mock
::
WarnUninterestingCalls
(
internal
::
ImplicitCast_
<
MockClass
*>
(
this
));
}
template
<
typename
A1
,
typename
A2
,
typename
A3
,
typename
A4
,
typename
A5
,
typename
A6
,
typename
A7
,
typename
A8
>
NaggyMock
(
const
A1
&
a1
,
const
A2
&
a2
,
const
A3
&
a3
,
const
A4
&
a4
,
const
A5
&
a5
,
const
A6
&
a6
,
const
A7
&
a7
,
const
A8
&
a8
)
:
MockClass
(
a1
,
a2
,
a3
,
a4
,
a5
,
a6
,
a7
,
a8
)
{
::
testing
::
Mock
::
WarnUninterestingCalls
(
internal
::
ImplicitCast_
<
MockClass
*>
(
this
));
}
template
<
typename
A1
,
typename
A2
,
typename
A3
,
typename
A4
,
typename
A5
,
typename
A6
,
typename
A7
,
typename
A8
,
typename
A9
>
NaggyMock
(
const
A1
&
a1
,
const
A2
&
a2
,
const
A3
&
a3
,
const
A4
&
a4
,
const
A5
&
a5
,
const
A6
&
a6
,
const
A7
&
a7
,
const
A8
&
a8
,
const
A9
&
a9
)
:
MockClass
(
a1
,
a2
,
a3
,
a4
,
a5
,
a6
,
a7
,
a8
,
a9
)
{
::
testing
::
Mock
::
WarnUninterestingCalls
(
internal
::
ImplicitCast_
<
MockClass
*>
(
this
));
}
template
<
typename
A1
,
typename
A2
,
typename
A3
,
typename
A4
,
typename
A5
,
typename
A6
,
typename
A7
,
typename
A8
,
typename
A9
,
typename
A10
>
NaggyMock
(
const
A1
&
a1
,
const
A2
&
a2
,
const
A3
&
a3
,
const
A4
&
a4
,
const
A5
&
a5
,
const
A6
&
a6
,
const
A7
&
a7
,
const
A8
&
a8
,
const
A9
&
a9
,
const
A10
&
a10
)
:
MockClass
(
a1
,
a2
,
a3
,
a4
,
a5
,
a6
,
a7
,
a8
,
a9
,
a10
)
{
::
testing
::
Mock
::
WarnUninterestingCalls
(
internal
::
ImplicitCast_
<
MockClass
*>
(
this
));
}
virtual
~
NaggyMock
()
{
::
testing
::
Mock
::
UnregisterCallReaction
(
internal
::
ImplicitCast_
<
MockClass
*>
(
this
));
}
private:
GTEST_DISALLOW_COPY_AND_ASSIGN_
(
NaggyMock
);
};
template
<
class
MockClass
>
class
StrictMock
:
public
MockClass
{
public:
// We don't factor out the constructor body to a common method, as
// we have to avoid a possible clash with members of MockClass.
StrictMock
()
{
::
testing
::
Mock
::
FailUninterestingCalls
(
internal
::
ImplicitCast_
<
MockClass
*>
(
this
));
}
// C++ doesn't (yet) allow inheritance of constructors, so we have
// to define it for each arity.
template
<
typename
A1
>
explicit
StrictMock
(
const
A1
&
a1
)
:
MockClass
(
a1
)
{
::
testing
::
Mock
::
FailUninterestingCalls
(
internal
::
ImplicitCast_
<
MockClass
*>
(
this
));
}
template
<
typename
A1
,
typename
A2
>
StrictMock
(
const
A1
&
a1
,
const
A2
&
a2
)
:
MockClass
(
a1
,
a2
)
{
::
testing
::
Mock
::
FailUninterestingCalls
(
internal
::
ImplicitCast_
<
MockClass
*>
(
this
));
}
template
<
typename
A1
,
typename
A2
,
typename
A3
>
StrictMock
(
const
A1
&
a1
,
const
A2
&
a2
,
const
A3
&
a3
)
:
MockClass
(
a1
,
a2
,
a3
)
{
::
testing
::
Mock
::
FailUninterestingCalls
(
internal
::
ImplicitCast_
<
MockClass
*>
(
this
));
}
template
<
typename
A1
,
typename
A2
,
typename
A3
,
typename
A4
>
StrictMock
(
const
A1
&
a1
,
const
A2
&
a2
,
const
A3
&
a3
,
const
A4
&
a4
)
:
MockClass
(
a1
,
a2
,
a3
,
a4
)
{
::
testing
::
Mock
::
FailUninterestingCalls
(
internal
::
ImplicitCast_
<
MockClass
*>
(
this
));
}
template
<
typename
A1
,
typename
A2
,
typename
A3
,
typename
A4
,
typename
A5
>
StrictMock
(
const
A1
&
a1
,
const
A2
&
a2
,
const
A3
&
a3
,
const
A4
&
a4
,
const
A5
&
a5
)
:
MockClass
(
a1
,
a2
,
a3
,
a4
,
a5
)
{
::
testing
::
Mock
::
FailUninterestingCalls
(
internal
::
ImplicitCast_
<
MockClass
*>
(
this
));
}
template
<
typename
A1
,
typename
A2
,
typename
A3
,
typename
A4
,
typename
A5
,
typename
A6
>
StrictMock
(
const
A1
&
a1
,
const
A2
&
a2
,
const
A3
&
a3
,
const
A4
&
a4
,
const
A5
&
a5
,
const
A6
&
a6
)
:
MockClass
(
a1
,
a2
,
a3
,
a4
,
a5
,
a6
)
{
::
testing
::
Mock
::
FailUninterestingCalls
(
internal
::
ImplicitCast_
<
MockClass
*>
(
this
));
}
template
<
typename
A1
,
typename
A2
,
typename
A3
,
typename
A4
,
typename
A5
,
typename
A6
,
typename
A7
>
StrictMock
(
const
A1
&
a1
,
const
A2
&
a2
,
const
A3
&
a3
,
const
A4
&
a4
,
const
A5
&
a5
,
const
A6
&
a6
,
const
A7
&
a7
)
:
MockClass
(
a1
,
a2
,
a3
,
a4
,
a5
,
a6
,
a7
)
{
::
testing
::
Mock
::
FailUninterestingCalls
(
internal
::
ImplicitCast_
<
MockClass
*>
(
this
));
}
template
<
typename
A1
,
typename
A2
,
typename
A3
,
typename
A4
,
typename
A5
,
typename
A6
,
typename
A7
,
typename
A8
>
StrictMock
(
const
A1
&
a1
,
const
A2
&
a2
,
const
A3
&
a3
,
const
A4
&
a4
,
const
A5
&
a5
,
const
A6
&
a6
,
const
A7
&
a7
,
const
A8
&
a8
)
:
MockClass
(
a1
,
a2
,
a3
,
a4
,
a5
,
a6
,
a7
,
a8
)
{
::
testing
::
Mock
::
FailUninterestingCalls
(
internal
::
ImplicitCast_
<
MockClass
*>
(
this
));
}
template
<
typename
A1
,
typename
A2
,
typename
A3
,
typename
A4
,
typename
A5
,
typename
A6
,
typename
A7
,
typename
A8
,
typename
A9
>
StrictMock
(
const
A1
&
a1
,
const
A2
&
a2
,
const
A3
&
a3
,
const
A4
&
a4
,
const
A5
&
a5
,
const
A6
&
a6
,
const
A7
&
a7
,
const
A8
&
a8
,
const
A9
&
a9
)
:
MockClass
(
a1
,
a2
,
a3
,
a4
,
a5
,
a6
,
a7
,
a8
,
a9
)
{
::
testing
::
Mock
::
FailUninterestingCalls
(
internal
::
ImplicitCast_
<
MockClass
*>
(
this
));
}
template
<
typename
A1
,
typename
A2
,
typename
A3
,
typename
A4
,
typename
A5
,
typename
A6
,
typename
A7
,
typename
A8
,
typename
A9
,
typename
A10
>
StrictMock
(
const
A1
&
a1
,
const
A2
&
a2
,
const
A3
&
a3
,
const
A4
&
a4
,
const
A5
&
a5
,
const
A6
&
a6
,
const
A7
&
a7
,
const
A8
&
a8
,
const
A9
&
a9
,
const
A10
&
a10
)
:
MockClass
(
a1
,
a2
,
a3
,
a4
,
a5
,
a6
,
a7
,
a8
,
a9
,
a10
)
{
::
testing
::
Mock
::
FailUninterestingCalls
(
internal
::
ImplicitCast_
<
MockClass
*>
(
this
));
}
virtual
~
StrictMock
()
{
::
testing
::
Mock
::
UnregisterCallReaction
(
internal
::
ImplicitCast_
<
MockClass
*>
(
this
));
}
private:
GTEST_DISALLOW_COPY_AND_ASSIGN_
(
StrictMock
);
};
// The following specializations catch some (relatively more common)
// user errors of nesting nice and strict mocks. They do NOT catch
// all possible errors.
// These specializations are declared but not defined, as NiceMock,
// NaggyMock, and StrictMock cannot be nested.
template
<
typename
MockClass
>
class
NiceMock
<
NiceMock
<
MockClass
>
>
;
template
<
typename
MockClass
>
class
NiceMock
<
NaggyMock
<
MockClass
>
>
;
template
<
typename
MockClass
>
class
NiceMock
<
StrictMock
<
MockClass
>
>
;
template
<
typename
MockClass
>
class
NaggyMock
<
NiceMock
<
MockClass
>
>
;
template
<
typename
MockClass
>
class
NaggyMock
<
NaggyMock
<
MockClass
>
>
;
template
<
typename
MockClass
>
class
NaggyMock
<
StrictMock
<
MockClass
>
>
;
template
<
typename
MockClass
>
class
StrictMock
<
NiceMock
<
MockClass
>
>
;
template
<
typename
MockClass
>
class
StrictMock
<
NaggyMock
<
MockClass
>
>
;
template
<
typename
MockClass
>
class
StrictMock
<
StrictMock
<
MockClass
>
>
;
}
// namespace testing
#endif // GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_NICE_STRICT_H_
googlemock/include/gmock/gmock-generated-nice-strict.h.pump
0 → 100644
View file @
ecf94595
$$
-*-
mode
:
c
++
;
-*-
$$
This
is
a
Pump
source
file
.
Please
use
Pump
to
convert
it
to
$$
gmock
-
generated
-
nice
-
strict
.
h
.
$$
$
var
n
=
10
$$
The
maximum
arity
we
support
.
// Copyright 2008, Google Inc.
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
// * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following disclaimer
// in the documentation and/or other materials provided with the
// distribution.
// * Neither the name of Google Inc. nor the names of its
// contributors may be used to endorse or promote products derived from
// this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//
// Author: wan@google.com (Zhanyong Wan)
// Implements class templates NiceMock, NaggyMock, and StrictMock.
//
// Given a mock class MockFoo that is created using Google Mock,
// NiceMock<MockFoo> is a subclass of MockFoo that allows
// uninteresting calls (i.e. calls to mock methods that have no
// EXPECT_CALL specs), NaggyMock<MockFoo> is a subclass of MockFoo
// that prints a warning when an uninteresting call occurs, and
// StrictMock<MockFoo> is a subclass of MockFoo that treats all
// uninteresting calls as errors.
//
// Currently a mock is naggy by default, so MockFoo and
// NaggyMock<MockFoo> behave like the same. However, we will soon
// switch the default behavior of mocks to be nice, as that in general
// leads to more maintainable tests. When that happens, MockFoo will
// stop behaving like NaggyMock<MockFoo> and start behaving like
// NiceMock<MockFoo>.
//
// NiceMock, NaggyMock, and StrictMock "inherit" the constructors of
// their respective base class, with up-to $n arguments. Therefore
// you can write NiceMock<MockFoo>(5, "a") to construct a nice mock
// where MockFoo has a constructor that accepts (int, const char*),
// for example.
//
// A known limitation is that NiceMock<MockFoo>, NaggyMock<MockFoo>,
// and StrictMock<MockFoo> only works for mock methods defined using
// the MOCK_METHOD* family of macros DIRECTLY in the MockFoo class.
// If a mock method is defined in a base class of MockFoo, the "nice"
// or "strict" modifier may not affect it, depending on the compiler.
// In particular, nesting NiceMock, NaggyMock, and StrictMock is NOT
// supported.
//
// Another known limitation is that the constructors of the base mock
// cannot have arguments passed by non-const reference, which are
// banned by the Google C++ style guide anyway.
#ifndef GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_NICE_STRICT_H_
#define GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_NICE_STRICT_H_
#include "gmock/gmock-spec-builders.h"
#include "gmock/internal/gmock-port.h"
namespace
testing
{
$
range
kind
0..2
$
for
kind
[[
$
var
clazz
=
[[
$
if
kind
==
0
[[
NiceMock
]]
$
elif
kind
==
1
[[
NaggyMock
]]
$
else
[[
StrictMock
]]]]
$
var
method
=
[[
$
if
kind
==
0
[[
AllowUninterestingCalls
]]
$
elif
kind
==
1
[[
WarnUninterestingCalls
]]
$
else
[[
FailUninterestingCalls
]]]]
template
<
class
MockClass
>
class
$
clazz
:
public
MockClass
{
public:
// We don't factor out the constructor body to a common method, as
// we have to avoid a possible clash with members of MockClass.
$
clazz
()
{
::
testing
::
Mock
::
$
method
(
internal
::
ImplicitCast_
<
MockClass
*>
(
this
));
}
// C++ doesn't (yet) allow inheritance of constructors, so we have
// to define it for each arity.
template
<
typename
A1
>
explicit
$
clazz
(
const
A1
&
a1
)
:
MockClass
(
a1
)
{
::
testing
::
Mock
::
$
method
(
internal
::
ImplicitCast_
<
MockClass
*>
(
this
));
}
$
range
i
2.
.
n
$
for
i
[[
$
range
j
1.
.
i
template
<
$
for
j
,
[[
typename
A
$
j
]]>
$
clazz
(
$
for
j
,
[[
const
A
$
j
&
a
$
j
]])
:
MockClass
(
$
for
j
,
[[
a
$
j
]])
{
::
testing
::
Mock
::
$
method
(
internal
::
ImplicitCast_
<
MockClass
*>
(
this
));
}
]]
virtual
~
$
clazz
()
{
::
testing
::
Mock
::
UnregisterCallReaction
(
internal
::
ImplicitCast_
<
MockClass
*>
(
this
));
}
private:
GTEST_DISALLOW_COPY_AND_ASSIGN_
(
$
clazz
);
};
]]
// The following specializations catch some (relatively more common)
// user errors of nesting nice and strict mocks. They do NOT catch
// all possible errors.
// These specializations are declared but not defined, as NiceMock,
// NaggyMock, and StrictMock cannot be nested.
template
<
typename
MockClass
>
class
NiceMock
<
NiceMock
<
MockClass
>
>
;
template
<
typename
MockClass
>
class
NiceMock
<
NaggyMock
<
MockClass
>
>
;
template
<
typename
MockClass
>
class
NiceMock
<
StrictMock
<
MockClass
>
>
;
template
<
typename
MockClass
>
class
NaggyMock
<
NiceMock
<
MockClass
>
>
;
template
<
typename
MockClass
>
class
NaggyMock
<
NaggyMock
<
MockClass
>
>
;
template
<
typename
MockClass
>
class
NaggyMock
<
StrictMock
<
MockClass
>
>
;
template
<
typename
MockClass
>
class
StrictMock
<
NiceMock
<
MockClass
>
>
;
template
<
typename
MockClass
>
class
StrictMock
<
NaggyMock
<
MockClass
>
>
;
template
<
typename
MockClass
>
class
StrictMock
<
StrictMock
<
MockClass
>
>
;
}
// namespace testing
#endif // GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_NICE_STRICT_H_
googlemock/include/gmock/gmock-matchers.h
0 → 100644
View file @
ecf94595
// Copyright 2007, Google Inc.
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
// * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following disclaimer
// in the documentation and/or other materials provided with the
// distribution.
// * Neither the name of Google Inc. nor the names of its
// contributors may be used to endorse or promote products derived from
// this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//
// Author: wan@google.com (Zhanyong Wan)
// Google Mock - a framework for writing C++ mock classes.
//
// This file implements some commonly used argument matchers. More
// matchers can be defined by the user implementing the
// MatcherInterface<T> interface if necessary.
#ifndef GMOCK_INCLUDE_GMOCK_GMOCK_MATCHERS_H_
#define GMOCK_INCLUDE_GMOCK_GMOCK_MATCHERS_H_
#include <math.h>
#include <algorithm>
#include <iterator>
#include <limits>
#include <ostream> // NOLINT
#include <sstream>
#include <string>
#include <utility>
#include <vector>
#include "gmock/internal/gmock-internal-utils.h"
#include "gmock/internal/gmock-port.h"
#include "gtest/gtest.h"
#if GTEST_HAS_STD_INITIALIZER_LIST_
# include <initializer_list> // NOLINT -- must be after gtest.h
#endif
namespace
testing
{
// To implement a matcher Foo for type T, define:
// 1. a class FooMatcherImpl that implements the
// MatcherInterface<T> interface, and
// 2. a factory function that creates a Matcher<T> object from a
// FooMatcherImpl*.
//
// The two-level delegation design makes it possible to allow a user
// to write "v" instead of "Eq(v)" where a Matcher is expected, which
// is impossible if we pass matchers by pointers. It also eases
// ownership management as Matcher objects can now be copied like
// plain values.
// MatchResultListener is an abstract class. Its << operator can be
// used by a matcher to explain why a value matches or doesn't match.
//
// TODO(wan@google.com): add method
// bool InterestedInWhy(bool result) const;
// to indicate whether the listener is interested in why the match
// result is 'result'.
class
MatchResultListener
{
public:
// Creates a listener object with the given underlying ostream. The
// listener does not own the ostream, and does not dereference it
// in the constructor or destructor.
explicit
MatchResultListener
(
::
std
::
ostream
*
os
)
:
stream_
(
os
)
{}
virtual
~
MatchResultListener
()
=
0
;
// Makes this class abstract.
// Streams x to the underlying ostream; does nothing if the ostream
// is NULL.
template
<
typename
T
>
MatchResultListener
&
operator
<<
(
const
T
&
x
)
{
if
(
stream_
!=
NULL
)
*
stream_
<<
x
;
return
*
this
;
}
// Returns the underlying ostream.
::
std
::
ostream
*
stream
()
{
return
stream_
;
}
// Returns true iff the listener is interested in an explanation of
// the match result. A matcher's MatchAndExplain() method can use
// this information to avoid generating the explanation when no one
// intends to hear it.
bool
IsInterested
()
const
{
return
stream_
!=
NULL
;
}
private:
::
std
::
ostream
*
const
stream_
;
GTEST_DISALLOW_COPY_AND_ASSIGN_
(
MatchResultListener
);
};
inline
MatchResultListener
::~
MatchResultListener
()
{
}
// An instance of a subclass of this knows how to describe itself as a
// matcher.
class
MatcherDescriberInterface
{
public:
virtual
~
MatcherDescriberInterface
()
{}
// Describes this matcher to an ostream. The function should print
// a verb phrase that describes the property a value matching this
// matcher should have. The subject of the verb phrase is the value
// being matched. For example, the DescribeTo() method of the Gt(7)
// matcher prints "is greater than 7".
virtual
void
DescribeTo
(
::
std
::
ostream
*
os
)
const
=
0
;
// Describes the negation of this matcher to an ostream. For
// example, if the description of this matcher is "is greater than
// 7", the negated description could be "is not greater than 7".
// You are not required to override this when implementing
// MatcherInterface, but it is highly advised so that your matcher
// can produce good error messages.
virtual
void
DescribeNegationTo
(
::
std
::
ostream
*
os
)
const
{
*
os
<<
"not ("
;
DescribeTo
(
os
);
*
os
<<
")"
;
}
};
// The implementation of a matcher.
template
<
typename
T
>
class
MatcherInterface
:
public
MatcherDescriberInterface
{
public:
// Returns true iff the matcher matches x; also explains the match
// result to 'listener' if necessary (see the next paragraph), in
// the form of a non-restrictive relative clause ("which ...",
// "whose ...", etc) that describes x. For example, the
// MatchAndExplain() method of the Pointee(...) matcher should
// generate an explanation like "which points to ...".
//
// Implementations of MatchAndExplain() should add an explanation of
// the match result *if and only if* they can provide additional
// information that's not already present (or not obvious) in the
// print-out of x and the matcher's description. Whether the match
// succeeds is not a factor in deciding whether an explanation is
// needed, as sometimes the caller needs to print a failure message
// when the match succeeds (e.g. when the matcher is used inside
// Not()).
//
// For example, a "has at least 10 elements" matcher should explain
// what the actual element count is, regardless of the match result,
// as it is useful information to the reader; on the other hand, an
// "is empty" matcher probably only needs to explain what the actual
// size is when the match fails, as it's redundant to say that the
// size is 0 when the value is already known to be empty.
//
// You should override this method when defining a new matcher.
//
// It's the responsibility of the caller (Google Mock) to guarantee
// that 'listener' is not NULL. This helps to simplify a matcher's
// implementation when it doesn't care about the performance, as it
// can talk to 'listener' without checking its validity first.
// However, in order to implement dummy listeners efficiently,
// listener->stream() may be NULL.
virtual
bool
MatchAndExplain
(
T
x
,
MatchResultListener
*
listener
)
const
=
0
;
// Inherits these methods from MatcherDescriberInterface:
// virtual void DescribeTo(::std::ostream* os) const = 0;
// virtual void DescribeNegationTo(::std::ostream* os) const;
};
// A match result listener that stores the explanation in a string.
class
StringMatchResultListener
:
public
MatchResultListener
{
public:
StringMatchResultListener
()
:
MatchResultListener
(
&
ss_
)
{}
// Returns the explanation accumulated so far.
internal
::
string
str
()
const
{
return
ss_
.
str
();
}
// Clears the explanation accumulated so far.
void
Clear
()
{
ss_
.
str
(
""
);
}
private:
::
std
::
stringstream
ss_
;
GTEST_DISALLOW_COPY_AND_ASSIGN_
(
StringMatchResultListener
);
};
namespace
internal
{
struct
AnyEq
{
template
<
typename
A
,
typename
B
>
bool
operator
()(
const
A
&
a
,
const
B
&
b
)
const
{
return
a
==
b
;
}
};
struct
AnyNe
{
template
<
typename
A
,
typename
B
>
bool
operator
()(
const
A
&
a
,
const
B
&
b
)
const
{
return
a
!=
b
;
}
};
struct
AnyLt
{
template
<
typename
A
,
typename
B
>
bool
operator
()(
const
A
&
a
,
const
B
&
b
)
const
{
return
a
<
b
;
}
};
struct
AnyGt
{
template
<
typename
A
,
typename
B
>
bool
operator
()(
const
A
&
a
,
const
B
&
b
)
const
{
return
a
>
b
;
}
};
struct
AnyLe
{
template
<
typename
A
,
typename
B
>
bool
operator
()(
const
A
&
a
,
const
B
&
b
)
const
{
return
a
<=
b
;
}
};
struct
AnyGe
{
template
<
typename
A
,
typename
B
>
bool
operator
()(
const
A
&
a
,
const
B
&
b
)
const
{
return
a
>=
b
;
}
};
// A match result listener that ignores the explanation.
class
DummyMatchResultListener
:
public
MatchResultListener
{
public:
DummyMatchResultListener
()
:
MatchResultListener
(
NULL
)
{}
private:
GTEST_DISALLOW_COPY_AND_ASSIGN_
(
DummyMatchResultListener
);
};
// A match result listener that forwards the explanation to a given
// ostream. The difference between this and MatchResultListener is
// that the former is concrete.
class
StreamMatchResultListener
:
public
MatchResultListener
{
public:
explicit
StreamMatchResultListener
(
::
std
::
ostream
*
os
)
:
MatchResultListener
(
os
)
{}
private:
GTEST_DISALLOW_COPY_AND_ASSIGN_
(
StreamMatchResultListener
);
};
// An internal class for implementing Matcher<T>, which will derive
// from it. We put functionalities common to all Matcher<T>
// specializations here to avoid code duplication.
template
<
typename
T
>
class
MatcherBase
{
public:
// Returns true iff the matcher matches x; also explains the match
// result to 'listener'.
bool
MatchAndExplain
(
T
x
,
MatchResultListener
*
listener
)
const
{
return
impl_
->
MatchAndExplain
(
x
,
listener
);
}
// Returns true iff this matcher matches x.
bool
Matches
(
T
x
)
const
{
DummyMatchResultListener
dummy
;
return
MatchAndExplain
(
x
,
&
dummy
);
}
// Describes this matcher to an ostream.
void
DescribeTo
(
::
std
::
ostream
*
os
)
const
{
impl_
->
DescribeTo
(
os
);
}
// Describes the negation of this matcher to an ostream.
void
DescribeNegationTo
(
::
std
::
ostream
*
os
)
const
{
impl_
->
DescribeNegationTo
(
os
);
}
// Explains why x matches, or doesn't match, the matcher.
void
ExplainMatchResultTo
(
T
x
,
::
std
::
ostream
*
os
)
const
{
StreamMatchResultListener
listener
(
os
);
MatchAndExplain
(
x
,
&
listener
);
}
// Returns the describer for this matcher object; retains ownership
// of the describer, which is only guaranteed to be alive when
// this matcher object is alive.
const
MatcherDescriberInterface
*
GetDescriber
()
const
{
return
impl_
.
get
();
}
protected:
MatcherBase
()
{}
// Constructs a matcher from its implementation.
explicit
MatcherBase
(
const
MatcherInterface
<
T
>*
impl
)
:
impl_
(
impl
)
{}
virtual
~
MatcherBase
()
{}
private:
// shared_ptr (util/gtl/shared_ptr.h) and linked_ptr have similar
// interfaces. The former dynamically allocates a chunk of memory
// to hold the reference count, while the latter tracks all
// references using a circular linked list without allocating
// memory. It has been observed that linked_ptr performs better in
// typical scenarios. However, shared_ptr can out-perform
// linked_ptr when there are many more uses of the copy constructor
// than the default constructor.
//
// If performance becomes a problem, we should see if using
// shared_ptr helps.
::
testing
::
internal
::
linked_ptr
<
const
MatcherInterface
<
T
>
>
impl_
;
};
}
// namespace internal
// A Matcher<T> is a copyable and IMMUTABLE (except by assignment)
// object that can check whether a value of type T matches. The
// implementation of Matcher<T> is just a linked_ptr to const
// MatcherInterface<T>, so copying is fairly cheap. Don't inherit
// from Matcher!
template
<
typename
T
>
class
Matcher
:
public
internal
::
MatcherBase
<
T
>
{
public:
// Constructs a null matcher. Needed for storing Matcher objects in STL
// containers. A default-constructed matcher is not yet initialized. You
// cannot use it until a valid value has been assigned to it.
explicit
Matcher
()
{}
// NOLINT
// Constructs a matcher from its implementation.
explicit
Matcher
(
const
MatcherInterface
<
T
>*
impl
)
:
internal
::
MatcherBase
<
T
>
(
impl
)
{}
// Implicit constructor here allows people to write
// EXPECT_CALL(foo, Bar(5)) instead of EXPECT_CALL(foo, Bar(Eq(5))) sometimes
Matcher
(
T
value
);
// NOLINT
};
// The following two specializations allow the user to write str
// instead of Eq(str) and "foo" instead of Eq("foo") when a string
// matcher is expected.
template
<>
class
GTEST_API_
Matcher
<
const
internal
::
string
&>
:
public
internal
::
MatcherBase
<
const
internal
::
string
&>
{
public:
Matcher
()
{}
explicit
Matcher
(
const
MatcherInterface
<
const
internal
::
string
&>*
impl
)
:
internal
::
MatcherBase
<
const
internal
::
string
&>
(
impl
)
{}
// Allows the user to write str instead of Eq(str) sometimes, where
// str is a string object.
Matcher
(
const
internal
::
string
&
s
);
// NOLINT
// Allows the user to write "foo" instead of Eq("foo") sometimes.
Matcher
(
const
char
*
s
);
// NOLINT
};
template
<>
class
GTEST_API_
Matcher
<
internal
::
string
>
:
public
internal
::
MatcherBase
<
internal
::
string
>
{
public:
Matcher
()
{}
explicit
Matcher
(
const
MatcherInterface
<
internal
::
string
>*
impl
)
:
internal
::
MatcherBase
<
internal
::
string
>
(
impl
)
{}
// Allows the user to write str instead of Eq(str) sometimes, where
// str is a string object.
Matcher
(
const
internal
::
string
&
s
);
// NOLINT
// Allows the user to write "foo" instead of Eq("foo") sometimes.
Matcher
(
const
char
*
s
);
// NOLINT
};
#if GTEST_HAS_STRING_PIECE_
// The following two specializations allow the user to write str
// instead of Eq(str) and "foo" instead of Eq("foo") when a StringPiece
// matcher is expected.
template
<>
class
GTEST_API_
Matcher
<
const
StringPiece
&>
:
public
internal
::
MatcherBase
<
const
StringPiece
&>
{
public:
Matcher
()
{}
explicit
Matcher
(
const
MatcherInterface
<
const
StringPiece
&>*
impl
)
:
internal
::
MatcherBase
<
const
StringPiece
&>
(
impl
)
{}
// Allows the user to write str instead of Eq(str) sometimes, where
// str is a string object.
Matcher
(
const
internal
::
string
&
s
);
// NOLINT
// Allows the user to write "foo" instead of Eq("foo") sometimes.
Matcher
(
const
char
*
s
);
// NOLINT
// Allows the user to pass StringPieces directly.
Matcher
(
StringPiece
s
);
// NOLINT
};
template
<>
class
GTEST_API_
Matcher
<
StringPiece
>
:
public
internal
::
MatcherBase
<
StringPiece
>
{
public:
Matcher
()
{}
explicit
Matcher
(
const
MatcherInterface
<
StringPiece
>*
impl
)
:
internal
::
MatcherBase
<
StringPiece
>
(
impl
)
{}
// Allows the user to write str instead of Eq(str) sometimes, where
// str is a string object.
Matcher
(
const
internal
::
string
&
s
);
// NOLINT
// Allows the user to write "foo" instead of Eq("foo") sometimes.
Matcher
(
const
char
*
s
);
// NOLINT
// Allows the user to pass StringPieces directly.
Matcher
(
StringPiece
s
);
// NOLINT
};
#endif // GTEST_HAS_STRING_PIECE_
// The PolymorphicMatcher class template makes it easy to implement a
// polymorphic matcher (i.e. a matcher that can match values of more
// than one type, e.g. Eq(n) and NotNull()).
//
// To define a polymorphic matcher, a user should provide an Impl
// class that has a DescribeTo() method and a DescribeNegationTo()
// method, and define a member function (or member function template)
//
// bool MatchAndExplain(const Value& value,
// MatchResultListener* listener) const;
//
// See the definition of NotNull() for a complete example.
template
<
class
Impl
>
class
PolymorphicMatcher
{
public:
explicit
PolymorphicMatcher
(
const
Impl
&
an_impl
)
:
impl_
(
an_impl
)
{}
// Returns a mutable reference to the underlying matcher
// implementation object.
Impl
&
mutable_impl
()
{
return
impl_
;
}
// Returns an immutable reference to the underlying matcher
// implementation object.
const
Impl
&
impl
()
const
{
return
impl_
;
}
template
<
typename
T
>
operator
Matcher
<
T
>
()
const
{
return
Matcher
<
T
>
(
new
MonomorphicImpl
<
T
>
(
impl_
));
}
private:
template
<
typename
T
>
class
MonomorphicImpl
:
public
MatcherInterface
<
T
>
{
public:
explicit
MonomorphicImpl
(
const
Impl
&
impl
)
:
impl_
(
impl
)
{}
virtual
void
DescribeTo
(
::
std
::
ostream
*
os
)
const
{
impl_
.
DescribeTo
(
os
);
}
virtual
void
DescribeNegationTo
(
::
std
::
ostream
*
os
)
const
{
impl_
.
DescribeNegationTo
(
os
);
}
virtual
bool
MatchAndExplain
(
T
x
,
MatchResultListener
*
listener
)
const
{
return
impl_
.
MatchAndExplain
(
x
,
listener
);
}
private:
const
Impl
impl_
;
GTEST_DISALLOW_ASSIGN_
(
MonomorphicImpl
);
};
Impl
impl_
;
GTEST_DISALLOW_ASSIGN_
(
PolymorphicMatcher
);
};
// Creates a matcher from its implementation. This is easier to use
// than the Matcher<T> constructor as it doesn't require you to
// explicitly write the template argument, e.g.
//
// MakeMatcher(foo);
// vs
// Matcher<const string&>(foo);
template
<
typename
T
>
inline
Matcher
<
T
>
MakeMatcher
(
const
MatcherInterface
<
T
>*
impl
)
{
return
Matcher
<
T
>
(
impl
);
}
// Creates a polymorphic matcher from its implementation. This is
// easier to use than the PolymorphicMatcher<Impl> constructor as it
// doesn't require you to explicitly write the template argument, e.g.
//
// MakePolymorphicMatcher(foo);
// vs
// PolymorphicMatcher<TypeOfFoo>(foo);
template
<
class
Impl
>
inline
PolymorphicMatcher
<
Impl
>
MakePolymorphicMatcher
(
const
Impl
&
impl
)
{
return
PolymorphicMatcher
<
Impl
>
(
impl
);
}
// Anything inside the 'internal' namespace IS INTERNAL IMPLEMENTATION
// and MUST NOT BE USED IN USER CODE!!!
namespace
internal
{
// The MatcherCastImpl class template is a helper for implementing
// MatcherCast(). We need this helper in order to partially
// specialize the implementation of MatcherCast() (C++ allows
// class/struct templates to be partially specialized, but not
// function templates.).
// This general version is used when MatcherCast()'s argument is a
// polymorphic matcher (i.e. something that can be converted to a
// Matcher but is not one yet; for example, Eq(value)) or a value (for
// example, "hello").
template
<
typename
T
,
typename
M
>
class
MatcherCastImpl
{
public:
static
Matcher
<
T
>
Cast
(
const
M
&
polymorphic_matcher_or_value
)
{
// M can be a polymorhic matcher, in which case we want to use
// its conversion operator to create Matcher<T>. Or it can be a value
// that should be passed to the Matcher<T>'s constructor.
//
// We can't call Matcher<T>(polymorphic_matcher_or_value) when M is a
// polymorphic matcher because it'll be ambiguous if T has an implicit
// constructor from M (this usually happens when T has an implicit
// constructor from any type).
//
// It won't work to unconditionally implict_cast
// polymorphic_matcher_or_value to Matcher<T> because it won't trigger
// a user-defined conversion from M to T if one exists (assuming M is
// a value).
return
CastImpl
(
polymorphic_matcher_or_value
,
BooleanConstant
<
internal
::
ImplicitlyConvertible
<
M
,
Matcher
<
T
>
>::
value
>
());
}
private:
static
Matcher
<
T
>
CastImpl
(
const
M
&
value
,
BooleanConstant
<
false
>
)
{
// M can't be implicitly converted to Matcher<T>, so M isn't a polymorphic
// matcher. It must be a value then. Use direct initialization to create
// a matcher.
return
Matcher
<
T
>
(
ImplicitCast_
<
T
>
(
value
));
}
static
Matcher
<
T
>
CastImpl
(
const
M
&
polymorphic_matcher_or_value
,
BooleanConstant
<
true
>
)
{
// M is implicitly convertible to Matcher<T>, which means that either
// M is a polymorhpic matcher or Matcher<T> has an implicit constructor
// from M. In both cases using the implicit conversion will produce a
// matcher.
//
// Even if T has an implicit constructor from M, it won't be called because
// creating Matcher<T> would require a chain of two user-defined conversions
// (first to create T from M and then to create Matcher<T> from T).
return
polymorphic_matcher_or_value
;
}
};
// This more specialized version is used when MatcherCast()'s argument
// is already a Matcher. This only compiles when type T can be
// statically converted to type U.
template
<
typename
T
,
typename
U
>
class
MatcherCastImpl
<
T
,
Matcher
<
U
>
>
{
public:
static
Matcher
<
T
>
Cast
(
const
Matcher
<
U
>&
source_matcher
)
{
return
Matcher
<
T
>
(
new
Impl
(
source_matcher
));
}
private:
class
Impl
:
public
MatcherInterface
<
T
>
{
public:
explicit
Impl
(
const
Matcher
<
U
>&
source_matcher
)
:
source_matcher_
(
source_matcher
)
{}
// We delegate the matching logic to the source matcher.
virtual
bool
MatchAndExplain
(
T
x
,
MatchResultListener
*
listener
)
const
{
return
source_matcher_
.
MatchAndExplain
(
static_cast
<
U
>
(
x
),
listener
);
}
virtual
void
DescribeTo
(
::
std
::
ostream
*
os
)
const
{
source_matcher_
.
DescribeTo
(
os
);
}
virtual
void
DescribeNegationTo
(
::
std
::
ostream
*
os
)
const
{
source_matcher_
.
DescribeNegationTo
(
os
);
}
private:
const
Matcher
<
U
>
source_matcher_
;
GTEST_DISALLOW_ASSIGN_
(
Impl
);
};
};
// This even more specialized version is used for efficiently casting
// a matcher to its own type.
template
<
typename
T
>
class
MatcherCastImpl
<
T
,
Matcher
<
T
>
>
{
public:
static
Matcher
<
T
>
Cast
(
const
Matcher
<
T
>&
matcher
)
{
return
matcher
;
}
};
}
// namespace internal
// In order to be safe and clear, casting between different matcher
// types is done explicitly via MatcherCast<T>(m), which takes a
// matcher m and returns a Matcher<T>. It compiles only when T can be
// statically converted to the argument type of m.
template
<
typename
T
,
typename
M
>
inline
Matcher
<
T
>
MatcherCast
(
const
M
&
matcher
)
{
return
internal
::
MatcherCastImpl
<
T
,
M
>::
Cast
(
matcher
);
}
// Implements SafeMatcherCast().
//
// We use an intermediate class to do the actual safe casting as Nokia's
// Symbian compiler cannot decide between
// template <T, M> ... (M) and
// template <T, U> ... (const Matcher<U>&)
// for function templates but can for member function templates.
template
<
typename
T
>
class
SafeMatcherCastImpl
{
public:
// This overload handles polymorphic matchers and values only since
// monomorphic matchers are handled by the next one.
template
<
typename
M
>
static
inline
Matcher
<
T
>
Cast
(
const
M
&
polymorphic_matcher_or_value
)
{
return
internal
::
MatcherCastImpl
<
T
,
M
>::
Cast
(
polymorphic_matcher_or_value
);
}
// This overload handles monomorphic matchers.
//
// In general, if type T can be implicitly converted to type U, we can
// safely convert a Matcher<U> to a Matcher<T> (i.e. Matcher is
// contravariant): just keep a copy of the original Matcher<U>, convert the
// argument from type T to U, and then pass it to the underlying Matcher<U>.
// The only exception is when U is a reference and T is not, as the
// underlying Matcher<U> may be interested in the argument's address, which
// is not preserved in the conversion from T to U.
template
<
typename
U
>
static
inline
Matcher
<
T
>
Cast
(
const
Matcher
<
U
>&
matcher
)
{
// Enforce that T can be implicitly converted to U.
GTEST_COMPILE_ASSERT_
((
internal
::
ImplicitlyConvertible
<
T
,
U
>::
value
),
T_must_be_implicitly_convertible_to_U
);
// Enforce that we are not converting a non-reference type T to a reference
// type U.
GTEST_COMPILE_ASSERT_
(
internal
::
is_reference
<
T
>::
value
||
!
internal
::
is_reference
<
U
>::
value
,
cannot_convert_non_referentce_arg_to_reference
);
// In case both T and U are arithmetic types, enforce that the
// conversion is not lossy.
typedef
GTEST_REMOVE_REFERENCE_AND_CONST_
(
T
)
RawT
;
typedef
GTEST_REMOVE_REFERENCE_AND_CONST_
(
U
)
RawU
;
const
bool
kTIsOther
=
GMOCK_KIND_OF_
(
RawT
)
==
internal
::
kOther
;
const
bool
kUIsOther
=
GMOCK_KIND_OF_
(
RawU
)
==
internal
::
kOther
;
GTEST_COMPILE_ASSERT_
(
kTIsOther
||
kUIsOther
||
(
internal
::
LosslessArithmeticConvertible
<
RawT
,
RawU
>::
value
),
conversion_of_arithmetic_types_must_be_lossless
);
return
MatcherCast
<
T
>
(
matcher
);
}
};
template
<
typename
T
,
typename
M
>
inline
Matcher
<
T
>
SafeMatcherCast
(
const
M
&
polymorphic_matcher
)
{
return
SafeMatcherCastImpl
<
T
>::
Cast
(
polymorphic_matcher
);
}
// A<T>() returns a matcher that matches any value of type T.
template
<
typename
T
>
Matcher
<
T
>
A
();
// Anything inside the 'internal' namespace IS INTERNAL IMPLEMENTATION
// and MUST NOT BE USED IN USER CODE!!!
namespace
internal
{
// If the explanation is not empty, prints it to the ostream.
inline
void
PrintIfNotEmpty
(
const
internal
::
string
&
explanation
,
::
std
::
ostream
*
os
)
{
if
(
explanation
!=
""
&&
os
!=
NULL
)
{
*
os
<<
", "
<<
explanation
;
}
}
// Returns true if the given type name is easy to read by a human.
// This is used to decide whether printing the type of a value might
// be helpful.
inline
bool
IsReadableTypeName
(
const
string
&
type_name
)
{
// We consider a type name readable if it's short or doesn't contain
// a template or function type.
return
(
type_name
.
length
()
<=
20
||
type_name
.
find_first_of
(
"<("
)
==
string
::
npos
);
}
// Matches the value against the given matcher, prints the value and explains
// the match result to the listener. Returns the match result.
// 'listener' must not be NULL.
// Value cannot be passed by const reference, because some matchers take a
// non-const argument.
template
<
typename
Value
,
typename
T
>
bool
MatchPrintAndExplain
(
Value
&
value
,
const
Matcher
<
T
>&
matcher
,
MatchResultListener
*
listener
)
{
if
(
!
listener
->
IsInterested
())
{
// If the listener is not interested, we do not need to construct the
// inner explanation.
return
matcher
.
Matches
(
value
);
}
StringMatchResultListener
inner_listener
;
const
bool
match
=
matcher
.
MatchAndExplain
(
value
,
&
inner_listener
);
UniversalPrint
(
value
,
listener
->
stream
());
#if GTEST_HAS_RTTI
const
string
&
type_name
=
GetTypeName
<
Value
>
();
if
(
IsReadableTypeName
(
type_name
))
*
listener
->
stream
()
<<
" (of type "
<<
type_name
<<
")"
;
#endif
PrintIfNotEmpty
(
inner_listener
.
str
(),
listener
->
stream
());
return
match
;
}
// An internal helper class for doing compile-time loop on a tuple's
// fields.
template
<
size_t
N
>
class
TuplePrefix
{
public:
// TuplePrefix<N>::Matches(matcher_tuple, value_tuple) returns true
// iff the first N fields of matcher_tuple matches the first N
// fields of value_tuple, respectively.
template
<
typename
MatcherTuple
,
typename
ValueTuple
>
static
bool
Matches
(
const
MatcherTuple
&
matcher_tuple
,
const
ValueTuple
&
value_tuple
)
{
return
TuplePrefix
<
N
-
1
>::
Matches
(
matcher_tuple
,
value_tuple
)
&&
get
<
N
-
1
>
(
matcher_tuple
).
Matches
(
get
<
N
-
1
>
(
value_tuple
));
}
// TuplePrefix<N>::ExplainMatchFailuresTo(matchers, values, os)
// describes failures in matching the first N fields of matchers
// against the first N fields of values. If there is no failure,
// nothing will be streamed to os.
template
<
typename
MatcherTuple
,
typename
ValueTuple
>
static
void
ExplainMatchFailuresTo
(
const
MatcherTuple
&
matchers
,
const
ValueTuple
&
values
,
::
std
::
ostream
*
os
)
{
// First, describes failures in the first N - 1 fields.
TuplePrefix
<
N
-
1
>::
ExplainMatchFailuresTo
(
matchers
,
values
,
os
);
// Then describes the failure (if any) in the (N - 1)-th (0-based)
// field.
typename
tuple_element
<
N
-
1
,
MatcherTuple
>::
type
matcher
=
get
<
N
-
1
>
(
matchers
);
typedef
typename
tuple_element
<
N
-
1
,
ValueTuple
>::
type
Value
;
Value
value
=
get
<
N
-
1
>
(
values
);
StringMatchResultListener
listener
;
if
(
!
matcher
.
MatchAndExplain
(
value
,
&
listener
))
{
// TODO(wan): include in the message the name of the parameter
// as used in MOCK_METHOD*() when possible.
*
os
<<
" Expected arg #"
<<
N
-
1
<<
": "
;
get
<
N
-
1
>
(
matchers
).
DescribeTo
(
os
);
*
os
<<
"
\n
Actual: "
;
// We remove the reference in type Value to prevent the
// universal printer from printing the address of value, which
// isn't interesting to the user most of the time. The
// matcher's MatchAndExplain() method handles the case when
// the address is interesting.
internal
::
UniversalPrint
(
value
,
os
);
PrintIfNotEmpty
(
listener
.
str
(),
os
);
*
os
<<
"
\n
"
;
}
}
};
// The base case.
template
<>
class
TuplePrefix
<
0
>
{
public:
template
<
typename
MatcherTuple
,
typename
ValueTuple
>
static
bool
Matches
(
const
MatcherTuple
&
/* matcher_tuple */
,
const
ValueTuple
&
/* value_tuple */
)
{
return
true
;
}
template
<
typename
MatcherTuple
,
typename
ValueTuple
>
static
void
ExplainMatchFailuresTo
(
const
MatcherTuple
&
/* matchers */
,
const
ValueTuple
&
/* values */
,
::
std
::
ostream
*
/* os */
)
{}
};
// TupleMatches(matcher_tuple, value_tuple) returns true iff all
// matchers in matcher_tuple match the corresponding fields in
// value_tuple. It is a compiler error if matcher_tuple and
// value_tuple have different number of fields or incompatible field
// types.
template
<
typename
MatcherTuple
,
typename
ValueTuple
>
bool
TupleMatches
(
const
MatcherTuple
&
matcher_tuple
,
const
ValueTuple
&
value_tuple
)
{
// Makes sure that matcher_tuple and value_tuple have the same
// number of fields.
GTEST_COMPILE_ASSERT_
(
tuple_size
<
MatcherTuple
>::
value
==
tuple_size
<
ValueTuple
>::
value
,
matcher_and_value_have_different_numbers_of_fields
);
return
TuplePrefix
<
tuple_size
<
ValueTuple
>::
value
>::
Matches
(
matcher_tuple
,
value_tuple
);
}
// Describes failures in matching matchers against values. If there
// is no failure, nothing will be streamed to os.
template
<
typename
MatcherTuple
,
typename
ValueTuple
>
void
ExplainMatchFailureTupleTo
(
const
MatcherTuple
&
matchers
,
const
ValueTuple
&
values
,
::
std
::
ostream
*
os
)
{
TuplePrefix
<
tuple_size
<
MatcherTuple
>::
value
>::
ExplainMatchFailuresTo
(
matchers
,
values
,
os
);
}
// TransformTupleValues and its helper.
//
// TransformTupleValuesHelper hides the internal machinery that
// TransformTupleValues uses to implement a tuple traversal.
template
<
typename
Tuple
,
typename
Func
,
typename
OutIter
>
class
TransformTupleValuesHelper
{
private:
typedef
::
testing
::
tuple_size
<
Tuple
>
TupleSize
;
public:
// For each member of tuple 't', taken in order, evaluates '*out++ = f(t)'.
// Returns the final value of 'out' in case the caller needs it.
static
OutIter
Run
(
Func
f
,
const
Tuple
&
t
,
OutIter
out
)
{
return
IterateOverTuple
<
Tuple
,
TupleSize
::
value
>
()(
f
,
t
,
out
);
}
private:
template
<
typename
Tup
,
size_t
kRemainingSize
>
struct
IterateOverTuple
{
OutIter
operator
()
(
Func
f
,
const
Tup
&
t
,
OutIter
out
)
const
{
*
out
++
=
f
(
::
testing
::
get
<
TupleSize
::
value
-
kRemainingSize
>
(
t
));
return
IterateOverTuple
<
Tup
,
kRemainingSize
-
1
>
()(
f
,
t
,
out
);
}
};
template
<
typename
Tup
>
struct
IterateOverTuple
<
Tup
,
0
>
{
OutIter
operator
()
(
Func
/* f */
,
const
Tup
&
/* t */
,
OutIter
out
)
const
{
return
out
;
}
};
};
// Successively invokes 'f(element)' on each element of the tuple 't',
// appending each result to the 'out' iterator. Returns the final value
// of 'out'.
template
<
typename
Tuple
,
typename
Func
,
typename
OutIter
>
OutIter
TransformTupleValues
(
Func
f
,
const
Tuple
&
t
,
OutIter
out
)
{
return
TransformTupleValuesHelper
<
Tuple
,
Func
,
OutIter
>::
Run
(
f
,
t
,
out
);
}
// Implements A<T>().
template
<
typename
T
>
class
AnyMatcherImpl
:
public
MatcherInterface
<
T
>
{
public:
virtual
bool
MatchAndExplain
(
T
/* x */
,
MatchResultListener
*
/* listener */
)
const
{
return
true
;
}
virtual
void
DescribeTo
(
::
std
::
ostream
*
os
)
const
{
*
os
<<
"is anything"
;
}
virtual
void
DescribeNegationTo
(
::
std
::
ostream
*
os
)
const
{
// This is mostly for completeness' safe, as it's not very useful
// to write Not(A<bool>()). However we cannot completely rule out
// such a possibility, and it doesn't hurt to be prepared.
*
os
<<
"never matches"
;
}
};
// Implements _, a matcher that matches any value of any
// type. This is a polymorphic matcher, so we need a template type
// conversion operator to make it appearing as a Matcher<T> for any
// type T.
class
AnythingMatcher
{
public:
template
<
typename
T
>
operator
Matcher
<
T
>
()
const
{
return
A
<
T
>
();
}
};
// Implements a matcher that compares a given value with a
// pre-supplied value using one of the ==, <=, <, etc, operators. The
// two values being compared don't have to have the same type.
//
// The matcher defined here is polymorphic (for example, Eq(5) can be
// used to match an int, a short, a double, etc). Therefore we use
// a template type conversion operator in the implementation.
//
// The following template definition assumes that the Rhs parameter is
// a "bare" type (i.e. neither 'const T' nor 'T&').
template
<
typename
D
,
typename
Rhs
,
typename
Op
>
class
ComparisonBase
{
public:
explicit
ComparisonBase
(
const
Rhs
&
rhs
)
:
rhs_
(
rhs
)
{}
template
<
typename
Lhs
>
operator
Matcher
<
Lhs
>
()
const
{
return
MakeMatcher
(
new
Impl
<
Lhs
>
(
rhs_
));
}
private:
template
<
typename
Lhs
>
class
Impl
:
public
MatcherInterface
<
Lhs
>
{
public:
explicit
Impl
(
const
Rhs
&
rhs
)
:
rhs_
(
rhs
)
{}
virtual
bool
MatchAndExplain
(
Lhs
lhs
,
MatchResultListener
*
/* listener */
)
const
{
return
Op
()(
lhs
,
rhs_
);
}
virtual
void
DescribeTo
(
::
std
::
ostream
*
os
)
const
{
*
os
<<
D
::
Desc
()
<<
" "
;
UniversalPrint
(
rhs_
,
os
);
}
virtual
void
DescribeNegationTo
(
::
std
::
ostream
*
os
)
const
{
*
os
<<
D
::
NegatedDesc
()
<<
" "
;
UniversalPrint
(
rhs_
,
os
);
}
private:
Rhs
rhs_
;
GTEST_DISALLOW_ASSIGN_
(
Impl
);
};
Rhs
rhs_
;
GTEST_DISALLOW_ASSIGN_
(
ComparisonBase
);
};
template
<
typename
Rhs
>
class
EqMatcher
:
public
ComparisonBase
<
EqMatcher
<
Rhs
>
,
Rhs
,
AnyEq
>
{
public:
explicit
EqMatcher
(
const
Rhs
&
rhs
)
:
ComparisonBase
<
EqMatcher
<
Rhs
>
,
Rhs
,
AnyEq
>
(
rhs
)
{
}
static
const
char
*
Desc
()
{
return
"is equal to"
;
}
static
const
char
*
NegatedDesc
()
{
return
"isn't equal to"
;
}
};
template
<
typename
Rhs
>
class
NeMatcher
:
public
ComparisonBase
<
NeMatcher
<
Rhs
>
,
Rhs
,
AnyNe
>
{
public:
explicit
NeMatcher
(
const
Rhs
&
rhs
)
:
ComparisonBase
<
NeMatcher
<
Rhs
>
,
Rhs
,
AnyNe
>
(
rhs
)
{
}
static
const
char
*
Desc
()
{
return
"isn't equal to"
;
}
static
const
char
*
NegatedDesc
()
{
return
"is equal to"
;
}
};
template
<
typename
Rhs
>
class
LtMatcher
:
public
ComparisonBase
<
LtMatcher
<
Rhs
>
,
Rhs
,
AnyLt
>
{
public:
explicit
LtMatcher
(
const
Rhs
&
rhs
)
:
ComparisonBase
<
LtMatcher
<
Rhs
>
,
Rhs
,
AnyLt
>
(
rhs
)
{
}
static
const
char
*
Desc
()
{
return
"is <"
;
}
static
const
char
*
NegatedDesc
()
{
return
"isn't <"
;
}
};
template
<
typename
Rhs
>
class
GtMatcher
:
public
ComparisonBase
<
GtMatcher
<
Rhs
>
,
Rhs
,
AnyGt
>
{
public:
explicit
GtMatcher
(
const
Rhs
&
rhs
)
:
ComparisonBase
<
GtMatcher
<
Rhs
>
,
Rhs
,
AnyGt
>
(
rhs
)
{
}
static
const
char
*
Desc
()
{
return
"is >"
;
}
static
const
char
*
NegatedDesc
()
{
return
"isn't >"
;
}
};
template
<
typename
Rhs
>
class
LeMatcher
:
public
ComparisonBase
<
LeMatcher
<
Rhs
>
,
Rhs
,
AnyLe
>
{
public:
explicit
LeMatcher
(
const
Rhs
&
rhs
)
:
ComparisonBase
<
LeMatcher
<
Rhs
>
,
Rhs
,
AnyLe
>
(
rhs
)
{
}
static
const
char
*
Desc
()
{
return
"is <="
;
}
static
const
char
*
NegatedDesc
()
{
return
"isn't <="
;
}
};
template
<
typename
Rhs
>
class
GeMatcher
:
public
ComparisonBase
<
GeMatcher
<
Rhs
>
,
Rhs
,
AnyGe
>
{
public:
explicit
GeMatcher
(
const
Rhs
&
rhs
)
:
ComparisonBase
<
GeMatcher
<
Rhs
>
,
Rhs
,
AnyGe
>
(
rhs
)
{
}
static
const
char
*
Desc
()
{
return
"is >="
;
}
static
const
char
*
NegatedDesc
()
{
return
"isn't >="
;
}
};
// Implements the polymorphic IsNull() matcher, which matches any raw or smart
// pointer that is NULL.
class
IsNullMatcher
{
public:
template
<
typename
Pointer
>
bool
MatchAndExplain
(
const
Pointer
&
p
,
MatchResultListener
*
/* listener */
)
const
{
#if GTEST_LANG_CXX11
return
p
==
nullptr
;
#else // GTEST_LANG_CXX11
return
GetRawPointer
(
p
)
==
NULL
;
#endif // GTEST_LANG_CXX11
}
void
DescribeTo
(
::
std
::
ostream
*
os
)
const
{
*
os
<<
"is NULL"
;
}
void
DescribeNegationTo
(
::
std
::
ostream
*
os
)
const
{
*
os
<<
"isn't NULL"
;
}
};
// Implements the polymorphic NotNull() matcher, which matches any raw or smart
// pointer that is not NULL.
class
NotNullMatcher
{
public:
template
<
typename
Pointer
>
bool
MatchAndExplain
(
const
Pointer
&
p
,
MatchResultListener
*
/* listener */
)
const
{
#if GTEST_LANG_CXX11
return
p
!=
nullptr
;
#else // GTEST_LANG_CXX11
return
GetRawPointer
(
p
)
!=
NULL
;
#endif // GTEST_LANG_CXX11
}
void
DescribeTo
(
::
std
::
ostream
*
os
)
const
{
*
os
<<
"isn't NULL"
;
}
void
DescribeNegationTo
(
::
std
::
ostream
*
os
)
const
{
*
os
<<
"is NULL"
;
}
};
// Ref(variable) matches any argument that is a reference to
// 'variable'. This matcher is polymorphic as it can match any
// super type of the type of 'variable'.
//
// The RefMatcher template class implements Ref(variable). It can
// only be instantiated with a reference type. This prevents a user
// from mistakenly using Ref(x) to match a non-reference function
// argument. For example, the following will righteously cause a
// compiler error:
//
// int n;
// Matcher<int> m1 = Ref(n); // This won't compile.
// Matcher<int&> m2 = Ref(n); // This will compile.
template
<
typename
T
>
class
RefMatcher
;
template
<
typename
T
>
class
RefMatcher
<
T
&>
{
// Google Mock is a generic framework and thus needs to support
// mocking any function types, including those that take non-const
// reference arguments. Therefore the template parameter T (and
// Super below) can be instantiated to either a const type or a
// non-const type.
public:
// RefMatcher() takes a T& instead of const T&, as we want the
// compiler to catch using Ref(const_value) as a matcher for a
// non-const reference.
explicit
RefMatcher
(
T
&
x
)
:
object_
(
x
)
{}
// NOLINT
template
<
typename
Super
>
operator
Matcher
<
Super
&>
()
const
{
// By passing object_ (type T&) to Impl(), which expects a Super&,
// we make sure that Super is a super type of T. In particular,
// this catches using Ref(const_value) as a matcher for a
// non-const reference, as you cannot implicitly convert a const
// reference to a non-const reference.
return
MakeMatcher
(
new
Impl
<
Super
>
(
object_
));
}
private:
template
<
typename
Super
>
class
Impl
:
public
MatcherInterface
<
Super
&>
{
public:
explicit
Impl
(
Super
&
x
)
:
object_
(
x
)
{}
// NOLINT
// MatchAndExplain() takes a Super& (as opposed to const Super&)
// in order to match the interface MatcherInterface<Super&>.
virtual
bool
MatchAndExplain
(
Super
&
x
,
MatchResultListener
*
listener
)
const
{
*
listener
<<
"which is located @"
<<
static_cast
<
const
void
*>
(
&
x
);
return
&
x
==
&
object_
;
}
virtual
void
DescribeTo
(
::
std
::
ostream
*
os
)
const
{
*
os
<<
"references the variable "
;
UniversalPrinter
<
Super
&>::
Print
(
object_
,
os
);
}
virtual
void
DescribeNegationTo
(
::
std
::
ostream
*
os
)
const
{
*
os
<<
"does not reference the variable "
;
UniversalPrinter
<
Super
&>::
Print
(
object_
,
os
);
}
private:
const
Super
&
object_
;
GTEST_DISALLOW_ASSIGN_
(
Impl
);
};
T
&
object_
;
GTEST_DISALLOW_ASSIGN_
(
RefMatcher
);
};
// Polymorphic helper functions for narrow and wide string matchers.
inline
bool
CaseInsensitiveCStringEquals
(
const
char
*
lhs
,
const
char
*
rhs
)
{
return
String
::
CaseInsensitiveCStringEquals
(
lhs
,
rhs
);
}
inline
bool
CaseInsensitiveCStringEquals
(
const
wchar_t
*
lhs
,
const
wchar_t
*
rhs
)
{
return
String
::
CaseInsensitiveWideCStringEquals
(
lhs
,
rhs
);
}
// String comparison for narrow or wide strings that can have embedded NUL
// characters.
template
<
typename
StringType
>
bool
CaseInsensitiveStringEquals
(
const
StringType
&
s1
,
const
StringType
&
s2
)
{
// Are the heads equal?
if
(
!
CaseInsensitiveCStringEquals
(
s1
.
c_str
(),
s2
.
c_str
()))
{
return
false
;
}
// Skip the equal heads.
const
typename
StringType
::
value_type
nul
=
0
;
const
size_t
i1
=
s1
.
find
(
nul
),
i2
=
s2
.
find
(
nul
);
// Are we at the end of either s1 or s2?
if
(
i1
==
StringType
::
npos
||
i2
==
StringType
::
npos
)
{
return
i1
==
i2
;
}
// Are the tails equal?
return
CaseInsensitiveStringEquals
(
s1
.
substr
(
i1
+
1
),
s2
.
substr
(
i2
+
1
));
}
// String matchers.
// Implements equality-based string matchers like StrEq, StrCaseNe, and etc.
template
<
typename
StringType
>
class
StrEqualityMatcher
{
public:
StrEqualityMatcher
(
const
StringType
&
str
,
bool
expect_eq
,
bool
case_sensitive
)
:
string_
(
str
),
expect_eq_
(
expect_eq
),
case_sensitive_
(
case_sensitive
)
{}
// Accepts pointer types, particularly:
// const char*
// char*
// const wchar_t*
// wchar_t*
template
<
typename
CharType
>
bool
MatchAndExplain
(
CharType
*
s
,
MatchResultListener
*
listener
)
const
{
if
(
s
==
NULL
)
{
return
!
expect_eq_
;
}
return
MatchAndExplain
(
StringType
(
s
),
listener
);
}
// Matches anything that can convert to StringType.
//
// This is a template, not just a plain function with const StringType&,
// because StringPiece has some interfering non-explicit constructors.
template
<
typename
MatcheeStringType
>
bool
MatchAndExplain
(
const
MatcheeStringType
&
s
,
MatchResultListener
*
/* listener */
)
const
{
const
StringType
&
s2
(
s
);
const
bool
eq
=
case_sensitive_
?
s2
==
string_
:
CaseInsensitiveStringEquals
(
s2
,
string_
);
return
expect_eq_
==
eq
;
}
void
DescribeTo
(
::
std
::
ostream
*
os
)
const
{
DescribeToHelper
(
expect_eq_
,
os
);
}
void
DescribeNegationTo
(
::
std
::
ostream
*
os
)
const
{
DescribeToHelper
(
!
expect_eq_
,
os
);
}
private:
void
DescribeToHelper
(
bool
expect_eq
,
::
std
::
ostream
*
os
)
const
{
*
os
<<
(
expect_eq
?
"is "
:
"isn't "
);
*
os
<<
"equal to "
;
if
(
!
case_sensitive_
)
{
*
os
<<
"(ignoring case) "
;
}
UniversalPrint
(
string_
,
os
);
}
const
StringType
string_
;
const
bool
expect_eq_
;
const
bool
case_sensitive_
;
GTEST_DISALLOW_ASSIGN_
(
StrEqualityMatcher
);
};
// Implements the polymorphic HasSubstr(substring) matcher, which
// can be used as a Matcher<T> as long as T can be converted to a
// string.
template
<
typename
StringType
>
class
HasSubstrMatcher
{
public:
explicit
HasSubstrMatcher
(
const
StringType
&
substring
)
:
substring_
(
substring
)
{}
// Accepts pointer types, particularly:
// const char*
// char*
// const wchar_t*
// wchar_t*
template
<
typename
CharType
>
bool
MatchAndExplain
(
CharType
*
s
,
MatchResultListener
*
listener
)
const
{
return
s
!=
NULL
&&
MatchAndExplain
(
StringType
(
s
),
listener
);
}
// Matches anything that can convert to StringType.
//
// This is a template, not just a plain function with const StringType&,
// because StringPiece has some interfering non-explicit constructors.
template
<
typename
MatcheeStringType
>
bool
MatchAndExplain
(
const
MatcheeStringType
&
s
,
MatchResultListener
*
/* listener */
)
const
{
const
StringType
&
s2
(
s
);
return
s2
.
find
(
substring_
)
!=
StringType
::
npos
;
}
// Describes what this matcher matches.
void
DescribeTo
(
::
std
::
ostream
*
os
)
const
{
*
os
<<
"has substring "
;
UniversalPrint
(
substring_
,
os
);
}
void
DescribeNegationTo
(
::
std
::
ostream
*
os
)
const
{
*
os
<<
"has no substring "
;
UniversalPrint
(
substring_
,
os
);
}
private:
const
StringType
substring_
;
GTEST_DISALLOW_ASSIGN_
(
HasSubstrMatcher
);
};
// Implements the polymorphic StartsWith(substring) matcher, which
// can be used as a Matcher<T> as long as T can be converted to a
// string.
template
<
typename
StringType
>
class
StartsWithMatcher
{
public:
explicit
StartsWithMatcher
(
const
StringType
&
prefix
)
:
prefix_
(
prefix
)
{
}
// Accepts pointer types, particularly:
// const char*
// char*
// const wchar_t*
// wchar_t*
template
<
typename
CharType
>
bool
MatchAndExplain
(
CharType
*
s
,
MatchResultListener
*
listener
)
const
{
return
s
!=
NULL
&&
MatchAndExplain
(
StringType
(
s
),
listener
);
}
// Matches anything that can convert to StringType.
//
// This is a template, not just a plain function with const StringType&,
// because StringPiece has some interfering non-explicit constructors.
template
<
typename
MatcheeStringType
>
bool
MatchAndExplain
(
const
MatcheeStringType
&
s
,
MatchResultListener
*
/* listener */
)
const
{
const
StringType
&
s2
(
s
);
return
s2
.
length
()
>=
prefix_
.
length
()
&&
s2
.
substr
(
0
,
prefix_
.
length
())
==
prefix_
;
}
void
DescribeTo
(
::
std
::
ostream
*
os
)
const
{
*
os
<<
"starts with "
;
UniversalPrint
(
prefix_
,
os
);
}
void
DescribeNegationTo
(
::
std
::
ostream
*
os
)
const
{
*
os
<<
"doesn't start with "
;
UniversalPrint
(
prefix_
,
os
);
}
private:
const
StringType
prefix_
;
GTEST_DISALLOW_ASSIGN_
(
StartsWithMatcher
);
};
// Implements the polymorphic EndsWith(substring) matcher, which
// can be used as a Matcher<T> as long as T can be converted to a
// string.
template
<
typename
StringType
>
class
EndsWithMatcher
{
public:
explicit
EndsWithMatcher
(
const
StringType
&
suffix
)
:
suffix_
(
suffix
)
{}
// Accepts pointer types, particularly:
// const char*
// char*
// const wchar_t*
// wchar_t*
template
<
typename
CharType
>
bool
MatchAndExplain
(
CharType
*
s
,
MatchResultListener
*
listener
)
const
{
return
s
!=
NULL
&&
MatchAndExplain
(
StringType
(
s
),
listener
);
}
// Matches anything that can convert to StringType.
//
// This is a template, not just a plain function with const StringType&,
// because StringPiece has some interfering non-explicit constructors.
template
<
typename
MatcheeStringType
>
bool
MatchAndExplain
(
const
MatcheeStringType
&
s
,
MatchResultListener
*
/* listener */
)
const
{
const
StringType
&
s2
(
s
);
return
s2
.
length
()
>=
suffix_
.
length
()
&&
s2
.
substr
(
s2
.
length
()
-
suffix_
.
length
())
==
suffix_
;
}
void
DescribeTo
(
::
std
::
ostream
*
os
)
const
{
*
os
<<
"ends with "
;
UniversalPrint
(
suffix_
,
os
);
}
void
DescribeNegationTo
(
::
std
::
ostream
*
os
)
const
{
*
os
<<
"doesn't end with "
;
UniversalPrint
(
suffix_
,
os
);
}
private:
const
StringType
suffix_
;
GTEST_DISALLOW_ASSIGN_
(
EndsWithMatcher
);
};
// Implements polymorphic matchers MatchesRegex(regex) and
// ContainsRegex(regex), which can be used as a Matcher<T> as long as
// T can be converted to a string.
class
MatchesRegexMatcher
{
public:
MatchesRegexMatcher
(
const
RE
*
regex
,
bool
full_match
)
:
regex_
(
regex
),
full_match_
(
full_match
)
{}
// Accepts pointer types, particularly:
// const char*
// char*
// const wchar_t*
// wchar_t*
template
<
typename
CharType
>
bool
MatchAndExplain
(
CharType
*
s
,
MatchResultListener
*
listener
)
const
{
return
s
!=
NULL
&&
MatchAndExplain
(
internal
::
string
(
s
),
listener
);
}
// Matches anything that can convert to internal::string.
//
// This is a template, not just a plain function with const internal::string&,
// because StringPiece has some interfering non-explicit constructors.
template
<
class
MatcheeStringType
>
bool
MatchAndExplain
(
const
MatcheeStringType
&
s
,
MatchResultListener
*
/* listener */
)
const
{
const
internal
::
string
&
s2
(
s
);
return
full_match_
?
RE
:
:
FullMatch
(
s2
,
*
regex_
)
:
RE
::
PartialMatch
(
s2
,
*
regex_
);
}
void
DescribeTo
(
::
std
::
ostream
*
os
)
const
{
*
os
<<
(
full_match_
?
"matches"
:
"contains"
)
<<
" regular expression "
;
UniversalPrinter
<
internal
::
string
>::
Print
(
regex_
->
pattern
(),
os
);
}
void
DescribeNegationTo
(
::
std
::
ostream
*
os
)
const
{
*
os
<<
"doesn't "
<<
(
full_match_
?
"match"
:
"contain"
)
<<
" regular expression "
;
UniversalPrinter
<
internal
::
string
>::
Print
(
regex_
->
pattern
(),
os
);
}
private:
const
internal
::
linked_ptr
<
const
RE
>
regex_
;
const
bool
full_match_
;
GTEST_DISALLOW_ASSIGN_
(
MatchesRegexMatcher
);
};
// Implements a matcher that compares the two fields of a 2-tuple
// using one of the ==, <=, <, etc, operators. The two fields being
// compared don't have to have the same type.
//
// The matcher defined here is polymorphic (for example, Eq() can be
// used to match a tuple<int, short>, a tuple<const long&, double>,
// etc). Therefore we use a template type conversion operator in the
// implementation.
template
<
typename
D
,
typename
Op
>
class
PairMatchBase
{
public:
template
<
typename
T1
,
typename
T2
>
operator
Matcher
<
::
testing
::
tuple
<
T1
,
T2
>
>
()
const
{
return
MakeMatcher
(
new
Impl
<
::
testing
::
tuple
<
T1
,
T2
>
>
);
}
template
<
typename
T1
,
typename
T2
>
operator
Matcher
<
const
::
testing
::
tuple
<
T1
,
T2
>&>
()
const
{
return
MakeMatcher
(
new
Impl
<
const
::
testing
::
tuple
<
T1
,
T2
>&>
);
}
private:
static
::
std
::
ostream
&
GetDesc
(
::
std
::
ostream
&
os
)
{
// NOLINT
return
os
<<
D
::
Desc
();
}
template
<
typename
Tuple
>
class
Impl
:
public
MatcherInterface
<
Tuple
>
{
public:
virtual
bool
MatchAndExplain
(
Tuple
args
,
MatchResultListener
*
/* listener */
)
const
{
return
Op
()(
::
testing
::
get
<
0
>
(
args
),
::
testing
::
get
<
1
>
(
args
));
}
virtual
void
DescribeTo
(
::
std
::
ostream
*
os
)
const
{
*
os
<<
"are "
<<
GetDesc
;
}
virtual
void
DescribeNegationTo
(
::
std
::
ostream
*
os
)
const
{
*
os
<<
"aren't "
<<
GetDesc
;
}
};
};
class
Eq2Matcher
:
public
PairMatchBase
<
Eq2Matcher
,
AnyEq
>
{
public:
static
const
char
*
Desc
()
{
return
"an equal pair"
;
}
};
class
Ne2Matcher
:
public
PairMatchBase
<
Ne2Matcher
,
AnyNe
>
{
public:
static
const
char
*
Desc
()
{
return
"an unequal pair"
;
}
};
class
Lt2Matcher
:
public
PairMatchBase
<
Lt2Matcher
,
AnyLt
>
{
public:
static
const
char
*
Desc
()
{
return
"a pair where the first < the second"
;
}
};
class
Gt2Matcher
:
public
PairMatchBase
<
Gt2Matcher
,
AnyGt
>
{
public:
static
const
char
*
Desc
()
{
return
"a pair where the first > the second"
;
}
};
class
Le2Matcher
:
public
PairMatchBase
<
Le2Matcher
,
AnyLe
>
{
public:
static
const
char
*
Desc
()
{
return
"a pair where the first <= the second"
;
}
};
class
Ge2Matcher
:
public
PairMatchBase
<
Ge2Matcher
,
AnyGe
>
{
public:
static
const
char
*
Desc
()
{
return
"a pair where the first >= the second"
;
}
};
// Implements the Not(...) matcher for a particular argument type T.
// We do not nest it inside the NotMatcher class template, as that
// will prevent different instantiations of NotMatcher from sharing
// the same NotMatcherImpl<T> class.
template
<
typename
T
>
class
NotMatcherImpl
:
public
MatcherInterface
<
T
>
{
public:
explicit
NotMatcherImpl
(
const
Matcher
<
T
>&
matcher
)
:
matcher_
(
matcher
)
{}
virtual
bool
MatchAndExplain
(
T
x
,
MatchResultListener
*
listener
)
const
{
return
!
matcher_
.
MatchAndExplain
(
x
,
listener
);
}
virtual
void
DescribeTo
(
::
std
::
ostream
*
os
)
const
{
matcher_
.
DescribeNegationTo
(
os
);
}
virtual
void
DescribeNegationTo
(
::
std
::
ostream
*
os
)
const
{
matcher_
.
DescribeTo
(
os
);
}
private:
const
Matcher
<
T
>
matcher_
;
GTEST_DISALLOW_ASSIGN_
(
NotMatcherImpl
);
};
// Implements the Not(m) matcher, which matches a value that doesn't
// match matcher m.
template
<
typename
InnerMatcher
>
class
NotMatcher
{
public:
explicit
NotMatcher
(
InnerMatcher
matcher
)
:
matcher_
(
matcher
)
{}
// This template type conversion operator allows Not(m) to be used
// to match any type m can match.
template
<
typename
T
>
operator
Matcher
<
T
>
()
const
{
return
Matcher
<
T
>
(
new
NotMatcherImpl
<
T
>
(
SafeMatcherCast
<
T
>
(
matcher_
)));
}
private:
InnerMatcher
matcher_
;
GTEST_DISALLOW_ASSIGN_
(
NotMatcher
);
};
// Implements the AllOf(m1, m2) matcher for a particular argument type
// T. We do not nest it inside the BothOfMatcher class template, as
// that will prevent different instantiations of BothOfMatcher from
// sharing the same BothOfMatcherImpl<T> class.
template
<
typename
T
>
class
BothOfMatcherImpl
:
public
MatcherInterface
<
T
>
{
public:
BothOfMatcherImpl
(
const
Matcher
<
T
>&
matcher1
,
const
Matcher
<
T
>&
matcher2
)
:
matcher1_
(
matcher1
),
matcher2_
(
matcher2
)
{}
virtual
void
DescribeTo
(
::
std
::
ostream
*
os
)
const
{
*
os
<<
"("
;
matcher1_
.
DescribeTo
(
os
);
*
os
<<
") and ("
;
matcher2_
.
DescribeTo
(
os
);
*
os
<<
")"
;
}
virtual
void
DescribeNegationTo
(
::
std
::
ostream
*
os
)
const
{
*
os
<<
"("
;
matcher1_
.
DescribeNegationTo
(
os
);
*
os
<<
") or ("
;
matcher2_
.
DescribeNegationTo
(
os
);
*
os
<<
")"
;
}
virtual
bool
MatchAndExplain
(
T
x
,
MatchResultListener
*
listener
)
const
{
// If either matcher1_ or matcher2_ doesn't match x, we only need
// to explain why one of them fails.
StringMatchResultListener
listener1
;
if
(
!
matcher1_
.
MatchAndExplain
(
x
,
&
listener1
))
{
*
listener
<<
listener1
.
str
();
return
false
;
}
StringMatchResultListener
listener2
;
if
(
!
matcher2_
.
MatchAndExplain
(
x
,
&
listener2
))
{
*
listener
<<
listener2
.
str
();
return
false
;
}
// Otherwise we need to explain why *both* of them match.
const
internal
::
string
s1
=
listener1
.
str
();
const
internal
::
string
s2
=
listener2
.
str
();
if
(
s1
==
""
)
{
*
listener
<<
s2
;
}
else
{
*
listener
<<
s1
;
if
(
s2
!=
""
)
{
*
listener
<<
", and "
<<
s2
;
}
}
return
true
;
}
private:
const
Matcher
<
T
>
matcher1_
;
const
Matcher
<
T
>
matcher2_
;
GTEST_DISALLOW_ASSIGN_
(
BothOfMatcherImpl
);
};
#if GTEST_LANG_CXX11
// MatcherList provides mechanisms for storing a variable number of matchers in
// a list structure (ListType) and creating a combining matcher from such a
// list.
// The template is defined recursively using the following template paramters:
// * kSize is the length of the MatcherList.
// * Head is the type of the first matcher of the list.
// * Tail denotes the types of the remaining matchers of the list.
template
<
int
kSize
,
typename
Head
,
typename
...
Tail
>
struct
MatcherList
{
typedef
MatcherList
<
kSize
-
1
,
Tail
...
>
MatcherListTail
;
typedef
::
std
::
pair
<
Head
,
typename
MatcherListTail
::
ListType
>
ListType
;
// BuildList stores variadic type values in a nested pair structure.
// Example:
// MatcherList<3, int, string, float>::BuildList(5, "foo", 2.0) will return
// the corresponding result of type pair<int, pair<string, float>>.
static
ListType
BuildList
(
const
Head
&
matcher
,
const
Tail
&
...
tail
)
{
return
ListType
(
matcher
,
MatcherListTail
::
BuildList
(
tail
...));
}
// CreateMatcher<T> creates a Matcher<T> from a given list of matchers (built
// by BuildList()). CombiningMatcher<T> is used to combine the matchers of the
// list. CombiningMatcher<T> must implement MatcherInterface<T> and have a
// constructor taking two Matcher<T>s as input.
template
<
typename
T
,
template
<
typename
/* T */
>
class
CombiningMatcher
>
static
Matcher
<
T
>
CreateMatcher
(
const
ListType
&
matchers
)
{
return
Matcher
<
T
>
(
new
CombiningMatcher
<
T
>
(
SafeMatcherCast
<
T
>
(
matchers
.
first
),
MatcherListTail
::
template
CreateMatcher
<
T
,
CombiningMatcher
>
(
matchers
.
second
)));
}
};
// The following defines the base case for the recursive definition of
// MatcherList.
template
<
typename
Matcher1
,
typename
Matcher2
>
struct
MatcherList
<
2
,
Matcher1
,
Matcher2
>
{
typedef
::
std
::
pair
<
Matcher1
,
Matcher2
>
ListType
;
static
ListType
BuildList
(
const
Matcher1
&
matcher1
,
const
Matcher2
&
matcher2
)
{
return
::
std
::
pair
<
Matcher1
,
Matcher2
>
(
matcher1
,
matcher2
);
}
template
<
typename
T
,
template
<
typename
/* T */
>
class
CombiningMatcher
>
static
Matcher
<
T
>
CreateMatcher
(
const
ListType
&
matchers
)
{
return
Matcher
<
T
>
(
new
CombiningMatcher
<
T
>
(
SafeMatcherCast
<
T
>
(
matchers
.
first
),
SafeMatcherCast
<
T
>
(
matchers
.
second
)));
}
};
// VariadicMatcher is used for the variadic implementation of
// AllOf(m_1, m_2, ...) and AnyOf(m_1, m_2, ...).
// CombiningMatcher<T> is used to recursively combine the provided matchers
// (of type Args...).
template
<
template
<
typename
T
>
class
CombiningMatcher
,
typename
...
Args
>
class
VariadicMatcher
{
public:
VariadicMatcher
(
const
Args
&
...
matchers
)
// NOLINT
:
matchers_
(
MatcherListType
::
BuildList
(
matchers
...))
{}
// This template type conversion operator allows an
// VariadicMatcher<Matcher1, Matcher2...> object to match any type that
// all of the provided matchers (Matcher1, Matcher2, ...) can match.
template
<
typename
T
>
operator
Matcher
<
T
>
()
const
{
return
MatcherListType
::
template
CreateMatcher
<
T
,
CombiningMatcher
>
(
matchers_
);
}
private:
typedef
MatcherList
<
sizeof
...(
Args
),
Args
...
>
MatcherListType
;
const
typename
MatcherListType
::
ListType
matchers_
;
GTEST_DISALLOW_ASSIGN_
(
VariadicMatcher
);
};
template
<
typename
...
Args
>
using
AllOfMatcher
=
VariadicMatcher
<
BothOfMatcherImpl
,
Args
...
>
;
#endif // GTEST_LANG_CXX11
// Used for implementing the AllOf(m_1, ..., m_n) matcher, which
// matches a value that matches all of the matchers m_1, ..., and m_n.
template
<
typename
Matcher1
,
typename
Matcher2
>
class
BothOfMatcher
{
public:
BothOfMatcher
(
Matcher1
matcher1
,
Matcher2
matcher2
)
:
matcher1_
(
matcher1
),
matcher2_
(
matcher2
)
{}
// This template type conversion operator allows a
// BothOfMatcher<Matcher1, Matcher2> object to match any type that
// both Matcher1 and Matcher2 can match.
template
<
typename
T
>
operator
Matcher
<
T
>
()
const
{
return
Matcher
<
T
>
(
new
BothOfMatcherImpl
<
T
>
(
SafeMatcherCast
<
T
>
(
matcher1_
),
SafeMatcherCast
<
T
>
(
matcher2_
)));
}
private:
Matcher1
matcher1_
;
Matcher2
matcher2_
;
GTEST_DISALLOW_ASSIGN_
(
BothOfMatcher
);
};
// Implements the AnyOf(m1, m2) matcher for a particular argument type
// T. We do not nest it inside the AnyOfMatcher class template, as
// that will prevent different instantiations of AnyOfMatcher from
// sharing the same EitherOfMatcherImpl<T> class.
template
<
typename
T
>
class
EitherOfMatcherImpl
:
public
MatcherInterface
<
T
>
{
public:
EitherOfMatcherImpl
(
const
Matcher
<
T
>&
matcher1
,
const
Matcher
<
T
>&
matcher2
)
:
matcher1_
(
matcher1
),
matcher2_
(
matcher2
)
{}
virtual
void
DescribeTo
(
::
std
::
ostream
*
os
)
const
{
*
os
<<
"("
;
matcher1_
.
DescribeTo
(
os
);
*
os
<<
") or ("
;
matcher2_
.
DescribeTo
(
os
);
*
os
<<
")"
;
}
virtual
void
DescribeNegationTo
(
::
std
::
ostream
*
os
)
const
{
*
os
<<
"("
;
matcher1_
.
DescribeNegationTo
(
os
);
*
os
<<
") and ("
;
matcher2_
.
DescribeNegationTo
(
os
);
*
os
<<
")"
;
}
virtual
bool
MatchAndExplain
(
T
x
,
MatchResultListener
*
listener
)
const
{
// If either matcher1_ or matcher2_ matches x, we just need to
// explain why *one* of them matches.
StringMatchResultListener
listener1
;
if
(
matcher1_
.
MatchAndExplain
(
x
,
&
listener1
))
{
*
listener
<<
listener1
.
str
();
return
true
;
}
StringMatchResultListener
listener2
;
if
(
matcher2_
.
MatchAndExplain
(
x
,
&
listener2
))
{
*
listener
<<
listener2
.
str
();
return
true
;
}
// Otherwise we need to explain why *both* of them fail.
const
internal
::
string
s1
=
listener1
.
str
();
const
internal
::
string
s2
=
listener2
.
str
();
if
(
s1
==
""
)
{
*
listener
<<
s2
;
}
else
{
*
listener
<<
s1
;
if
(
s2
!=
""
)
{
*
listener
<<
", and "
<<
s2
;
}
}
return
false
;
}
private:
const
Matcher
<
T
>
matcher1_
;
const
Matcher
<
T
>
matcher2_
;
GTEST_DISALLOW_ASSIGN_
(
EitherOfMatcherImpl
);
};
#if GTEST_LANG_CXX11
// AnyOfMatcher is used for the variadic implementation of AnyOf(m_1, m_2, ...).
template
<
typename
...
Args
>
using
AnyOfMatcher
=
VariadicMatcher
<
EitherOfMatcherImpl
,
Args
...
>
;
#endif // GTEST_LANG_CXX11
// Used for implementing the AnyOf(m_1, ..., m_n) matcher, which
// matches a value that matches at least one of the matchers m_1, ...,
// and m_n.
template
<
typename
Matcher1
,
typename
Matcher2
>
class
EitherOfMatcher
{
public:
EitherOfMatcher
(
Matcher1
matcher1
,
Matcher2
matcher2
)
:
matcher1_
(
matcher1
),
matcher2_
(
matcher2
)
{}
// This template type conversion operator allows a
// EitherOfMatcher<Matcher1, Matcher2> object to match any type that
// both Matcher1 and Matcher2 can match.
template
<
typename
T
>
operator
Matcher
<
T
>
()
const
{
return
Matcher
<
T
>
(
new
EitherOfMatcherImpl
<
T
>
(
SafeMatcherCast
<
T
>
(
matcher1_
),
SafeMatcherCast
<
T
>
(
matcher2_
)));
}
private:
Matcher1
matcher1_
;
Matcher2
matcher2_
;
GTEST_DISALLOW_ASSIGN_
(
EitherOfMatcher
);
};
// Used for implementing Truly(pred), which turns a predicate into a
// matcher.
template
<
typename
Predicate
>
class
TrulyMatcher
{
public:
explicit
TrulyMatcher
(
Predicate
pred
)
:
predicate_
(
pred
)
{}
// This method template allows Truly(pred) to be used as a matcher
// for type T where T is the argument type of predicate 'pred'. The
// argument is passed by reference as the predicate may be
// interested in the address of the argument.
template
<
typename
T
>
bool
MatchAndExplain
(
T
&
x
,
// NOLINT
MatchResultListener
*
/* listener */
)
const
{
// Without the if-statement, MSVC sometimes warns about converting
// a value to bool (warning 4800).
//
// We cannot write 'return !!predicate_(x);' as that doesn't work
// when predicate_(x) returns a class convertible to bool but
// having no operator!().
if
(
predicate_
(
x
))
return
true
;
return
false
;
}
void
DescribeTo
(
::
std
::
ostream
*
os
)
const
{
*
os
<<
"satisfies the given predicate"
;
}
void
DescribeNegationTo
(
::
std
::
ostream
*
os
)
const
{
*
os
<<
"doesn't satisfy the given predicate"
;
}
private:
Predicate
predicate_
;
GTEST_DISALLOW_ASSIGN_
(
TrulyMatcher
);
};
// Used for implementing Matches(matcher), which turns a matcher into
// a predicate.
template
<
typename
M
>
class
MatcherAsPredicate
{
public:
explicit
MatcherAsPredicate
(
M
matcher
)
:
matcher_
(
matcher
)
{}
// This template operator() allows Matches(m) to be used as a
// predicate on type T where m is a matcher on type T.
//
// The argument x is passed by reference instead of by value, as
// some matcher may be interested in its address (e.g. as in
// Matches(Ref(n))(x)).
template
<
typename
T
>
bool
operator
()(
const
T
&
x
)
const
{
// We let matcher_ commit to a particular type here instead of
// when the MatcherAsPredicate object was constructed. This
// allows us to write Matches(m) where m is a polymorphic matcher
// (e.g. Eq(5)).
//
// If we write Matcher<T>(matcher_).Matches(x) here, it won't
// compile when matcher_ has type Matcher<const T&>; if we write
// Matcher<const T&>(matcher_).Matches(x) here, it won't compile
// when matcher_ has type Matcher<T>; if we just write
// matcher_.Matches(x), it won't compile when matcher_ is
// polymorphic, e.g. Eq(5).
//
// MatcherCast<const T&>() is necessary for making the code work
// in all of the above situations.
return
MatcherCast
<
const
T
&>
(
matcher_
).
Matches
(
x
);
}
private:
M
matcher_
;
GTEST_DISALLOW_ASSIGN_
(
MatcherAsPredicate
);
};
// For implementing ASSERT_THAT() and EXPECT_THAT(). The template
// argument M must be a type that can be converted to a matcher.
template
<
typename
M
>
class
PredicateFormatterFromMatcher
{
public:
explicit
PredicateFormatterFromMatcher
(
M
m
)
:
matcher_
(
internal
::
move
(
m
))
{}
// This template () operator allows a PredicateFormatterFromMatcher
// object to act as a predicate-formatter suitable for using with
// Google Test's EXPECT_PRED_FORMAT1() macro.
template
<
typename
T
>
AssertionResult
operator
()(
const
char
*
value_text
,
const
T
&
x
)
const
{
// We convert matcher_ to a Matcher<const T&> *now* instead of
// when the PredicateFormatterFromMatcher object was constructed,
// as matcher_ may be polymorphic (e.g. NotNull()) and we won't
// know which type to instantiate it to until we actually see the
// type of x here.
//
// We write SafeMatcherCast<const T&>(matcher_) instead of
// Matcher<const T&>(matcher_), as the latter won't compile when
// matcher_ has type Matcher<T> (e.g. An<int>()).
// We don't write MatcherCast<const T&> either, as that allows
// potentially unsafe downcasting of the matcher argument.
const
Matcher
<
const
T
&>
matcher
=
SafeMatcherCast
<
const
T
&>
(
matcher_
);
StringMatchResultListener
listener
;
if
(
MatchPrintAndExplain
(
x
,
matcher
,
&
listener
))
return
AssertionSuccess
();
::
std
::
stringstream
ss
;
ss
<<
"Value of: "
<<
value_text
<<
"
\n
"
<<
"Expected: "
;
matcher
.
DescribeTo
(
&
ss
);
ss
<<
"
\n
Actual: "
<<
listener
.
str
();
return
AssertionFailure
()
<<
ss
.
str
();
}
private:
const
M
matcher_
;
GTEST_DISALLOW_ASSIGN_
(
PredicateFormatterFromMatcher
);
};
// A helper function for converting a matcher to a predicate-formatter
// without the user needing to explicitly write the type. This is
// used for implementing ASSERT_THAT() and EXPECT_THAT().
// Implementation detail: 'matcher' is received by-value to force decaying.
template
<
typename
M
>
inline
PredicateFormatterFromMatcher
<
M
>
MakePredicateFormatterFromMatcher
(
M
matcher
)
{
return
PredicateFormatterFromMatcher
<
M
>
(
internal
::
move
(
matcher
));
}
// Implements the polymorphic floating point equality matcher, which matches
// two float values using ULP-based approximation or, optionally, a
// user-specified epsilon. The template is meant to be instantiated with
// FloatType being either float or double.
template
<
typename
FloatType
>
class
FloatingEqMatcher
{
public:
// Constructor for FloatingEqMatcher.
// The matcher's input will be compared with expected. The matcher treats two
// NANs as equal if nan_eq_nan is true. Otherwise, under IEEE standards,
// equality comparisons between NANs will always return false. We specify a
// negative max_abs_error_ term to indicate that ULP-based approximation will
// be used for comparison.
FloatingEqMatcher
(
FloatType
expected
,
bool
nan_eq_nan
)
:
expected_
(
expected
),
nan_eq_nan_
(
nan_eq_nan
),
max_abs_error_
(
-
1
)
{
}
// Constructor that supports a user-specified max_abs_error that will be used
// for comparison instead of ULP-based approximation. The max absolute
// should be non-negative.
FloatingEqMatcher
(
FloatType
expected
,
bool
nan_eq_nan
,
FloatType
max_abs_error
)
:
expected_
(
expected
),
nan_eq_nan_
(
nan_eq_nan
),
max_abs_error_
(
max_abs_error
)
{
GTEST_CHECK_
(
max_abs_error
>=
0
)
<<
", where max_abs_error is"
<<
max_abs_error
;
}
// Implements floating point equality matcher as a Matcher<T>.
template
<
typename
T
>
class
Impl
:
public
MatcherInterface
<
T
>
{
public:
Impl
(
FloatType
expected
,
bool
nan_eq_nan
,
FloatType
max_abs_error
)
:
expected_
(
expected
),
nan_eq_nan_
(
nan_eq_nan
),
max_abs_error_
(
max_abs_error
)
{}
virtual
bool
MatchAndExplain
(
T
value
,
MatchResultListener
*
listener
)
const
{
const
FloatingPoint
<
FloatType
>
actual
(
value
),
expected
(
expected_
);
// Compares NaNs first, if nan_eq_nan_ is true.
if
(
actual
.
is_nan
()
||
expected
.
is_nan
())
{
if
(
actual
.
is_nan
()
&&
expected
.
is_nan
())
{
return
nan_eq_nan_
;
}
// One is nan; the other is not nan.
return
false
;
}
if
(
HasMaxAbsError
())
{
// We perform an equality check so that inf will match inf, regardless
// of error bounds. If the result of value - expected_ would result in
// overflow or if either value is inf, the default result is infinity,
// which should only match if max_abs_error_ is also infinity.
if
(
value
==
expected_
)
{
return
true
;
}
const
FloatType
diff
=
value
-
expected_
;
if
(
fabs
(
diff
)
<=
max_abs_error_
)
{
return
true
;
}
if
(
listener
->
IsInterested
())
{
*
listener
<<
"which is "
<<
diff
<<
" from "
<<
expected_
;
}
return
false
;
}
else
{
return
actual
.
AlmostEquals
(
expected
);
}
}
virtual
void
DescribeTo
(
::
std
::
ostream
*
os
)
const
{
// os->precision() returns the previously set precision, which we
// store to restore the ostream to its original configuration
// after outputting.
const
::
std
::
streamsize
old_precision
=
os
->
precision
(
::
std
::
numeric_limits
<
FloatType
>::
digits10
+
2
);
if
(
FloatingPoint
<
FloatType
>
(
expected_
).
is_nan
())
{
if
(
nan_eq_nan_
)
{
*
os
<<
"is NaN"
;
}
else
{
*
os
<<
"never matches"
;
}
}
else
{
*
os
<<
"is approximately "
<<
expected_
;
if
(
HasMaxAbsError
())
{
*
os
<<
" (absolute error <= "
<<
max_abs_error_
<<
")"
;
}
}
os
->
precision
(
old_precision
);
}
virtual
void
DescribeNegationTo
(
::
std
::
ostream
*
os
)
const
{
// As before, get original precision.
const
::
std
::
streamsize
old_precision
=
os
->
precision
(
::
std
::
numeric_limits
<
FloatType
>::
digits10
+
2
);
if
(
FloatingPoint
<
FloatType
>
(
expected_
).
is_nan
())
{
if
(
nan_eq_nan_
)
{
*
os
<<
"isn't NaN"
;
}
else
{
*
os
<<
"is anything"
;
}
}
else
{
*
os
<<
"isn't approximately "
<<
expected_
;
if
(
HasMaxAbsError
())
{
*
os
<<
" (absolute error > "
<<
max_abs_error_
<<
")"
;
}
}
// Restore original precision.
os
->
precision
(
old_precision
);
}
private:
bool
HasMaxAbsError
()
const
{
return
max_abs_error_
>=
0
;
}
const
FloatType
expected_
;
const
bool
nan_eq_nan_
;
// max_abs_error will be used for value comparison when >= 0.
const
FloatType
max_abs_error_
;
GTEST_DISALLOW_ASSIGN_
(
Impl
);
};
// The following 3 type conversion operators allow FloatEq(expected) and
// NanSensitiveFloatEq(expected) to be used as a Matcher<float>, a
// Matcher<const float&>, or a Matcher<float&>, but nothing else.
// (While Google's C++ coding style doesn't allow arguments passed
// by non-const reference, we may see them in code not conforming to
// the style. Therefore Google Mock needs to support them.)
operator
Matcher
<
FloatType
>
()
const
{
return
MakeMatcher
(
new
Impl
<
FloatType
>
(
expected_
,
nan_eq_nan_
,
max_abs_error_
));
}
operator
Matcher
<
const
FloatType
&>
()
const
{
return
MakeMatcher
(
new
Impl
<
const
FloatType
&>
(
expected_
,
nan_eq_nan_
,
max_abs_error_
));
}
operator
Matcher
<
FloatType
&>
()
const
{
return
MakeMatcher
(
new
Impl
<
FloatType
&>
(
expected_
,
nan_eq_nan_
,
max_abs_error_
));
}
private:
const
FloatType
expected_
;
const
bool
nan_eq_nan_
;
// max_abs_error will be used for value comparison when >= 0.
const
FloatType
max_abs_error_
;
GTEST_DISALLOW_ASSIGN_
(
FloatingEqMatcher
);
};
// Implements the Pointee(m) matcher for matching a pointer whose
// pointee matches matcher m. The pointer can be either raw or smart.
template
<
typename
InnerMatcher
>
class
PointeeMatcher
{
public:
explicit
PointeeMatcher
(
const
InnerMatcher
&
matcher
)
:
matcher_
(
matcher
)
{}
// This type conversion operator template allows Pointee(m) to be
// used as a matcher for any pointer type whose pointee type is
// compatible with the inner matcher, where type Pointer can be
// either a raw pointer or a smart pointer.
//
// The reason we do this instead of relying on
// MakePolymorphicMatcher() is that the latter is not flexible
// enough for implementing the DescribeTo() method of Pointee().
template
<
typename
Pointer
>
operator
Matcher
<
Pointer
>
()
const
{
return
MakeMatcher
(
new
Impl
<
Pointer
>
(
matcher_
));
}
private:
// The monomorphic implementation that works for a particular pointer type.
template
<
typename
Pointer
>
class
Impl
:
public
MatcherInterface
<
Pointer
>
{
public:
typedef
typename
PointeeOf
<
GTEST_REMOVE_CONST_
(
// NOLINT
GTEST_REMOVE_REFERENCE_
(
Pointer
))
>::
type
Pointee
;
explicit
Impl
(
const
InnerMatcher
&
matcher
)
:
matcher_
(
MatcherCast
<
const
Pointee
&>
(
matcher
))
{}
virtual
void
DescribeTo
(
::
std
::
ostream
*
os
)
const
{
*
os
<<
"points to a value that "
;
matcher_
.
DescribeTo
(
os
);
}
virtual
void
DescribeNegationTo
(
::
std
::
ostream
*
os
)
const
{
*
os
<<
"does not point to a value that "
;
matcher_
.
DescribeTo
(
os
);
}
virtual
bool
MatchAndExplain
(
Pointer
pointer
,
MatchResultListener
*
listener
)
const
{
if
(
GetRawPointer
(
pointer
)
==
NULL
)
return
false
;
*
listener
<<
"which points to "
;
return
MatchPrintAndExplain
(
*
pointer
,
matcher_
,
listener
);
}
private:
const
Matcher
<
const
Pointee
&>
matcher_
;
GTEST_DISALLOW_ASSIGN_
(
Impl
);
};
const
InnerMatcher
matcher_
;
GTEST_DISALLOW_ASSIGN_
(
PointeeMatcher
);
};
// Implements the WhenDynamicCastTo<T>(m) matcher that matches a pointer or
// reference that matches inner_matcher when dynamic_cast<T> is applied.
// The result of dynamic_cast<To> is forwarded to the inner matcher.
// If To is a pointer and the cast fails, the inner matcher will receive NULL.
// If To is a reference and the cast fails, this matcher returns false
// immediately.
template
<
typename
To
>
class
WhenDynamicCastToMatcherBase
{
public:
explicit
WhenDynamicCastToMatcherBase
(
const
Matcher
<
To
>&
matcher
)
:
matcher_
(
matcher
)
{}
void
DescribeTo
(
::
std
::
ostream
*
os
)
const
{
GetCastTypeDescription
(
os
);
matcher_
.
DescribeTo
(
os
);
}
void
DescribeNegationTo
(
::
std
::
ostream
*
os
)
const
{
GetCastTypeDescription
(
os
);
matcher_
.
DescribeNegationTo
(
os
);
}
protected:
const
Matcher
<
To
>
matcher_
;
static
string
GetToName
()
{
#if GTEST_HAS_RTTI
return
GetTypeName
<
To
>
();
#else // GTEST_HAS_RTTI
return
"the target type"
;
#endif // GTEST_HAS_RTTI
}
private:
static
void
GetCastTypeDescription
(
::
std
::
ostream
*
os
)
{
*
os
<<
"when dynamic_cast to "
<<
GetToName
()
<<
", "
;
}
GTEST_DISALLOW_ASSIGN_
(
WhenDynamicCastToMatcherBase
);
};
// Primary template.
// To is a pointer. Cast and forward the result.
template
<
typename
To
>
class
WhenDynamicCastToMatcher
:
public
WhenDynamicCastToMatcherBase
<
To
>
{
public:
explicit
WhenDynamicCastToMatcher
(
const
Matcher
<
To
>&
matcher
)
:
WhenDynamicCastToMatcherBase
<
To
>
(
matcher
)
{}
template
<
typename
From
>
bool
MatchAndExplain
(
From
from
,
MatchResultListener
*
listener
)
const
{
// TODO(sbenza): Add more detail on failures. ie did the dyn_cast fail?
To
to
=
dynamic_cast
<
To
>
(
from
);
return
MatchPrintAndExplain
(
to
,
this
->
matcher_
,
listener
);
}
};
// Specialize for references.
// In this case we return false if the dynamic_cast fails.
template
<
typename
To
>
class
WhenDynamicCastToMatcher
<
To
&>
:
public
WhenDynamicCastToMatcherBase
<
To
&>
{
public:
explicit
WhenDynamicCastToMatcher
(
const
Matcher
<
To
&>&
matcher
)
:
WhenDynamicCastToMatcherBase
<
To
&>
(
matcher
)
{}
template
<
typename
From
>
bool
MatchAndExplain
(
From
&
from
,
MatchResultListener
*
listener
)
const
{
// We don't want an std::bad_cast here, so do the cast with pointers.
To
*
to
=
dynamic_cast
<
To
*>
(
&
from
);
if
(
to
==
NULL
)
{
*
listener
<<
"which cannot be dynamic_cast to "
<<
this
->
GetToName
();
return
false
;
}
return
MatchPrintAndExplain
(
*
to
,
this
->
matcher_
,
listener
);
}
};
// Implements the Field() matcher for matching a field (i.e. member
// variable) of an object.
template
<
typename
Class
,
typename
FieldType
>
class
FieldMatcher
{
public:
FieldMatcher
(
FieldType
Class
::*
field
,
const
Matcher
<
const
FieldType
&>&
matcher
)
:
field_
(
field
),
matcher_
(
matcher
)
{}
void
DescribeTo
(
::
std
::
ostream
*
os
)
const
{
*
os
<<
"is an object whose given field "
;
matcher_
.
DescribeTo
(
os
);
}
void
DescribeNegationTo
(
::
std
::
ostream
*
os
)
const
{
*
os
<<
"is an object whose given field "
;
matcher_
.
DescribeNegationTo
(
os
);
}
template
<
typename
T
>
bool
MatchAndExplain
(
const
T
&
value
,
MatchResultListener
*
listener
)
const
{
return
MatchAndExplainImpl
(
typename
::
testing
::
internal
::
is_pointer
<
GTEST_REMOVE_CONST_
(
T
)
>::
type
(),
value
,
listener
);
}
private:
// The first argument of MatchAndExplainImpl() is needed to help
// Symbian's C++ compiler choose which overload to use. Its type is
// true_type iff the Field() matcher is used to match a pointer.
bool
MatchAndExplainImpl
(
false_type
/* is_not_pointer */
,
const
Class
&
obj
,
MatchResultListener
*
listener
)
const
{
*
listener
<<
"whose given field is "
;
return
MatchPrintAndExplain
(
obj
.
*
field_
,
matcher_
,
listener
);
}
bool
MatchAndExplainImpl
(
true_type
/* is_pointer */
,
const
Class
*
p
,
MatchResultListener
*
listener
)
const
{
if
(
p
==
NULL
)
return
false
;
*
listener
<<
"which points to an object "
;
// Since *p has a field, it must be a class/struct/union type and
// thus cannot be a pointer. Therefore we pass false_type() as
// the first argument.
return
MatchAndExplainImpl
(
false_type
(),
*
p
,
listener
);
}
const
FieldType
Class
::*
field_
;
const
Matcher
<
const
FieldType
&>
matcher_
;
GTEST_DISALLOW_ASSIGN_
(
FieldMatcher
);
};
// Implements the Property() matcher for matching a property
// (i.e. return value of a getter method) of an object.
template
<
typename
Class
,
typename
PropertyType
>
class
PropertyMatcher
{
public:
// The property may have a reference type, so 'const PropertyType&'
// may cause double references and fail to compile. That's why we
// need GTEST_REFERENCE_TO_CONST, which works regardless of
// PropertyType being a reference or not.
typedef
GTEST_REFERENCE_TO_CONST_
(
PropertyType
)
RefToConstProperty
;
PropertyMatcher
(
PropertyType
(
Class
::*
property
)()
const
,
const
Matcher
<
RefToConstProperty
>&
matcher
)
:
property_
(
property
),
matcher_
(
matcher
)
{}
void
DescribeTo
(
::
std
::
ostream
*
os
)
const
{
*
os
<<
"is an object whose given property "
;
matcher_
.
DescribeTo
(
os
);
}
void
DescribeNegationTo
(
::
std
::
ostream
*
os
)
const
{
*
os
<<
"is an object whose given property "
;
matcher_
.
DescribeNegationTo
(
os
);
}
template
<
typename
T
>
bool
MatchAndExplain
(
const
T
&
value
,
MatchResultListener
*
listener
)
const
{
return
MatchAndExplainImpl
(
typename
::
testing
::
internal
::
is_pointer
<
GTEST_REMOVE_CONST_
(
T
)
>::
type
(),
value
,
listener
);
}
private:
// The first argument of MatchAndExplainImpl() is needed to help
// Symbian's C++ compiler choose which overload to use. Its type is
// true_type iff the Property() matcher is used to match a pointer.
bool
MatchAndExplainImpl
(
false_type
/* is_not_pointer */
,
const
Class
&
obj
,
MatchResultListener
*
listener
)
const
{
*
listener
<<
"whose given property is "
;
// Cannot pass the return value (for example, int) to MatchPrintAndExplain,
// which takes a non-const reference as argument.
#if defined(_PREFAST_ ) && _MSC_VER == 1800
// Workaround bug in VC++ 2013's /analyze parser.
// https://connect.microsoft.com/VisualStudio/feedback/details/1106363/internal-compiler-error-with-analyze-due-to-failure-to-infer-move
posix
::
Abort
();
// To make sure it is never run.
return
false
;
#else
RefToConstProperty
result
=
(
obj
.
*
property_
)();
return
MatchPrintAndExplain
(
result
,
matcher_
,
listener
);
#endif
}
bool
MatchAndExplainImpl
(
true_type
/* is_pointer */
,
const
Class
*
p
,
MatchResultListener
*
listener
)
const
{
if
(
p
==
NULL
)
return
false
;
*
listener
<<
"which points to an object "
;
// Since *p has a property method, it must be a class/struct/union
// type and thus cannot be a pointer. Therefore we pass
// false_type() as the first argument.
return
MatchAndExplainImpl
(
false_type
(),
*
p
,
listener
);
}
PropertyType
(
Class
::*
property_
)()
const
;
const
Matcher
<
RefToConstProperty
>
matcher_
;
GTEST_DISALLOW_ASSIGN_
(
PropertyMatcher
);
};
// Type traits specifying various features of different functors for ResultOf.
// The default template specifies features for functor objects.
// Functor classes have to typedef argument_type and result_type
// to be compatible with ResultOf.
template
<
typename
Functor
>
struct
CallableTraits
{
typedef
typename
Functor
::
result_type
ResultType
;
typedef
Functor
StorageType
;
static
void
CheckIsValid
(
Functor
/* functor */
)
{}
template
<
typename
T
>
static
ResultType
Invoke
(
Functor
f
,
T
arg
)
{
return
f
(
arg
);
}
};
// Specialization for function pointers.
template
<
typename
ArgType
,
typename
ResType
>
struct
CallableTraits
<
ResType
(
*
)(
ArgType
)
>
{
typedef
ResType
ResultType
;
typedef
ResType
(
*
StorageType
)(
ArgType
);
static
void
CheckIsValid
(
ResType
(
*
f
)(
ArgType
))
{
GTEST_CHECK_
(
f
!=
NULL
)
<<
"NULL function pointer is passed into ResultOf()."
;
}
template
<
typename
T
>
static
ResType
Invoke
(
ResType
(
*
f
)(
ArgType
),
T
arg
)
{
return
(
*
f
)(
arg
);
}
};
// Implements the ResultOf() matcher for matching a return value of a
// unary function of an object.
template
<
typename
Callable
>
class
ResultOfMatcher
{
public:
typedef
typename
CallableTraits
<
Callable
>::
ResultType
ResultType
;
ResultOfMatcher
(
Callable
callable
,
const
Matcher
<
ResultType
>&
matcher
)
:
callable_
(
callable
),
matcher_
(
matcher
)
{
CallableTraits
<
Callable
>::
CheckIsValid
(
callable_
);
}
template
<
typename
T
>
operator
Matcher
<
T
>
()
const
{
return
Matcher
<
T
>
(
new
Impl
<
T
>
(
callable_
,
matcher_
));
}
private:
typedef
typename
CallableTraits
<
Callable
>::
StorageType
CallableStorageType
;
template
<
typename
T
>
class
Impl
:
public
MatcherInterface
<
T
>
{
public:
Impl
(
CallableStorageType
callable
,
const
Matcher
<
ResultType
>&
matcher
)
:
callable_
(
callable
),
matcher_
(
matcher
)
{}
virtual
void
DescribeTo
(
::
std
::
ostream
*
os
)
const
{
*
os
<<
"is mapped by the given callable to a value that "
;
matcher_
.
DescribeTo
(
os
);
}
virtual
void
DescribeNegationTo
(
::
std
::
ostream
*
os
)
const
{
*
os
<<
"is mapped by the given callable to a value that "
;
matcher_
.
DescribeNegationTo
(
os
);
}
virtual
bool
MatchAndExplain
(
T
obj
,
MatchResultListener
*
listener
)
const
{
*
listener
<<
"which is mapped by the given callable to "
;
// Cannot pass the return value (for example, int) to
// MatchPrintAndExplain, which takes a non-const reference as argument.
ResultType
result
=
CallableTraits
<
Callable
>::
template
Invoke
<
T
>
(
callable_
,
obj
);
return
MatchPrintAndExplain
(
result
,
matcher_
,
listener
);
}
private:
// Functors often define operator() as non-const method even though
// they are actualy stateless. But we need to use them even when
// 'this' is a const pointer. It's the user's responsibility not to
// use stateful callables with ResultOf(), which does't guarantee
// how many times the callable will be invoked.
mutable
CallableStorageType
callable_
;
const
Matcher
<
ResultType
>
matcher_
;
GTEST_DISALLOW_ASSIGN_
(
Impl
);
};
// class Impl
const
CallableStorageType
callable_
;
const
Matcher
<
ResultType
>
matcher_
;
GTEST_DISALLOW_ASSIGN_
(
ResultOfMatcher
);
};
// Implements a matcher that checks the size of an STL-style container.
template
<
typename
SizeMatcher
>
class
SizeIsMatcher
{
public:
explicit
SizeIsMatcher
(
const
SizeMatcher
&
size_matcher
)
:
size_matcher_
(
size_matcher
)
{
}
template
<
typename
Container
>
operator
Matcher
<
Container
>
()
const
{
return
MakeMatcher
(
new
Impl
<
Container
>
(
size_matcher_
));
}
template
<
typename
Container
>
class
Impl
:
public
MatcherInterface
<
Container
>
{
public:
typedef
internal
::
StlContainerView
<
GTEST_REMOVE_REFERENCE_AND_CONST_
(
Container
)
>
ContainerView
;
typedef
typename
ContainerView
::
type
::
size_type
SizeType
;
explicit
Impl
(
const
SizeMatcher
&
size_matcher
)
:
size_matcher_
(
MatcherCast
<
SizeType
>
(
size_matcher
))
{}
virtual
void
DescribeTo
(
::
std
::
ostream
*
os
)
const
{
*
os
<<
"size "
;
size_matcher_
.
DescribeTo
(
os
);
}
virtual
void
DescribeNegationTo
(
::
std
::
ostream
*
os
)
const
{
*
os
<<
"size "
;
size_matcher_
.
DescribeNegationTo
(
os
);
}
virtual
bool
MatchAndExplain
(
Container
container
,
MatchResultListener
*
listener
)
const
{
SizeType
size
=
container
.
size
();
StringMatchResultListener
size_listener
;
const
bool
result
=
size_matcher_
.
MatchAndExplain
(
size
,
&
size_listener
);
*
listener
<<
"whose size "
<<
size
<<
(
result
?
" matches"
:
" doesn't match"
);
PrintIfNotEmpty
(
size_listener
.
str
(),
listener
->
stream
());
return
result
;
}
private:
const
Matcher
<
SizeType
>
size_matcher_
;
GTEST_DISALLOW_ASSIGN_
(
Impl
);
};
private:
const
SizeMatcher
size_matcher_
;
GTEST_DISALLOW_ASSIGN_
(
SizeIsMatcher
);
};
// Implements a matcher that checks the begin()..end() distance of an STL-style
// container.
template
<
typename
DistanceMatcher
>
class
BeginEndDistanceIsMatcher
{
public:
explicit
BeginEndDistanceIsMatcher
(
const
DistanceMatcher
&
distance_matcher
)
:
distance_matcher_
(
distance_matcher
)
{}
template
<
typename
Container
>
operator
Matcher
<
Container
>
()
const
{
return
MakeMatcher
(
new
Impl
<
Container
>
(
distance_matcher_
));
}
template
<
typename
Container
>
class
Impl
:
public
MatcherInterface
<
Container
>
{
public:
typedef
internal
::
StlContainerView
<
GTEST_REMOVE_REFERENCE_AND_CONST_
(
Container
)
>
ContainerView
;
typedef
typename
std
::
iterator_traits
<
typename
ContainerView
::
type
::
const_iterator
>::
difference_type
DistanceType
;
explicit
Impl
(
const
DistanceMatcher
&
distance_matcher
)
:
distance_matcher_
(
MatcherCast
<
DistanceType
>
(
distance_matcher
))
{}
virtual
void
DescribeTo
(
::
std
::
ostream
*
os
)
const
{
*
os
<<
"distance between begin() and end() "
;
distance_matcher_
.
DescribeTo
(
os
);
}
virtual
void
DescribeNegationTo
(
::
std
::
ostream
*
os
)
const
{
*
os
<<
"distance between begin() and end() "
;
distance_matcher_
.
DescribeNegationTo
(
os
);
}
virtual
bool
MatchAndExplain
(
Container
container
,
MatchResultListener
*
listener
)
const
{
#if GTEST_HAS_STD_BEGIN_AND_END_
using
std
::
begin
;
using
std
::
end
;
DistanceType
distance
=
std
::
distance
(
begin
(
container
),
end
(
container
));
#else
DistanceType
distance
=
std
::
distance
(
container
.
begin
(),
container
.
end
());
#endif
StringMatchResultListener
distance_listener
;
const
bool
result
=
distance_matcher_
.
MatchAndExplain
(
distance
,
&
distance_listener
);
*
listener
<<
"whose distance between begin() and end() "
<<
distance
<<
(
result
?
" matches"
:
" doesn't match"
);
PrintIfNotEmpty
(
distance_listener
.
str
(),
listener
->
stream
());
return
result
;
}
private:
const
Matcher
<
DistanceType
>
distance_matcher_
;
GTEST_DISALLOW_ASSIGN_
(
Impl
);
};
private:
const
DistanceMatcher
distance_matcher_
;
GTEST_DISALLOW_ASSIGN_
(
BeginEndDistanceIsMatcher
);
};
// Implements an equality matcher for any STL-style container whose elements
// support ==. This matcher is like Eq(), but its failure explanations provide
// more detailed information that is useful when the container is used as a set.
// The failure message reports elements that are in one of the operands but not
// the other. The failure messages do not report duplicate or out-of-order
// elements in the containers (which don't properly matter to sets, but can
// occur if the containers are vectors or lists, for example).
//
// Uses the container's const_iterator, value_type, operator ==,
// begin(), and end().
template
<
typename
Container
>
class
ContainerEqMatcher
{
public:
typedef
internal
::
StlContainerView
<
Container
>
View
;
typedef
typename
View
::
type
StlContainer
;
typedef
typename
View
::
const_reference
StlContainerReference
;
// We make a copy of expected in case the elements in it are modified
// after this matcher is created.
explicit
ContainerEqMatcher
(
const
Container
&
expected
)
:
expected_
(
View
::
Copy
(
expected
))
{
// Makes sure the user doesn't instantiate this class template
// with a const or reference type.
(
void
)
testing
::
StaticAssertTypeEq
<
Container
,
GTEST_REMOVE_REFERENCE_AND_CONST_
(
Container
)
>
();
}
void
DescribeTo
(
::
std
::
ostream
*
os
)
const
{
*
os
<<
"equals "
;
UniversalPrint
(
expected_
,
os
);
}
void
DescribeNegationTo
(
::
std
::
ostream
*
os
)
const
{
*
os
<<
"does not equal "
;
UniversalPrint
(
expected_
,
os
);
}
template
<
typename
LhsContainer
>
bool
MatchAndExplain
(
const
LhsContainer
&
lhs
,
MatchResultListener
*
listener
)
const
{
// GTEST_REMOVE_CONST_() is needed to work around an MSVC 8.0 bug
// that causes LhsContainer to be a const type sometimes.
typedef
internal
::
StlContainerView
<
GTEST_REMOVE_CONST_
(
LhsContainer
)
>
LhsView
;
typedef
typename
LhsView
::
type
LhsStlContainer
;
StlContainerReference
lhs_stl_container
=
LhsView
::
ConstReference
(
lhs
);
if
(
lhs_stl_container
==
expected_
)
return
true
;
::
std
::
ostream
*
const
os
=
listener
->
stream
();
if
(
os
!=
NULL
)
{
// Something is different. Check for extra values first.
bool
printed_header
=
false
;
for
(
typename
LhsStlContainer
::
const_iterator
it
=
lhs_stl_container
.
begin
();
it
!=
lhs_stl_container
.
end
();
++
it
)
{
if
(
internal
::
ArrayAwareFind
(
expected_
.
begin
(),
expected_
.
end
(),
*
it
)
==
expected_
.
end
())
{
if
(
printed_header
)
{
*
os
<<
", "
;
}
else
{
*
os
<<
"which has these unexpected elements: "
;
printed_header
=
true
;
}
UniversalPrint
(
*
it
,
os
);
}
}
// Now check for missing values.
bool
printed_header2
=
false
;
for
(
typename
StlContainer
::
const_iterator
it
=
expected_
.
begin
();
it
!=
expected_
.
end
();
++
it
)
{
if
(
internal
::
ArrayAwareFind
(
lhs_stl_container
.
begin
(),
lhs_stl_container
.
end
(),
*
it
)
==
lhs_stl_container
.
end
())
{
if
(
printed_header2
)
{
*
os
<<
", "
;
}
else
{
*
os
<<
(
printed_header
?
",
\n
and"
:
"which"
)
<<
" doesn't have these expected elements: "
;
printed_header2
=
true
;
}
UniversalPrint
(
*
it
,
os
);
}
}
}
return
false
;
}
private:
const
StlContainer
expected_
;
GTEST_DISALLOW_ASSIGN_
(
ContainerEqMatcher
);
};
// A comparator functor that uses the < operator to compare two values.
struct
LessComparator
{
template
<
typename
T
,
typename
U
>
bool
operator
()(
const
T
&
lhs
,
const
U
&
rhs
)
const
{
return
lhs
<
rhs
;
}
};
// Implements WhenSortedBy(comparator, container_matcher).
template
<
typename
Comparator
,
typename
ContainerMatcher
>
class
WhenSortedByMatcher
{
public:
WhenSortedByMatcher
(
const
Comparator
&
comparator
,
const
ContainerMatcher
&
matcher
)
:
comparator_
(
comparator
),
matcher_
(
matcher
)
{}
template
<
typename
LhsContainer
>
operator
Matcher
<
LhsContainer
>
()
const
{
return
MakeMatcher
(
new
Impl
<
LhsContainer
>
(
comparator_
,
matcher_
));
}
template
<
typename
LhsContainer
>
class
Impl
:
public
MatcherInterface
<
LhsContainer
>
{
public:
typedef
internal
::
StlContainerView
<
GTEST_REMOVE_REFERENCE_AND_CONST_
(
LhsContainer
)
>
LhsView
;
typedef
typename
LhsView
::
type
LhsStlContainer
;
typedef
typename
LhsView
::
const_reference
LhsStlContainerReference
;
// Transforms std::pair<const Key, Value> into std::pair<Key, Value>
// so that we can match associative containers.
typedef
typename
RemoveConstFromKey
<
typename
LhsStlContainer
::
value_type
>::
type
LhsValue
;
Impl
(
const
Comparator
&
comparator
,
const
ContainerMatcher
&
matcher
)
:
comparator_
(
comparator
),
matcher_
(
matcher
)
{}
virtual
void
DescribeTo
(
::
std
::
ostream
*
os
)
const
{
*
os
<<
"(when sorted) "
;
matcher_
.
DescribeTo
(
os
);
}
virtual
void
DescribeNegationTo
(
::
std
::
ostream
*
os
)
const
{
*
os
<<
"(when sorted) "
;
matcher_
.
DescribeNegationTo
(
os
);
}
virtual
bool
MatchAndExplain
(
LhsContainer
lhs
,
MatchResultListener
*
listener
)
const
{
LhsStlContainerReference
lhs_stl_container
=
LhsView
::
ConstReference
(
lhs
);
::
std
::
vector
<
LhsValue
>
sorted_container
(
lhs_stl_container
.
begin
(),
lhs_stl_container
.
end
());
::
std
::
sort
(
sorted_container
.
begin
(),
sorted_container
.
end
(),
comparator_
);
if
(
!
listener
->
IsInterested
())
{
// If the listener is not interested, we do not need to
// construct the inner explanation.
return
matcher_
.
Matches
(
sorted_container
);
}
*
listener
<<
"which is "
;
UniversalPrint
(
sorted_container
,
listener
->
stream
());
*
listener
<<
" when sorted"
;
StringMatchResultListener
inner_listener
;
const
bool
match
=
matcher_
.
MatchAndExplain
(
sorted_container
,
&
inner_listener
);
PrintIfNotEmpty
(
inner_listener
.
str
(),
listener
->
stream
());
return
match
;
}
private:
const
Comparator
comparator_
;
const
Matcher
<
const
::
std
::
vector
<
LhsValue
>&>
matcher_
;
GTEST_DISALLOW_COPY_AND_ASSIGN_
(
Impl
);
};
private:
const
Comparator
comparator_
;
const
ContainerMatcher
matcher_
;
GTEST_DISALLOW_ASSIGN_
(
WhenSortedByMatcher
);
};
// Implements Pointwise(tuple_matcher, rhs_container). tuple_matcher
// must be able to be safely cast to Matcher<tuple<const T1&, const
// T2&> >, where T1 and T2 are the types of elements in the LHS
// container and the RHS container respectively.
template
<
typename
TupleMatcher
,
typename
RhsContainer
>
class
PointwiseMatcher
{
public:
typedef
internal
::
StlContainerView
<
RhsContainer
>
RhsView
;
typedef
typename
RhsView
::
type
RhsStlContainer
;
typedef
typename
RhsStlContainer
::
value_type
RhsValue
;
// Like ContainerEq, we make a copy of rhs in case the elements in
// it are modified after this matcher is created.
PointwiseMatcher
(
const
TupleMatcher
&
tuple_matcher
,
const
RhsContainer
&
rhs
)
:
tuple_matcher_
(
tuple_matcher
),
rhs_
(
RhsView
::
Copy
(
rhs
))
{
// Makes sure the user doesn't instantiate this class template
// with a const or reference type.
(
void
)
testing
::
StaticAssertTypeEq
<
RhsContainer
,
GTEST_REMOVE_REFERENCE_AND_CONST_
(
RhsContainer
)
>
();
}
template
<
typename
LhsContainer
>
operator
Matcher
<
LhsContainer
>
()
const
{
return
MakeMatcher
(
new
Impl
<
LhsContainer
>
(
tuple_matcher_
,
rhs_
));
}
template
<
typename
LhsContainer
>
class
Impl
:
public
MatcherInterface
<
LhsContainer
>
{
public:
typedef
internal
::
StlContainerView
<
GTEST_REMOVE_REFERENCE_AND_CONST_
(
LhsContainer
)
>
LhsView
;
typedef
typename
LhsView
::
type
LhsStlContainer
;
typedef
typename
LhsView
::
const_reference
LhsStlContainerReference
;
typedef
typename
LhsStlContainer
::
value_type
LhsValue
;
// We pass the LHS value and the RHS value to the inner matcher by
// reference, as they may be expensive to copy. We must use tuple
// instead of pair here, as a pair cannot hold references (C++ 98,
// 20.2.2 [lib.pairs]).
typedef
::
testing
::
tuple
<
const
LhsValue
&
,
const
RhsValue
&>
InnerMatcherArg
;
Impl
(
const
TupleMatcher
&
tuple_matcher
,
const
RhsStlContainer
&
rhs
)
// mono_tuple_matcher_ holds a monomorphic version of the tuple matcher.
:
mono_tuple_matcher_
(
SafeMatcherCast
<
InnerMatcherArg
>
(
tuple_matcher
)),
rhs_
(
rhs
)
{}
virtual
void
DescribeTo
(
::
std
::
ostream
*
os
)
const
{
*
os
<<
"contains "
<<
rhs_
.
size
()
<<
" values, where each value and its corresponding value in "
;
UniversalPrinter
<
RhsStlContainer
>::
Print
(
rhs_
,
os
);
*
os
<<
" "
;
mono_tuple_matcher_
.
DescribeTo
(
os
);
}
virtual
void
DescribeNegationTo
(
::
std
::
ostream
*
os
)
const
{
*
os
<<
"doesn't contain exactly "
<<
rhs_
.
size
()
<<
" values, or contains a value x at some index i"
<<
" where x and the i-th value of "
;
UniversalPrint
(
rhs_
,
os
);
*
os
<<
" "
;
mono_tuple_matcher_
.
DescribeNegationTo
(
os
);
}
virtual
bool
MatchAndExplain
(
LhsContainer
lhs
,
MatchResultListener
*
listener
)
const
{
LhsStlContainerReference
lhs_stl_container
=
LhsView
::
ConstReference
(
lhs
);
const
size_t
actual_size
=
lhs_stl_container
.
size
();
if
(
actual_size
!=
rhs_
.
size
())
{
*
listener
<<
"which contains "
<<
actual_size
<<
" values"
;
return
false
;
}
typename
LhsStlContainer
::
const_iterator
left
=
lhs_stl_container
.
begin
();
typename
RhsStlContainer
::
const_iterator
right
=
rhs_
.
begin
();
for
(
size_t
i
=
0
;
i
!=
actual_size
;
++
i
,
++
left
,
++
right
)
{
const
InnerMatcherArg
value_pair
(
*
left
,
*
right
);
if
(
listener
->
IsInterested
())
{
StringMatchResultListener
inner_listener
;
if
(
!
mono_tuple_matcher_
.
MatchAndExplain
(
value_pair
,
&
inner_listener
))
{
*
listener
<<
"where the value pair ("
;
UniversalPrint
(
*
left
,
listener
->
stream
());
*
listener
<<
", "
;
UniversalPrint
(
*
right
,
listener
->
stream
());
*
listener
<<
") at index #"
<<
i
<<
" don't match"
;
PrintIfNotEmpty
(
inner_listener
.
str
(),
listener
->
stream
());
return
false
;
}
}
else
{
if
(
!
mono_tuple_matcher_
.
Matches
(
value_pair
))
return
false
;
}
}
return
true
;
}
private:
const
Matcher
<
InnerMatcherArg
>
mono_tuple_matcher_
;
const
RhsStlContainer
rhs_
;
GTEST_DISALLOW_ASSIGN_
(
Impl
);
};
private:
const
TupleMatcher
tuple_matcher_
;
const
RhsStlContainer
rhs_
;
GTEST_DISALLOW_ASSIGN_
(
PointwiseMatcher
);
};
// Holds the logic common to ContainsMatcherImpl and EachMatcherImpl.
template
<
typename
Container
>
class
QuantifierMatcherImpl
:
public
MatcherInterface
<
Container
>
{
public:
typedef
GTEST_REMOVE_REFERENCE_AND_CONST_
(
Container
)
RawContainer
;
typedef
StlContainerView
<
RawContainer
>
View
;
typedef
typename
View
::
type
StlContainer
;
typedef
typename
View
::
const_reference
StlContainerReference
;
typedef
typename
StlContainer
::
value_type
Element
;
template
<
typename
InnerMatcher
>
explicit
QuantifierMatcherImpl
(
InnerMatcher
inner_matcher
)
:
inner_matcher_
(
testing
::
SafeMatcherCast
<
const
Element
&>
(
inner_matcher
))
{}
// Checks whether:
// * All elements in the container match, if all_elements_should_match.
// * Any element in the container matches, if !all_elements_should_match.
bool
MatchAndExplainImpl
(
bool
all_elements_should_match
,
Container
container
,
MatchResultListener
*
listener
)
const
{
StlContainerReference
stl_container
=
View
::
ConstReference
(
container
);
size_t
i
=
0
;
for
(
typename
StlContainer
::
const_iterator
it
=
stl_container
.
begin
();
it
!=
stl_container
.
end
();
++
it
,
++
i
)
{
StringMatchResultListener
inner_listener
;
const
bool
matches
=
inner_matcher_
.
MatchAndExplain
(
*
it
,
&
inner_listener
);
if
(
matches
!=
all_elements_should_match
)
{
*
listener
<<
"whose element #"
<<
i
<<
(
matches
?
" matches"
:
" doesn't match"
);
PrintIfNotEmpty
(
inner_listener
.
str
(),
listener
->
stream
());
return
!
all_elements_should_match
;
}
}
return
all_elements_should_match
;
}
protected:
const
Matcher
<
const
Element
&>
inner_matcher_
;
GTEST_DISALLOW_ASSIGN_
(
QuantifierMatcherImpl
);
};
// Implements Contains(element_matcher) for the given argument type Container.
// Symmetric to EachMatcherImpl.
template
<
typename
Container
>
class
ContainsMatcherImpl
:
public
QuantifierMatcherImpl
<
Container
>
{
public:
template
<
typename
InnerMatcher
>
explicit
ContainsMatcherImpl
(
InnerMatcher
inner_matcher
)
:
QuantifierMatcherImpl
<
Container
>
(
inner_matcher
)
{}
// Describes what this matcher does.
virtual
void
DescribeTo
(
::
std
::
ostream
*
os
)
const
{
*
os
<<
"contains at least one element that "
;
this
->
inner_matcher_
.
DescribeTo
(
os
);
}
virtual
void
DescribeNegationTo
(
::
std
::
ostream
*
os
)
const
{
*
os
<<
"doesn't contain any element that "
;
this
->
inner_matcher_
.
DescribeTo
(
os
);
}
virtual
bool
MatchAndExplain
(
Container
container
,
MatchResultListener
*
listener
)
const
{
return
this
->
MatchAndExplainImpl
(
false
,
container
,
listener
);
}
private:
GTEST_DISALLOW_ASSIGN_
(
ContainsMatcherImpl
);
};
// Implements Each(element_matcher) for the given argument type Container.
// Symmetric to ContainsMatcherImpl.
template
<
typename
Container
>
class
EachMatcherImpl
:
public
QuantifierMatcherImpl
<
Container
>
{
public:
template
<
typename
InnerMatcher
>
explicit
EachMatcherImpl
(
InnerMatcher
inner_matcher
)
:
QuantifierMatcherImpl
<
Container
>
(
inner_matcher
)
{}
// Describes what this matcher does.
virtual
void
DescribeTo
(
::
std
::
ostream
*
os
)
const
{
*
os
<<
"only contains elements that "
;
this
->
inner_matcher_
.
DescribeTo
(
os
);
}
virtual
void
DescribeNegationTo
(
::
std
::
ostream
*
os
)
const
{
*
os
<<
"contains some element that "
;
this
->
inner_matcher_
.
DescribeNegationTo
(
os
);
}
virtual
bool
MatchAndExplain
(
Container
container
,
MatchResultListener
*
listener
)
const
{
return
this
->
MatchAndExplainImpl
(
true
,
container
,
listener
);
}
private:
GTEST_DISALLOW_ASSIGN_
(
EachMatcherImpl
);
};
// Implements polymorphic Contains(element_matcher).
template
<
typename
M
>
class
ContainsMatcher
{
public:
explicit
ContainsMatcher
(
M
m
)
:
inner_matcher_
(
m
)
{}
template
<
typename
Container
>
operator
Matcher
<
Container
>
()
const
{
return
MakeMatcher
(
new
ContainsMatcherImpl
<
Container
>
(
inner_matcher_
));
}
private:
const
M
inner_matcher_
;
GTEST_DISALLOW_ASSIGN_
(
ContainsMatcher
);
};
// Implements polymorphic Each(element_matcher).
template
<
typename
M
>
class
EachMatcher
{
public:
explicit
EachMatcher
(
M
m
)
:
inner_matcher_
(
m
)
{}
template
<
typename
Container
>
operator
Matcher
<
Container
>
()
const
{
return
MakeMatcher
(
new
EachMatcherImpl
<
Container
>
(
inner_matcher_
));
}
private:
const
M
inner_matcher_
;
GTEST_DISALLOW_ASSIGN_
(
EachMatcher
);
};
// Implements Key(inner_matcher) for the given argument pair type.
// Key(inner_matcher) matches an std::pair whose 'first' field matches
// inner_matcher. For example, Contains(Key(Ge(5))) can be used to match an
// std::map that contains at least one element whose key is >= 5.
template
<
typename
PairType
>
class
KeyMatcherImpl
:
public
MatcherInterface
<
PairType
>
{
public:
typedef
GTEST_REMOVE_REFERENCE_AND_CONST_
(
PairType
)
RawPairType
;
typedef
typename
RawPairType
::
first_type
KeyType
;
template
<
typename
InnerMatcher
>
explicit
KeyMatcherImpl
(
InnerMatcher
inner_matcher
)
:
inner_matcher_
(
testing
::
SafeMatcherCast
<
const
KeyType
&>
(
inner_matcher
))
{
}
// Returns true iff 'key_value.first' (the key) matches the inner matcher.
virtual
bool
MatchAndExplain
(
PairType
key_value
,
MatchResultListener
*
listener
)
const
{
StringMatchResultListener
inner_listener
;
const
bool
match
=
inner_matcher_
.
MatchAndExplain
(
key_value
.
first
,
&
inner_listener
);
const
internal
::
string
explanation
=
inner_listener
.
str
();
if
(
explanation
!=
""
)
{
*
listener
<<
"whose first field is a value "
<<
explanation
;
}
return
match
;
}
// Describes what this matcher does.
virtual
void
DescribeTo
(
::
std
::
ostream
*
os
)
const
{
*
os
<<
"has a key that "
;
inner_matcher_
.
DescribeTo
(
os
);
}
// Describes what the negation of this matcher does.
virtual
void
DescribeNegationTo
(
::
std
::
ostream
*
os
)
const
{
*
os
<<
"doesn't have a key that "
;
inner_matcher_
.
DescribeTo
(
os
);
}
private:
const
Matcher
<
const
KeyType
&>
inner_matcher_
;
GTEST_DISALLOW_ASSIGN_
(
KeyMatcherImpl
);
};
// Implements polymorphic Key(matcher_for_key).
template
<
typename
M
>
class
KeyMatcher
{
public:
explicit
KeyMatcher
(
M
m
)
:
matcher_for_key_
(
m
)
{}
template
<
typename
PairType
>
operator
Matcher
<
PairType
>
()
const
{
return
MakeMatcher
(
new
KeyMatcherImpl
<
PairType
>
(
matcher_for_key_
));
}
private:
const
M
matcher_for_key_
;
GTEST_DISALLOW_ASSIGN_
(
KeyMatcher
);
};
// Implements Pair(first_matcher, second_matcher) for the given argument pair
// type with its two matchers. See Pair() function below.
template
<
typename
PairType
>
class
PairMatcherImpl
:
public
MatcherInterface
<
PairType
>
{
public:
typedef
GTEST_REMOVE_REFERENCE_AND_CONST_
(
PairType
)
RawPairType
;
typedef
typename
RawPairType
::
first_type
FirstType
;
typedef
typename
RawPairType
::
second_type
SecondType
;
template
<
typename
FirstMatcher
,
typename
SecondMatcher
>
PairMatcherImpl
(
FirstMatcher
first_matcher
,
SecondMatcher
second_matcher
)
:
first_matcher_
(
testing
::
SafeMatcherCast
<
const
FirstType
&>
(
first_matcher
)),
second_matcher_
(
testing
::
SafeMatcherCast
<
const
SecondType
&>
(
second_matcher
))
{
}
// Describes what this matcher does.
virtual
void
DescribeTo
(
::
std
::
ostream
*
os
)
const
{
*
os
<<
"has a first field that "
;
first_matcher_
.
DescribeTo
(
os
);
*
os
<<
", and has a second field that "
;
second_matcher_
.
DescribeTo
(
os
);
}
// Describes what the negation of this matcher does.
virtual
void
DescribeNegationTo
(
::
std
::
ostream
*
os
)
const
{
*
os
<<
"has a first field that "
;
first_matcher_
.
DescribeNegationTo
(
os
);
*
os
<<
", or has a second field that "
;
second_matcher_
.
DescribeNegationTo
(
os
);
}
// Returns true iff 'a_pair.first' matches first_matcher and 'a_pair.second'
// matches second_matcher.
virtual
bool
MatchAndExplain
(
PairType
a_pair
,
MatchResultListener
*
listener
)
const
{
if
(
!
listener
->
IsInterested
())
{
// If the listener is not interested, we don't need to construct the
// explanation.
return
first_matcher_
.
Matches
(
a_pair
.
first
)
&&
second_matcher_
.
Matches
(
a_pair
.
second
);
}
StringMatchResultListener
first_inner_listener
;
if
(
!
first_matcher_
.
MatchAndExplain
(
a_pair
.
first
,
&
first_inner_listener
))
{
*
listener
<<
"whose first field does not match"
;
PrintIfNotEmpty
(
first_inner_listener
.
str
(),
listener
->
stream
());
return
false
;
}
StringMatchResultListener
second_inner_listener
;
if
(
!
second_matcher_
.
MatchAndExplain
(
a_pair
.
second
,
&
second_inner_listener
))
{
*
listener
<<
"whose second field does not match"
;
PrintIfNotEmpty
(
second_inner_listener
.
str
(),
listener
->
stream
());
return
false
;
}
ExplainSuccess
(
first_inner_listener
.
str
(),
second_inner_listener
.
str
(),
listener
);
return
true
;
}
private:
void
ExplainSuccess
(
const
internal
::
string
&
first_explanation
,
const
internal
::
string
&
second_explanation
,
MatchResultListener
*
listener
)
const
{
*
listener
<<
"whose both fields match"
;
if
(
first_explanation
!=
""
)
{
*
listener
<<
", where the first field is a value "
<<
first_explanation
;
}
if
(
second_explanation
!=
""
)
{
*
listener
<<
", "
;
if
(
first_explanation
!=
""
)
{
*
listener
<<
"and "
;
}
else
{
*
listener
<<
"where "
;
}
*
listener
<<
"the second field is a value "
<<
second_explanation
;
}
}
const
Matcher
<
const
FirstType
&>
first_matcher_
;
const
Matcher
<
const
SecondType
&>
second_matcher_
;
GTEST_DISALLOW_ASSIGN_
(
PairMatcherImpl
);
};
// Implements polymorphic Pair(first_matcher, second_matcher).
template
<
typename
FirstMatcher
,
typename
SecondMatcher
>
class
PairMatcher
{
public:
PairMatcher
(
FirstMatcher
first_matcher
,
SecondMatcher
second_matcher
)
:
first_matcher_
(
first_matcher
),
second_matcher_
(
second_matcher
)
{}
template
<
typename
PairType
>
operator
Matcher
<
PairType
>
()
const
{
return
MakeMatcher
(
new
PairMatcherImpl
<
PairType
>
(
first_matcher_
,
second_matcher_
));
}
private:
const
FirstMatcher
first_matcher_
;
const
SecondMatcher
second_matcher_
;
GTEST_DISALLOW_ASSIGN_
(
PairMatcher
);
};
// Implements ElementsAre() and ElementsAreArray().
template
<
typename
Container
>
class
ElementsAreMatcherImpl
:
public
MatcherInterface
<
Container
>
{
public:
typedef
GTEST_REMOVE_REFERENCE_AND_CONST_
(
Container
)
RawContainer
;
typedef
internal
::
StlContainerView
<
RawContainer
>
View
;
typedef
typename
View
::
type
StlContainer
;
typedef
typename
View
::
const_reference
StlContainerReference
;
typedef
typename
StlContainer
::
value_type
Element
;
// Constructs the matcher from a sequence of element values or
// element matchers.
template
<
typename
InputIter
>
ElementsAreMatcherImpl
(
InputIter
first
,
InputIter
last
)
{
while
(
first
!=
last
)
{
matchers_
.
push_back
(
MatcherCast
<
const
Element
&>
(
*
first
++
));
}
}
// Describes what this matcher does.
virtual
void
DescribeTo
(
::
std
::
ostream
*
os
)
const
{
if
(
count
()
==
0
)
{
*
os
<<
"is empty"
;
}
else
if
(
count
()
==
1
)
{
*
os
<<
"has 1 element that "
;
matchers_
[
0
].
DescribeTo
(
os
);
}
else
{
*
os
<<
"has "
<<
Elements
(
count
())
<<
" where
\n
"
;
for
(
size_t
i
=
0
;
i
!=
count
();
++
i
)
{
*
os
<<
"element #"
<<
i
<<
" "
;
matchers_
[
i
].
DescribeTo
(
os
);
if
(
i
+
1
<
count
())
{
*
os
<<
",
\n
"
;
}
}
}
}
// Describes what the negation of this matcher does.
virtual
void
DescribeNegationTo
(
::
std
::
ostream
*
os
)
const
{
if
(
count
()
==
0
)
{
*
os
<<
"isn't empty"
;
return
;
}
*
os
<<
"doesn't have "
<<
Elements
(
count
())
<<
", or
\n
"
;
for
(
size_t
i
=
0
;
i
!=
count
();
++
i
)
{
*
os
<<
"element #"
<<
i
<<
" "
;
matchers_
[
i
].
DescribeNegationTo
(
os
);
if
(
i
+
1
<
count
())
{
*
os
<<
", or
\n
"
;
}
}
}
virtual
bool
MatchAndExplain
(
Container
container
,
MatchResultListener
*
listener
)
const
{
// To work with stream-like "containers", we must only walk
// through the elements in one pass.
const
bool
listener_interested
=
listener
->
IsInterested
();
// explanations[i] is the explanation of the element at index i.
::
std
::
vector
<
internal
::
string
>
explanations
(
count
());
StlContainerReference
stl_container
=
View
::
ConstReference
(
container
);
typename
StlContainer
::
const_iterator
it
=
stl_container
.
begin
();
size_t
exam_pos
=
0
;
bool
mismatch_found
=
false
;
// Have we found a mismatched element yet?
// Go through the elements and matchers in pairs, until we reach
// the end of either the elements or the matchers, or until we find a
// mismatch.
for
(;
it
!=
stl_container
.
end
()
&&
exam_pos
!=
count
();
++
it
,
++
exam_pos
)
{
bool
match
;
// Does the current element match the current matcher?
if
(
listener_interested
)
{
StringMatchResultListener
s
;
match
=
matchers_
[
exam_pos
].
MatchAndExplain
(
*
it
,
&
s
);
explanations
[
exam_pos
]
=
s
.
str
();
}
else
{
match
=
matchers_
[
exam_pos
].
Matches
(
*
it
);
}
if
(
!
match
)
{
mismatch_found
=
true
;
break
;
}
}
// If mismatch_found is true, 'exam_pos' is the index of the mismatch.
// Find how many elements the actual container has. We avoid
// calling size() s.t. this code works for stream-like "containers"
// that don't define size().
size_t
actual_count
=
exam_pos
;
for
(;
it
!=
stl_container
.
end
();
++
it
)
{
++
actual_count
;
}
if
(
actual_count
!=
count
())
{
// The element count doesn't match. If the container is empty,
// there's no need to explain anything as Google Mock already
// prints the empty container. Otherwise we just need to show
// how many elements there actually are.
if
(
listener_interested
&&
(
actual_count
!=
0
))
{
*
listener
<<
"which has "
<<
Elements
(
actual_count
);
}
return
false
;
}
if
(
mismatch_found
)
{
// The element count matches, but the exam_pos-th element doesn't match.
if
(
listener_interested
)
{
*
listener
<<
"whose element #"
<<
exam_pos
<<
" doesn't match"
;
PrintIfNotEmpty
(
explanations
[
exam_pos
],
listener
->
stream
());
}
return
false
;
}
// Every element matches its expectation. We need to explain why
// (the obvious ones can be skipped).
if
(
listener_interested
)
{
bool
reason_printed
=
false
;
for
(
size_t
i
=
0
;
i
!=
count
();
++
i
)
{
const
internal
::
string
&
s
=
explanations
[
i
];
if
(
!
s
.
empty
())
{
if
(
reason_printed
)
{
*
listener
<<
",
\n
and "
;
}
*
listener
<<
"whose element #"
<<
i
<<
" matches, "
<<
s
;
reason_printed
=
true
;
}
}
}
return
true
;
}
private:
static
Message
Elements
(
size_t
count
)
{
return
Message
()
<<
count
<<
(
count
==
1
?
" element"
:
" elements"
);
}
size_t
count
()
const
{
return
matchers_
.
size
();
}
::
std
::
vector
<
Matcher
<
const
Element
&>
>
matchers_
;
GTEST_DISALLOW_ASSIGN_
(
ElementsAreMatcherImpl
);
};
// Connectivity matrix of (elements X matchers), in element-major order.
// Initially, there are no edges.
// Use NextGraph() to iterate over all possible edge configurations.
// Use Randomize() to generate a random edge configuration.
class
GTEST_API_
MatchMatrix
{
public:
MatchMatrix
(
size_t
num_elements
,
size_t
num_matchers
)
:
num_elements_
(
num_elements
),
num_matchers_
(
num_matchers
),
matched_
(
num_elements_
*
num_matchers_
,
0
)
{
}
size_t
LhsSize
()
const
{
return
num_elements_
;
}
size_t
RhsSize
()
const
{
return
num_matchers_
;
}
bool
HasEdge
(
size_t
ilhs
,
size_t
irhs
)
const
{
return
matched_
[
SpaceIndex
(
ilhs
,
irhs
)]
==
1
;
}
void
SetEdge
(
size_t
ilhs
,
size_t
irhs
,
bool
b
)
{
matched_
[
SpaceIndex
(
ilhs
,
irhs
)]
=
b
?
1
:
0
;
}
// Treating the connectivity matrix as a (LhsSize()*RhsSize())-bit number,
// adds 1 to that number; returns false if incrementing the graph left it
// empty.
bool
NextGraph
();
void
Randomize
();
string
DebugString
()
const
;
private:
size_t
SpaceIndex
(
size_t
ilhs
,
size_t
irhs
)
const
{
return
ilhs
*
num_matchers_
+
irhs
;
}
size_t
num_elements_
;
size_t
num_matchers_
;
// Each element is a char interpreted as bool. They are stored as a
// flattened array in lhs-major order, use 'SpaceIndex()' to translate
// a (ilhs, irhs) matrix coordinate into an offset.
::
std
::
vector
<
char
>
matched_
;
};
typedef
::
std
::
pair
<
size_t
,
size_t
>
ElementMatcherPair
;
typedef
::
std
::
vector
<
ElementMatcherPair
>
ElementMatcherPairs
;
// Returns a maximum bipartite matching for the specified graph 'g'.
// The matching is represented as a vector of {element, matcher} pairs.
GTEST_API_
ElementMatcherPairs
FindMaxBipartiteMatching
(
const
MatchMatrix
&
g
);
GTEST_API_
bool
FindPairing
(
const
MatchMatrix
&
matrix
,
MatchResultListener
*
listener
);
// Untyped base class for implementing UnorderedElementsAre. By
// putting logic that's not specific to the element type here, we
// reduce binary bloat and increase compilation speed.
class
GTEST_API_
UnorderedElementsAreMatcherImplBase
{
protected:
// A vector of matcher describers, one for each element matcher.
// Does not own the describers (and thus can be used only when the
// element matchers are alive).
typedef
::
std
::
vector
<
const
MatcherDescriberInterface
*>
MatcherDescriberVec
;
// Describes this UnorderedElementsAre matcher.
void
DescribeToImpl
(
::
std
::
ostream
*
os
)
const
;
// Describes the negation of this UnorderedElementsAre matcher.
void
DescribeNegationToImpl
(
::
std
::
ostream
*
os
)
const
;
bool
VerifyAllElementsAndMatchersAreMatched
(
const
::
std
::
vector
<
string
>&
element_printouts
,
const
MatchMatrix
&
matrix
,
MatchResultListener
*
listener
)
const
;
MatcherDescriberVec
&
matcher_describers
()
{
return
matcher_describers_
;
}
static
Message
Elements
(
size_t
n
)
{
return
Message
()
<<
n
<<
" element"
<<
(
n
==
1
?
""
:
"s"
);
}
private:
MatcherDescriberVec
matcher_describers_
;
GTEST_DISALLOW_ASSIGN_
(
UnorderedElementsAreMatcherImplBase
);
};
// Implements unordered ElementsAre and unordered ElementsAreArray.
template
<
typename
Container
>
class
UnorderedElementsAreMatcherImpl
:
public
MatcherInterface
<
Container
>
,
public
UnorderedElementsAreMatcherImplBase
{
public:
typedef
GTEST_REMOVE_REFERENCE_AND_CONST_
(
Container
)
RawContainer
;
typedef
internal
::
StlContainerView
<
RawContainer
>
View
;
typedef
typename
View
::
type
StlContainer
;
typedef
typename
View
::
const_reference
StlContainerReference
;
typedef
typename
StlContainer
::
const_iterator
StlContainerConstIterator
;
typedef
typename
StlContainer
::
value_type
Element
;
// Constructs the matcher from a sequence of element values or
// element matchers.
template
<
typename
InputIter
>
UnorderedElementsAreMatcherImpl
(
InputIter
first
,
InputIter
last
)
{
for
(;
first
!=
last
;
++
first
)
{
matchers_
.
push_back
(
MatcherCast
<
const
Element
&>
(
*
first
));
matcher_describers
().
push_back
(
matchers_
.
back
().
GetDescriber
());
}
}
// Describes what this matcher does.
virtual
void
DescribeTo
(
::
std
::
ostream
*
os
)
const
{
return
UnorderedElementsAreMatcherImplBase
::
DescribeToImpl
(
os
);
}
// Describes what the negation of this matcher does.
virtual
void
DescribeNegationTo
(
::
std
::
ostream
*
os
)
const
{
return
UnorderedElementsAreMatcherImplBase
::
DescribeNegationToImpl
(
os
);
}
virtual
bool
MatchAndExplain
(
Container
container
,
MatchResultListener
*
listener
)
const
{
StlContainerReference
stl_container
=
View
::
ConstReference
(
container
);
::
std
::
vector
<
string
>
element_printouts
;
MatchMatrix
matrix
=
AnalyzeElements
(
stl_container
.
begin
(),
stl_container
.
end
(),
&
element_printouts
,
listener
);
const
size_t
actual_count
=
matrix
.
LhsSize
();
if
(
actual_count
==
0
&&
matchers_
.
empty
())
{
return
true
;
}
if
(
actual_count
!=
matchers_
.
size
())
{
// The element count doesn't match. If the container is empty,
// there's no need to explain anything as Google Mock already
// prints the empty container. Otherwise we just need to show
// how many elements there actually are.
if
(
actual_count
!=
0
&&
listener
->
IsInterested
())
{
*
listener
<<
"which has "
<<
Elements
(
actual_count
);
}
return
false
;
}
return
VerifyAllElementsAndMatchersAreMatched
(
element_printouts
,
matrix
,
listener
)
&&
FindPairing
(
matrix
,
listener
);
}
private:
typedef
::
std
::
vector
<
Matcher
<
const
Element
&>
>
MatcherVec
;
template
<
typename
ElementIter
>
MatchMatrix
AnalyzeElements
(
ElementIter
elem_first
,
ElementIter
elem_last
,
::
std
::
vector
<
string
>*
element_printouts
,
MatchResultListener
*
listener
)
const
{
element_printouts
->
clear
();
::
std
::
vector
<
char
>
did_match
;
size_t
num_elements
=
0
;
for
(;
elem_first
!=
elem_last
;
++
num_elements
,
++
elem_first
)
{
if
(
listener
->
IsInterested
())
{
element_printouts
->
push_back
(
PrintToString
(
*
elem_first
));
}
for
(
size_t
irhs
=
0
;
irhs
!=
matchers_
.
size
();
++
irhs
)
{
did_match
.
push_back
(
Matches
(
matchers_
[
irhs
])(
*
elem_first
));
}
}
MatchMatrix
matrix
(
num_elements
,
matchers_
.
size
());
::
std
::
vector
<
char
>::
const_iterator
did_match_iter
=
did_match
.
begin
();
for
(
size_t
ilhs
=
0
;
ilhs
!=
num_elements
;
++
ilhs
)
{
for
(
size_t
irhs
=
0
;
irhs
!=
matchers_
.
size
();
++
irhs
)
{
matrix
.
SetEdge
(
ilhs
,
irhs
,
*
did_match_iter
++
!=
0
);
}
}
return
matrix
;
}
MatcherVec
matchers_
;
GTEST_DISALLOW_ASSIGN_
(
UnorderedElementsAreMatcherImpl
);
};
// Functor for use in TransformTuple.
// Performs MatcherCast<Target> on an input argument of any type.
template
<
typename
Target
>
struct
CastAndAppendTransform
{
template
<
typename
Arg
>
Matcher
<
Target
>
operator
()(
const
Arg
&
a
)
const
{
return
MatcherCast
<
Target
>
(
a
);
}
};
// Implements UnorderedElementsAre.
template
<
typename
MatcherTuple
>
class
UnorderedElementsAreMatcher
{
public:
explicit
UnorderedElementsAreMatcher
(
const
MatcherTuple
&
args
)
:
matchers_
(
args
)
{}
template
<
typename
Container
>
operator
Matcher
<
Container
>
()
const
{
typedef
GTEST_REMOVE_REFERENCE_AND_CONST_
(
Container
)
RawContainer
;
typedef
typename
internal
::
StlContainerView
<
RawContainer
>::
type
View
;
typedef
typename
View
::
value_type
Element
;
typedef
::
std
::
vector
<
Matcher
<
const
Element
&>
>
MatcherVec
;
MatcherVec
matchers
;
matchers
.
reserve
(
::
testing
::
tuple_size
<
MatcherTuple
>::
value
);
TransformTupleValues
(
CastAndAppendTransform
<
const
Element
&>
(),
matchers_
,
::
std
::
back_inserter
(
matchers
));
return
MakeMatcher
(
new
UnorderedElementsAreMatcherImpl
<
Container
>
(
matchers
.
begin
(),
matchers
.
end
()));
}
private:
const
MatcherTuple
matchers_
;
GTEST_DISALLOW_ASSIGN_
(
UnorderedElementsAreMatcher
);
};
// Implements ElementsAre.
template
<
typename
MatcherTuple
>
class
ElementsAreMatcher
{
public:
explicit
ElementsAreMatcher
(
const
MatcherTuple
&
args
)
:
matchers_
(
args
)
{}
template
<
typename
Container
>
operator
Matcher
<
Container
>
()
const
{
typedef
GTEST_REMOVE_REFERENCE_AND_CONST_
(
Container
)
RawContainer
;
typedef
typename
internal
::
StlContainerView
<
RawContainer
>::
type
View
;
typedef
typename
View
::
value_type
Element
;
typedef
::
std
::
vector
<
Matcher
<
const
Element
&>
>
MatcherVec
;
MatcherVec
matchers
;
matchers
.
reserve
(
::
testing
::
tuple_size
<
MatcherTuple
>::
value
);
TransformTupleValues
(
CastAndAppendTransform
<
const
Element
&>
(),
matchers_
,
::
std
::
back_inserter
(
matchers
));
return
MakeMatcher
(
new
ElementsAreMatcherImpl
<
Container
>
(
matchers
.
begin
(),
matchers
.
end
()));
}
private:
const
MatcherTuple
matchers_
;
GTEST_DISALLOW_ASSIGN_
(
ElementsAreMatcher
);
};
// Implements UnorderedElementsAreArray().
template
<
typename
T
>
class
UnorderedElementsAreArrayMatcher
{
public:
UnorderedElementsAreArrayMatcher
()
{}
template
<
typename
Iter
>
UnorderedElementsAreArrayMatcher
(
Iter
first
,
Iter
last
)
:
matchers_
(
first
,
last
)
{}
template
<
typename
Container
>
operator
Matcher
<
Container
>
()
const
{
return
MakeMatcher
(
new
UnorderedElementsAreMatcherImpl
<
Container
>
(
matchers_
.
begin
(),
matchers_
.
end
()));
}
private:
::
std
::
vector
<
T
>
matchers_
;
GTEST_DISALLOW_ASSIGN_
(
UnorderedElementsAreArrayMatcher
);
};
// Implements ElementsAreArray().
template
<
typename
T
>
class
ElementsAreArrayMatcher
{
public:
template
<
typename
Iter
>
ElementsAreArrayMatcher
(
Iter
first
,
Iter
last
)
:
matchers_
(
first
,
last
)
{}
template
<
typename
Container
>
operator
Matcher
<
Container
>
()
const
{
return
MakeMatcher
(
new
ElementsAreMatcherImpl
<
Container
>
(
matchers_
.
begin
(),
matchers_
.
end
()));
}
private:
const
::
std
::
vector
<
T
>
matchers_
;
GTEST_DISALLOW_ASSIGN_
(
ElementsAreArrayMatcher
);
};
// Given a 2-tuple matcher tm of type Tuple2Matcher and a value second
// of type Second, BoundSecondMatcher<Tuple2Matcher, Second>(tm,
// second) is a polymorphic matcher that matches a value x iff tm
// matches tuple (x, second). Useful for implementing
// UnorderedPointwise() in terms of UnorderedElementsAreArray().
//
// BoundSecondMatcher is copyable and assignable, as we need to put
// instances of this class in a vector when implementing
// UnorderedPointwise().
template
<
typename
Tuple2Matcher
,
typename
Second
>
class
BoundSecondMatcher
{
public:
BoundSecondMatcher
(
const
Tuple2Matcher
&
tm
,
const
Second
&
second
)
:
tuple2_matcher_
(
tm
),
second_value_
(
second
)
{}
template
<
typename
T
>
operator
Matcher
<
T
>
()
const
{
return
MakeMatcher
(
new
Impl
<
T
>
(
tuple2_matcher_
,
second_value_
));
}
// We have to define this for UnorderedPointwise() to compile in
// C++98 mode, as it puts BoundSecondMatcher instances in a vector,
// which requires the elements to be assignable in C++98. The
// compiler cannot generate the operator= for us, as Tuple2Matcher
// and Second may not be assignable.
//
// However, this should never be called, so the implementation just
// need to assert.
void
operator
=
(
const
BoundSecondMatcher
&
/*rhs*/
)
{
GTEST_LOG_
(
FATAL
)
<<
"BoundSecondMatcher should never be assigned."
;
}
private:
template
<
typename
T
>
class
Impl
:
public
MatcherInterface
<
T
>
{
public:
typedef
::
testing
::
tuple
<
T
,
Second
>
ArgTuple
;
Impl
(
const
Tuple2Matcher
&
tm
,
const
Second
&
second
)
:
mono_tuple2_matcher_
(
SafeMatcherCast
<
const
ArgTuple
&>
(
tm
)),
second_value_
(
second
)
{}
virtual
void
DescribeTo
(
::
std
::
ostream
*
os
)
const
{
*
os
<<
"and "
;
UniversalPrint
(
second_value_
,
os
);
*
os
<<
" "
;
mono_tuple2_matcher_
.
DescribeTo
(
os
);
}
virtual
bool
MatchAndExplain
(
T
x
,
MatchResultListener
*
listener
)
const
{
return
mono_tuple2_matcher_
.
MatchAndExplain
(
ArgTuple
(
x
,
second_value_
),
listener
);
}
private:
const
Matcher
<
const
ArgTuple
&>
mono_tuple2_matcher_
;
const
Second
second_value_
;
GTEST_DISALLOW_ASSIGN_
(
Impl
);
};
const
Tuple2Matcher
tuple2_matcher_
;
const
Second
second_value_
;
};
// Given a 2-tuple matcher tm and a value second,
// MatcherBindSecond(tm, second) returns a matcher that matches a
// value x iff tm matches tuple (x, second). Useful for implementing
// UnorderedPointwise() in terms of UnorderedElementsAreArray().
template
<
typename
Tuple2Matcher
,
typename
Second
>
BoundSecondMatcher
<
Tuple2Matcher
,
Second
>
MatcherBindSecond
(
const
Tuple2Matcher
&
tm
,
const
Second
&
second
)
{
return
BoundSecondMatcher
<
Tuple2Matcher
,
Second
>
(
tm
,
second
);
}
// Returns the description for a matcher defined using the MATCHER*()
// macro where the user-supplied description string is "", if
// 'negation' is false; otherwise returns the description of the
// negation of the matcher. 'param_values' contains a list of strings
// that are the print-out of the matcher's parameters.
GTEST_API_
string
FormatMatcherDescription
(
bool
negation
,
const
char
*
matcher_name
,
const
Strings
&
param_values
);
}
// namespace internal
// ElementsAreArray(first, last)
// ElementsAreArray(pointer, count)
// ElementsAreArray(array)
// ElementsAreArray(container)
// ElementsAreArray({ e1, e2, ..., en })
//
// The ElementsAreArray() functions are like ElementsAre(...), except
// that they are given a homogeneous sequence rather than taking each
// element as a function argument. The sequence can be specified as an
// array, a pointer and count, a vector, an initializer list, or an
// STL iterator range. In each of these cases, the underlying sequence
// can be either a sequence of values or a sequence of matchers.
//
// All forms of ElementsAreArray() make a copy of the input matcher sequence.
template
<
typename
Iter
>
inline
internal
::
ElementsAreArrayMatcher
<
typename
::
std
::
iterator_traits
<
Iter
>::
value_type
>
ElementsAreArray
(
Iter
first
,
Iter
last
)
{
typedef
typename
::
std
::
iterator_traits
<
Iter
>::
value_type
T
;
return
internal
::
ElementsAreArrayMatcher
<
T
>
(
first
,
last
);
}
template
<
typename
T
>
inline
internal
::
ElementsAreArrayMatcher
<
T
>
ElementsAreArray
(
const
T
*
pointer
,
size_t
count
)
{
return
ElementsAreArray
(
pointer
,
pointer
+
count
);
}
template
<
typename
T
,
size_t
N
>
inline
internal
::
ElementsAreArrayMatcher
<
T
>
ElementsAreArray
(
const
T
(
&
array
)[
N
])
{
return
ElementsAreArray
(
array
,
N
);
}
template
<
typename
Container
>
inline
internal
::
ElementsAreArrayMatcher
<
typename
Container
::
value_type
>
ElementsAreArray
(
const
Container
&
container
)
{
return
ElementsAreArray
(
container
.
begin
(),
container
.
end
());
}
#if GTEST_HAS_STD_INITIALIZER_LIST_
template
<
typename
T
>
inline
internal
::
ElementsAreArrayMatcher
<
T
>
ElementsAreArray
(
::
std
::
initializer_list
<
T
>
xs
)
{
return
ElementsAreArray
(
xs
.
begin
(),
xs
.
end
());
}
#endif
// UnorderedElementsAreArray(first, last)
// UnorderedElementsAreArray(pointer, count)
// UnorderedElementsAreArray(array)
// UnorderedElementsAreArray(container)
// UnorderedElementsAreArray({ e1, e2, ..., en })
//
// The UnorderedElementsAreArray() functions are like
// ElementsAreArray(...), but allow matching the elements in any order.
template
<
typename
Iter
>
inline
internal
::
UnorderedElementsAreArrayMatcher
<
typename
::
std
::
iterator_traits
<
Iter
>::
value_type
>
UnorderedElementsAreArray
(
Iter
first
,
Iter
last
)
{
typedef
typename
::
std
::
iterator_traits
<
Iter
>::
value_type
T
;
return
internal
::
UnorderedElementsAreArrayMatcher
<
T
>
(
first
,
last
);
}
template
<
typename
T
>
inline
internal
::
UnorderedElementsAreArrayMatcher
<
T
>
UnorderedElementsAreArray
(
const
T
*
pointer
,
size_t
count
)
{
return
UnorderedElementsAreArray
(
pointer
,
pointer
+
count
);
}
template
<
typename
T
,
size_t
N
>
inline
internal
::
UnorderedElementsAreArrayMatcher
<
T
>
UnorderedElementsAreArray
(
const
T
(
&
array
)[
N
])
{
return
UnorderedElementsAreArray
(
array
,
N
);
}
template
<
typename
Container
>
inline
internal
::
UnorderedElementsAreArrayMatcher
<
typename
Container
::
value_type
>
UnorderedElementsAreArray
(
const
Container
&
container
)
{
return
UnorderedElementsAreArray
(
container
.
begin
(),
container
.
end
());
}
#if GTEST_HAS_STD_INITIALIZER_LIST_
template
<
typename
T
>
inline
internal
::
UnorderedElementsAreArrayMatcher
<
T
>
UnorderedElementsAreArray
(
::
std
::
initializer_list
<
T
>
xs
)
{
return
UnorderedElementsAreArray
(
xs
.
begin
(),
xs
.
end
());
}
#endif
// _ is a matcher that matches anything of any type.
//
// This definition is fine as:
//
// 1. The C++ standard permits using the name _ in a namespace that
// is not the global namespace or ::std.
// 2. The AnythingMatcher class has no data member or constructor,
// so it's OK to create global variables of this type.
// 3. c-style has approved of using _ in this case.
const
internal
::
AnythingMatcher
_
=
{};
// Creates a matcher that matches any value of the given type T.
template
<
typename
T
>
inline
Matcher
<
T
>
A
()
{
return
MakeMatcher
(
new
internal
::
AnyMatcherImpl
<
T
>
());
}
// Creates a matcher that matches any value of the given type T.
template
<
typename
T
>
inline
Matcher
<
T
>
An
()
{
return
A
<
T
>
();
}
// Creates a polymorphic matcher that matches anything equal to x.
// Note: if the parameter of Eq() were declared as const T&, Eq("foo")
// wouldn't compile.
template
<
typename
T
>
inline
internal
::
EqMatcher
<
T
>
Eq
(
T
x
)
{
return
internal
::
EqMatcher
<
T
>
(
x
);
}
// Constructs a Matcher<T> from a 'value' of type T. The constructed
// matcher matches any value that's equal to 'value'.
template
<
typename
T
>
Matcher
<
T
>::
Matcher
(
T
value
)
{
*
this
=
Eq
(
value
);
}
// Creates a monomorphic matcher that matches anything with type Lhs
// and equal to rhs. A user may need to use this instead of Eq(...)
// in order to resolve an overloading ambiguity.
//
// TypedEq<T>(x) is just a convenient short-hand for Matcher<T>(Eq(x))
// or Matcher<T>(x), but more readable than the latter.
//
// We could define similar monomorphic matchers for other comparison
// operations (e.g. TypedLt, TypedGe, and etc), but decided not to do
// it yet as those are used much less than Eq() in practice. A user
// can always write Matcher<T>(Lt(5)) to be explicit about the type,
// for example.
template
<
typename
Lhs
,
typename
Rhs
>
inline
Matcher
<
Lhs
>
TypedEq
(
const
Rhs
&
rhs
)
{
return
Eq
(
rhs
);
}
// Creates a polymorphic matcher that matches anything >= x.
template
<
typename
Rhs
>
inline
internal
::
GeMatcher
<
Rhs
>
Ge
(
Rhs
x
)
{
return
internal
::
GeMatcher
<
Rhs
>
(
x
);
}
// Creates a polymorphic matcher that matches anything > x.
template
<
typename
Rhs
>
inline
internal
::
GtMatcher
<
Rhs
>
Gt
(
Rhs
x
)
{
return
internal
::
GtMatcher
<
Rhs
>
(
x
);
}
// Creates a polymorphic matcher that matches anything <= x.
template
<
typename
Rhs
>
inline
internal
::
LeMatcher
<
Rhs
>
Le
(
Rhs
x
)
{
return
internal
::
LeMatcher
<
Rhs
>
(
x
);
}
// Creates a polymorphic matcher that matches anything < x.
template
<
typename
Rhs
>
inline
internal
::
LtMatcher
<
Rhs
>
Lt
(
Rhs
x
)
{
return
internal
::
LtMatcher
<
Rhs
>
(
x
);
}
// Creates a polymorphic matcher that matches anything != x.
template
<
typename
Rhs
>
inline
internal
::
NeMatcher
<
Rhs
>
Ne
(
Rhs
x
)
{
return
internal
::
NeMatcher
<
Rhs
>
(
x
);
}
// Creates a polymorphic matcher that matches any NULL pointer.
inline
PolymorphicMatcher
<
internal
::
IsNullMatcher
>
IsNull
()
{
return
MakePolymorphicMatcher
(
internal
::
IsNullMatcher
());
}
// Creates a polymorphic matcher that matches any non-NULL pointer.
// This is convenient as Not(NULL) doesn't compile (the compiler
// thinks that that expression is comparing a pointer with an integer).
inline
PolymorphicMatcher
<
internal
::
NotNullMatcher
>
NotNull
()
{
return
MakePolymorphicMatcher
(
internal
::
NotNullMatcher
());
}
// Creates a polymorphic matcher that matches any argument that
// references variable x.
template
<
typename
T
>
inline
internal
::
RefMatcher
<
T
&>
Ref
(
T
&
x
)
{
// NOLINT
return
internal
::
RefMatcher
<
T
&>
(
x
);
}
// Creates a matcher that matches any double argument approximately
// equal to rhs, where two NANs are considered unequal.
inline
internal
::
FloatingEqMatcher
<
double
>
DoubleEq
(
double
rhs
)
{
return
internal
::
FloatingEqMatcher
<
double
>
(
rhs
,
false
);
}
// Creates a matcher that matches any double argument approximately
// equal to rhs, including NaN values when rhs is NaN.
inline
internal
::
FloatingEqMatcher
<
double
>
NanSensitiveDoubleEq
(
double
rhs
)
{
return
internal
::
FloatingEqMatcher
<
double
>
(
rhs
,
true
);
}
// Creates a matcher that matches any double argument approximately equal to
// rhs, up to the specified max absolute error bound, where two NANs are
// considered unequal. The max absolute error bound must be non-negative.
inline
internal
::
FloatingEqMatcher
<
double
>
DoubleNear
(
double
rhs
,
double
max_abs_error
)
{
return
internal
::
FloatingEqMatcher
<
double
>
(
rhs
,
false
,
max_abs_error
);
}
// Creates a matcher that matches any double argument approximately equal to
// rhs, up to the specified max absolute error bound, including NaN values when
// rhs is NaN. The max absolute error bound must be non-negative.
inline
internal
::
FloatingEqMatcher
<
double
>
NanSensitiveDoubleNear
(
double
rhs
,
double
max_abs_error
)
{
return
internal
::
FloatingEqMatcher
<
double
>
(
rhs
,
true
,
max_abs_error
);
}
// Creates a matcher that matches any float argument approximately
// equal to rhs, where two NANs are considered unequal.
inline
internal
::
FloatingEqMatcher
<
float
>
FloatEq
(
float
rhs
)
{
return
internal
::
FloatingEqMatcher
<
float
>
(
rhs
,
false
);
}
// Creates a matcher that matches any float argument approximately
// equal to rhs, including NaN values when rhs is NaN.
inline
internal
::
FloatingEqMatcher
<
float
>
NanSensitiveFloatEq
(
float
rhs
)
{
return
internal
::
FloatingEqMatcher
<
float
>
(
rhs
,
true
);
}
// Creates a matcher that matches any float argument approximately equal to
// rhs, up to the specified max absolute error bound, where two NANs are
// considered unequal. The max absolute error bound must be non-negative.
inline
internal
::
FloatingEqMatcher
<
float
>
FloatNear
(
float
rhs
,
float
max_abs_error
)
{
return
internal
::
FloatingEqMatcher
<
float
>
(
rhs
,
false
,
max_abs_error
);
}
// Creates a matcher that matches any float argument approximately equal to
// rhs, up to the specified max absolute error bound, including NaN values when
// rhs is NaN. The max absolute error bound must be non-negative.
inline
internal
::
FloatingEqMatcher
<
float
>
NanSensitiveFloatNear
(
float
rhs
,
float
max_abs_error
)
{
return
internal
::
FloatingEqMatcher
<
float
>
(
rhs
,
true
,
max_abs_error
);
}
// Creates a matcher that matches a pointer (raw or smart) that points
// to a value that matches inner_matcher.
template
<
typename
InnerMatcher
>
inline
internal
::
PointeeMatcher
<
InnerMatcher
>
Pointee
(
const
InnerMatcher
&
inner_matcher
)
{
return
internal
::
PointeeMatcher
<
InnerMatcher
>
(
inner_matcher
);
}
// Creates a matcher that matches a pointer or reference that matches
// inner_matcher when dynamic_cast<To> is applied.
// The result of dynamic_cast<To> is forwarded to the inner matcher.
// If To is a pointer and the cast fails, the inner matcher will receive NULL.
// If To is a reference and the cast fails, this matcher returns false
// immediately.
template
<
typename
To
>
inline
PolymorphicMatcher
<
internal
::
WhenDynamicCastToMatcher
<
To
>
>
WhenDynamicCastTo
(
const
Matcher
<
To
>&
inner_matcher
)
{
return
MakePolymorphicMatcher
(
internal
::
WhenDynamicCastToMatcher
<
To
>
(
inner_matcher
));
}
// Creates a matcher that matches an object whose given field matches
// 'matcher'. For example,
// Field(&Foo::number, Ge(5))
// matches a Foo object x iff x.number >= 5.
template
<
typename
Class
,
typename
FieldType
,
typename
FieldMatcher
>
inline
PolymorphicMatcher
<
internal
::
FieldMatcher
<
Class
,
FieldType
>
>
Field
(
FieldType
Class
::*
field
,
const
FieldMatcher
&
matcher
)
{
return
MakePolymorphicMatcher
(
internal
::
FieldMatcher
<
Class
,
FieldType
>
(
field
,
MatcherCast
<
const
FieldType
&>
(
matcher
)));
// The call to MatcherCast() is required for supporting inner
// matchers of compatible types. For example, it allows
// Field(&Foo::bar, m)
// to compile where bar is an int32 and m is a matcher for int64.
}
// Creates a matcher that matches an object whose given property
// matches 'matcher'. For example,
// Property(&Foo::str, StartsWith("hi"))
// matches a Foo object x iff x.str() starts with "hi".
template
<
typename
Class
,
typename
PropertyType
,
typename
PropertyMatcher
>
inline
PolymorphicMatcher
<
internal
::
PropertyMatcher
<
Class
,
PropertyType
>
>
Property
(
PropertyType
(
Class
::*
property
)()
const
,
const
PropertyMatcher
&
matcher
)
{
return
MakePolymorphicMatcher
(
internal
::
PropertyMatcher
<
Class
,
PropertyType
>
(
property
,
MatcherCast
<
GTEST_REFERENCE_TO_CONST_
(
PropertyType
)
>
(
matcher
)));
// The call to MatcherCast() is required for supporting inner
// matchers of compatible types. For example, it allows
// Property(&Foo::bar, m)
// to compile where bar() returns an int32 and m is a matcher for int64.
}
// Creates a matcher that matches an object iff the result of applying
// a callable to x matches 'matcher'.
// For example,
// ResultOf(f, StartsWith("hi"))
// matches a Foo object x iff f(x) starts with "hi".
// callable parameter can be a function, function pointer, or a functor.
// Callable has to satisfy the following conditions:
// * It is required to keep no state affecting the results of
// the calls on it and make no assumptions about how many calls
// will be made. Any state it keeps must be protected from the
// concurrent access.
// * If it is a function object, it has to define type result_type.
// We recommend deriving your functor classes from std::unary_function.
template
<
typename
Callable
,
typename
ResultOfMatcher
>
internal
::
ResultOfMatcher
<
Callable
>
ResultOf
(
Callable
callable
,
const
ResultOfMatcher
&
matcher
)
{
return
internal
::
ResultOfMatcher
<
Callable
>
(
callable
,
MatcherCast
<
typename
internal
::
CallableTraits
<
Callable
>::
ResultType
>
(
matcher
));
// The call to MatcherCast() is required for supporting inner
// matchers of compatible types. For example, it allows
// ResultOf(Function, m)
// to compile where Function() returns an int32 and m is a matcher for int64.
}
// String matchers.
// Matches a string equal to str.
inline
PolymorphicMatcher
<
internal
::
StrEqualityMatcher
<
internal
::
string
>
>
StrEq
(
const
internal
::
string
&
str
)
{
return
MakePolymorphicMatcher
(
internal
::
StrEqualityMatcher
<
internal
::
string
>
(
str
,
true
,
true
));
}
// Matches a string not equal to str.
inline
PolymorphicMatcher
<
internal
::
StrEqualityMatcher
<
internal
::
string
>
>
StrNe
(
const
internal
::
string
&
str
)
{
return
MakePolymorphicMatcher
(
internal
::
StrEqualityMatcher
<
internal
::
string
>
(
str
,
false
,
true
));
}
// Matches a string equal to str, ignoring case.
inline
PolymorphicMatcher
<
internal
::
StrEqualityMatcher
<
internal
::
string
>
>
StrCaseEq
(
const
internal
::
string
&
str
)
{
return
MakePolymorphicMatcher
(
internal
::
StrEqualityMatcher
<
internal
::
string
>
(
str
,
true
,
false
));
}
// Matches a string not equal to str, ignoring case.
inline
PolymorphicMatcher
<
internal
::
StrEqualityMatcher
<
internal
::
string
>
>
StrCaseNe
(
const
internal
::
string
&
str
)
{
return
MakePolymorphicMatcher
(
internal
::
StrEqualityMatcher
<
internal
::
string
>
(
str
,
false
,
false
));
}
// Creates a matcher that matches any string, std::string, or C string
// that contains the given substring.
inline
PolymorphicMatcher
<
internal
::
HasSubstrMatcher
<
internal
::
string
>
>
HasSubstr
(
const
internal
::
string
&
substring
)
{
return
MakePolymorphicMatcher
(
internal
::
HasSubstrMatcher
<
internal
::
string
>
(
substring
));
}
// Matches a string that starts with 'prefix' (case-sensitive).
inline
PolymorphicMatcher
<
internal
::
StartsWithMatcher
<
internal
::
string
>
>
StartsWith
(
const
internal
::
string
&
prefix
)
{
return
MakePolymorphicMatcher
(
internal
::
StartsWithMatcher
<
internal
::
string
>
(
prefix
));
}
// Matches a string that ends with 'suffix' (case-sensitive).
inline
PolymorphicMatcher
<
internal
::
EndsWithMatcher
<
internal
::
string
>
>
EndsWith
(
const
internal
::
string
&
suffix
)
{
return
MakePolymorphicMatcher
(
internal
::
EndsWithMatcher
<
internal
::
string
>
(
suffix
));
}
// Matches a string that fully matches regular expression 'regex'.
// The matcher takes ownership of 'regex'.
inline
PolymorphicMatcher
<
internal
::
MatchesRegexMatcher
>
MatchesRegex
(
const
internal
::
RE
*
regex
)
{
return
MakePolymorphicMatcher
(
internal
::
MatchesRegexMatcher
(
regex
,
true
));
}
inline
PolymorphicMatcher
<
internal
::
MatchesRegexMatcher
>
MatchesRegex
(
const
internal
::
string
&
regex
)
{
return
MatchesRegex
(
new
internal
::
RE
(
regex
));
}
// Matches a string that contains regular expression 'regex'.
// The matcher takes ownership of 'regex'.
inline
PolymorphicMatcher
<
internal
::
MatchesRegexMatcher
>
ContainsRegex
(
const
internal
::
RE
*
regex
)
{
return
MakePolymorphicMatcher
(
internal
::
MatchesRegexMatcher
(
regex
,
false
));
}
inline
PolymorphicMatcher
<
internal
::
MatchesRegexMatcher
>
ContainsRegex
(
const
internal
::
string
&
regex
)
{
return
ContainsRegex
(
new
internal
::
RE
(
regex
));
}
#if GTEST_HAS_GLOBAL_WSTRING || GTEST_HAS_STD_WSTRING
// Wide string matchers.
// Matches a string equal to str.
inline
PolymorphicMatcher
<
internal
::
StrEqualityMatcher
<
internal
::
wstring
>
>
StrEq
(
const
internal
::
wstring
&
str
)
{
return
MakePolymorphicMatcher
(
internal
::
StrEqualityMatcher
<
internal
::
wstring
>
(
str
,
true
,
true
));
}
// Matches a string not equal to str.
inline
PolymorphicMatcher
<
internal
::
StrEqualityMatcher
<
internal
::
wstring
>
>
StrNe
(
const
internal
::
wstring
&
str
)
{
return
MakePolymorphicMatcher
(
internal
::
StrEqualityMatcher
<
internal
::
wstring
>
(
str
,
false
,
true
));
}
// Matches a string equal to str, ignoring case.
inline
PolymorphicMatcher
<
internal
::
StrEqualityMatcher
<
internal
::
wstring
>
>
StrCaseEq
(
const
internal
::
wstring
&
str
)
{
return
MakePolymorphicMatcher
(
internal
::
StrEqualityMatcher
<
internal
::
wstring
>
(
str
,
true
,
false
));
}
// Matches a string not equal to str, ignoring case.
inline
PolymorphicMatcher
<
internal
::
StrEqualityMatcher
<
internal
::
wstring
>
>
StrCaseNe
(
const
internal
::
wstring
&
str
)
{
return
MakePolymorphicMatcher
(
internal
::
StrEqualityMatcher
<
internal
::
wstring
>
(
str
,
false
,
false
));
}
// Creates a matcher that matches any wstring, std::wstring, or C wide string
// that contains the given substring.
inline
PolymorphicMatcher
<
internal
::
HasSubstrMatcher
<
internal
::
wstring
>
>
HasSubstr
(
const
internal
::
wstring
&
substring
)
{
return
MakePolymorphicMatcher
(
internal
::
HasSubstrMatcher
<
internal
::
wstring
>
(
substring
));
}
// Matches a string that starts with 'prefix' (case-sensitive).
inline
PolymorphicMatcher
<
internal
::
StartsWithMatcher
<
internal
::
wstring
>
>
StartsWith
(
const
internal
::
wstring
&
prefix
)
{
return
MakePolymorphicMatcher
(
internal
::
StartsWithMatcher
<
internal
::
wstring
>
(
prefix
));
}
// Matches a string that ends with 'suffix' (case-sensitive).
inline
PolymorphicMatcher
<
internal
::
EndsWithMatcher
<
internal
::
wstring
>
>
EndsWith
(
const
internal
::
wstring
&
suffix
)
{
return
MakePolymorphicMatcher
(
internal
::
EndsWithMatcher
<
internal
::
wstring
>
(
suffix
));
}
#endif // GTEST_HAS_GLOBAL_WSTRING || GTEST_HAS_STD_WSTRING
// Creates a polymorphic matcher that matches a 2-tuple where the
// first field == the second field.
inline
internal
::
Eq2Matcher
Eq
()
{
return
internal
::
Eq2Matcher
();
}
// Creates a polymorphic matcher that matches a 2-tuple where the
// first field >= the second field.
inline
internal
::
Ge2Matcher
Ge
()
{
return
internal
::
Ge2Matcher
();
}
// Creates a polymorphic matcher that matches a 2-tuple where the
// first field > the second field.
inline
internal
::
Gt2Matcher
Gt
()
{
return
internal
::
Gt2Matcher
();
}
// Creates a polymorphic matcher that matches a 2-tuple where the
// first field <= the second field.
inline
internal
::
Le2Matcher
Le
()
{
return
internal
::
Le2Matcher
();
}
// Creates a polymorphic matcher that matches a 2-tuple where the
// first field < the second field.
inline
internal
::
Lt2Matcher
Lt
()
{
return
internal
::
Lt2Matcher
();
}
// Creates a polymorphic matcher that matches a 2-tuple where the
// first field != the second field.
inline
internal
::
Ne2Matcher
Ne
()
{
return
internal
::
Ne2Matcher
();
}
// Creates a matcher that matches any value of type T that m doesn't
// match.
template
<
typename
InnerMatcher
>
inline
internal
::
NotMatcher
<
InnerMatcher
>
Not
(
InnerMatcher
m
)
{
return
internal
::
NotMatcher
<
InnerMatcher
>
(
m
);
}
// Returns a matcher that matches anything that satisfies the given
// predicate. The predicate can be any unary function or functor
// whose return type can be implicitly converted to bool.
template
<
typename
Predicate
>
inline
PolymorphicMatcher
<
internal
::
TrulyMatcher
<
Predicate
>
>
Truly
(
Predicate
pred
)
{
return
MakePolymorphicMatcher
(
internal
::
TrulyMatcher
<
Predicate
>
(
pred
));
}
// Returns a matcher that matches the container size. The container must
// support both size() and size_type which all STL-like containers provide.
// Note that the parameter 'size' can be a value of type size_type as well as
// matcher. For instance:
// EXPECT_THAT(container, SizeIs(2)); // Checks container has 2 elements.
// EXPECT_THAT(container, SizeIs(Le(2)); // Checks container has at most 2.
template
<
typename
SizeMatcher
>
inline
internal
::
SizeIsMatcher
<
SizeMatcher
>
SizeIs
(
const
SizeMatcher
&
size_matcher
)
{
return
internal
::
SizeIsMatcher
<
SizeMatcher
>
(
size_matcher
);
}
// Returns a matcher that matches the distance between the container's begin()
// iterator and its end() iterator, i.e. the size of the container. This matcher
// can be used instead of SizeIs with containers such as std::forward_list which
// do not implement size(). The container must provide const_iterator (with
// valid iterator_traits), begin() and end().
template
<
typename
DistanceMatcher
>
inline
internal
::
BeginEndDistanceIsMatcher
<
DistanceMatcher
>
BeginEndDistanceIs
(
const
DistanceMatcher
&
distance_matcher
)
{
return
internal
::
BeginEndDistanceIsMatcher
<
DistanceMatcher
>
(
distance_matcher
);
}
// Returns a matcher that matches an equal container.
// This matcher behaves like Eq(), but in the event of mismatch lists the
// values that are included in one container but not the other. (Duplicate
// values and order differences are not explained.)
template
<
typename
Container
>
inline
PolymorphicMatcher
<
internal
::
ContainerEqMatcher
<
// NOLINT
GTEST_REMOVE_CONST_
(
Container
)
>
>
ContainerEq
(
const
Container
&
rhs
)
{
// This following line is for working around a bug in MSVC 8.0,
// which causes Container to be a const type sometimes.
typedef
GTEST_REMOVE_CONST_
(
Container
)
RawContainer
;
return
MakePolymorphicMatcher
(
internal
::
ContainerEqMatcher
<
RawContainer
>
(
rhs
));
}
// Returns a matcher that matches a container that, when sorted using
// the given comparator, matches container_matcher.
template
<
typename
Comparator
,
typename
ContainerMatcher
>
inline
internal
::
WhenSortedByMatcher
<
Comparator
,
ContainerMatcher
>
WhenSortedBy
(
const
Comparator
&
comparator
,
const
ContainerMatcher
&
container_matcher
)
{
return
internal
::
WhenSortedByMatcher
<
Comparator
,
ContainerMatcher
>
(
comparator
,
container_matcher
);
}
// Returns a matcher that matches a container that, when sorted using
// the < operator, matches container_matcher.
template
<
typename
ContainerMatcher
>
inline
internal
::
WhenSortedByMatcher
<
internal
::
LessComparator
,
ContainerMatcher
>
WhenSorted
(
const
ContainerMatcher
&
container_matcher
)
{
return
internal
::
WhenSortedByMatcher
<
internal
::
LessComparator
,
ContainerMatcher
>
(
internal
::
LessComparator
(),
container_matcher
);
}
// Matches an STL-style container or a native array that contains the
// same number of elements as in rhs, where its i-th element and rhs's
// i-th element (as a pair) satisfy the given pair matcher, for all i.
// TupleMatcher must be able to be safely cast to Matcher<tuple<const
// T1&, const T2&> >, where T1 and T2 are the types of elements in the
// LHS container and the RHS container respectively.
template
<
typename
TupleMatcher
,
typename
Container
>
inline
internal
::
PointwiseMatcher
<
TupleMatcher
,
GTEST_REMOVE_CONST_
(
Container
)
>
Pointwise
(
const
TupleMatcher
&
tuple_matcher
,
const
Container
&
rhs
)
{
// This following line is for working around a bug in MSVC 8.0,
// which causes Container to be a const type sometimes (e.g. when
// rhs is a const int[])..
typedef
GTEST_REMOVE_CONST_
(
Container
)
RawContainer
;
return
internal
::
PointwiseMatcher
<
TupleMatcher
,
RawContainer
>
(
tuple_matcher
,
rhs
);
}
#if GTEST_HAS_STD_INITIALIZER_LIST_
// Supports the Pointwise(m, {a, b, c}) syntax.
template
<
typename
TupleMatcher
,
typename
T
>
inline
internal
::
PointwiseMatcher
<
TupleMatcher
,
std
::
vector
<
T
>
>
Pointwise
(
const
TupleMatcher
&
tuple_matcher
,
std
::
initializer_list
<
T
>
rhs
)
{
return
Pointwise
(
tuple_matcher
,
std
::
vector
<
T
>
(
rhs
));
}
#endif // GTEST_HAS_STD_INITIALIZER_LIST_
// UnorderedPointwise(pair_matcher, rhs) matches an STL-style
// container or a native array that contains the same number of
// elements as in rhs, where in some permutation of the container, its
// i-th element and rhs's i-th element (as a pair) satisfy the given
// pair matcher, for all i. Tuple2Matcher must be able to be safely
// cast to Matcher<tuple<const T1&, const T2&> >, where T1 and T2 are
// the types of elements in the LHS container and the RHS container
// respectively.
//
// This is like Pointwise(pair_matcher, rhs), except that the element
// order doesn't matter.
template
<
typename
Tuple2Matcher
,
typename
RhsContainer
>
inline
internal
::
UnorderedElementsAreArrayMatcher
<
typename
internal
::
BoundSecondMatcher
<
Tuple2Matcher
,
typename
internal
::
StlContainerView
<
GTEST_REMOVE_CONST_
(
RhsContainer
)
>::
type
::
value_type
>
>
UnorderedPointwise
(
const
Tuple2Matcher
&
tuple2_matcher
,
const
RhsContainer
&
rhs_container
)
{
// This following line is for working around a bug in MSVC 8.0,
// which causes RhsContainer to be a const type sometimes (e.g. when
// rhs_container is a const int[]).
typedef
GTEST_REMOVE_CONST_
(
RhsContainer
)
RawRhsContainer
;
// RhsView allows the same code to handle RhsContainer being a
// STL-style container and it being a native C-style array.
typedef
typename
internal
::
StlContainerView
<
RawRhsContainer
>
RhsView
;
typedef
typename
RhsView
::
type
RhsStlContainer
;
typedef
typename
RhsStlContainer
::
value_type
Second
;
const
RhsStlContainer
&
rhs_stl_container
=
RhsView
::
ConstReference
(
rhs_container
);
// Create a matcher for each element in rhs_container.
::
std
::
vector
<
internal
::
BoundSecondMatcher
<
Tuple2Matcher
,
Second
>
>
matchers
;
for
(
typename
RhsStlContainer
::
const_iterator
it
=
rhs_stl_container
.
begin
();
it
!=
rhs_stl_container
.
end
();
++
it
)
{
matchers
.
push_back
(
internal
::
MatcherBindSecond
(
tuple2_matcher
,
*
it
));
}
// Delegate the work to UnorderedElementsAreArray().
return
UnorderedElementsAreArray
(
matchers
);
}
#if GTEST_HAS_STD_INITIALIZER_LIST_
// Supports the UnorderedPointwise(m, {a, b, c}) syntax.
template
<
typename
Tuple2Matcher
,
typename
T
>
inline
internal
::
UnorderedElementsAreArrayMatcher
<
typename
internal
::
BoundSecondMatcher
<
Tuple2Matcher
,
T
>
>
UnorderedPointwise
(
const
Tuple2Matcher
&
tuple2_matcher
,
std
::
initializer_list
<
T
>
rhs
)
{
return
UnorderedPointwise
(
tuple2_matcher
,
std
::
vector
<
T
>
(
rhs
));
}
#endif // GTEST_HAS_STD_INITIALIZER_LIST_
// Matches an STL-style container or a native array that contains at
// least one element matching the given value or matcher.
//
// Examples:
// ::std::set<int> page_ids;
// page_ids.insert(3);
// page_ids.insert(1);
// EXPECT_THAT(page_ids, Contains(1));
// EXPECT_THAT(page_ids, Contains(Gt(2)));
// EXPECT_THAT(page_ids, Not(Contains(4)));
//
// ::std::map<int, size_t> page_lengths;
// page_lengths[1] = 100;
// EXPECT_THAT(page_lengths,
// Contains(::std::pair<const int, size_t>(1, 100)));
//
// const char* user_ids[] = { "joe", "mike", "tom" };
// EXPECT_THAT(user_ids, Contains(Eq(::std::string("tom"))));
template
<
typename
M
>
inline
internal
::
ContainsMatcher
<
M
>
Contains
(
M
matcher
)
{
return
internal
::
ContainsMatcher
<
M
>
(
matcher
);
}
// Matches an STL-style container or a native array that contains only
// elements matching the given value or matcher.
//
// Each(m) is semantically equivalent to Not(Contains(Not(m))). Only
// the messages are different.
//
// Examples:
// ::std::set<int> page_ids;
// // Each(m) matches an empty container, regardless of what m is.
// EXPECT_THAT(page_ids, Each(Eq(1)));
// EXPECT_THAT(page_ids, Each(Eq(77)));
//
// page_ids.insert(3);
// EXPECT_THAT(page_ids, Each(Gt(0)));
// EXPECT_THAT(page_ids, Not(Each(Gt(4))));
// page_ids.insert(1);
// EXPECT_THAT(page_ids, Not(Each(Lt(2))));
//
// ::std::map<int, size_t> page_lengths;
// page_lengths[1] = 100;
// page_lengths[2] = 200;
// page_lengths[3] = 300;
// EXPECT_THAT(page_lengths, Not(Each(Pair(1, 100))));
// EXPECT_THAT(page_lengths, Each(Key(Le(3))));
//
// const char* user_ids[] = { "joe", "mike", "tom" };
// EXPECT_THAT(user_ids, Not(Each(Eq(::std::string("tom")))));
template
<
typename
M
>
inline
internal
::
EachMatcher
<
M
>
Each
(
M
matcher
)
{
return
internal
::
EachMatcher
<
M
>
(
matcher
);
}
// Key(inner_matcher) matches an std::pair whose 'first' field matches
// inner_matcher. For example, Contains(Key(Ge(5))) can be used to match an
// std::map that contains at least one element whose key is >= 5.
template
<
typename
M
>
inline
internal
::
KeyMatcher
<
M
>
Key
(
M
inner_matcher
)
{
return
internal
::
KeyMatcher
<
M
>
(
inner_matcher
);
}
// Pair(first_matcher, second_matcher) matches a std::pair whose 'first' field
// matches first_matcher and whose 'second' field matches second_matcher. For
// example, EXPECT_THAT(map_type, ElementsAre(Pair(Ge(5), "foo"))) can be used
// to match a std::map<int, string> that contains exactly one element whose key
// is >= 5 and whose value equals "foo".
template
<
typename
FirstMatcher
,
typename
SecondMatcher
>
inline
internal
::
PairMatcher
<
FirstMatcher
,
SecondMatcher
>
Pair
(
FirstMatcher
first_matcher
,
SecondMatcher
second_matcher
)
{
return
internal
::
PairMatcher
<
FirstMatcher
,
SecondMatcher
>
(
first_matcher
,
second_matcher
);
}
// Returns a predicate that is satisfied by anything that matches the
// given matcher.
template
<
typename
M
>
inline
internal
::
MatcherAsPredicate
<
M
>
Matches
(
M
matcher
)
{
return
internal
::
MatcherAsPredicate
<
M
>
(
matcher
);
}
// Returns true iff the value matches the matcher.
template
<
typename
T
,
typename
M
>
inline
bool
Value
(
const
T
&
value
,
M
matcher
)
{
return
testing
::
Matches
(
matcher
)(
value
);
}
// Matches the value against the given matcher and explains the match
// result to listener.
template
<
typename
T
,
typename
M
>
inline
bool
ExplainMatchResult
(
M
matcher
,
const
T
&
value
,
MatchResultListener
*
listener
)
{
return
SafeMatcherCast
<
const
T
&>
(
matcher
).
MatchAndExplain
(
value
,
listener
);
}
#if GTEST_LANG_CXX11
// Define variadic matcher versions. They are overloaded in
// gmock-generated-matchers.h for the cases supported by pre C++11 compilers.
template
<
typename
...
Args
>
inline
internal
::
AllOfMatcher
<
Args
...
>
AllOf
(
const
Args
&
...
matchers
)
{
return
internal
::
AllOfMatcher
<
Args
...
>
(
matchers
...);
}
template
<
typename
...
Args
>
inline
internal
::
AnyOfMatcher
<
Args
...
>
AnyOf
(
const
Args
&
...
matchers
)
{
return
internal
::
AnyOfMatcher
<
Args
...
>
(
matchers
...);
}
#endif // GTEST_LANG_CXX11
// AllArgs(m) is a synonym of m. This is useful in
//
// EXPECT_CALL(foo, Bar(_, _)).With(AllArgs(Eq()));
//
// which is easier to read than
//
// EXPECT_CALL(foo, Bar(_, _)).With(Eq());
template
<
typename
InnerMatcher
>
inline
InnerMatcher
AllArgs
(
const
InnerMatcher
&
matcher
)
{
return
matcher
;
}
// These macros allow using matchers to check values in Google Test
// tests. ASSERT_THAT(value, matcher) and EXPECT_THAT(value, matcher)
// succeed iff the value matches the matcher. If the assertion fails,
// the value and the description of the matcher will be printed.
#define ASSERT_THAT(value, matcher) ASSERT_PRED_FORMAT1(\
::testing::internal::MakePredicateFormatterFromMatcher(matcher), value)
#define EXPECT_THAT(value, matcher) EXPECT_PRED_FORMAT1(\
::testing::internal::MakePredicateFormatterFromMatcher(matcher), value)
}
// namespace testing
// Include any custom callback matchers added by the local installation.
// We must include this header at the end to make sure it can use the
// declarations from this file.
#include "gmock/internal/custom/gmock-matchers.h"
#endif // GMOCK_INCLUDE_GMOCK_GMOCK_MATCHERS_H_
googlemock/include/gmock/gmock-more-actions.h
0 → 100644
View file @
ecf94595
// Copyright 2007, Google Inc.
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
// * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following disclaimer
// in the documentation and/or other materials provided with the
// distribution.
// * Neither the name of Google Inc. nor the names of its
// contributors may be used to endorse or promote products derived from
// this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//
// Author: wan@google.com (Zhanyong Wan)
// Google Mock - a framework for writing C++ mock classes.
//
// This file implements some actions that depend on gmock-generated-actions.h.
#ifndef GMOCK_INCLUDE_GMOCK_GMOCK_MORE_ACTIONS_H_
#define GMOCK_INCLUDE_GMOCK_GMOCK_MORE_ACTIONS_H_
#include <algorithm>
#include "gmock/gmock-generated-actions.h"
namespace
testing
{
namespace
internal
{
// Implements the Invoke(f) action. The template argument
// FunctionImpl is the implementation type of f, which can be either a
// function pointer or a functor. Invoke(f) can be used as an
// Action<F> as long as f's type is compatible with F (i.e. f can be
// assigned to a tr1::function<F>).
template
<
typename
FunctionImpl
>
class
InvokeAction
{
public:
// The c'tor makes a copy of function_impl (either a function
// pointer or a functor).
explicit
InvokeAction
(
FunctionImpl
function_impl
)
:
function_impl_
(
function_impl
)
{}
template
<
typename
Result
,
typename
ArgumentTuple
>
Result
Perform
(
const
ArgumentTuple
&
args
)
{
return
InvokeHelper
<
Result
,
ArgumentTuple
>::
Invoke
(
function_impl_
,
args
);
}
private:
FunctionImpl
function_impl_
;
GTEST_DISALLOW_ASSIGN_
(
InvokeAction
);
};
// Implements the Invoke(object_ptr, &Class::Method) action.
template
<
class
Class
,
typename
MethodPtr
>
class
InvokeMethodAction
{
public:
InvokeMethodAction
(
Class
*
obj_ptr
,
MethodPtr
method_ptr
)
:
method_ptr_
(
method_ptr
),
obj_ptr_
(
obj_ptr
)
{}
template
<
typename
Result
,
typename
ArgumentTuple
>
Result
Perform
(
const
ArgumentTuple
&
args
)
const
{
return
InvokeHelper
<
Result
,
ArgumentTuple
>::
InvokeMethod
(
obj_ptr_
,
method_ptr_
,
args
);
}
private:
// The order of these members matters. Reversing the order can trigger
// warning C4121 in MSVC (see
// http://computer-programming-forum.com/7-vc.net/6fbc30265f860ad1.htm ).
const
MethodPtr
method_ptr_
;
Class
*
const
obj_ptr_
;
GTEST_DISALLOW_ASSIGN_
(
InvokeMethodAction
);
};
// An internal replacement for std::copy which mimics its behavior. This is
// necessary because Visual Studio deprecates ::std::copy, issuing warning 4996.
// However Visual Studio 2010 and later do not honor #pragmas which disable that
// warning.
template
<
typename
InputIterator
,
typename
OutputIterator
>
inline
OutputIterator
CopyElements
(
InputIterator
first
,
InputIterator
last
,
OutputIterator
output
)
{
for
(;
first
!=
last
;
++
first
,
++
output
)
{
*
output
=
*
first
;
}
return
output
;
}
}
// namespace internal
// Various overloads for Invoke().
// Creates an action that invokes 'function_impl' with the mock
// function's arguments.
template
<
typename
FunctionImpl
>
PolymorphicAction
<
internal
::
InvokeAction
<
FunctionImpl
>
>
Invoke
(
FunctionImpl
function_impl
)
{
return
MakePolymorphicAction
(
internal
::
InvokeAction
<
FunctionImpl
>
(
function_impl
));
}
// Creates an action that invokes the given method on the given object
// with the mock function's arguments.
template
<
class
Class
,
typename
MethodPtr
>
PolymorphicAction
<
internal
::
InvokeMethodAction
<
Class
,
MethodPtr
>
>
Invoke
(
Class
*
obj_ptr
,
MethodPtr
method_ptr
)
{
return
MakePolymorphicAction
(
internal
::
InvokeMethodAction
<
Class
,
MethodPtr
>
(
obj_ptr
,
method_ptr
));
}
// WithoutArgs(inner_action) can be used in a mock function with a
// non-empty argument list to perform inner_action, which takes no
// argument. In other words, it adapts an action accepting no
// argument to one that accepts (and ignores) arguments.
template
<
typename
InnerAction
>
inline
internal
::
WithArgsAction
<
InnerAction
>
WithoutArgs
(
const
InnerAction
&
action
)
{
return
internal
::
WithArgsAction
<
InnerAction
>
(
action
);
}
// WithArg<k>(an_action) creates an action that passes the k-th
// (0-based) argument of the mock function to an_action and performs
// it. It adapts an action accepting one argument to one that accepts
// multiple arguments. For convenience, we also provide
// WithArgs<k>(an_action) (defined below) as a synonym.
template
<
int
k
,
typename
InnerAction
>
inline
internal
::
WithArgsAction
<
InnerAction
,
k
>
WithArg
(
const
InnerAction
&
action
)
{
return
internal
::
WithArgsAction
<
InnerAction
,
k
>
(
action
);
}
// The ACTION*() macros trigger warning C4100 (unreferenced formal
// parameter) in MSVC with -W4. Unfortunately they cannot be fixed in
// the macro definition, as the warnings are generated when the macro
// is expanded and macro expansion cannot contain #pragma. Therefore
// we suppress them here.
#ifdef _MSC_VER
# pragma warning(push)
# pragma warning(disable:4100)
#endif
// Action ReturnArg<k>() returns the k-th argument of the mock function.
ACTION_TEMPLATE
(
ReturnArg
,
HAS_1_TEMPLATE_PARAMS
(
int
,
k
),
AND_0_VALUE_PARAMS
())
{
return
::
testing
::
get
<
k
>
(
args
);
}
// Action SaveArg<k>(pointer) saves the k-th (0-based) argument of the
// mock function to *pointer.
ACTION_TEMPLATE
(
SaveArg
,
HAS_1_TEMPLATE_PARAMS
(
int
,
k
),
AND_1_VALUE_PARAMS
(
pointer
))
{
*
pointer
=
::
testing
::
get
<
k
>
(
args
);
}
// Action SaveArgPointee<k>(pointer) saves the value pointed to
// by the k-th (0-based) argument of the mock function to *pointer.
ACTION_TEMPLATE
(
SaveArgPointee
,
HAS_1_TEMPLATE_PARAMS
(
int
,
k
),
AND_1_VALUE_PARAMS
(
pointer
))
{
*
pointer
=
*::
testing
::
get
<
k
>
(
args
);
}
// Action SetArgReferee<k>(value) assigns 'value' to the variable
// referenced by the k-th (0-based) argument of the mock function.
ACTION_TEMPLATE
(
SetArgReferee
,
HAS_1_TEMPLATE_PARAMS
(
int
,
k
),
AND_1_VALUE_PARAMS
(
value
))
{
typedef
typename
::
testing
::
tuple_element
<
k
,
args_type
>::
type
argk_type
;
// Ensures that argument #k is a reference. If you get a compiler
// error on the next line, you are using SetArgReferee<k>(value) in
// a mock function whose k-th (0-based) argument is not a reference.
GTEST_COMPILE_ASSERT_
(
internal
::
is_reference
<
argk_type
>::
value
,
SetArgReferee_must_be_used_with_a_reference_argument
);
::
testing
::
get
<
k
>
(
args
)
=
value
;
}
// Action SetArrayArgument<k>(first, last) copies the elements in
// source range [first, last) to the array pointed to by the k-th
// (0-based) argument, which can be either a pointer or an
// iterator. The action does not take ownership of the elements in the
// source range.
ACTION_TEMPLATE
(
SetArrayArgument
,
HAS_1_TEMPLATE_PARAMS
(
int
,
k
),
AND_2_VALUE_PARAMS
(
first
,
last
))
{
// Visual Studio deprecates ::std::copy, so we use our own copy in that case.
#ifdef _MSC_VER
internal
::
CopyElements
(
first
,
last
,
::
testing
::
get
<
k
>
(
args
));
#else
::
std
::
copy
(
first
,
last
,
::
testing
::
get
<
k
>
(
args
));
#endif
}
// Action DeleteArg<k>() deletes the k-th (0-based) argument of the mock
// function.
ACTION_TEMPLATE
(
DeleteArg
,
HAS_1_TEMPLATE_PARAMS
(
int
,
k
),
AND_0_VALUE_PARAMS
())
{
delete
::
testing
::
get
<
k
>
(
args
);
}
// This action returns the value pointed to by 'pointer'.
ACTION_P
(
ReturnPointee
,
pointer
)
{
return
*
pointer
;
}
// Action Throw(exception) can be used in a mock function of any type
// to throw the given exception. Any copyable value can be thrown.
#if GTEST_HAS_EXCEPTIONS
// Suppresses the 'unreachable code' warning that VC generates in opt modes.
# ifdef _MSC_VER
# pragma warning(push) // Saves the current warning state.
# pragma warning(disable:4702) // Temporarily disables warning 4702.
# endif
ACTION_P
(
Throw
,
exception
)
{
throw
exception
;
}
# ifdef _MSC_VER
# pragma warning(pop) // Restores the warning state.
# endif
#endif // GTEST_HAS_EXCEPTIONS
#ifdef _MSC_VER
# pragma warning(pop)
#endif
}
// namespace testing
#endif // GMOCK_INCLUDE_GMOCK_GMOCK_MORE_ACTIONS_H_
googlemock/include/gmock/gmock-more-matchers.h
0 → 100644
View file @
ecf94595
// Copyright 2013, Google Inc.
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
// * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following disclaimer
// in the documentation and/or other materials provided with the
// distribution.
// * Neither the name of Google Inc. nor the names of its
// contributors may be used to endorse or promote products derived from
// this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//
// Author: marcus.boerger@google.com (Marcus Boerger)
// Google Mock - a framework for writing C++ mock classes.
//
// This file implements some matchers that depend on gmock-generated-matchers.h.
//
// Note that tests are implemented in gmock-matchers_test.cc rather than
// gmock-more-matchers-test.cc.
#ifndef GMOCK_GMOCK_MORE_MATCHERS_H_
#define GMOCK_GMOCK_MORE_MATCHERS_H_
#include "gmock/gmock-generated-matchers.h"
namespace
testing
{
// Defines a matcher that matches an empty container. The container must
// support both size() and empty(), which all STL-like containers provide.
MATCHER
(
IsEmpty
,
negation
?
"isn't empty"
:
"is empty"
)
{
if
(
arg
.
empty
())
{
return
true
;
}
*
result_listener
<<
"whose size is "
<<
arg
.
size
();
return
false
;
}
}
// namespace testing
#endif // GMOCK_GMOCK_MORE_MATCHERS_H_
googlemock/include/gmock/gmock-spec-builders.h
0 → 100644
View file @
ecf94595
// Copyright 2007, Google Inc.
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
// * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following disclaimer
// in the documentation and/or other materials provided with the
// distribution.
// * Neither the name of Google Inc. nor the names of its
// contributors may be used to endorse or promote products derived from
// this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//
// Author: wan@google.com (Zhanyong Wan)
// Google Mock - a framework for writing C++ mock classes.
//
// This file implements the ON_CALL() and EXPECT_CALL() macros.
//
// A user can use the ON_CALL() macro to specify the default action of
// a mock method. The syntax is:
//
// ON_CALL(mock_object, Method(argument-matchers))
// .With(multi-argument-matcher)
// .WillByDefault(action);
//
// where the .With() clause is optional.
//
// A user can use the EXPECT_CALL() macro to specify an expectation on
// a mock method. The syntax is:
//
// EXPECT_CALL(mock_object, Method(argument-matchers))
// .With(multi-argument-matchers)
// .Times(cardinality)
// .InSequence(sequences)
// .After(expectations)
// .WillOnce(action)
// .WillRepeatedly(action)
// .RetiresOnSaturation();
//
// where all clauses are optional, and .InSequence()/.After()/
// .WillOnce() can appear any number of times.
#ifndef GMOCK_INCLUDE_GMOCK_GMOCK_SPEC_BUILDERS_H_
#define GMOCK_INCLUDE_GMOCK_GMOCK_SPEC_BUILDERS_H_
#include <map>
#include <set>
#include <sstream>
#include <string>
#include <vector>
#if GTEST_HAS_EXCEPTIONS
# include <stdexcept> // NOLINT
#endif
#include "gmock/gmock-actions.h"
#include "gmock/gmock-cardinalities.h"
#include "gmock/gmock-matchers.h"
#include "gmock/internal/gmock-internal-utils.h"
#include "gmock/internal/gmock-port.h"
#include "gtest/gtest.h"
namespace
testing
{
// An abstract handle of an expectation.
class
Expectation
;
// A set of expectation handles.
class
ExpectationSet
;
// Anything inside the 'internal' namespace IS INTERNAL IMPLEMENTATION
// and MUST NOT BE USED IN USER CODE!!!
namespace
internal
{
// Implements a mock function.
template
<
typename
F
>
class
FunctionMocker
;
// Base class for expectations.
class
ExpectationBase
;
// Implements an expectation.
template
<
typename
F
>
class
TypedExpectation
;
// Helper class for testing the Expectation class template.
class
ExpectationTester
;
// Base class for function mockers.
template
<
typename
F
>
class
FunctionMockerBase
;
// Protects the mock object registry (in class Mock), all function
// mockers, and all expectations.
//
// The reason we don't use more fine-grained protection is: when a
// mock function Foo() is called, it needs to consult its expectations
// to see which one should be picked. If another thread is allowed to
// call a mock function (either Foo() or a different one) at the same
// time, it could affect the "retired" attributes of Foo()'s
// expectations when InSequence() is used, and thus affect which
// expectation gets picked. Therefore, we sequence all mock function
// calls to ensure the integrity of the mock objects' states.
GTEST_API_
GTEST_DECLARE_STATIC_MUTEX_
(
g_gmock_mutex
);
// Untyped base class for ActionResultHolder<R>.
class
UntypedActionResultHolderBase
;
// Abstract base class of FunctionMockerBase. This is the
// type-agnostic part of the function mocker interface. Its pure
// virtual methods are implemented by FunctionMockerBase.
class
GTEST_API_
UntypedFunctionMockerBase
{
public:
UntypedFunctionMockerBase
();
virtual
~
UntypedFunctionMockerBase
();
// Verifies that all expectations on this mock function have been
// satisfied. Reports one or more Google Test non-fatal failures
// and returns false if not.
bool
VerifyAndClearExpectationsLocked
()
GTEST_EXCLUSIVE_LOCK_REQUIRED_
(
g_gmock_mutex
);
// Clears the ON_CALL()s set on this mock function.
virtual
void
ClearDefaultActionsLocked
()
GTEST_EXCLUSIVE_LOCK_REQUIRED_
(
g_gmock_mutex
)
=
0
;
// In all of the following Untyped* functions, it's the caller's
// responsibility to guarantee the correctness of the arguments'
// types.
// Performs the default action with the given arguments and returns
// the action's result. The call description string will be used in
// the error message to describe the call in the case the default
// action fails.
// L = *
virtual
UntypedActionResultHolderBase
*
UntypedPerformDefaultAction
(
const
void
*
untyped_args
,
const
string
&
call_description
)
const
=
0
;
// Performs the given action with the given arguments and returns
// the action's result.
// L = *
virtual
UntypedActionResultHolderBase
*
UntypedPerformAction
(
const
void
*
untyped_action
,
const
void
*
untyped_args
)
const
=
0
;
// Writes a message that the call is uninteresting (i.e. neither
// explicitly expected nor explicitly unexpected) to the given
// ostream.
virtual
void
UntypedDescribeUninterestingCall
(
const
void
*
untyped_args
,
::
std
::
ostream
*
os
)
const
GTEST_LOCK_EXCLUDED_
(
g_gmock_mutex
)
=
0
;
// Returns the expectation that matches the given function arguments
// (or NULL is there's no match); when a match is found,
// untyped_action is set to point to the action that should be
// performed (or NULL if the action is "do default"), and
// is_excessive is modified to indicate whether the call exceeds the
// expected number.
virtual
const
ExpectationBase
*
UntypedFindMatchingExpectation
(
const
void
*
untyped_args
,
const
void
**
untyped_action
,
bool
*
is_excessive
,
::
std
::
ostream
*
what
,
::
std
::
ostream
*
why
)
GTEST_LOCK_EXCLUDED_
(
g_gmock_mutex
)
=
0
;
// Prints the given function arguments to the ostream.
virtual
void
UntypedPrintArgs
(
const
void
*
untyped_args
,
::
std
::
ostream
*
os
)
const
=
0
;
// Sets the mock object this mock method belongs to, and registers
// this information in the global mock registry. Will be called
// whenever an EXPECT_CALL() or ON_CALL() is executed on this mock
// method.
// TODO(wan@google.com): rename to SetAndRegisterOwner().
void
RegisterOwner
(
const
void
*
mock_obj
)
GTEST_LOCK_EXCLUDED_
(
g_gmock_mutex
);
// Sets the mock object this mock method belongs to, and sets the
// name of the mock function. Will be called upon each invocation
// of this mock function.
void
SetOwnerAndName
(
const
void
*
mock_obj
,
const
char
*
name
)
GTEST_LOCK_EXCLUDED_
(
g_gmock_mutex
);
// Returns the mock object this mock method belongs to. Must be
// called after RegisterOwner() or SetOwnerAndName() has been
// called.
const
void
*
MockObject
()
const
GTEST_LOCK_EXCLUDED_
(
g_gmock_mutex
);
// Returns the name of this mock method. Must be called after
// SetOwnerAndName() has been called.
const
char
*
Name
()
const
GTEST_LOCK_EXCLUDED_
(
g_gmock_mutex
);
// Returns the result of invoking this mock function with the given
// arguments. This function can be safely called from multiple
// threads concurrently. The caller is responsible for deleting the
// result.
UntypedActionResultHolderBase
*
UntypedInvokeWith
(
const
void
*
untyped_args
)
GTEST_LOCK_EXCLUDED_
(
g_gmock_mutex
);
protected:
typedef
std
::
vector
<
const
void
*>
UntypedOnCallSpecs
;
typedef
std
::
vector
<
internal
::
linked_ptr
<
ExpectationBase
>
>
UntypedExpectations
;
// Returns an Expectation object that references and co-owns exp,
// which must be an expectation on this mock function.
Expectation
GetHandleOf
(
ExpectationBase
*
exp
);
// Address of the mock object this mock method belongs to. Only
// valid after this mock method has been called or
// ON_CALL/EXPECT_CALL has been invoked on it.
const
void
*
mock_obj_
;
// Protected by g_gmock_mutex.
// Name of the function being mocked. Only valid after this mock
// method has been called.
const
char
*
name_
;
// Protected by g_gmock_mutex.
// All default action specs for this function mocker.
UntypedOnCallSpecs
untyped_on_call_specs_
;
// All expectations for this function mocker.
UntypedExpectations
untyped_expectations_
;
};
// class UntypedFunctionMockerBase
// Untyped base class for OnCallSpec<F>.
class
UntypedOnCallSpecBase
{
public:
// The arguments are the location of the ON_CALL() statement.
UntypedOnCallSpecBase
(
const
char
*
a_file
,
int
a_line
)
:
file_
(
a_file
),
line_
(
a_line
),
last_clause_
(
kNone
)
{}
// Where in the source file was the default action spec defined?
const
char
*
file
()
const
{
return
file_
;
}
int
line
()
const
{
return
line_
;
}
protected:
// Gives each clause in the ON_CALL() statement a name.
enum
Clause
{
// Do not change the order of the enum members! The run-time
// syntax checking relies on it.
kNone
,
kWith
,
kWillByDefault
};
// Asserts that the ON_CALL() statement has a certain property.
void
AssertSpecProperty
(
bool
property
,
const
string
&
failure_message
)
const
{
Assert
(
property
,
file_
,
line_
,
failure_message
);
}
// Expects that the ON_CALL() statement has a certain property.
void
ExpectSpecProperty
(
bool
property
,
const
string
&
failure_message
)
const
{
Expect
(
property
,
file_
,
line_
,
failure_message
);
}
const
char
*
file_
;
int
line_
;
// The last clause in the ON_CALL() statement as seen so far.
// Initially kNone and changes as the statement is parsed.
Clause
last_clause_
;
};
// class UntypedOnCallSpecBase
// This template class implements an ON_CALL spec.
template
<
typename
F
>
class
OnCallSpec
:
public
UntypedOnCallSpecBase
{
public:
typedef
typename
Function
<
F
>::
ArgumentTuple
ArgumentTuple
;
typedef
typename
Function
<
F
>::
ArgumentMatcherTuple
ArgumentMatcherTuple
;
// Constructs an OnCallSpec object from the information inside
// the parenthesis of an ON_CALL() statement.
OnCallSpec
(
const
char
*
a_file
,
int
a_line
,
const
ArgumentMatcherTuple
&
matchers
)
:
UntypedOnCallSpecBase
(
a_file
,
a_line
),
matchers_
(
matchers
),
// 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
// overloaded constructors of Matcher<const ArgumentTuple&>).
extra_matcher_
(
A
<
const
ArgumentTuple
&>
())
{
}
// Implements the .With() clause.
OnCallSpec
&
With
(
const
Matcher
<
const
ArgumentTuple
&>&
m
)
{
// Makes sure this is called at most once.
ExpectSpecProperty
(
last_clause_
<
kWith
,
".With() cannot appear "
"more than once in an ON_CALL()."
);
last_clause_
=
kWith
;
extra_matcher_
=
m
;
return
*
this
;
}
// Implements the .WillByDefault() clause.
OnCallSpec
&
WillByDefault
(
const
Action
<
F
>&
action
)
{
ExpectSpecProperty
(
last_clause_
<
kWillByDefault
,
".WillByDefault() must appear "
"exactly once in an ON_CALL()."
);
last_clause_
=
kWillByDefault
;
ExpectSpecProperty
(
!
action
.
IsDoDefault
(),
"DoDefault() cannot be used in ON_CALL()."
);
action_
=
action
;
return
*
this
;
}
// Returns true iff the given arguments match the matchers.
bool
Matches
(
const
ArgumentTuple
&
args
)
const
{
return
TupleMatches
(
matchers_
,
args
)
&&
extra_matcher_
.
Matches
(
args
);
}
// Returns the action specified by the user.
const
Action
<
F
>&
GetAction
()
const
{
AssertSpecProperty
(
last_clause_
==
kWillByDefault
,
".WillByDefault() must appear exactly "
"once in an ON_CALL()."
);
return
action_
;
}
private:
// The information in statement
//
// ON_CALL(mock_object, Method(matchers))
// .With(multi-argument-matcher)
// .WillByDefault(action);
//
// is recorded in the data members like this:
//
// source file that contains the statement => file_
// line number of the statement => line_
// matchers => matchers_
// multi-argument-matcher => extra_matcher_
// action => action_
ArgumentMatcherTuple
matchers_
;
Matcher
<
const
ArgumentTuple
&>
extra_matcher_
;
Action
<
F
>
action_
;
};
// class OnCallSpec
// Possible reactions on uninteresting calls.
enum
CallReaction
{
kAllow
,
kWarn
,
kFail
,
kDefault
=
kWarn
// By default, warn about uninteresting calls.
};
}
// namespace internal
// Utilities for manipulating mock objects.
class
GTEST_API_
Mock
{
public:
// The following public methods can be called concurrently.
// Tells Google Mock to ignore mock_obj when checking for leaked
// mock objects.
static
void
AllowLeak
(
const
void
*
mock_obj
)
GTEST_LOCK_EXCLUDED_
(
internal
::
g_gmock_mutex
);
// Verifies and clears all expectations on the given mock object.
// If the expectations aren't satisfied, generates one or more
// Google Test non-fatal failures and returns false.
static
bool
VerifyAndClearExpectations
(
void
*
mock_obj
)
GTEST_LOCK_EXCLUDED_
(
internal
::
g_gmock_mutex
);
// Verifies all expectations on the given mock object and clears its
// default actions and expectations. Returns true iff the
// verification was successful.
static
bool
VerifyAndClear
(
void
*
mock_obj
)
GTEST_LOCK_EXCLUDED_
(
internal
::
g_gmock_mutex
);
private:
friend
class
internal
::
UntypedFunctionMockerBase
;
// Needed for a function mocker to register itself (so that we know
// how to clear a mock object).
template
<
typename
F
>
friend
class
internal
::
FunctionMockerBase
;
template
<
typename
M
>
friend
class
NiceMock
;
template
<
typename
M
>
friend
class
NaggyMock
;
template
<
typename
M
>
friend
class
StrictMock
;
// Tells Google Mock to allow uninteresting calls on the given mock
// object.
static
void
AllowUninterestingCalls
(
const
void
*
mock_obj
)
GTEST_LOCK_EXCLUDED_
(
internal
::
g_gmock_mutex
);
// Tells Google Mock to warn the user about uninteresting calls on
// the given mock object.
static
void
WarnUninterestingCalls
(
const
void
*
mock_obj
)
GTEST_LOCK_EXCLUDED_
(
internal
::
g_gmock_mutex
);
// Tells Google Mock to fail uninteresting calls on the given mock
// object.
static
void
FailUninterestingCalls
(
const
void
*
mock_obj
)
GTEST_LOCK_EXCLUDED_
(
internal
::
g_gmock_mutex
);
// Tells Google Mock the given mock object is being destroyed and
// its entry in the call-reaction table should be removed.
static
void
UnregisterCallReaction
(
const
void
*
mock_obj
)
GTEST_LOCK_EXCLUDED_
(
internal
::
g_gmock_mutex
);
// Returns the reaction Google Mock will have on uninteresting calls
// made on the given mock object.
static
internal
::
CallReaction
GetReactionOnUninterestingCalls
(
const
void
*
mock_obj
)
GTEST_LOCK_EXCLUDED_
(
internal
::
g_gmock_mutex
);
// Verifies that all expectations on the given mock object have been
// satisfied. Reports one or more Google Test non-fatal failures
// and returns false if not.
static
bool
VerifyAndClearExpectationsLocked
(
void
*
mock_obj
)
GTEST_EXCLUSIVE_LOCK_REQUIRED_
(
internal
::
g_gmock_mutex
);
// Clears all ON_CALL()s set on the given mock object.
static
void
ClearDefaultActionsLocked
(
void
*
mock_obj
)
GTEST_EXCLUSIVE_LOCK_REQUIRED_
(
internal
::
g_gmock_mutex
);
// Registers a mock object and a mock method it owns.
static
void
Register
(
const
void
*
mock_obj
,
internal
::
UntypedFunctionMockerBase
*
mocker
)
GTEST_LOCK_EXCLUDED_
(
internal
::
g_gmock_mutex
);
// Tells Google Mock where in the source code mock_obj is used in an
// ON_CALL or EXPECT_CALL. In case mock_obj is leaked, this
// information helps the user identify which object it is.
static
void
RegisterUseByOnCallOrExpectCall
(
const
void
*
mock_obj
,
const
char
*
file
,
int
line
)
GTEST_LOCK_EXCLUDED_
(
internal
::
g_gmock_mutex
);
// Unregisters a mock method; removes the owning mock object from
// the registry when the last mock method associated with it has
// been unregistered. This is called only in the destructor of
// FunctionMockerBase.
static
void
UnregisterLocked
(
internal
::
UntypedFunctionMockerBase
*
mocker
)
GTEST_EXCLUSIVE_LOCK_REQUIRED_
(
internal
::
g_gmock_mutex
);
};
// class Mock
// An abstract handle of an expectation. Useful in the .After()
// clause of EXPECT_CALL() for setting the (partial) order of
// expectations. The syntax:
//
// Expectation e1 = EXPECT_CALL(...)...;
// EXPECT_CALL(...).After(e1)...;
//
// sets two expectations where the latter can only be matched after
// the former has been satisfied.
//
// Notes:
// - This class is copyable and has value semantics.
// - Constness is shallow: a const Expectation object itself cannot
// be modified, but the mutable methods of the ExpectationBase
// object it references can be called via expectation_base().
// - The constructors and destructor are defined out-of-line because
// the Symbian WINSCW compiler wants to otherwise instantiate them
// when it sees this class definition, at which point it doesn't have
// ExpectationBase available yet, leading to incorrect destruction
// in the linked_ptr (or compilation errors if using a checking
// linked_ptr).
class
GTEST_API_
Expectation
{
public:
// Constructs a null object that doesn't reference any expectation.
Expectation
();
~
Expectation
();
// This single-argument ctor must not be explicit, in order to support the
// Expectation e = EXPECT_CALL(...);
// syntax.
//
// A TypedExpectation object stores its pre-requisites as
// Expectation objects, and needs to call the non-const Retire()
// method on the ExpectationBase objects they reference. Therefore
// Expectation must receive a *non-const* reference to the
// ExpectationBase object.
Expectation
(
internal
::
ExpectationBase
&
exp
);
// NOLINT
// The compiler-generated copy ctor and operator= work exactly as
// intended, so we don't need to define our own.
// Returns true iff rhs references the same expectation as this object does.
bool
operator
==
(
const
Expectation
&
rhs
)
const
{
return
expectation_base_
==
rhs
.
expectation_base_
;
}
bool
operator
!=
(
const
Expectation
&
rhs
)
const
{
return
!
(
*
this
==
rhs
);
}
private:
friend
class
ExpectationSet
;
friend
class
Sequence
;
friend
class
::
testing
::
internal
::
ExpectationBase
;
friend
class
::
testing
::
internal
::
UntypedFunctionMockerBase
;
template
<
typename
F
>
friend
class
::
testing
::
internal
::
FunctionMockerBase
;
template
<
typename
F
>
friend
class
::
testing
::
internal
::
TypedExpectation
;
// This comparator is needed for putting Expectation objects into a set.
class
Less
{
public:
bool
operator
()(
const
Expectation
&
lhs
,
const
Expectation
&
rhs
)
const
{
return
lhs
.
expectation_base_
.
get
()
<
rhs
.
expectation_base_
.
get
();
}
};
typedef
::
std
::
set
<
Expectation
,
Less
>
Set
;
Expectation
(
const
internal
::
linked_ptr
<
internal
::
ExpectationBase
>&
expectation_base
);
// Returns the expectation this object references.
const
internal
::
linked_ptr
<
internal
::
ExpectationBase
>&
expectation_base
()
const
{
return
expectation_base_
;
}
// A linked_ptr that co-owns the expectation this handle references.
internal
::
linked_ptr
<
internal
::
ExpectationBase
>
expectation_base_
;
};
// A set of expectation handles. Useful in the .After() clause of
// EXPECT_CALL() for setting the (partial) order of expectations. The
// syntax:
//
// ExpectationSet es;
// es += EXPECT_CALL(...)...;
// es += EXPECT_CALL(...)...;
// EXPECT_CALL(...).After(es)...;
//
// sets three expectations where the last one can only be matched
// after the first two have both been satisfied.
//
// This class is copyable and has value semantics.
class
ExpectationSet
{
public:
// A bidirectional iterator that can read a const element in the set.
typedef
Expectation
::
Set
::
const_iterator
const_iterator
;
// An object stored in the set. This is an alias of Expectation.
typedef
Expectation
::
Set
::
value_type
value_type
;
// Constructs an empty set.
ExpectationSet
()
{}
// This single-argument ctor must not be explicit, in order to support the
// ExpectationSet es = EXPECT_CALL(...);
// syntax.
ExpectationSet
(
internal
::
ExpectationBase
&
exp
)
{
// NOLINT
*
this
+=
Expectation
(
exp
);
}
// This single-argument ctor implements implicit conversion from
// Expectation and thus must not be explicit. This allows either an
// Expectation or an ExpectationSet to be used in .After().
ExpectationSet
(
const
Expectation
&
e
)
{
// NOLINT
*
this
+=
e
;
}
// The compiler-generator ctor and operator= works exactly as
// intended, so we don't need to define our own.
// Returns true iff rhs contains the same set of Expectation objects
// as this does.
bool
operator
==
(
const
ExpectationSet
&
rhs
)
const
{
return
expectations_
==
rhs
.
expectations_
;
}
bool
operator
!=
(
const
ExpectationSet
&
rhs
)
const
{
return
!
(
*
this
==
rhs
);
}
// Implements the syntax
// expectation_set += EXPECT_CALL(...);
ExpectationSet
&
operator
+=
(
const
Expectation
&
e
)
{
expectations_
.
insert
(
e
);
return
*
this
;
}
int
size
()
const
{
return
static_cast
<
int
>
(
expectations_
.
size
());
}
const_iterator
begin
()
const
{
return
expectations_
.
begin
();
}
const_iterator
end
()
const
{
return
expectations_
.
end
();
}
private:
Expectation
::
Set
expectations_
;
};
// Sequence objects are used by a user to specify the relative order
// in which the expectations should match. They are copyable (we rely
// on the compiler-defined copy constructor and assignment operator).
class
GTEST_API_
Sequence
{
public:
// Constructs an empty sequence.
Sequence
()
:
last_expectation_
(
new
Expectation
)
{}
// Adds an expectation to this sequence. The caller must ensure
// that no other thread is accessing this Sequence object.
void
AddExpectation
(
const
Expectation
&
expectation
)
const
;
private:
// The last expectation in this sequence. We use a linked_ptr here
// because Sequence objects are copyable and we want the copies to
// be aliases. The linked_ptr allows the copies to co-own and share
// the same Expectation object.
internal
::
linked_ptr
<
Expectation
>
last_expectation_
;
};
// class Sequence
// An object of this type causes all EXPECT_CALL() statements
// encountered in its scope to be put in an anonymous sequence. The
// work is done in the constructor and destructor. You should only
// create an InSequence object on the stack.
//
// The sole purpose for this class is to support easy definition of
// sequential expectations, e.g.
//
// {
// InSequence dummy; // The name of the object doesn't matter.
//
// // The following expectations must match in the order they appear.
// EXPECT_CALL(a, Bar())...;
// EXPECT_CALL(a, Baz())...;
// ...
// EXPECT_CALL(b, Xyz())...;
// }
//
// You can create InSequence objects in multiple threads, as long as
// they are used to affect different mock objects. The idea is that
// each thread can create and set up its own mocks as if it's the only
// thread. However, for clarity of your tests we recommend you to set
// up mocks in the main thread unless you have a good reason not to do
// so.
class
GTEST_API_
InSequence
{
public:
InSequence
();
~
InSequence
();
private:
bool
sequence_created_
;
GTEST_DISALLOW_COPY_AND_ASSIGN_
(
InSequence
);
// NOLINT
}
GTEST_ATTRIBUTE_UNUSED_
;
namespace
internal
{
// Points to the implicit sequence introduced by a living InSequence
// object (if any) in the current thread or NULL.
GTEST_API_
extern
ThreadLocal
<
Sequence
*>
g_gmock_implicit_sequence
;
// Base class for implementing expectations.
//
// There are two reasons for having a type-agnostic base class for
// Expectation:
//
// 1. We need to store collections of expectations of different
// types (e.g. all pre-requisites of a particular expectation, all
// expectations in a sequence). Therefore these expectation objects
// must share a common base class.
//
// 2. We can avoid binary code bloat by moving methods not depending
// on the template argument of Expectation to the base class.
//
// This class is internal and mustn't be used by user code directly.
class
GTEST_API_
ExpectationBase
{
public:
// 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_
;
}
// Describes the source file location of this expectation.
void
DescribeLocationTo
(
::
std
::
ostream
*
os
)
const
{
*
os
<<
FormatFileLocation
(
file
(),
line
())
<<
" "
;
}
// Describes how many times a function call matching this
// expectation has occurred.
void
DescribeCallCountTo
(
::
std
::
ostream
*
os
)
const
GTEST_EXCLUSIVE_LOCK_REQUIRED_
(
g_gmock_mutex
);
// If this mock method has an extra matcher (i.e. .With(matcher)),
// describes it to the ostream.
virtual
void
MaybeDescribeExtraMatcherTo
(
::
std
::
ostream
*
os
)
=
0
;
protected:
friend
class
::
testing
::
Expectation
;
friend
class
UntypedFunctionMockerBase
;
enum
Clause
{
// Don't change the order of the enum members!
kNone
,
kWith
,
kTimes
,
kInSequence
,
kAfter
,
kWillOnce
,
kWillRepeatedly
,
kRetiresOnSaturation
};
typedef
std
::
vector
<
const
void
*>
UntypedActions
;
// Returns an Expectation object that references and co-owns this
// expectation.
virtual
Expectation
GetHandle
()
=
0
;
// Asserts that the EXPECT_CALL() statement has the given property.
void
AssertSpecProperty
(
bool
property
,
const
string
&
failure_message
)
const
{
Assert
(
property
,
file_
,
line_
,
failure_message
);
}
// Expects that the EXPECT_CALL() statement has the given property.
void
ExpectSpecProperty
(
bool
property
,
const
string
&
failure_message
)
const
{
Expect
(
property
,
file_
,
line_
,
failure_message
);
}
// Explicitly specifies the cardinality of this expectation. Used
// by the subclasses to implement the .Times() clause.
void
SpecifyCardinality
(
const
Cardinality
&
cardinality
);
// Returns true iff the user specified the cardinality explicitly
// using a .Times().
bool
cardinality_specified
()
const
{
return
cardinality_specified_
;
}
// Sets the cardinality of this expectation spec.
void
set_cardinality
(
const
Cardinality
&
a_cardinality
)
{
cardinality_
=
a_cardinality
;
}
// The following group of methods should only be called after the
// EXPECT_CALL() statement, and only when g_gmock_mutex is held by
// the current thread.
// Retires all pre-requisites of this expectation.
void
RetireAllPreRequisites
()
GTEST_EXCLUSIVE_LOCK_REQUIRED_
(
g_gmock_mutex
);
// Returns true iff this expectation is retired.
bool
is_retired
()
const
GTEST_EXCLUSIVE_LOCK_REQUIRED_
(
g_gmock_mutex
)
{
g_gmock_mutex
.
AssertHeld
();
return
retired_
;
}
// Retires this expectation.
void
Retire
()
GTEST_EXCLUSIVE_LOCK_REQUIRED_
(
g_gmock_mutex
)
{
g_gmock_mutex
.
AssertHeld
();
retired_
=
true
;
}
// Returns true iff this expectation is satisfied.
bool
IsSatisfied
()
const
GTEST_EXCLUSIVE_LOCK_REQUIRED_
(
g_gmock_mutex
)
{
g_gmock_mutex
.
AssertHeld
();
return
cardinality
().
IsSatisfiedByCallCount
(
call_count_
);
}
// Returns true iff this expectation is saturated.
bool
IsSaturated
()
const
GTEST_EXCLUSIVE_LOCK_REQUIRED_
(
g_gmock_mutex
)
{
g_gmock_mutex
.
AssertHeld
();
return
cardinality
().
IsSaturatedByCallCount
(
call_count_
);
}
// Returns true iff this expectation is over-saturated.
bool
IsOverSaturated
()
const
GTEST_EXCLUSIVE_LOCK_REQUIRED_
(
g_gmock_mutex
)
{
g_gmock_mutex
.
AssertHeld
();
return
cardinality
().
IsOverSaturatedByCallCount
(
call_count_
);
}
// Returns true iff all pre-requisites of this expectation are satisfied.
bool
AllPrerequisitesAreSatisfied
()
const
GTEST_EXCLUSIVE_LOCK_REQUIRED_
(
g_gmock_mutex
);
// Adds unsatisfied pre-requisites of this expectation to 'result'.
void
FindUnsatisfiedPrerequisites
(
ExpectationSet
*
result
)
const
GTEST_EXCLUSIVE_LOCK_REQUIRED_
(
g_gmock_mutex
);
// Returns the number this expectation has been invoked.
int
call_count
()
const
GTEST_EXCLUSIVE_LOCK_REQUIRED_
(
g_gmock_mutex
)
{
g_gmock_mutex
.
AssertHeld
();
return
call_count_
;
}
// Increments the number this expectation has been invoked.
void
IncrementCallCount
()
GTEST_EXCLUSIVE_LOCK_REQUIRED_
(
g_gmock_mutex
)
{
g_gmock_mutex
.
AssertHeld
();
call_count_
++
;
}
// Checks the action count (i.e. the number of WillOnce() and
// WillRepeatedly() clauses) against the cardinality if this hasn't
// been done before. Prints a warning if there are too many or too
// few actions.
void
CheckActionCountIfNotDone
()
const
GTEST_LOCK_EXCLUDED_
(
mutex_
);
friend
class
::
testing
::
Sequence
;
friend
class
::
testing
::
internal
::
ExpectationTester
;
template
<
typename
Function
>
friend
class
TypedExpectation
;
// Implements the .Times() clause.
void
UntypedTimes
(
const
Cardinality
&
a_cardinality
);
// 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
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.
// The immediate pre-requisites (i.e. expectations that must be
// satisfied before this expectation can be matched) of this
// expectation. We use linked_ptr in the set because we want an
// Expectation object to be co-owned by its FunctionMocker and its
// successors. This allows multiple mock objects to be deleted at
// different times.
ExpectationSet
immediate_prerequisites_
;
// This group of fields are the current state of the expectation,
// 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.
UntypedActions
untyped_actions_
;
bool
extra_matcher_specified_
;
bool
repeated_action_specified_
;
// True if a WillRepeatedly() was specified.
bool
retires_on_saturation_
;
Clause
last_clause_
;
mutable
bool
action_count_checked_
;
// Under mutex_.
mutable
Mutex
mutex_
;
// Protects action_count_checked_.
GTEST_DISALLOW_ASSIGN_
(
ExpectationBase
);
};
// class ExpectationBase
// Impements an expectation for the given function type.
template
<
typename
F
>
class
TypedExpectation
:
public
ExpectationBase
{
public:
typedef
typename
Function
<
F
>::
ArgumentTuple
ArgumentTuple
;
typedef
typename
Function
<
F
>::
ArgumentMatcherTuple
ArgumentMatcherTuple
;
typedef
typename
Function
<
F
>::
Result
Result
;
TypedExpectation
(
FunctionMockerBase
<
F
>*
owner
,
const
char
*
a_file
,
int
a_line
,
const
string
&
a_source_text
,
const
ArgumentMatcherTuple
&
m
)
:
ExpectationBase
(
a_file
,
a_line
,
a_source_text
),
owner_
(
owner
),
matchers_
(
m
),
// 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
// overloaded constructors of Matcher<const ArgumentTuple&>).
extra_matcher_
(
A
<
const
ArgumentTuple
&>
()),
repeated_action_
(
DoDefault
())
{}
virtual
~
TypedExpectation
()
{
// Check the validity of the action count if it hasn't been done
// yet (for example, if the expectation was never used).
CheckActionCountIfNotDone
();
for
(
UntypedActions
::
const_iterator
it
=
untyped_actions_
.
begin
();
it
!=
untyped_actions_
.
end
();
++
it
)
{
delete
static_cast
<
const
Action
<
F
>*>
(
*
it
);
}
}
// Implements the .With() clause.
TypedExpectation
&
With
(
const
Matcher
<
const
ArgumentTuple
&>&
m
)
{
if
(
last_clause_
==
kWith
)
{
ExpectSpecProperty
(
false
,
".With() cannot appear "
"more than once in an EXPECT_CALL()."
);
}
else
{
ExpectSpecProperty
(
last_clause_
<
kWith
,
".With() must be the first "
"clause in an EXPECT_CALL()."
);
}
last_clause_
=
kWith
;
extra_matcher_
=
m
;
extra_matcher_specified_
=
true
;
return
*
this
;
}
// Implements the .Times() clause.
TypedExpectation
&
Times
(
const
Cardinality
&
a_cardinality
)
{
ExpectationBase
::
UntypedTimes
(
a_cardinality
);
return
*
this
;
}
// Implements the .Times() clause.
TypedExpectation
&
Times
(
int
n
)
{
return
Times
(
Exactly
(
n
));
}
// Implements the .InSequence() clause.
TypedExpectation
&
InSequence
(
const
Sequence
&
s
)
{
ExpectSpecProperty
(
last_clause_
<=
kInSequence
,
".InSequence() cannot appear after .After(),"
" .WillOnce(), .WillRepeatedly(), or "
".RetiresOnSaturation()."
);
last_clause_
=
kInSequence
;
s
.
AddExpectation
(
GetHandle
());
return
*
this
;
}
TypedExpectation
&
InSequence
(
const
Sequence
&
s1
,
const
Sequence
&
s2
)
{
return
InSequence
(
s1
).
InSequence
(
s2
);
}
TypedExpectation
&
InSequence
(
const
Sequence
&
s1
,
const
Sequence
&
s2
,
const
Sequence
&
s3
)
{
return
InSequence
(
s1
,
s2
).
InSequence
(
s3
);
}
TypedExpectation
&
InSequence
(
const
Sequence
&
s1
,
const
Sequence
&
s2
,
const
Sequence
&
s3
,
const
Sequence
&
s4
)
{
return
InSequence
(
s1
,
s2
,
s3
).
InSequence
(
s4
);
}
TypedExpectation
&
InSequence
(
const
Sequence
&
s1
,
const
Sequence
&
s2
,
const
Sequence
&
s3
,
const
Sequence
&
s4
,
const
Sequence
&
s5
)
{
return
InSequence
(
s1
,
s2
,
s3
,
s4
).
InSequence
(
s5
);
}
// Implements that .After() clause.
TypedExpectation
&
After
(
const
ExpectationSet
&
s
)
{
ExpectSpecProperty
(
last_clause_
<=
kAfter
,
".After() cannot appear after .WillOnce(),"
" .WillRepeatedly(), or "
".RetiresOnSaturation()."
);
last_clause_
=
kAfter
;
for
(
ExpectationSet
::
const_iterator
it
=
s
.
begin
();
it
!=
s
.
end
();
++
it
)
{
immediate_prerequisites_
+=
*
it
;
}
return
*
this
;
}
TypedExpectation
&
After
(
const
ExpectationSet
&
s1
,
const
ExpectationSet
&
s2
)
{
return
After
(
s1
).
After
(
s2
);
}
TypedExpectation
&
After
(
const
ExpectationSet
&
s1
,
const
ExpectationSet
&
s2
,
const
ExpectationSet
&
s3
)
{
return
After
(
s1
,
s2
).
After
(
s3
);
}
TypedExpectation
&
After
(
const
ExpectationSet
&
s1
,
const
ExpectationSet
&
s2
,
const
ExpectationSet
&
s3
,
const
ExpectationSet
&
s4
)
{
return
After
(
s1
,
s2
,
s3
).
After
(
s4
);
}
TypedExpectation
&
After
(
const
ExpectationSet
&
s1
,
const
ExpectationSet
&
s2
,
const
ExpectationSet
&
s3
,
const
ExpectationSet
&
s4
,
const
ExpectationSet
&
s5
)
{
return
After
(
s1
,
s2
,
s3
,
s4
).
After
(
s5
);
}
// Implements the .WillOnce() clause.
TypedExpectation
&
WillOnce
(
const
Action
<
F
>&
action
)
{
ExpectSpecProperty
(
last_clause_
<=
kWillOnce
,
".WillOnce() cannot appear after "
".WillRepeatedly() or .RetiresOnSaturation()."
);
last_clause_
=
kWillOnce
;
untyped_actions_
.
push_back
(
new
Action
<
F
>
(
action
));
if
(
!
cardinality_specified
())
{
set_cardinality
(
Exactly
(
static_cast
<
int
>
(
untyped_actions_
.
size
())));
}
return
*
this
;
}
// Implements the .WillRepeatedly() clause.
TypedExpectation
&
WillRepeatedly
(
const
Action
<
F
>&
action
)
{
if
(
last_clause_
==
kWillRepeatedly
)
{
ExpectSpecProperty
(
false
,
".WillRepeatedly() cannot appear "
"more than once in an EXPECT_CALL()."
);
}
else
{
ExpectSpecProperty
(
last_clause_
<
kWillRepeatedly
,
".WillRepeatedly() cannot appear "
"after .RetiresOnSaturation()."
);
}
last_clause_
=
kWillRepeatedly
;
repeated_action_specified_
=
true
;
repeated_action_
=
action
;
if
(
!
cardinality_specified
())
{
set_cardinality
(
AtLeast
(
static_cast
<
int
>
(
untyped_actions_
.
size
())));
}
// Now that no more action clauses can be specified, we check
// whether their count makes sense.
CheckActionCountIfNotDone
();
return
*
this
;
}
// Implements the .RetiresOnSaturation() clause.
TypedExpectation
&
RetiresOnSaturation
()
{
ExpectSpecProperty
(
last_clause_
<
kRetiresOnSaturation
,
".RetiresOnSaturation() cannot appear "
"more than once."
);
last_clause_
=
kRetiresOnSaturation
;
retires_on_saturation_
=
true
;
// Now that no more action clauses can be specified, we check
// whether their count makes sense.
CheckActionCountIfNotDone
();
return
*
this
;
}
// Returns the matchers for the arguments as specified inside the
// EXPECT_CALL() macro.
const
ArgumentMatcherTuple
&
matchers
()
const
{
return
matchers_
;
}
// Returns the matcher specified by the .With() clause.
const
Matcher
<
const
ArgumentTuple
&>&
extra_matcher
()
const
{
return
extra_matcher_
;
}
// Returns the action specified by the .WillRepeatedly() clause.
const
Action
<
F
>&
repeated_action
()
const
{
return
repeated_action_
;
}
// If this mock method has an extra matcher (i.e. .With(matcher)),
// describes it to the ostream.
virtual
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
;
// Returns an Expectation object that references and co-owns this
// expectation.
virtual
Expectation
GetHandle
()
{
return
owner_
->
GetHandleOf
(
this
);
}
// The following methods will be called only after the EXPECT_CALL()
// statement finishes and when the current thread holds
// g_gmock_mutex.
// Returns true iff this expectation matches the given arguments.
bool
Matches
(
const
ArgumentTuple
&
args
)
const
GTEST_EXCLUSIVE_LOCK_REQUIRED_
(
g_gmock_mutex
)
{
g_gmock_mutex
.
AssertHeld
();
return
TupleMatches
(
matchers_
,
args
)
&&
extra_matcher_
.
Matches
(
args
);
}
// Returns true iff this expectation should handle the given arguments.
bool
ShouldHandleArguments
(
const
ArgumentTuple
&
args
)
const
GTEST_EXCLUSIVE_LOCK_REQUIRED_
(
g_gmock_mutex
)
{
g_gmock_mutex
.
AssertHeld
();
// In case the action count wasn't checked when the expectation
// was defined (e.g. if this expectation has no WillRepeatedly()
// or RetiresOnSaturation() clause), we check it when the
// expectation is used for the first time.
CheckActionCountIfNotDone
();
return
!
is_retired
()
&&
AllPrerequisitesAreSatisfied
()
&&
Matches
(
args
);
}
// Describes the result of matching the arguments against this
// expectation to the given ostream.
void
ExplainMatchResultTo
(
const
ArgumentTuple
&
args
,
::
std
::
ostream
*
os
)
const
GTEST_EXCLUSIVE_LOCK_REQUIRED_
(
g_gmock_mutex
)
{
g_gmock_mutex
.
AssertHeld
();
if
(
is_retired
())
{
*
os
<<
" Expected: the expectation is active
\n
"
<<
" Actual: it is retired
\n
"
;
}
else
if
(
!
Matches
(
args
))
{
if
(
!
TupleMatches
(
matchers_
,
args
))
{
ExplainMatchFailureTupleTo
(
matchers_
,
args
,
os
);
}
StringMatchResultListener
listener
;
if
(
!
extra_matcher_
.
MatchAndExplain
(
args
,
&
listener
))
{
*
os
<<
" Expected args: "
;
extra_matcher_
.
DescribeTo
(
os
);
*
os
<<
"
\n
Actual: don't match"
;
internal
::
PrintIfNotEmpty
(
listener
.
str
(),
os
);
*
os
<<
"
\n
"
;
}
}
else
if
(
!
AllPrerequisitesAreSatisfied
())
{
*
os
<<
" Expected: all pre-requisites are satisfied
\n
"
<<
" Actual: the following immediate pre-requisites "
<<
"are not satisfied:
\n
"
;
ExpectationSet
unsatisfied_prereqs
;
FindUnsatisfiedPrerequisites
(
&
unsatisfied_prereqs
);
int
i
=
0
;
for
(
ExpectationSet
::
const_iterator
it
=
unsatisfied_prereqs
.
begin
();
it
!=
unsatisfied_prereqs
.
end
();
++
it
)
{
it
->
expectation_base
()
->
DescribeLocationTo
(
os
);
*
os
<<
"pre-requisite #"
<<
i
++
<<
"
\n
"
;
}
*
os
<<
" (end of pre-requisites)
\n
"
;
}
else
{
// This line is here just for completeness' sake. It will never
// be executed as currently the ExplainMatchResultTo() function
// is called only when the mock function call does NOT match the
// expectation.
*
os
<<
"The call matches the expectation.
\n
"
;
}
}
// Returns the action that should be taken for the current invocation.
const
Action
<
F
>&
GetCurrentAction
(
const
FunctionMockerBase
<
F
>*
mocker
,
const
ArgumentTuple
&
args
)
const
GTEST_EXCLUSIVE_LOCK_REQUIRED_
(
g_gmock_mutex
)
{
g_gmock_mutex
.
AssertHeld
();
const
int
count
=
call_count
();
Assert
(
count
>=
1
,
__FILE__
,
__LINE__
,
"call_count() is <= 0 when GetCurrentAction() is "
"called - this should never happen."
);
const
int
action_count
=
static_cast
<
int
>
(
untyped_actions_
.
size
());
if
(
action_count
>
0
&&
!
repeated_action_specified_
&&
count
>
action_count
)
{
// If there is at least one WillOnce() and no WillRepeatedly(),
// we warn the user when the WillOnce() clauses ran out.
::
std
::
stringstream
ss
;
DescribeLocationTo
(
&
ss
);
ss
<<
"Actions ran out in "
<<
source_text
()
<<
"...
\n
"
<<
"Called "
<<
count
<<
" times, but only "
<<
action_count
<<
" WillOnce()"
<<
(
action_count
==
1
?
" is"
:
"s are"
)
<<
" specified - "
;
mocker
->
DescribeDefaultActionTo
(
args
,
&
ss
);
Log
(
kWarning
,
ss
.
str
(),
1
);
}
return
count
<=
action_count
?
*
static_cast
<
const
Action
<
F
>*>
(
untyped_actions_
[
count
-
1
])
:
repeated_action
();
}
// Given the arguments of a mock function call, if the call will
// over-saturate this expectation, returns the default action;
// otherwise, returns the next action in this expectation. Also
// describes *what* happened to 'what', and explains *why* Google
// Mock does it to 'why'. This method is not const as it calls
// IncrementCallCount(). A return value of NULL means the default
// action.
const
Action
<
F
>*
GetActionForArguments
(
const
FunctionMockerBase
<
F
>*
mocker
,
const
ArgumentTuple
&
args
,
::
std
::
ostream
*
what
,
::
std
::
ostream
*
why
)
GTEST_EXCLUSIVE_LOCK_REQUIRED_
(
g_gmock_mutex
)
{
g_gmock_mutex
.
AssertHeld
();
if
(
IsSaturated
())
{
// We have an excessive call.
IncrementCallCount
();
*
what
<<
"Mock function called more times than expected - "
;
mocker
->
DescribeDefaultActionTo
(
args
,
what
);
DescribeCallCountTo
(
why
);
// TODO(wan@google.com): allow the user to control whether
// unexpected calls should fail immediately or continue using a
// flag --gmock_unexpected_calls_are_fatal.
return
NULL
;
}
IncrementCallCount
();
RetireAllPreRequisites
();
if
(
retires_on_saturation_
&&
IsSaturated
())
{
Retire
();
}
// Must be done after IncrementCount()!
*
what
<<
"Mock function call matches "
<<
source_text
()
<<
"...
\n
"
;
return
&
(
GetCurrentAction
(
mocker
,
args
));
}
// All the fields below won't change once the EXPECT_CALL()
// statement finishes.
FunctionMockerBase
<
F
>*
const
owner_
;
ArgumentMatcherTuple
matchers_
;
Matcher
<
const
ArgumentTuple
&>
extra_matcher_
;
Action
<
F
>
repeated_action_
;
GTEST_DISALLOW_COPY_AND_ASSIGN_
(
TypedExpectation
);
};
// class TypedExpectation
// A MockSpec object is used by ON_CALL() or EXPECT_CALL() for
// specifying the default behavior of, or expectation on, a mock
// function.
// Note: class MockSpec really belongs to the ::testing namespace.
// However if we define it in ::testing, MSVC will complain when
// classes in ::testing::internal declare it as a friend class
// template. To workaround this compiler bug, we define MockSpec in
// ::testing::internal and import it into ::testing.
// Logs a message including file and line number information.
GTEST_API_
void
LogWithLocation
(
testing
::
internal
::
LogSeverity
severity
,
const
char
*
file
,
int
line
,
const
string
&
message
);
template
<
typename
F
>
class
MockSpec
{
public:
typedef
typename
internal
::
Function
<
F
>::
ArgumentTuple
ArgumentTuple
;
typedef
typename
internal
::
Function
<
F
>::
ArgumentMatcherTuple
ArgumentMatcherTuple
;
// Constructs a MockSpec object, given the function mocker object
// that the spec is associated with.
explicit
MockSpec
(
internal
::
FunctionMockerBase
<
F
>*
function_mocker
)
:
function_mocker_
(
function_mocker
)
{}
// Adds a new default action spec to the function mocker and returns
// the newly created spec.
internal
::
OnCallSpec
<
F
>&
InternalDefaultActionSetAt
(
const
char
*
file
,
int
line
,
const
char
*
obj
,
const
char
*
call
)
{
LogWithLocation
(
internal
::
kInfo
,
file
,
line
,
string
(
"ON_CALL("
)
+
obj
+
", "
+
call
+
") invoked"
);
return
function_mocker_
->
AddNewOnCallSpec
(
file
,
line
,
matchers_
);
}
// Adds a new expectation spec to the function mocker and returns
// the newly created spec.
internal
::
TypedExpectation
<
F
>&
InternalExpectedAt
(
const
char
*
file
,
int
line
,
const
char
*
obj
,
const
char
*
call
)
{
const
string
source_text
(
string
(
"EXPECT_CALL("
)
+
obj
+
", "
+
call
+
")"
);
LogWithLocation
(
internal
::
kInfo
,
file
,
line
,
source_text
+
" invoked"
);
return
function_mocker_
->
AddNewExpectation
(
file
,
line
,
source_text
,
matchers_
);
}
private:
template
<
typename
Function
>
friend
class
internal
::
FunctionMocker
;
void
SetMatchers
(
const
ArgumentMatcherTuple
&
matchers
)
{
matchers_
=
matchers
;
}
// The function mocker that owns this spec.
internal
::
FunctionMockerBase
<
F
>*
const
function_mocker_
;
// The argument matchers specified in the spec.
ArgumentMatcherTuple
matchers_
;
GTEST_DISALLOW_ASSIGN_
(
MockSpec
);
};
// class MockSpec
// Wrapper type for generically holding an ordinary value or lvalue reference.
// If T is not a reference type, it must be copyable or movable.
// ReferenceOrValueWrapper<T> is movable, and will also be copyable unless
// T is a move-only value type (which means that it will always be copyable
// if the current platform does not support move semantics).
//
// The primary template defines handling for values, but function header
// comments describe the contract for the whole template (including
// specializations).
template
<
typename
T
>
class
ReferenceOrValueWrapper
{
public:
// Constructs a wrapper from the given value/reference.
explicit
ReferenceOrValueWrapper
(
T
value
)
:
value_
(
::
testing
::
internal
::
move
(
value
))
{
}
// Unwraps and returns the underlying value/reference, exactly as
// originally passed. The behavior of calling this more than once on
// the same object is unspecified.
T
Unwrap
()
{
return
::
testing
::
internal
::
move
(
value_
);
}
// Provides nondestructive access to the underlying value/reference.
// Always returns a const reference (more precisely,
// const RemoveReference<T>&). The behavior of calling this after
// calling Unwrap on the same object is unspecified.
const
T
&
Peek
()
const
{
return
value_
;
}
private:
T
value_
;
};
// Specialization for lvalue reference types. See primary template
// for documentation.
template
<
typename
T
>
class
ReferenceOrValueWrapper
<
T
&>
{
public:
// Workaround for debatable pass-by-reference lint warning (c-library-team
// policy precludes NOLINT in this context)
typedef
T
&
reference
;
explicit
ReferenceOrValueWrapper
(
reference
ref
)
:
value_ptr_
(
&
ref
)
{}
T
&
Unwrap
()
{
return
*
value_ptr_
;
}
const
T
&
Peek
()
const
{
return
*
value_ptr_
;
}
private:
T
*
value_ptr_
;
};
// MSVC warns about using 'this' in base member initializer list, so
// we need to temporarily disable the warning. We have to do it for
// the entire class to suppress the warning, even though it's about
// the constructor only.
#ifdef _MSC_VER
# pragma warning(push) // Saves the current warning state.
# pragma warning(disable:4355) // Temporarily disables warning 4355.
#endif // _MSV_VER
// C++ treats the void type specially. For example, you cannot define
// a void-typed variable or pass a void value to a function.
// ActionResultHolder<T> holds a value of type T, where T must be a
// copyable type or void (T doesn't need to be default-constructable).
// It hides the syntactic difference between void and other types, and
// is used to unify the code for invoking both void-returning and
// non-void-returning mock functions.
// Untyped base class for ActionResultHolder<T>.
class
UntypedActionResultHolderBase
{
public:
virtual
~
UntypedActionResultHolderBase
()
{}
// Prints the held value as an action's result to os.
virtual
void
PrintAsActionResult
(
::
std
::
ostream
*
os
)
const
=
0
;
};
// This generic definition is used when T is not void.
template
<
typename
T
>
class
ActionResultHolder
:
public
UntypedActionResultHolderBase
{
public:
// Returns the held value. Must not be called more than once.
T
Unwrap
()
{
return
result_
.
Unwrap
();
}
// Prints the held value as an action's result to os.
virtual
void
PrintAsActionResult
(
::
std
::
ostream
*
os
)
const
{
*
os
<<
"
\n
Returns: "
;
// T may be a reference type, so we don't use UniversalPrint().
UniversalPrinter
<
T
>::
Print
(
result_
.
Peek
(),
os
);
}
// Performs the given mock function's default action and returns the
// result in a new-ed ActionResultHolder.
template
<
typename
F
>
static
ActionResultHolder
*
PerformDefaultAction
(
const
FunctionMockerBase
<
F
>*
func_mocker
,
const
typename
Function
<
F
>::
ArgumentTuple
&
args
,
const
string
&
call_description
)
{
return
new
ActionResultHolder
(
Wrapper
(
func_mocker
->
PerformDefaultAction
(
args
,
call_description
)));
}
// Performs the given action and returns the result in a new-ed
// ActionResultHolder.
template
<
typename
F
>
static
ActionResultHolder
*
PerformAction
(
const
Action
<
F
>&
action
,
const
typename
Function
<
F
>::
ArgumentTuple
&
args
)
{
return
new
ActionResultHolder
(
Wrapper
(
action
.
Perform
(
args
)));
}
private:
typedef
ReferenceOrValueWrapper
<
T
>
Wrapper
;
explicit
ActionResultHolder
(
Wrapper
result
)
:
result_
(
::
testing
::
internal
::
move
(
result
))
{
}
Wrapper
result_
;
GTEST_DISALLOW_COPY_AND_ASSIGN_
(
ActionResultHolder
);
};
// Specialization for T = void.
template
<
>
class
ActionResultHolder
<
void
>
:
public
UntypedActionResultHolderBase
{
public:
void
Unwrap
()
{
}
virtual
void
PrintAsActionResult
(
::
std
::
ostream
*
/* os */
)
const
{}
// Performs the given mock function's default action and returns ownership
// of an empty ActionResultHolder*.
template
<
typename
F
>
static
ActionResultHolder
*
PerformDefaultAction
(
const
FunctionMockerBase
<
F
>*
func_mocker
,
const
typename
Function
<
F
>::
ArgumentTuple
&
args
,
const
string
&
call_description
)
{
func_mocker
->
PerformDefaultAction
(
args
,
call_description
);
return
new
ActionResultHolder
;
}
// Performs the given action and returns ownership of an empty
// ActionResultHolder*.
template
<
typename
F
>
static
ActionResultHolder
*
PerformAction
(
const
Action
<
F
>&
action
,
const
typename
Function
<
F
>::
ArgumentTuple
&
args
)
{
action
.
Perform
(
args
);
return
new
ActionResultHolder
;
}
private:
ActionResultHolder
()
{}
GTEST_DISALLOW_COPY_AND_ASSIGN_
(
ActionResultHolder
);
};
// The base of the function mocker class for the given function type.
// We put the methods in this class instead of its child to avoid code
// bloat.
template
<
typename
F
>
class
FunctionMockerBase
:
public
UntypedFunctionMockerBase
{
public:
typedef
typename
Function
<
F
>::
Result
Result
;
typedef
typename
Function
<
F
>::
ArgumentTuple
ArgumentTuple
;
typedef
typename
Function
<
F
>::
ArgumentMatcherTuple
ArgumentMatcherTuple
;
FunctionMockerBase
()
:
current_spec_
(
this
)
{}
// The destructor verifies that all expectations on this mock
// function have been satisfied. If not, it will report Google Test
// non-fatal failures for the violations.
virtual
~
FunctionMockerBase
()
GTEST_LOCK_EXCLUDED_
(
g_gmock_mutex
)
{
MutexLock
l
(
&
g_gmock_mutex
);
VerifyAndClearExpectationsLocked
();
Mock
::
UnregisterLocked
(
this
);
ClearDefaultActionsLocked
();
}
// Returns the ON_CALL spec that matches this mock function with the
// given arguments; returns NULL if no matching ON_CALL is found.
// L = *
const
OnCallSpec
<
F
>*
FindOnCallSpec
(
const
ArgumentTuple
&
args
)
const
{
for
(
UntypedOnCallSpecs
::
const_reverse_iterator
it
=
untyped_on_call_specs_
.
rbegin
();
it
!=
untyped_on_call_specs_
.
rend
();
++
it
)
{
const
OnCallSpec
<
F
>*
spec
=
static_cast
<
const
OnCallSpec
<
F
>*>
(
*
it
);
if
(
spec
->
Matches
(
args
))
return
spec
;
}
return
NULL
;
}
// Performs the default action of this mock function on the given
// arguments and returns the result. Asserts (or throws if
// exceptions are enabled) with a helpful call descrption if there
// is no valid return value. This method doesn't depend on the
// mutable state of this object, and thus can be called concurrently
// without locking.
// L = *
Result
PerformDefaultAction
(
const
ArgumentTuple
&
args
,
const
string
&
call_description
)
const
{
const
OnCallSpec
<
F
>*
const
spec
=
this
->
FindOnCallSpec
(
args
);
if
(
spec
!=
NULL
)
{
return
spec
->
GetAction
().
Perform
(
args
);
}
const
string
message
=
call_description
+
"
\n
The mock function has no default action "
"set, and its return type has no default value set."
;
#if GTEST_HAS_EXCEPTIONS
if
(
!
DefaultValue
<
Result
>::
Exists
())
{
throw
std
::
runtime_error
(
message
);
}
#else
Assert
(
DefaultValue
<
Result
>::
Exists
(),
""
,
-
1
,
message
);
#endif
return
DefaultValue
<
Result
>::
Get
();
}
// Performs the default action with the given arguments and returns
// the action's result. The call description string will be used in
// the error message to describe the call in the case the default
// action fails. The caller is responsible for deleting the result.
// L = *
virtual
UntypedActionResultHolderBase
*
UntypedPerformDefaultAction
(
const
void
*
untyped_args
,
// must point to an ArgumentTuple
const
string
&
call_description
)
const
{
const
ArgumentTuple
&
args
=
*
static_cast
<
const
ArgumentTuple
*>
(
untyped_args
);
return
ResultHolder
::
PerformDefaultAction
(
this
,
args
,
call_description
);
}
// Performs the given action with the given arguments and returns
// the action's result. The caller is responsible for deleting the
// result.
// L = *
virtual
UntypedActionResultHolderBase
*
UntypedPerformAction
(
const
void
*
untyped_action
,
const
void
*
untyped_args
)
const
{
// Make a copy of the action before performing it, in case the
// action deletes the mock object (and thus deletes itself).
const
Action
<
F
>
action
=
*
static_cast
<
const
Action
<
F
>*>
(
untyped_action
);
const
ArgumentTuple
&
args
=
*
static_cast
<
const
ArgumentTuple
*>
(
untyped_args
);
return
ResultHolder
::
PerformAction
(
action
,
args
);
}
// Implements UntypedFunctionMockerBase::ClearDefaultActionsLocked():
// clears the ON_CALL()s set on this mock function.
virtual
void
ClearDefaultActionsLocked
()
GTEST_EXCLUSIVE_LOCK_REQUIRED_
(
g_gmock_mutex
)
{
g_gmock_mutex
.
AssertHeld
();
// Deleting our default actions may trigger other mock objects to be
// deleted, for example if an action contains a reference counted smart
// pointer to that mock object, and that is the last reference. So if we
// delete our actions within the context of the global mutex we may deadlock
// when this method is called again. Instead, make a copy of the set of
// actions to delete, clear our set within the mutex, and then delete the
// actions outside of the mutex.
UntypedOnCallSpecs
specs_to_delete
;
untyped_on_call_specs_
.
swap
(
specs_to_delete
);
g_gmock_mutex
.
Unlock
();
for
(
UntypedOnCallSpecs
::
const_iterator
it
=
specs_to_delete
.
begin
();
it
!=
specs_to_delete
.
end
();
++
it
)
{
delete
static_cast
<
const
OnCallSpec
<
F
>*>
(
*
it
);
}
// Lock the mutex again, since the caller expects it to be locked when we
// return.
g_gmock_mutex
.
Lock
();
}
protected:
template
<
typename
Function
>
friend
class
MockSpec
;
typedef
ActionResultHolder
<
Result
>
ResultHolder
;
// Returns the result of invoking this mock function with the given
// arguments. This function can be safely called from multiple
// threads concurrently.
Result
InvokeWith
(
const
ArgumentTuple
&
args
)
GTEST_LOCK_EXCLUDED_
(
g_gmock_mutex
)
{
scoped_ptr
<
ResultHolder
>
holder
(
DownCast_
<
ResultHolder
*>
(
this
->
UntypedInvokeWith
(
&
args
)));
return
holder
->
Unwrap
();
}
// Adds and returns a default action spec for this mock function.
OnCallSpec
<
F
>&
AddNewOnCallSpec
(
const
char
*
file
,
int
line
,
const
ArgumentMatcherTuple
&
m
)
GTEST_LOCK_EXCLUDED_
(
g_gmock_mutex
)
{
Mock
::
RegisterUseByOnCallOrExpectCall
(
MockObject
(),
file
,
line
);
OnCallSpec
<
F
>*
const
on_call_spec
=
new
OnCallSpec
<
F
>
(
file
,
line
,
m
);
untyped_on_call_specs_
.
push_back
(
on_call_spec
);
return
*
on_call_spec
;
}
// Adds and returns an expectation spec for this mock function.
TypedExpectation
<
F
>&
AddNewExpectation
(
const
char
*
file
,
int
line
,
const
string
&
source_text
,
const
ArgumentMatcherTuple
&
m
)
GTEST_LOCK_EXCLUDED_
(
g_gmock_mutex
)
{
Mock
::
RegisterUseByOnCallOrExpectCall
(
MockObject
(),
file
,
line
);
TypedExpectation
<
F
>*
const
expectation
=
new
TypedExpectation
<
F
>
(
this
,
file
,
line
,
source_text
,
m
);
const
linked_ptr
<
ExpectationBase
>
untyped_expectation
(
expectation
);
untyped_expectations_
.
push_back
(
untyped_expectation
);
// Adds this expectation into the implicit sequence if there is one.
Sequence
*
const
implicit_sequence
=
g_gmock_implicit_sequence
.
get
();
if
(
implicit_sequence
!=
NULL
)
{
implicit_sequence
->
AddExpectation
(
Expectation
(
untyped_expectation
));
}
return
*
expectation
;
}
// 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
;
// Some utilities needed for implementing UntypedInvokeWith().
// Describes what default action will be performed for the given
// arguments.
// L = *
void
DescribeDefaultActionTo
(
const
ArgumentTuple
&
args
,
::
std
::
ostream
*
os
)
const
{
const
OnCallSpec
<
F
>*
const
spec
=
FindOnCallSpec
(
args
);
if
(
spec
==
NULL
)
{
*
os
<<
(
internal
::
type_equals
<
Result
,
void
>::
value
?
"returning directly.
\n
"
:
"returning default value.
\n
"
);
}
else
{
*
os
<<
"taking default action specified at:
\n
"
<<
FormatFileLocation
(
spec
->
file
(),
spec
->
line
())
<<
"
\n
"
;
}
}
// Writes a message that the call is uninteresting (i.e. neither
// explicitly expected nor explicitly unexpected) to the given
// ostream.
virtual
void
UntypedDescribeUninterestingCall
(
const
void
*
untyped_args
,
::
std
::
ostream
*
os
)
const
GTEST_LOCK_EXCLUDED_
(
g_gmock_mutex
)
{
const
ArgumentTuple
&
args
=
*
static_cast
<
const
ArgumentTuple
*>
(
untyped_args
);
*
os
<<
"Uninteresting mock function call - "
;
DescribeDefaultActionTo
(
args
,
os
);
*
os
<<
" Function call: "
<<
Name
();
UniversalPrint
(
args
,
os
);
}
// Returns the expectation that matches the given function arguments
// (or NULL is there's no match); when a match is found,
// untyped_action is set to point to the action that should be
// performed (or NULL if the action is "do default"), and
// is_excessive is modified to indicate whether the call exceeds the
// expected number.
//
// Critical section: We must find the matching expectation and the
// corresponding action that needs to be taken in an ATOMIC
// transaction. Otherwise another thread may call this mock
// method in the middle and mess up the state.
//
// However, performing the action has to be left out of the critical
// section. The reason is that we have no control on what the
// action does (it can invoke an arbitrary user function or even a
// mock function) and excessive locking could cause a dead lock.
virtual
const
ExpectationBase
*
UntypedFindMatchingExpectation
(
const
void
*
untyped_args
,
const
void
**
untyped_action
,
bool
*
is_excessive
,
::
std
::
ostream
*
what
,
::
std
::
ostream
*
why
)
GTEST_LOCK_EXCLUDED_
(
g_gmock_mutex
)
{
const
ArgumentTuple
&
args
=
*
static_cast
<
const
ArgumentTuple
*>
(
untyped_args
);
MutexLock
l
(
&
g_gmock_mutex
);
TypedExpectation
<
F
>*
exp
=
this
->
FindMatchingExpectationLocked
(
args
);
if
(
exp
==
NULL
)
{
// A match wasn't found.
this
->
FormatUnexpectedCallMessageLocked
(
args
,
what
,
why
);
return
NULL
;
}
// This line must be done before calling GetActionForArguments(),
// which will increment the call count for *exp and thus affect
// its saturation status.
*
is_excessive
=
exp
->
IsSaturated
();
const
Action
<
F
>*
action
=
exp
->
GetActionForArguments
(
this
,
args
,
what
,
why
);
if
(
action
!=
NULL
&&
action
->
IsDoDefault
())
action
=
NULL
;
// Normalize "do default" to NULL.
*
untyped_action
=
action
;
return
exp
;
}
// Prints the given function arguments to the ostream.
virtual
void
UntypedPrintArgs
(
const
void
*
untyped_args
,
::
std
::
ostream
*
os
)
const
{
const
ArgumentTuple
&
args
=
*
static_cast
<
const
ArgumentTuple
*>
(
untyped_args
);
UniversalPrint
(
args
,
os
);
}
// Returns the expectation that matches the arguments, or NULL if no
// expectation matches them.
TypedExpectation
<
F
>*
FindMatchingExpectationLocked
(
const
ArgumentTuple
&
args
)
const
GTEST_EXCLUSIVE_LOCK_REQUIRED_
(
g_gmock_mutex
)
{
g_gmock_mutex
.
AssertHeld
();
for
(
typename
UntypedExpectations
::
const_reverse_iterator
it
=
untyped_expectations_
.
rbegin
();
it
!=
untyped_expectations_
.
rend
();
++
it
)
{
TypedExpectation
<
F
>*
const
exp
=
static_cast
<
TypedExpectation
<
F
>*>
(
it
->
get
());
if
(
exp
->
ShouldHandleArguments
(
args
))
{
return
exp
;
}
}
return
NULL
;
}
// Returns a message that the arguments don't match any expectation.
void
FormatUnexpectedCallMessageLocked
(
const
ArgumentTuple
&
args
,
::
std
::
ostream
*
os
,
::
std
::
ostream
*
why
)
const
GTEST_EXCLUSIVE_LOCK_REQUIRED_
(
g_gmock_mutex
)
{
g_gmock_mutex
.
AssertHeld
();
*
os
<<
"
\n
Unexpected mock function call - "
;
DescribeDefaultActionTo
(
args
,
os
);
PrintTriedExpectationsLocked
(
args
,
why
);
}
// Prints a list of expectations that have been tried against the
// current mock function call.
void
PrintTriedExpectationsLocked
(
const
ArgumentTuple
&
args
,
::
std
::
ostream
*
why
)
const
GTEST_EXCLUSIVE_LOCK_REQUIRED_
(
g_gmock_mutex
)
{
g_gmock_mutex
.
AssertHeld
();
const
int
count
=
static_cast
<
int
>
(
untyped_expectations_
.
size
());
*
why
<<
"Google Mock tried the following "
<<
count
<<
" "
<<
(
count
==
1
?
"expectation, but it didn't match"
:
"expectations, but none matched"
)
<<
":
\n
"
;
for
(
int
i
=
0
;
i
<
count
;
i
++
)
{
TypedExpectation
<
F
>*
const
expectation
=
static_cast
<
TypedExpectation
<
F
>*>
(
untyped_expectations_
[
i
].
get
());
*
why
<<
"
\n
"
;
expectation
->
DescribeLocationTo
(
why
);
if
(
count
>
1
)
{
*
why
<<
"tried expectation #"
<<
i
<<
": "
;
}
*
why
<<
expectation
->
source_text
()
<<
"...
\n
"
;
expectation
->
ExplainMatchResultTo
(
args
,
why
);
expectation
->
DescribeCallCountTo
(
why
);
}
}
// The current spec (either default action spec or expectation spec)
// being described on this function mocker.
MockSpec
<
F
>
current_spec_
;
// There is no generally useful and implementable semantics of
// copying a mock object, so copying a mock is usually a user error.
// Thus we disallow copying function mockers. If the user really
// wants to copy a mock object, he should implement his own copy
// operation, for example:
//
// class MockFoo : public Foo {
// public:
// // Defines a copy constructor explicitly.
// MockFoo(const MockFoo& src) {}
// ...
// };
GTEST_DISALLOW_COPY_AND_ASSIGN_
(
FunctionMockerBase
);
};
// class FunctionMockerBase
#ifdef _MSC_VER
# pragma warning(pop) // Restores the warning state.
#endif // _MSV_VER
// Implements methods of FunctionMockerBase.
// Verifies that all expectations on this mock function have been
// satisfied. Reports one or more Google Test non-fatal failures and
// returns false if not.
// Reports an uninteresting call (whose description is in msg) in the
// manner specified by 'reaction'.
void
ReportUninterestingCall
(
CallReaction
reaction
,
const
string
&
msg
);
}
// namespace internal
// The style guide prohibits "using" statements in a namespace scope
// inside a header file. However, the MockSpec class template is
// meant to be defined in the ::testing namespace. The following line
// is just a trick for working around a bug in MSVC 8.0, which cannot
// handle it if we define MockSpec in ::testing.
using
internal
::
MockSpec
;
// Const(x) is a convenient function for obtaining a const reference
// to x. This is useful for setting expectations on an overloaded
// const mock method, e.g.
//
// class MockFoo : public FooInterface {
// public:
// MOCK_METHOD0(Bar, int());
// MOCK_CONST_METHOD0(Bar, int&());
// };
//
// MockFoo foo;
// // Expects a call to non-const MockFoo::Bar().
// EXPECT_CALL(foo, Bar());
// // Expects a call to const MockFoo::Bar().
// EXPECT_CALL(Const(foo), Bar());
template
<
typename
T
>
inline
const
T
&
Const
(
const
T
&
x
)
{
return
x
;
}
// Constructs an Expectation object that references and co-owns exp.
inline
Expectation
::
Expectation
(
internal
::
ExpectationBase
&
exp
)
// NOLINT
:
expectation_base_
(
exp
.
GetHandle
().
expectation_base
())
{}
}
// namespace testing
// A separate macro is required to avoid compile errors when the name
// of the method used in call is a result of macro expansion.
// See CompilesWithMethodNameExpandedFromMacro tests in
// internal/gmock-spec-builders_test.cc for more details.
#define GMOCK_ON_CALL_IMPL_(obj, call) \
((obj).gmock_##call).InternalDefaultActionSetAt(__FILE__, __LINE__, \
#obj, #call)
#define ON_CALL(obj, call) GMOCK_ON_CALL_IMPL_(obj, call)
#define GMOCK_EXPECT_CALL_IMPL_(obj, call) \
((obj).gmock_##call).InternalExpectedAt(__FILE__, __LINE__, #obj, #call)
#define EXPECT_CALL(obj, call) GMOCK_EXPECT_CALL_IMPL_(obj, call)
#endif // GMOCK_INCLUDE_GMOCK_GMOCK_SPEC_BUILDERS_H_
googlemock/include/gmock/gmock.h
0 → 100644
View file @
ecf94595
// Copyright 2007, Google Inc.
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
// * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following disclaimer
// in the documentation and/or other materials provided with the
// distribution.
// * Neither the name of Google Inc. nor the names of its
// contributors may be used to endorse or promote products derived from
// this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//
// Author: wan@google.com (Zhanyong Wan)
// Google Mock - a framework for writing C++ mock classes.
//
// This is the main header file a user should include.
#ifndef GMOCK_INCLUDE_GMOCK_GMOCK_H_
#define GMOCK_INCLUDE_GMOCK_GMOCK_H_
// This file implements the following syntax:
//
// ON_CALL(mock_object.Method(...))
// .With(...) ?
// .WillByDefault(...);
//
// where With() is optional and WillByDefault() must appear exactly
// once.
//
// EXPECT_CALL(mock_object.Method(...))
// .With(...) ?
// .Times(...) ?
// .InSequence(...) *
// .WillOnce(...) *
// .WillRepeatedly(...) ?
// .RetiresOnSaturation() ? ;
//
// where all clauses are optional and WillOnce() can be repeated.
#include "gmock/gmock-actions.h"
#include "gmock/gmock-cardinalities.h"
#include "gmock/gmock-generated-actions.h"
#include "gmock/gmock-generated-function-mockers.h"
#include "gmock/gmock-generated-nice-strict.h"
#include "gmock/gmock-generated-matchers.h"
#include "gmock/gmock-matchers.h"
#include "gmock/gmock-more-actions.h"
#include "gmock/gmock-more-matchers.h"
#include "gmock/internal/gmock-internal-utils.h"
namespace
testing
{
// Declares Google Mock flags that we want a user to use programmatically.
GMOCK_DECLARE_bool_
(
catch_leaked_mocks
);
GMOCK_DECLARE_string_
(
verbose
);
// Initializes Google Mock. This must be called before running the
// tests. In particular, it parses the command line for the flags
// that Google Mock recognizes. Whenever a Google Mock flag is seen,
// it is removed from argv, and *argc is decremented.
//
// No value is returned. Instead, the Google Mock flag variables are
// updated.
//
// Since Google Test is needed for Google Mock to work, this function
// also initializes Google Test and parses its flags, if that hasn't
// been done.
GTEST_API_
void
InitGoogleMock
(
int
*
argc
,
char
**
argv
);
// This overloaded version can be used in Windows programs compiled in
// UNICODE mode.
GTEST_API_
void
InitGoogleMock
(
int
*
argc
,
wchar_t
**
argv
);
}
// namespace testing
#endif // GMOCK_INCLUDE_GMOCK_GMOCK_H_
googlemock/include/gmock/internal/custom/gmock-generated-actions.h
0 → 100644
View file @
ecf94595
// This file was GENERATED by command:
// pump.py gmock-generated-actions.h.pump
// DO NOT EDIT BY HAND!!!
#ifndef GMOCK_INCLUDE_GMOCK_INTERNAL_CUSTOM_GMOCK_GENERATED_ACTIONS_H_
#define GMOCK_INCLUDE_GMOCK_INTERNAL_CUSTOM_GMOCK_GENERATED_ACTIONS_H_
#endif // GMOCK_INCLUDE_GMOCK_INTERNAL_CUSTOM_GMOCK_GENERATED_ACTIONS_H_
googlemock/include/gmock/internal/custom/gmock-generated-actions.h.pump
0 → 100644
View file @
ecf94595
$$
-*-
mode
:
c
++
;
-*-
$$
This
is
a
Pump
source
file
(
http
:
//go/pump). Please use Pump to convert
$$
it
to
callback
-
actions
.
h
.
$$
$
var
max_callback_arity
=
5
$$}}
This
meta
comment
fixes
auto
-
indentation
in
editors
.
#ifndef GMOCK_INCLUDE_GMOCK_INTERNAL_CUSTOM_GMOCK_GENERATED_ACTIONS_H_
#define GMOCK_INCLUDE_GMOCK_INTERNAL_CUSTOM_GMOCK_GENERATED_ACTIONS_H_
#endif // GMOCK_INCLUDE_GMOCK_INTERNAL_CUSTOM_GMOCK_GENERATED_ACTIONS_H_
googlemock/include/gmock/internal/custom/gmock-matchers.h
0 → 100644
View file @
ecf94595
// Copyright 2015, Google Inc.
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
// * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following disclaimer
// in the documentation and/or other materials provided with the
// distribution.
// * Neither the name of Google Inc. nor the names of its
// contributors may be used to endorse or promote products derived from
// this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//
// ============================================================
// An installation-specific extension point for gmock-matchers.h.
// ============================================================
//
// Adds google3 callback support to CallableTraits.
//
#ifndef GMOCK_INCLUDE_GMOCK_INTERNAL_CUSTOM_CALLBACK_MATCHERS_H_
#define GMOCK_INCLUDE_GMOCK_INTERNAL_CUSTOM_CALLBACK_MATCHERS_H_
#endif // GMOCK_INCLUDE_GMOCK_INTERNAL_CUSTOM_CALLBACK_MATCHERS_H_
googlemock/include/gmock/internal/custom/gmock-port.h
0 → 100644
View file @
ecf94595
// Copyright 2015, Google Inc.
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
// * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following disclaimer
// in the documentation and/or other materials provided with the
// distribution.
// * Neither the name of Google Inc. nor the names of its
// contributors may be used to endorse or promote products derived from
// this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//
// Injection point for custom user configurations.
// The following macros can be defined:
//
// Flag related macros:
// GMOCK_DECLARE_bool_(name)
// GMOCK_DECLARE_int32_(name)
// GMOCK_DECLARE_string_(name)
// GMOCK_DEFINE_bool_(name, default_val, doc)
// GMOCK_DEFINE_int32_(name, default_val, doc)
// GMOCK_DEFINE_string_(name, default_val, doc)
//
// ** Custom implementation starts here **
#ifndef GMOCK_INCLUDE_GMOCK_INTERNAL_CUSTOM_GMOCK_PORT_H_
#define GMOCK_INCLUDE_GMOCK_INTERNAL_CUSTOM_GMOCK_PORT_H_
#endif // GMOCK_INCLUDE_GMOCK_INTERNAL_CUSTOM_GMOCK_PORT_H_
googlemock/include/gmock/internal/gmock-generated-internal-utils.h
0 → 100644
View file @
ecf94595
// This file was GENERATED by command:
// pump.py gmock-generated-internal-utils.h.pump
// DO NOT EDIT BY HAND!!!
// Copyright 2007, Google Inc.
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
// * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following disclaimer
// in the documentation and/or other materials provided with the
// distribution.
// * Neither the name of Google Inc. nor the names of its
// contributors may be used to endorse or promote products derived from
// this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//
// Author: wan@google.com (Zhanyong Wan)
// Google Mock - a framework for writing C++ mock classes.
//
// This file contains template meta-programming utility classes needed
// for implementing Google Mock.
#ifndef GMOCK_INCLUDE_GMOCK_INTERNAL_GMOCK_GENERATED_INTERNAL_UTILS_H_
#define GMOCK_INCLUDE_GMOCK_INTERNAL_GMOCK_GENERATED_INTERNAL_UTILS_H_
#include "gmock/internal/gmock-port.h"
namespace
testing
{
template
<
typename
T
>
class
Matcher
;
namespace
internal
{
// An IgnoredValue object can be implicitly constructed from ANY value.
// This is used in implementing the IgnoreResult(a) action.
class
IgnoredValue
{
public:
// This constructor template allows any value to be implicitly
// converted to IgnoredValue. The object has no data member and
// doesn't try to remember anything about the argument. We
// deliberately omit the 'explicit' keyword in order to allow the
// conversion to be implicit.
template
<
typename
T
>
IgnoredValue
(
const
T
&
/* ignored */
)
{}
// NOLINT(runtime/explicit)
};
// MatcherTuple<T>::type is a tuple type where each field is a Matcher
// for the corresponding field in tuple type T.
template
<
typename
Tuple
>
struct
MatcherTuple
;
template
<
>
struct
MatcherTuple
<
::
testing
::
tuple
<>
>
{
typedef
::
testing
::
tuple
<
>
type
;
};
template
<
typename
A1
>
struct
MatcherTuple
<
::
testing
::
tuple
<
A1
>
>
{
typedef
::
testing
::
tuple
<
Matcher
<
A1
>
>
type
;
};
template
<
typename
A1
,
typename
A2
>
struct
MatcherTuple
<
::
testing
::
tuple
<
A1
,
A2
>
>
{
typedef
::
testing
::
tuple
<
Matcher
<
A1
>
,
Matcher
<
A2
>
>
type
;
};
template
<
typename
A1
,
typename
A2
,
typename
A3
>
struct
MatcherTuple
<
::
testing
::
tuple
<
A1
,
A2
,
A3
>
>
{
typedef
::
testing
::
tuple
<
Matcher
<
A1
>
,
Matcher
<
A2
>
,
Matcher
<
A3
>
>
type
;
};
template
<
typename
A1
,
typename
A2
,
typename
A3
,
typename
A4
>
struct
MatcherTuple
<
::
testing
::
tuple
<
A1
,
A2
,
A3
,
A4
>
>
{
typedef
::
testing
::
tuple
<
Matcher
<
A1
>
,
Matcher
<
A2
>
,
Matcher
<
A3
>
,
Matcher
<
A4
>
>
type
;
};
template
<
typename
A1
,
typename
A2
,
typename
A3
,
typename
A4
,
typename
A5
>
struct
MatcherTuple
<
::
testing
::
tuple
<
A1
,
A2
,
A3
,
A4
,
A5
>
>
{
typedef
::
testing
::
tuple
<
Matcher
<
A1
>
,
Matcher
<
A2
>
,
Matcher
<
A3
>
,
Matcher
<
A4
>
,
Matcher
<
A5
>
>
type
;
};
template
<
typename
A1
,
typename
A2
,
typename
A3
,
typename
A4
,
typename
A5
,
typename
A6
>
struct
MatcherTuple
<
::
testing
::
tuple
<
A1
,
A2
,
A3
,
A4
,
A5
,
A6
>
>
{
typedef
::
testing
::
tuple
<
Matcher
<
A1
>
,
Matcher
<
A2
>
,
Matcher
<
A3
>
,
Matcher
<
A4
>
,
Matcher
<
A5
>
,
Matcher
<
A6
>
>
type
;
};
template
<
typename
A1
,
typename
A2
,
typename
A3
,
typename
A4
,
typename
A5
,
typename
A6
,
typename
A7
>
struct
MatcherTuple
<
::
testing
::
tuple
<
A1
,
A2
,
A3
,
A4
,
A5
,
A6
,
A7
>
>
{
typedef
::
testing
::
tuple
<
Matcher
<
A1
>
,
Matcher
<
A2
>
,
Matcher
<
A3
>
,
Matcher
<
A4
>
,
Matcher
<
A5
>
,
Matcher
<
A6
>
,
Matcher
<
A7
>
>
type
;
};
template
<
typename
A1
,
typename
A2
,
typename
A3
,
typename
A4
,
typename
A5
,
typename
A6
,
typename
A7
,
typename
A8
>
struct
MatcherTuple
<
::
testing
::
tuple
<
A1
,
A2
,
A3
,
A4
,
A5
,
A6
,
A7
,
A8
>
>
{
typedef
::
testing
::
tuple
<
Matcher
<
A1
>
,
Matcher
<
A2
>
,
Matcher
<
A3
>
,
Matcher
<
A4
>
,
Matcher
<
A5
>
,
Matcher
<
A6
>
,
Matcher
<
A7
>
,
Matcher
<
A8
>
>
type
;
};
template
<
typename
A1
,
typename
A2
,
typename
A3
,
typename
A4
,
typename
A5
,
typename
A6
,
typename
A7
,
typename
A8
,
typename
A9
>
struct
MatcherTuple
<
::
testing
::
tuple
<
A1
,
A2
,
A3
,
A4
,
A5
,
A6
,
A7
,
A8
,
A9
>
>
{
typedef
::
testing
::
tuple
<
Matcher
<
A1
>
,
Matcher
<
A2
>
,
Matcher
<
A3
>
,
Matcher
<
A4
>
,
Matcher
<
A5
>
,
Matcher
<
A6
>
,
Matcher
<
A7
>
,
Matcher
<
A8
>
,
Matcher
<
A9
>
>
type
;
};
template
<
typename
A1
,
typename
A2
,
typename
A3
,
typename
A4
,
typename
A5
,
typename
A6
,
typename
A7
,
typename
A8
,
typename
A9
,
typename
A10
>
struct
MatcherTuple
<
::
testing
::
tuple
<
A1
,
A2
,
A3
,
A4
,
A5
,
A6
,
A7
,
A8
,
A9
,
A10
>
>
{
typedef
::
testing
::
tuple
<
Matcher
<
A1
>
,
Matcher
<
A2
>
,
Matcher
<
A3
>
,
Matcher
<
A4
>
,
Matcher
<
A5
>
,
Matcher
<
A6
>
,
Matcher
<
A7
>
,
Matcher
<
A8
>
,
Matcher
<
A9
>
,
Matcher
<
A10
>
>
type
;
};
// Template struct Function<F>, where F must be a function type, contains
// the following typedefs:
//
// Result: the function's return type.
// ArgumentN: the type of the N-th argument, where N starts with 1.
// ArgumentTuple: the tuple type consisting of all parameters of F.
// ArgumentMatcherTuple: the tuple type consisting of Matchers for all
// parameters of F.
// MakeResultVoid: the function type obtained by substituting void
// for the return type of F.
// MakeResultIgnoredValue:
// the function type obtained by substituting Something
// for the return type of F.
template
<
typename
F
>
struct
Function
;
template
<
typename
R
>
struct
Function
<
R
()
>
{
typedef
R
Result
;
typedef
::
testing
::
tuple
<>
ArgumentTuple
;
typedef
typename
MatcherTuple
<
ArgumentTuple
>::
type
ArgumentMatcherTuple
;
typedef
void
MakeResultVoid
();
typedef
IgnoredValue
MakeResultIgnoredValue
();
};
template
<
typename
R
,
typename
A1
>
struct
Function
<
R
(
A1
)
>
:
Function
<
R
()
>
{
typedef
A1
Argument1
;
typedef
::
testing
::
tuple
<
A1
>
ArgumentTuple
;
typedef
typename
MatcherTuple
<
ArgumentTuple
>::
type
ArgumentMatcherTuple
;
typedef
void
MakeResultVoid
(
A1
);
typedef
IgnoredValue
MakeResultIgnoredValue
(
A1
);
};
template
<
typename
R
,
typename
A1
,
typename
A2
>
struct
Function
<
R
(
A1
,
A2
)
>
:
Function
<
R
(
A1
)
>
{
typedef
A2
Argument2
;
typedef
::
testing
::
tuple
<
A1
,
A2
>
ArgumentTuple
;
typedef
typename
MatcherTuple
<
ArgumentTuple
>::
type
ArgumentMatcherTuple
;
typedef
void
MakeResultVoid
(
A1
,
A2
);
typedef
IgnoredValue
MakeResultIgnoredValue
(
A1
,
A2
);
};
template
<
typename
R
,
typename
A1
,
typename
A2
,
typename
A3
>
struct
Function
<
R
(
A1
,
A2
,
A3
)
>
:
Function
<
R
(
A1
,
A2
)
>
{
typedef
A3
Argument3
;
typedef
::
testing
::
tuple
<
A1
,
A2
,
A3
>
ArgumentTuple
;
typedef
typename
MatcherTuple
<
ArgumentTuple
>::
type
ArgumentMatcherTuple
;
typedef
void
MakeResultVoid
(
A1
,
A2
,
A3
);
typedef
IgnoredValue
MakeResultIgnoredValue
(
A1
,
A2
,
A3
);
};
template
<
typename
R
,
typename
A1
,
typename
A2
,
typename
A3
,
typename
A4
>
struct
Function
<
R
(
A1
,
A2
,
A3
,
A4
)
>
:
Function
<
R
(
A1
,
A2
,
A3
)
>
{
typedef
A4
Argument4
;
typedef
::
testing
::
tuple
<
A1
,
A2
,
A3
,
A4
>
ArgumentTuple
;
typedef
typename
MatcherTuple
<
ArgumentTuple
>::
type
ArgumentMatcherTuple
;
typedef
void
MakeResultVoid
(
A1
,
A2
,
A3
,
A4
);
typedef
IgnoredValue
MakeResultIgnoredValue
(
A1
,
A2
,
A3
,
A4
);
};
template
<
typename
R
,
typename
A1
,
typename
A2
,
typename
A3
,
typename
A4
,
typename
A5
>
struct
Function
<
R
(
A1
,
A2
,
A3
,
A4
,
A5
)
>
:
Function
<
R
(
A1
,
A2
,
A3
,
A4
)
>
{
typedef
A5
Argument5
;
typedef
::
testing
::
tuple
<
A1
,
A2
,
A3
,
A4
,
A5
>
ArgumentTuple
;
typedef
typename
MatcherTuple
<
ArgumentTuple
>::
type
ArgumentMatcherTuple
;
typedef
void
MakeResultVoid
(
A1
,
A2
,
A3
,
A4
,
A5
);
typedef
IgnoredValue
MakeResultIgnoredValue
(
A1
,
A2
,
A3
,
A4
,
A5
);
};
template
<
typename
R
,
typename
A1
,
typename
A2
,
typename
A3
,
typename
A4
,
typename
A5
,
typename
A6
>
struct
Function
<
R
(
A1
,
A2
,
A3
,
A4
,
A5
,
A6
)
>
:
Function
<
R
(
A1
,
A2
,
A3
,
A4
,
A5
)
>
{
typedef
A6
Argument6
;
typedef
::
testing
::
tuple
<
A1
,
A2
,
A3
,
A4
,
A5
,
A6
>
ArgumentTuple
;
typedef
typename
MatcherTuple
<
ArgumentTuple
>::
type
ArgumentMatcherTuple
;
typedef
void
MakeResultVoid
(
A1
,
A2
,
A3
,
A4
,
A5
,
A6
);
typedef
IgnoredValue
MakeResultIgnoredValue
(
A1
,
A2
,
A3
,
A4
,
A5
,
A6
);
};
template
<
typename
R
,
typename
A1
,
typename
A2
,
typename
A3
,
typename
A4
,
typename
A5
,
typename
A6
,
typename
A7
>
struct
Function
<
R
(
A1
,
A2
,
A3
,
A4
,
A5
,
A6
,
A7
)
>
:
Function
<
R
(
A1
,
A2
,
A3
,
A4
,
A5
,
A6
)
>
{
typedef
A7
Argument7
;
typedef
::
testing
::
tuple
<
A1
,
A2
,
A3
,
A4
,
A5
,
A6
,
A7
>
ArgumentTuple
;
typedef
typename
MatcherTuple
<
ArgumentTuple
>::
type
ArgumentMatcherTuple
;
typedef
void
MakeResultVoid
(
A1
,
A2
,
A3
,
A4
,
A5
,
A6
,
A7
);
typedef
IgnoredValue
MakeResultIgnoredValue
(
A1
,
A2
,
A3
,
A4
,
A5
,
A6
,
A7
);
};
template
<
typename
R
,
typename
A1
,
typename
A2
,
typename
A3
,
typename
A4
,
typename
A5
,
typename
A6
,
typename
A7
,
typename
A8
>
struct
Function
<
R
(
A1
,
A2
,
A3
,
A4
,
A5
,
A6
,
A7
,
A8
)
>
:
Function
<
R
(
A1
,
A2
,
A3
,
A4
,
A5
,
A6
,
A7
)
>
{
typedef
A8
Argument8
;
typedef
::
testing
::
tuple
<
A1
,
A2
,
A3
,
A4
,
A5
,
A6
,
A7
,
A8
>
ArgumentTuple
;
typedef
typename
MatcherTuple
<
ArgumentTuple
>::
type
ArgumentMatcherTuple
;
typedef
void
MakeResultVoid
(
A1
,
A2
,
A3
,
A4
,
A5
,
A6
,
A7
,
A8
);
typedef
IgnoredValue
MakeResultIgnoredValue
(
A1
,
A2
,
A3
,
A4
,
A5
,
A6
,
A7
,
A8
);
};
template
<
typename
R
,
typename
A1
,
typename
A2
,
typename
A3
,
typename
A4
,
typename
A5
,
typename
A6
,
typename
A7
,
typename
A8
,
typename
A9
>
struct
Function
<
R
(
A1
,
A2
,
A3
,
A4
,
A5
,
A6
,
A7
,
A8
,
A9
)
>
:
Function
<
R
(
A1
,
A2
,
A3
,
A4
,
A5
,
A6
,
A7
,
A8
)
>
{
typedef
A9
Argument9
;
typedef
::
testing
::
tuple
<
A1
,
A2
,
A3
,
A4
,
A5
,
A6
,
A7
,
A8
,
A9
>
ArgumentTuple
;
typedef
typename
MatcherTuple
<
ArgumentTuple
>::
type
ArgumentMatcherTuple
;
typedef
void
MakeResultVoid
(
A1
,
A2
,
A3
,
A4
,
A5
,
A6
,
A7
,
A8
,
A9
);
typedef
IgnoredValue
MakeResultIgnoredValue
(
A1
,
A2
,
A3
,
A4
,
A5
,
A6
,
A7
,
A8
,
A9
);
};
template
<
typename
R
,
typename
A1
,
typename
A2
,
typename
A3
,
typename
A4
,
typename
A5
,
typename
A6
,
typename
A7
,
typename
A8
,
typename
A9
,
typename
A10
>
struct
Function
<
R
(
A1
,
A2
,
A3
,
A4
,
A5
,
A6
,
A7
,
A8
,
A9
,
A10
)
>
:
Function
<
R
(
A1
,
A2
,
A3
,
A4
,
A5
,
A6
,
A7
,
A8
,
A9
)
>
{
typedef
A10
Argument10
;
typedef
::
testing
::
tuple
<
A1
,
A2
,
A3
,
A4
,
A5
,
A6
,
A7
,
A8
,
A9
,
A10
>
ArgumentTuple
;
typedef
typename
MatcherTuple
<
ArgumentTuple
>::
type
ArgumentMatcherTuple
;
typedef
void
MakeResultVoid
(
A1
,
A2
,
A3
,
A4
,
A5
,
A6
,
A7
,
A8
,
A9
,
A10
);
typedef
IgnoredValue
MakeResultIgnoredValue
(
A1
,
A2
,
A3
,
A4
,
A5
,
A6
,
A7
,
A8
,
A9
,
A10
);
};
}
// namespace internal
}
// namespace testing
#endif // GMOCK_INCLUDE_GMOCK_INTERNAL_GMOCK_GENERATED_INTERNAL_UTILS_H_
googlemock/include/gmock/internal/gmock-generated-internal-utils.h.pump
0 → 100644
View file @
ecf94595
$$
-*-
mode
:
c
++
;
-*-
$$
This
is
a
Pump
source
file
.
Please
use
Pump
to
convert
it
to
$$
gmock
-
generated
-
function
-
mockers
.
h
.
$$
$
var
n
=
10
$$
The
maximum
arity
we
support
.
// Copyright 2007, Google Inc.
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
// * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following disclaimer
// in the documentation and/or other materials provided with the
// distribution.
// * Neither the name of Google Inc. nor the names of its
// contributors may be used to endorse or promote products derived from
// this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//
// Author: wan@google.com (Zhanyong Wan)
// Google Mock - a framework for writing C++ mock classes.
//
// This file contains template meta-programming utility classes needed
// for implementing Google Mock.
#ifndef GMOCK_INCLUDE_GMOCK_INTERNAL_GMOCK_GENERATED_INTERNAL_UTILS_H_
#define GMOCK_INCLUDE_GMOCK_INTERNAL_GMOCK_GENERATED_INTERNAL_UTILS_H_
#include "gmock/internal/gmock-port.h"
namespace
testing
{
template
<
typename
T
>
class
Matcher
;
namespace
internal
{
// An IgnoredValue object can be implicitly constructed from ANY value.
// This is used in implementing the IgnoreResult(a) action.
class
IgnoredValue
{
public:
// This constructor template allows any value to be implicitly
// converted to IgnoredValue. The object has no data member and
// doesn't try to remember anything about the argument. We
// deliberately omit the 'explicit' keyword in order to allow the
// conversion to be implicit.
template
<
typename
T
>
IgnoredValue
(
const
T
&
/* ignored */
)
{}
// NOLINT(runtime/explicit)
};
// MatcherTuple<T>::type is a tuple type where each field is a Matcher
// for the corresponding field in tuple type T.
template
<
typename
Tuple
>
struct
MatcherTuple
;
$
range
i
0.
.
n
$
for
i
[[
$
range
j
1.
.
i
$
var
typename_As
=
[[
$
for
j
,
[[
typename
A
$
j
]]]]
$
var
As
=
[[
$
for
j
,
[[
A
$
j
]]]]
$
var
matcher_As
=
[[
$
for
j
,
[[
Matcher
<
A
$
j
>
]]]]
template
<
$
typename_As
>
struct
MatcherTuple
<
::
testing
::
tuple
<
$
As
>
>
{
typedef
::
testing
::
tuple
<
$
matcher_As
>
type
;
};
]]
// Template struct Function<F>, where F must be a function type, contains
// the following typedefs:
//
// Result: the function's return type.
// ArgumentN: the type of the N-th argument, where N starts with 1.
// ArgumentTuple: the tuple type consisting of all parameters of F.
// ArgumentMatcherTuple: the tuple type consisting of Matchers for all
// parameters of F.
// MakeResultVoid: the function type obtained by substituting void
// for the return type of F.
// MakeResultIgnoredValue:
// the function type obtained by substituting Something
// for the return type of F.
template
<
typename
F
>
struct
Function
;
template
<
typename
R
>
struct
Function
<
R
()
>
{
typedef
R
Result
;
typedef
::
testing
::
tuple
<>
ArgumentTuple
;
typedef
typename
MatcherTuple
<
ArgumentTuple
>::
type
ArgumentMatcherTuple
;
typedef
void
MakeResultVoid
();
typedef
IgnoredValue
MakeResultIgnoredValue
();
};
$
range
i
1.
.
n
$
for
i
[[
$
range
j
1.
.
i
$
var
typename_As
=
[[
$
for
j
[[,
typename
A
$
j
]]]]
$
var
As
=
[[
$
for
j
,
[[
A
$
j
]]]]
$
var
matcher_As
=
[[
$
for
j
,
[[
Matcher
<
A
$
j
>
]]]]
$
range
k
1.
.
i
-
1
$
var
prev_As
=
[[
$
for
k
,
[[
A
$
k
]]]]
template
<
typename
R
$
typename_As
>
struct
Function
<
R
(
$
As
)
>
:
Function
<
R
(
$
prev_As
)
>
{
typedef
A
$
i
Argument
$
i
;
typedef
::
testing
::
tuple
<
$
As
>
ArgumentTuple
;
typedef
typename
MatcherTuple
<
ArgumentTuple
>::
type
ArgumentMatcherTuple
;
typedef
void
MakeResultVoid
(
$
As
);
typedef
IgnoredValue
MakeResultIgnoredValue
(
$
As
);
};
]]
}
// namespace internal
}
// namespace testing
#endif // GMOCK_INCLUDE_GMOCK_INTERNAL_GMOCK_GENERATED_INTERNAL_UTILS_H_
googlemock/include/gmock/internal/gmock-internal-utils.h
0 → 100644
View file @
ecf94595
// Copyright 2007, Google Inc.
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
// * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following disclaimer
// in the documentation and/or other materials provided with the
// distribution.
// * Neither the name of Google Inc. nor the names of its
// contributors may be used to endorse or promote products derived from
// this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//
// Author: wan@google.com (Zhanyong Wan)
// Google Mock - a framework for writing C++ mock classes.
//
// This file defines some utilities useful for implementing Google
// Mock. They are subject to change without notice, so please DO NOT
// USE THEM IN USER CODE.
#ifndef GMOCK_INCLUDE_GMOCK_INTERNAL_GMOCK_INTERNAL_UTILS_H_
#define GMOCK_INCLUDE_GMOCK_INTERNAL_GMOCK_INTERNAL_UTILS_H_
#include <stdio.h>
#include <ostream> // NOLINT
#include <string>
#include "gmock/internal/gmock-generated-internal-utils.h"
#include "gmock/internal/gmock-port.h"
#include "gtest/gtest.h"
namespace
testing
{
namespace
internal
{
// Converts an identifier name to a space-separated list of lower-case
// words. Each maximum substring of the form [A-Za-z][a-z]*|\d+ is
// treated as one word. For example, both "FooBar123" and
// "foo_bar_123" are converted to "foo bar 123".
GTEST_API_
string
ConvertIdentifierNameToWords
(
const
char
*
id_name
);
// PointeeOf<Pointer>::type is the type of a value pointed to by a
// Pointer, which can be either a smart pointer or a raw pointer. The
// following default implementation is for the case where Pointer is a
// smart pointer.
template
<
typename
Pointer
>
struct
PointeeOf
{
// Smart pointer classes define type element_type as the type of
// their pointees.
typedef
typename
Pointer
::
element_type
type
;
};
// This specialization is for the raw pointer case.
template
<
typename
T
>
struct
PointeeOf
<
T
*>
{
typedef
T
type
;
};
// NOLINT
// GetRawPointer(p) returns the raw pointer underlying p when p is a
// smart pointer, or returns p itself when p is already a raw pointer.
// The following default implementation is for the smart pointer case.
template
<
typename
Pointer
>
inline
const
typename
Pointer
::
element_type
*
GetRawPointer
(
const
Pointer
&
p
)
{
return
p
.
get
();
}
// This overloaded version is for the raw pointer case.
template
<
typename
Element
>
inline
Element
*
GetRawPointer
(
Element
*
p
)
{
return
p
;
}
// This comparator allows linked_ptr to be stored in sets.
template
<
typename
T
>
struct
LinkedPtrLessThan
{
bool
operator
()(
const
::
testing
::
internal
::
linked_ptr
<
T
>&
lhs
,
const
::
testing
::
internal
::
linked_ptr
<
T
>&
rhs
)
const
{
return
lhs
.
get
()
<
rhs
.
get
();
}
};
// Symbian compilation can be done with wchar_t being either a native
// type or a typedef. Using Google Mock with OpenC without wchar_t
// should require the definition of _STLP_NO_WCHAR_T.
//
// MSVC treats wchar_t as a native type usually, but treats it as the
// same as unsigned short when the compiler option /Zc:wchar_t- is
// specified. It defines _NATIVE_WCHAR_T_DEFINED symbol when wchar_t
// is a native type.
#if (GTEST_OS_SYMBIAN && defined(_STLP_NO_WCHAR_T)) || \
(defined(_MSC_VER) && !defined(_NATIVE_WCHAR_T_DEFINED))
// wchar_t is a typedef.
#else
# define GMOCK_WCHAR_T_IS_NATIVE_ 1
#endif
// signed wchar_t and unsigned wchar_t are NOT in the C++ standard.
// Using them is a bad practice and not portable. So DON'T use them.
//
// Still, Google Mock is designed to work even if the user uses signed
// wchar_t or unsigned wchar_t (obviously, assuming the compiler
// supports them).
//
// To gcc,
// wchar_t == signed wchar_t != unsigned wchar_t == unsigned int
#ifdef __GNUC__
// signed/unsigned wchar_t are valid types.
# define GMOCK_HAS_SIGNED_WCHAR_T_ 1
#endif
// In what follows, we use the term "kind" to indicate whether a type
// is bool, an integer type (excluding bool), a floating-point type,
// or none of them. This categorization is useful for determining
// when a matcher argument type can be safely converted to another
// type in the implementation of SafeMatcherCast.
enum
TypeKind
{
kBool
,
kInteger
,
kFloatingPoint
,
kOther
};
// KindOf<T>::value is the kind of type T.
template
<
typename
T
>
struct
KindOf
{
enum
{
value
=
kOther
};
// The default kind.
};
// This macro declares that the kind of 'type' is 'kind'.
#define GMOCK_DECLARE_KIND_(type, kind) \
template <> struct KindOf<type> { enum { value = kind }; }
GMOCK_DECLARE_KIND_
(
bool
,
kBool
);
// All standard integer types.
GMOCK_DECLARE_KIND_
(
char
,
kInteger
);
GMOCK_DECLARE_KIND_
(
signed
char
,
kInteger
);
GMOCK_DECLARE_KIND_
(
unsigned
char
,
kInteger
);
GMOCK_DECLARE_KIND_
(
short
,
kInteger
);
// NOLINT
GMOCK_DECLARE_KIND_
(
unsigned
short
,
kInteger
);
// NOLINT
GMOCK_DECLARE_KIND_
(
int
,
kInteger
);
GMOCK_DECLARE_KIND_
(
unsigned
int
,
kInteger
);
GMOCK_DECLARE_KIND_
(
long
,
kInteger
);
// NOLINT
GMOCK_DECLARE_KIND_
(
unsigned
long
,
kInteger
);
// NOLINT
#if GMOCK_WCHAR_T_IS_NATIVE_
GMOCK_DECLARE_KIND_
(
wchar_t
,
kInteger
);
#endif
// Non-standard integer types.
GMOCK_DECLARE_KIND_
(
Int64
,
kInteger
);
GMOCK_DECLARE_KIND_
(
UInt64
,
kInteger
);
// All standard floating-point types.
GMOCK_DECLARE_KIND_
(
float
,
kFloatingPoint
);
GMOCK_DECLARE_KIND_
(
double
,
kFloatingPoint
);
GMOCK_DECLARE_KIND_
(
long
double
,
kFloatingPoint
);
#undef GMOCK_DECLARE_KIND_
// Evaluates to the kind of 'type'.
#define GMOCK_KIND_OF_(type) \
static_cast< ::testing::internal::TypeKind>( \
::testing::internal::KindOf<type>::value)
// Evaluates to true iff integer type T is signed.
#define GMOCK_IS_SIGNED_(T) (static_cast<T>(-1) < 0)
// LosslessArithmeticConvertibleImpl<kFromKind, From, kToKind, To>::value
// is true iff arithmetic type From can be losslessly converted to
// arithmetic type To.
//
// It's the user's responsibility to ensure that both From and To are
// raw (i.e. has no CV modifier, is not a pointer, and is not a
// reference) built-in arithmetic types, kFromKind is the kind of
// From, and kToKind is the kind of To; the value is
// implementation-defined when the above pre-condition is violated.
template
<
TypeKind
kFromKind
,
typename
From
,
TypeKind
kToKind
,
typename
To
>
struct
LosslessArithmeticConvertibleImpl
:
public
false_type
{};
// Converting bool to bool is lossless.
template
<
>
struct
LosslessArithmeticConvertibleImpl
<
kBool
,
bool
,
kBool
,
bool
>
:
public
true_type
{};
// NOLINT
// Converting bool to any integer type is lossless.
template
<
typename
To
>
struct
LosslessArithmeticConvertibleImpl
<
kBool
,
bool
,
kInteger
,
To
>
:
public
true_type
{};
// NOLINT
// Converting bool to any floating-point type is lossless.
template
<
typename
To
>
struct
LosslessArithmeticConvertibleImpl
<
kBool
,
bool
,
kFloatingPoint
,
To
>
:
public
true_type
{};
// NOLINT
// Converting an integer to bool is lossy.
template
<
typename
From
>
struct
LosslessArithmeticConvertibleImpl
<
kInteger
,
From
,
kBool
,
bool
>
:
public
false_type
{};
// NOLINT
// Converting an integer to another non-bool integer is lossless iff
// the target type's range encloses the source type's range.
template
<
typename
From
,
typename
To
>
struct
LosslessArithmeticConvertibleImpl
<
kInteger
,
From
,
kInteger
,
To
>
:
public
bool_constant
<
// When converting from a smaller size to a larger size, we are
// fine as long as we are not converting from signed to unsigned.
((
sizeof
(
From
)
<
sizeof
(
To
))
&&
(
!
GMOCK_IS_SIGNED_
(
From
)
||
GMOCK_IS_SIGNED_
(
To
)))
||
// When converting between the same size, the signedness must match.
((
sizeof
(
From
)
==
sizeof
(
To
))
&&
(
GMOCK_IS_SIGNED_
(
From
)
==
GMOCK_IS_SIGNED_
(
To
)))
>
{};
// NOLINT
#undef GMOCK_IS_SIGNED_
// Converting an integer to a floating-point type may be lossy, since
// the format of a floating-point number is implementation-defined.
template
<
typename
From
,
typename
To
>
struct
LosslessArithmeticConvertibleImpl
<
kInteger
,
From
,
kFloatingPoint
,
To
>
:
public
false_type
{};
// NOLINT
// Converting a floating-point to bool is lossy.
template
<
typename
From
>
struct
LosslessArithmeticConvertibleImpl
<
kFloatingPoint
,
From
,
kBool
,
bool
>
:
public
false_type
{};
// NOLINT
// Converting a floating-point to an integer is lossy.
template
<
typename
From
,
typename
To
>
struct
LosslessArithmeticConvertibleImpl
<
kFloatingPoint
,
From
,
kInteger
,
To
>
:
public
false_type
{};
// NOLINT
// Converting a floating-point to another floating-point is lossless
// iff the target type is at least as big as the source type.
template
<
typename
From
,
typename
To
>
struct
LosslessArithmeticConvertibleImpl
<
kFloatingPoint
,
From
,
kFloatingPoint
,
To
>
:
public
bool_constant
<
sizeof
(
From
)
<=
sizeof
(
To
)
>
{};
// NOLINT
// LosslessArithmeticConvertible<From, To>::value is true iff arithmetic
// type From can be losslessly converted to arithmetic type To.
//
// It's the user's responsibility to ensure that both From and To are
// raw (i.e. has no CV modifier, is not a pointer, and is not a
// reference) built-in arithmetic types; the value is
// implementation-defined when the above pre-condition is violated.
template
<
typename
From
,
typename
To
>
struct
LosslessArithmeticConvertible
:
public
LosslessArithmeticConvertibleImpl
<
GMOCK_KIND_OF_
(
From
),
From
,
GMOCK_KIND_OF_
(
To
),
To
>
{};
// NOLINT
// This interface knows how to report a Google Mock failure (either
// non-fatal or fatal).
class
FailureReporterInterface
{
public:
// The type of a failure (either non-fatal or fatal).
enum
FailureType
{
kNonfatal
,
kFatal
};
virtual
~
FailureReporterInterface
()
{}
// Reports a failure that occurred at the given source file location.
virtual
void
ReportFailure
(
FailureType
type
,
const
char
*
file
,
int
line
,
const
string
&
message
)
=
0
;
};
// Returns the failure reporter used by Google Mock.
GTEST_API_
FailureReporterInterface
*
GetFailureReporter
();
// Asserts that condition is true; aborts the process with the given
// message if condition is false. We cannot use LOG(FATAL) or CHECK()
// as Google Mock might be used to mock the log sink itself. We
// inline this function to prevent it from showing up in the stack
// trace.
inline
void
Assert
(
bool
condition
,
const
char
*
file
,
int
line
,
const
string
&
msg
)
{
if
(
!
condition
)
{
GetFailureReporter
()
->
ReportFailure
(
FailureReporterInterface
::
kFatal
,
file
,
line
,
msg
);
}
}
inline
void
Assert
(
bool
condition
,
const
char
*
file
,
int
line
)
{
Assert
(
condition
,
file
,
line
,
"Assertion failed."
);
}
// Verifies that condition is true; generates a non-fatal failure if
// condition is false.
inline
void
Expect
(
bool
condition
,
const
char
*
file
,
int
line
,
const
string
&
msg
)
{
if
(
!
condition
)
{
GetFailureReporter
()
->
ReportFailure
(
FailureReporterInterface
::
kNonfatal
,
file
,
line
,
msg
);
}
}
inline
void
Expect
(
bool
condition
,
const
char
*
file
,
int
line
)
{
Expect
(
condition
,
file
,
line
,
"Expectation failed."
);
}
// Severity level of a log.
enum
LogSeverity
{
kInfo
=
0
,
kWarning
=
1
};
// Valid values for the --gmock_verbose flag.
// All logs (informational and warnings) are printed.
const
char
kInfoVerbosity
[]
=
"info"
;
// Only warnings are printed.
const
char
kWarningVerbosity
[]
=
"warning"
;
// No logs are printed.
const
char
kErrorVerbosity
[]
=
"error"
;
// Returns true iff a log with the given severity is visible according
// to the --gmock_verbose flag.
GTEST_API_
bool
LogIsVisible
(
LogSeverity
severity
);
// Prints the given message to stdout iff 'severity' >= the level
// specified by the --gmock_verbose flag. If stack_frames_to_skip >=
// 0, also prints the stack trace excluding the top
// stack_frames_to_skip frames. In opt mode, any positive
// stack_frames_to_skip is treated as 0, since we don't know which
// function calls will be inlined by the compiler and need to be
// conservative.
GTEST_API_
void
Log
(
LogSeverity
severity
,
const
string
&
message
,
int
stack_frames_to_skip
);
// TODO(wan@google.com): group all type utilities together.
// Type traits.
// is_reference<T>::value is non-zero iff T is a reference type.
template
<
typename
T
>
struct
is_reference
:
public
false_type
{};
template
<
typename
T
>
struct
is_reference
<
T
&>
:
public
true_type
{};
// type_equals<T1, T2>::value is non-zero iff T1 and T2 are the same type.
template
<
typename
T1
,
typename
T2
>
struct
type_equals
:
public
false_type
{};
template
<
typename
T
>
struct
type_equals
<
T
,
T
>
:
public
true_type
{};
// remove_reference<T>::type removes the reference from type T, if any.
template
<
typename
T
>
struct
remove_reference
{
typedef
T
type
;
};
// NOLINT
template
<
typename
T
>
struct
remove_reference
<
T
&>
{
typedef
T
type
;
};
// NOLINT
// DecayArray<T>::type turns an array type U[N] to const U* and preserves
// other types. Useful for saving a copy of a function argument.
template
<
typename
T
>
struct
DecayArray
{
typedef
T
type
;
};
// NOLINT
template
<
typename
T
,
size_t
N
>
struct
DecayArray
<
T
[
N
]
>
{
typedef
const
T
*
type
;
};
// Sometimes people use arrays whose size is not available at the use site
// (e.g. extern const char kNamePrefix[]). This specialization covers that
// case.
template
<
typename
T
>
struct
DecayArray
<
T
[]
>
{
typedef
const
T
*
type
;
};
// Disable MSVC warnings for infinite recursion, since in this case the
// the recursion is unreachable.
#ifdef _MSC_VER
# pragma warning(push)
# pragma warning(disable:4717)
#endif
// Invalid<T>() is usable as an expression of type T, but will terminate
// the program with an assertion failure if actually run. This is useful
// when a value of type T is needed for compilation, but the statement
// will not really be executed (or we don't care if the statement
// crashes).
template
<
typename
T
>
inline
T
Invalid
()
{
Assert
(
false
,
""
,
-
1
,
"Internal error: attempt to return invalid value"
);
// This statement is unreachable, and would never terminate even if it
// could be reached. It is provided only to placate compiler warnings
// about missing return statements.
return
Invalid
<
T
>
();
}
#ifdef _MSC_VER
# pragma warning(pop)
#endif
// Given a raw type (i.e. having no top-level reference or const
// modifier) RawContainer that's either an STL-style container or a
// native array, class StlContainerView<RawContainer> has the
// following members:
//
// - type is a type that provides an STL-style container view to
// (i.e. implements the STL container concept for) RawContainer;
// - const_reference is a type that provides a reference to a const
// RawContainer;
// - ConstReference(raw_container) returns a const reference to an STL-style
// container view to raw_container, which is a RawContainer.
// - Copy(raw_container) returns an STL-style container view of a
// copy of raw_container, which is a RawContainer.
//
// This generic version is used when RawContainer itself is already an
// STL-style container.
template
<
class
RawContainer
>
class
StlContainerView
{
public:
typedef
RawContainer
type
;
typedef
const
type
&
const_reference
;
static
const_reference
ConstReference
(
const
RawContainer
&
container
)
{
// Ensures that RawContainer is not a const type.
testing
::
StaticAssertTypeEq
<
RawContainer
,
GTEST_REMOVE_CONST_
(
RawContainer
)
>
();
return
container
;
}
static
type
Copy
(
const
RawContainer
&
container
)
{
return
container
;
}
};
// This specialization is used when RawContainer is a native array type.
template
<
typename
Element
,
size_t
N
>
class
StlContainerView
<
Element
[
N
]
>
{
public:
typedef
GTEST_REMOVE_CONST_
(
Element
)
RawElement
;
typedef
internal
::
NativeArray
<
RawElement
>
type
;
// NativeArray<T> can represent a native array either by value or by
// reference (selected by a constructor argument), so 'const type'
// can be used to reference a const native array. We cannot
// 'typedef const type& const_reference' here, as that would mean
// ConstReference() has to return a reference to a local variable.
typedef
const
type
const_reference
;
static
const_reference
ConstReference
(
const
Element
(
&
array
)[
N
])
{
// Ensures that Element is not a const type.
testing
::
StaticAssertTypeEq
<
Element
,
RawElement
>
();
#if GTEST_OS_SYMBIAN
// The Nokia Symbian compiler confuses itself in template instantiation
// for this call without the cast to Element*:
// function call '[testing::internal::NativeArray<char *>].NativeArray(
// {lval} const char *[4], long, testing::internal::RelationToSource)'
// does not match
// 'testing::internal::NativeArray<char *>::NativeArray(
// char *const *, unsigned int, testing::internal::RelationToSource)'
// (instantiating: 'testing::internal::ContainsMatcherImpl
// <const char * (&)[4]>::Matches(const char * (&)[4]) const')
// (instantiating: 'testing::internal::StlContainerView<char *[4]>::
// ConstReference(const char * (&)[4])')
// (and though the N parameter type is mismatched in the above explicit
// conversion of it doesn't help - only the conversion of the array).
return
type
(
const_cast
<
Element
*>
(
&
array
[
0
]),
N
,
RelationToSourceReference
());
#else
return
type
(
array
,
N
,
RelationToSourceReference
());
#endif // GTEST_OS_SYMBIAN
}
static
type
Copy
(
const
Element
(
&
array
)[
N
])
{
#if GTEST_OS_SYMBIAN
return
type
(
const_cast
<
Element
*>
(
&
array
[
0
]),
N
,
RelationToSourceCopy
());
#else
return
type
(
array
,
N
,
RelationToSourceCopy
());
#endif // GTEST_OS_SYMBIAN
}
};
// This specialization is used when RawContainer is a native array
// represented as a (pointer, size) tuple.
template
<
typename
ElementPointer
,
typename
Size
>
class
StlContainerView
<
::
testing
::
tuple
<
ElementPointer
,
Size
>
>
{
public:
typedef
GTEST_REMOVE_CONST_
(
typename
internal
::
PointeeOf
<
ElementPointer
>::
type
)
RawElement
;
typedef
internal
::
NativeArray
<
RawElement
>
type
;
typedef
const
type
const_reference
;
static
const_reference
ConstReference
(
const
::
testing
::
tuple
<
ElementPointer
,
Size
>&
array
)
{
return
type
(
get
<
0
>
(
array
),
get
<
1
>
(
array
),
RelationToSourceReference
());
}
static
type
Copy
(
const
::
testing
::
tuple
<
ElementPointer
,
Size
>&
array
)
{
return
type
(
get
<
0
>
(
array
),
get
<
1
>
(
array
),
RelationToSourceCopy
());
}
};
// The following specialization prevents the user from instantiating
// StlContainer with a reference type.
template
<
typename
T
>
class
StlContainerView
<
T
&>
;
// A type transform to remove constness from the first part of a pair.
// Pairs like that are used as the value_type of associative containers,
// and this transform produces a similar but assignable pair.
template
<
typename
T
>
struct
RemoveConstFromKey
{
typedef
T
type
;
};
// Partially specialized to remove constness from std::pair<const K, V>.
template
<
typename
K
,
typename
V
>
struct
RemoveConstFromKey
<
std
::
pair
<
const
K
,
V
>
>
{
typedef
std
::
pair
<
K
,
V
>
type
;
};
// Mapping from booleans to types. Similar to boost::bool_<kValue> and
// std::integral_constant<bool, kValue>.
template
<
bool
kValue
>
struct
BooleanConstant
{};
}
// namespace internal
}
// namespace testing
#endif // GMOCK_INCLUDE_GMOCK_INTERNAL_GMOCK_INTERNAL_UTILS_H_
googlemock/include/gmock/internal/gmock-port.h
0 → 100644
View file @
ecf94595
// Copyright 2008, Google Inc.
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
// * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following disclaimer
// in the documentation and/or other materials provided with the
// distribution.
// * Neither the name of Google Inc. nor the names of its
// contributors may be used to endorse or promote products derived from
// this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//
// Author: vadimb@google.com (Vadim Berman)
//
// Low-level types and utilities for porting Google Mock to various
// platforms. All macros ending with _ and symbols defined in an
// internal namespace are subject to change without notice. Code
// outside Google Mock MUST NOT USE THEM DIRECTLY. Macros that don't
// end with _ are part of Google Mock's public API and can be used by
// code outside Google Mock.
#ifndef GMOCK_INCLUDE_GMOCK_INTERNAL_GMOCK_PORT_H_
#define GMOCK_INCLUDE_GMOCK_INTERNAL_GMOCK_PORT_H_
#include <assert.h>
#include <stdlib.h>
#include <iostream>
// Most of the utilities needed for porting Google Mock are also
// required for Google Test and are defined in gtest-port.h.
//
// Note to maintainers: to reduce code duplication, prefer adding
// portability utilities to Google Test's gtest-port.h instead of
// here, as Google Mock depends on Google Test. Only add a utility
// here if it's truly specific to Google Mock.
#include "gtest/internal/gtest-linked_ptr.h"
#include "gtest/internal/gtest-port.h"
#include "gmock/internal/custom/gmock-port.h"
// To avoid conditional compilation everywhere, we make it
// gmock-port.h's responsibility to #include the header implementing
// tr1/tuple. gmock-port.h does this via gtest-port.h, which is
// guaranteed to pull in the tuple header.
// For MS Visual C++, check the compiler version. At least VS 2003 is
// required to compile Google Mock.
#if defined(_MSC_VER) && _MSC_VER < 1310
# error "At least Visual C++ 2003 (7.1) is required to compile Google Mock."
#endif
// Macro for referencing flags. This is public as we want the user to
// use this syntax to reference Google Mock flags.
#define GMOCK_FLAG(name) FLAGS_gmock_##name
#if !defined(GMOCK_DECLARE_bool_)
// Macros for declaring flags.
#define GMOCK_DECLARE_bool_(name) extern GTEST_API_ bool GMOCK_FLAG(name)
#define GMOCK_DECLARE_int32_(name) \
extern GTEST_API_ ::testing::internal::Int32 GMOCK_FLAG(name)
#define GMOCK_DECLARE_string_(name) \
extern GTEST_API_ ::std::string GMOCK_FLAG(name)
// Macros for defining flags.
#define GMOCK_DEFINE_bool_(name, default_val, doc) \
GTEST_API_ bool GMOCK_FLAG(name) = (default_val)
#define GMOCK_DEFINE_int32_(name, default_val, doc) \
GTEST_API_ ::testing::internal::Int32 GMOCK_FLAG(name) = (default_val)
#define GMOCK_DEFINE_string_(name, default_val, doc) \
GTEST_API_ ::std::string GMOCK_FLAG(name) = (default_val)
#endif // !defined(GMOCK_DECLARE_bool_)
#endif // GMOCK_INCLUDE_GMOCK_INTERNAL_GMOCK_PORT_H_
googlemock/make/Makefile
0 → 100644
View file @
ecf94595
# A sample Makefile for building both Google Mock and Google Test and
# using them in user tests. This file is self-contained, so you don't
# need to use the Makefile in Google Test's source tree. Please tweak
# it to suit your environment and project. You may want to move it to
# your project's root directory.
#
# SYNOPSIS:
#
# make [all] - makes everything.
# make TARGET - makes the given target.
# make clean - removes all files generated by make.
# Please tweak the following variable definitions as needed by your
# project, except GMOCK_HEADERS and GTEST_HEADERS, which you can use
# in your own targets but shouldn't modify.
# Points to the root of Google Test, relative to where this file is.
# Remember to tweak this if you move this file, or if you want to use
# a copy of Google Test at a different location.
GTEST_DIR
=
../gtest
# Points to the root of Google Mock, relative to where this file is.
# Remember to tweak this if you move this file.
GMOCK_DIR
=
..
# Where to find user code.
USER_DIR
=
../test
# Flags passed to the preprocessor.
# Set Google Test and Google Mock's header directories as system
# directories, such that the compiler doesn't generate warnings in
# these headers.
CPPFLAGS
+=
-isystem
$(GTEST_DIR)
/include
-isystem
$(GMOCK_DIR)
/include
# Flags passed to the C++ compiler.
CXXFLAGS
+=
-g
-Wall
-Wextra
-pthread
# All tests produced by this Makefile. Remember to add new tests you
# created to the list.
TESTS
=
gmock_test
# All Google Test headers. Usually you shouldn't change this
# definition.
GTEST_HEADERS
=
$(GTEST_DIR)
/include/gtest/
*
.h
\
$(GTEST_DIR)
/include/gtest/internal/
*
.h
# All Google Mock headers. Note that all Google Test headers are
# included here too, as they are #included by Google Mock headers.
# Usually you shouldn't change this definition.
GMOCK_HEADERS
=
$(GMOCK_DIR)
/include/gmock/
*
.h
\
$(GMOCK_DIR)
/include/gmock/internal/
*
.h
\
$(GTEST_HEADERS)
# House-keeping build targets.
all
:
$(TESTS)
clean
:
rm
-f
$(TESTS)
gmock.a gmock_main.a
*
.o
# Builds gmock.a and gmock_main.a. These libraries contain both
# Google Mock and Google Test. A test should link with either gmock.a
# or gmock_main.a, depending on whether it defines its own main()
# function. It's fine if your test only uses features from Google
# Test (and not Google Mock).
# Usually you shouldn't tweak such internal variables, indicated by a
# trailing _.
GTEST_SRCS_
=
$(GTEST_DIR)
/src/
*
.cc
$(GTEST_DIR)
/src/
*
.h
$(GTEST_HEADERS)
GMOCK_SRCS_
=
$(GMOCK_DIR)
/src/
*
.cc
$(GMOCK_HEADERS)
# For simplicity and to avoid depending on implementation details of
# Google Mock and Google Test, the dependencies specified below are
# conservative and not optimized. This is fine as Google Mock and
# Google Test compile fast and for ordinary users their source rarely
# changes.
gtest-all.o
:
$(GTEST_SRCS_)
$(CXX)
$(CPPFLAGS)
-I
$(GTEST_DIR)
-I
$(GMOCK_DIR)
$(CXXFLAGS)
\
-c
$(GTEST_DIR)
/src/gtest-all.cc
gmock-all.o
:
$(GMOCK_SRCS_)
$(CXX)
$(CPPFLAGS)
-I
$(GTEST_DIR)
-I
$(GMOCK_DIR)
$(CXXFLAGS)
\
-c
$(GMOCK_DIR)
/src/gmock-all.cc
gmock_main.o
:
$(GMOCK_SRCS_)
$(CXX)
$(CPPFLAGS)
-I
$(GTEST_DIR)
-I
$(GMOCK_DIR)
$(CXXFLAGS)
\
-c
$(GMOCK_DIR)
/src/gmock_main.cc
gmock.a
:
gmock-all.o gtest-all.o
$(AR)
$(ARFLAGS)
$@
$^
gmock_main.a
:
gmock-all.o gtest-all.o gmock_main.o
$(AR)
$(ARFLAGS)
$@
$^
# Builds a sample test.
gmock_test.o
:
$(USER_DIR)/gmock_test.cc $(GMOCK_HEADERS)
$(CXX)
$(CPPFLAGS)
$(CXXFLAGS)
-c
$(USER_DIR)
/gmock_test.cc
gmock_test
:
gmock_test.o gmock_main.a
$(CXX)
$(CPPFLAGS)
$(CXXFLAGS)
-lpthread
$^
-o
$@
googlemock/msvc/2005/gmock.sln
0 → 100644
View file @
ecf94595
Microsoft Visual Studio Solution File, Format Version 9.00
# Visual Studio 2005
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "gmock", "gmock.vcproj", "{34681F0D-CE45-415D-B5F2-5C662DFE3BD5}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "gmock_test", "gmock_test.vcproj", "{F10D22F8-AC7B-4213-8720-608E7D878CD2}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "gmock_main", "gmock_main.vcproj", "{E4EF614B-30DF-4954-8C53-580A0BF6B589}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Win32 = Debug|Win32
Release|Win32 = Release|Win32
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{34681F0D-CE45-415D-B5F2-5C662DFE3BD5}.Debug|Win32.ActiveCfg = Debug|Win32
{34681F0D-CE45-415D-B5F2-5C662DFE3BD5}.Debug|Win32.Build.0 = Debug|Win32
{34681F0D-CE45-415D-B5F2-5C662DFE3BD5}.Release|Win32.ActiveCfg = Release|Win32
{34681F0D-CE45-415D-B5F2-5C662DFE3BD5}.Release|Win32.Build.0 = Release|Win32
{F10D22F8-AC7B-4213-8720-608E7D878CD2}.Debug|Win32.ActiveCfg = Debug|Win32
{F10D22F8-AC7B-4213-8720-608E7D878CD2}.Debug|Win32.Build.0 = Debug|Win32
{F10D22F8-AC7B-4213-8720-608E7D878CD2}.Release|Win32.ActiveCfg = Release|Win32
{F10D22F8-AC7B-4213-8720-608E7D878CD2}.Release|Win32.Build.0 = Release|Win32
{E4EF614B-30DF-4954-8C53-580A0BF6B589}.Debug|Win32.ActiveCfg = Debug|Win32
{E4EF614B-30DF-4954-8C53-580A0BF6B589}.Debug|Win32.Build.0 = Debug|Win32
{E4EF614B-30DF-4954-8C53-580A0BF6B589}.Release|Win32.ActiveCfg = Release|Win32
{E4EF614B-30DF-4954-8C53-580A0BF6B589}.Release|Win32.Build.0 = Release|Win32
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
EndGlobal
googlemock/msvc/2005/gmock.vcproj
0 → 100644
View file @
ecf94595
<?xml version="1.0" encoding="Windows-1252"?>
<VisualStudioProject
ProjectType=
"Visual C++"
Version=
"8.00"
Name=
"gmock"
ProjectGUID=
"{34681F0D-CE45-415D-B5F2-5C662DFE3BD5}"
RootNamespace=
"gmock"
Keyword=
"Win32Proj"
>
<Platforms>
<Platform
Name=
"Win32"
/>
</Platforms>
<ToolFiles>
</ToolFiles>
<Configurations>
<Configuration
Name=
"Debug|Win32"
OutputDirectory=
"$(SolutionDir)$(ConfigurationName)"
IntermediateDirectory=
"$(OutDir)\$(ProjectName)"
ConfigurationType=
"4"
InheritedPropertySheets=
".\gmock_config.vsprops"
CharacterSet=
"1"
>
<Tool
Name=
"VCPreBuildEventTool"
/>
<Tool
Name=
"VCCustomBuildTool"
/>
<Tool
Name=
"VCXMLDataGeneratorTool"
/>
<Tool
Name=
"VCWebServiceProxyGeneratorTool"
/>
<Tool
Name=
"VCMIDLTool"
/>
<Tool
Name=
"VCCLCompilerTool"
Optimization=
"0"
AdditionalIncludeDirectories=
"..\..\include;..\.."
PreprocessorDefinitions=
"WIN32;_DEBUG;_LIB"
MinimalRebuild=
"true"
BasicRuntimeChecks=
"3"
RuntimeLibrary=
"1"
UsePrecompiledHeader=
"0"
WarningLevel=
"3"
Detect64BitPortabilityProblems=
"true"
DebugInformationFormat=
"3"
/>
<Tool
Name=
"VCManagedResourceCompilerTool"
/>
<Tool
Name=
"VCResourceCompilerTool"
/>
<Tool
Name=
"VCPreLinkEventTool"
/>
<Tool
Name=
"VCLibrarianTool"
/>
<Tool
Name=
"VCALinkTool"
/>
<Tool
Name=
"VCXDCMakeTool"
/>
<Tool
Name=
"VCBscMakeTool"
/>
<Tool
Name=
"VCFxCopTool"
/>
<Tool
Name=
"VCPostBuildEventTool"
/>
</Configuration>
<Configuration
Name=
"Release|Win32"
OutputDirectory=
"$(SolutionDir)$(ConfigurationName)"
IntermediateDirectory=
"$(OutDir)\$(ProjectName)"
ConfigurationType=
"4"
InheritedPropertySheets=
".\gmock_config.vsprops"
CharacterSet=
"1"
WholeProgramOptimization=
"1"
>
<Tool
Name=
"VCPreBuildEventTool"
/>
<Tool
Name=
"VCCustomBuildTool"
/>
<Tool
Name=
"VCXMLDataGeneratorTool"
/>
<Tool
Name=
"VCWebServiceProxyGeneratorTool"
/>
<Tool
Name=
"VCMIDLTool"
/>
<Tool
Name=
"VCCLCompilerTool"
AdditionalIncludeDirectories=
"..\..\include;..\.."
PreprocessorDefinitions=
"WIN32;NDEBUG;_LIB"
RuntimeLibrary=
"0"
UsePrecompiledHeader=
"0"
WarningLevel=
"3"
Detect64BitPortabilityProblems=
"true"
DebugInformationFormat=
"3"
/>
<Tool
Name=
"VCManagedResourceCompilerTool"
/>
<Tool
Name=
"VCResourceCompilerTool"
/>
<Tool
Name=
"VCPreLinkEventTool"
/>
<Tool
Name=
"VCLibrarianTool"
/>
<Tool
Name=
"VCALinkTool"
/>
<Tool
Name=
"VCXDCMakeTool"
/>
<Tool
Name=
"VCBscMakeTool"
/>
<Tool
Name=
"VCFxCopTool"
/>
<Tool
Name=
"VCPostBuildEventTool"
/>
</Configuration>
</Configurations>
<References>
</References>
<Files>
<Filter
Name=
"Source Files"
Filter=
"cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
UniqueIdentifier=
"{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
>
<File
RelativePath=
"..\..\src\gmock-all.cc"
>
</File>
<File
RelativePath=
"$(GTestDir)\src\gtest-all.cc"
>
<FileConfiguration
Name=
"Debug|Win32"
>
<Tool
Name=
"VCCLCompilerTool"
AdditionalIncludeDirectories=
"$(GTestDir)"
/>
</FileConfiguration>
<FileConfiguration
Name=
"Release|Win32"
>
<Tool
Name=
"VCCLCompilerTool"
AdditionalIncludeDirectories=
"$(GTestDir)"
/>
</FileConfiguration>
</File>
</Filter>
<Filter
Name=
"Public Header Files"
Filter=
"h;hpp;hxx;hm;inl;inc;xsd"
UniqueIdentifier=
"{93995380-89BD-4b04-88EB-625FBE52EBFB}"
>
</Filter>
<Filter
Name=
"Private Header Files"
>
</Filter>
</Files>
<Globals>
</Globals>
</VisualStudioProject>
googlemock/msvc/2005/gmock_config.vsprops
0 → 100644
View file @
ecf94595
<?xml version="1.0" encoding="Windows-1252"?>
<VisualStudioPropertySheet
ProjectType=
"Visual C++"
Version=
"8.00"
Name=
"gmock_config"
>
<Tool
Name=
"VCCLCompilerTool"
AdditionalIncludeDirectories=
""$(GTestDir)/include""
/>
<UserMacro
Name=
"GTestDir"
Value=
"../../gtest"
/>
</VisualStudioPropertySheet>
Prev
1
2
3
4
5
Next
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment