Enables SetArgPointee<>() to accept a string literal; removes a self-assignment warning; teaches gmock doctor to diagnose TTB with Clang; picks up gtest r525.
This commit is contained in:
parent
88032d8e0f
commit
a684b5a526
@ -1020,6 +1020,14 @@ SetArgPointee(const T& x) {
|
|||||||
return MakePolymorphicAction(internal::SetArgumentPointeeAction<
|
return MakePolymorphicAction(internal::SetArgumentPointeeAction<
|
||||||
N, T, internal::IsAProtocolMessage<T>::value>(x));
|
N, T, internal::IsAProtocolMessage<T>::value>(x));
|
||||||
}
|
}
|
||||||
|
// This overload allows SetArgPointee() to accept a string literal.
|
||||||
|
template <size_t N>
|
||||||
|
PolymorphicAction<
|
||||||
|
internal::SetArgumentPointeeAction<N, const char*, false> >
|
||||||
|
SetArgPointee(const char* p) {
|
||||||
|
return MakePolymorphicAction(internal::SetArgumentPointeeAction<
|
||||||
|
N, const char*, false>(p));
|
||||||
|
}
|
||||||
// The following version is DEPRECATED.
|
// The following version is DEPRECATED.
|
||||||
template <size_t N, typename T>
|
template <size_t N, typename T>
|
||||||
PolymorphicAction<
|
PolymorphicAction<
|
||||||
|
@ -459,6 +459,20 @@ def _TypeInTemplatedBaseDiagnoser(msg):
|
|||||||
r'error: \'(?P<type>.+)\' was not declared in this scope\n'
|
r'error: \'(?P<type>.+)\' was not declared in this scope\n'
|
||||||
r'.*error: template argument 1 is invalid\n'
|
r'.*error: template argument 1 is invalid\n'
|
||||||
r'.*error: \'.+\' was not declared in this scope')
|
r'.*error: \'.+\' was not declared in this scope')
|
||||||
|
clang_regex_type_of_retval_or_sole_param = (
|
||||||
|
_CLANG_FILE_LINE_RE +
|
||||||
|
r'error: use of undeclared identifier \'(?P<type>.*)\'\n'
|
||||||
|
r'(.*\n)*?'
|
||||||
|
r'(?P=file):(?P=line):(?P=column): error: '
|
||||||
|
r'non-friend class member \'Result\' cannot have a qualified name'
|
||||||
|
)
|
||||||
|
clang_regex_type_of_a_param = (
|
||||||
|
_CLANG_FILE_LINE_RE +
|
||||||
|
r'error: C\+\+ requires a type specifier for all declarations\n'
|
||||||
|
r'(.*\n)*?'
|
||||||
|
r'(?P=file):(?P=line):(?P=column): error: '
|
||||||
|
r'C\+\+ requires a type specifier for all declarations'
|
||||||
|
)
|
||||||
|
|
||||||
diagnosis = """
|
diagnosis = """
|
||||||
In a mock class template, types or typedefs defined in the base class
|
In a mock class template, types or typedefs defined in the base class
|
||||||
@ -473,7 +487,9 @@ need to make it visible. One way to do it is:
|
|||||||
[(gcc_4_3_1_regex_type_in_retval, diagnosis % {'type': 'Foo'}),
|
[(gcc_4_3_1_regex_type_in_retval, diagnosis % {'type': 'Foo'}),
|
||||||
(gcc_4_4_0_regex_type_in_retval, diagnosis % {'type': 'Foo'}),
|
(gcc_4_4_0_regex_type_in_retval, diagnosis % {'type': 'Foo'}),
|
||||||
(gcc_regex_type_of_sole_param, diagnosis),
|
(gcc_regex_type_of_sole_param, diagnosis),
|
||||||
(gcc_regex_type_of_a_param, diagnosis)],
|
(gcc_regex_type_of_a_param, diagnosis),
|
||||||
|
(clang_regex_type_of_retval_or_sole_param, diagnosis),
|
||||||
|
(clang_regex_type_of_a_param, diagnosis % {'type': 'Foo'})],
|
||||||
msg)
|
msg)
|
||||||
|
|
||||||
|
|
||||||
|
@ -715,6 +715,43 @@ TEST(SetArgPointeeTest, SetsTheNthPointee) {
|
|||||||
EXPECT_EQ('a', ch);
|
EXPECT_EQ('a', ch);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Tests that SetArgPointee<N>() accepts a string literal.
|
||||||
|
TEST(SetArgPointeeTest, AcceptsStringLiteral) {
|
||||||
|
typedef void MyFunction(bool, std::string*, const char**);
|
||||||
|
Action<MyFunction> a = SetArgPointee<1>("hi");
|
||||||
|
std::string str;
|
||||||
|
const char* ptr = NULL;
|
||||||
|
a.Perform(make_tuple(true, &str, &ptr));
|
||||||
|
EXPECT_EQ("hi", str);
|
||||||
|
EXPECT_TRUE(ptr == NULL);
|
||||||
|
|
||||||
|
a = SetArgPointee<2>("world");
|
||||||
|
str = "";
|
||||||
|
a.Perform(make_tuple(true, &str, &ptr));
|
||||||
|
EXPECT_EQ("", str);
|
||||||
|
EXPECT_STREQ("world", ptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Tests that SetArgPointee<N>() accepts a char pointer.
|
||||||
|
TEST(SetArgPointeeTest, AcceptsCharPointer) {
|
||||||
|
typedef void MyFunction(bool, std::string*, const char**);
|
||||||
|
const char* const hi = "hi";
|
||||||
|
Action<MyFunction> a = SetArgPointee<1>(hi);
|
||||||
|
std::string str;
|
||||||
|
const char* ptr = NULL;
|
||||||
|
a.Perform(make_tuple(true, &str, &ptr));
|
||||||
|
EXPECT_EQ("hi", str);
|
||||||
|
EXPECT_TRUE(ptr == NULL);
|
||||||
|
|
||||||
|
char world_array[] = "world";
|
||||||
|
char* const world = world_array;
|
||||||
|
a = SetArgPointee<2>(world);
|
||||||
|
str = "";
|
||||||
|
a.Perform(make_tuple(true, &str, &ptr));
|
||||||
|
EXPECT_EQ("", str);
|
||||||
|
EXPECT_EQ(world, ptr);
|
||||||
|
}
|
||||||
|
|
||||||
#if GTEST_HAS_PROTOBUF_
|
#if GTEST_HAS_PROTOBUF_
|
||||||
|
|
||||||
// Tests that SetArgPointee<N>(proto_buffer) sets the v1 protobuf
|
// Tests that SetArgPointee<N>(proto_buffer) sets the v1 protobuf
|
||||||
|
@ -251,5 +251,5 @@ TEST(WideInitGoogleMockTest, CallsInitGoogleTest) {
|
|||||||
TEST(FlagTest, IsAccessibleInCode) {
|
TEST(FlagTest, IsAccessibleInCode) {
|
||||||
bool dummy = testing::GMOCK_FLAG(catch_leaked_mocks) &&
|
bool dummy = testing::GMOCK_FLAG(catch_leaked_mocks) &&
|
||||||
testing::GMOCK_FLAG(verbose) == "";
|
testing::GMOCK_FLAG(verbose) == "";
|
||||||
dummy = dummy; // Avoids the "unused local variable" warning.
|
(void)dummy; // Avoids the "unused local variable" warning.
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user