Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
G
googletest
Project
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Chen Yisong
googletest
Commits
4abb012c
Commit
4abb012c
authored
Oct 14, 2020
by
Derek Mauro
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #2837 from inazarenko:duck_type_protos
PiperOrigin-RevId: 336087297
parents
07f48692
4c9ad191
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
93 additions
and
22 deletions
+93
-22
gtest-printers.h
googletest/include/gtest/gtest-printers.h
+3
-2
gtest-internal.h
googletest/include/gtest/internal/gtest-internal.h
+27
-4
gtest_unittest.cc
googletest/test/gtest_unittest.cc
+63
-16
No files found.
googletest/include/gtest/gtest-printers.h
View file @
4abb012c
...
...
@@ -235,8 +235,9 @@ struct ProtobufPrinter {
// DebugString() for better readability.
static
const
size_t
kProtobufOneLinerMaxLength
=
50
;
template
<
typename
T
,
typename
=
typename
std
::
enable_if
<
internal
::
IsAProtocolMessage
<
T
>::
value
>::
type
>
template
<
typename
T
,
typename
=
typename
std
::
enable_if
<
internal
::
HasDebugStringAndShortDebugString
<
T
>::
value
>::
type
>
static
void
PrintValue
(
const
T
&
value
,
::
std
::
ostream
*
os
)
{
std
::
string
pretty_str
=
value
.
ShortDebugString
();
if
(
pretty_str
.
length
()
>
kProtobufOneLinerMaxLength
)
{
...
...
googletest/include/gtest/internal/gtest-internal.h
View file @
4abb012c
...
...
@@ -892,11 +892,34 @@ class GTEST_API_ Random {
#define GTEST_REMOVE_REFERENCE_AND_CONST_(T) \
typename std::remove_const<typename std::remove_reference<T>::type>::type
// IsAProtocolMessage<T>::value is a compile-time bool constant that's
// true if and only if T is type proto2::MessageLite or a subclass of it.
// HasDebugStringAndShortDebugString<T>::value is a compile-time bool constant
// that's true if and only if T has methods DebugString() and ShortDebugString()
// that return std::string.
template
<
typename
T
>
struct
IsAProtocolMessage
:
public
std
::
is_convertible
<
const
T
*
,
const
::
proto2
::
MessageLite
*>
{};
class
HasDebugStringAndShortDebugString
{
private
:
template
<
typename
C
>
static
constexpr
auto
CheckDebugString
(
C
*
)
->
typename
std
::
is_same
<
std
::
string
,
decltype
(
std
::
declval
<
const
C
>
().
DebugString
())
>::
type
;
template
<
typename
>
static
constexpr
std
::
false_type
CheckDebugString
(...);
template
<
typename
C
>
static
constexpr
auto
CheckShortDebugString
(
C
*
)
->
typename
std
::
is_same
<
std
::
string
,
decltype
(
std
::
declval
<
const
C
>
().
ShortDebugString
())
>::
type
;
template
<
typename
>
static
constexpr
std
::
false_type
CheckShortDebugString
(...);
using
HasDebugStringType
=
decltype
(
CheckDebugString
<
T
>
(
nullptr
));
using
HasShortDebugStringType
=
decltype
(
CheckShortDebugString
<
T
>
(
nullptr
));
public
:
static
constexpr
bool
value
=
HasDebugStringType
::
value
&&
HasShortDebugStringType
::
value
;
};
template
<
typename
T
>
constexpr
bool
HasDebugStringAndShortDebugString
<
T
>::
value
;
// When the compiler sees expression IsContainerTest<C>(0), if C is an
// STL-style container class, the first overload of IsContainerTest
...
...
googletest/test/gtest_unittest.cc
View file @
4abb012c
...
...
@@ -254,8 +254,8 @@ using testing::internal::GetTimeInMillis;
using
testing
::
internal
::
GetTypeId
;
using
testing
::
internal
::
GetUnitTestImpl
;
using
testing
::
internal
::
GTestFlagSaver
;
using
testing
::
internal
::
HasDebugStringAndShortDebugString
;
using
testing
::
internal
::
Int32FromEnvOrDie
;
using
testing
::
internal
::
IsAProtocolMessage
;
using
testing
::
internal
::
IsContainer
;
using
testing
::
internal
::
IsContainerTest
;
using
testing
::
internal
::
IsNotContainer
;
...
...
@@ -7185,24 +7185,71 @@ GTEST_TEST(AlternativeNameTest, Works) { // GTEST_TEST is the same as TEST.
class
ConversionHelperBase
{};
class
ConversionHelperDerived
:
public
ConversionHelperBase
{};
// Tests that IsAProtocolMessage<T>::value is a compile-time constant.
TEST
(
IsAProtocolMessageTest
,
ValueIsCompileTimeConstant
)
{
GTEST_COMPILE_ASSERT_
(
IsAProtocolMessage
<::
proto2
::
MessageLite
>::
value
,
const_true
)
;
GTEST_COMPILE_ASSERT_
(
!
IsAProtocolMessage
<
int
>::
value
,
const_false
);
}
struct
HasDebugStringMethods
{
std
::
string
DebugString
()
const
{
return
""
;
}
std
::
string
ShortDebugString
()
const
{
return
""
;
}
}
;
struct
InheritsDebugStringMethods
:
public
HasDebugStringMethods
{};
// Tests that IsAProtocolMessage<T>::value is true when T is
// proto2::Message or a sub-class of it.
TEST
(
IsAProtocolMessageTest
,
ValueIsTrueWhenTypeIsAProtocolMessage
)
{
EXPECT_TRUE
(
IsAProtocolMessage
<::
proto2
::
MessageLite
>::
value
);
struct
WrongTypeDebugStringMethod
{
std
::
string
DebugString
()
const
{
return
""
;
}
int
ShortDebugString
()
const
{
return
1
;
}
};
struct
NotConstDebugStringMethod
{
std
::
string
DebugString
()
{
return
""
;
}
std
::
string
ShortDebugString
()
const
{
return
""
;
}
};
struct
MissingDebugStringMethod
{
std
::
string
DebugString
()
{
return
""
;
}
};
struct
IncompleteType
;
// Tests that HasDebugStringAndShortDebugString<T>::value is a compile-time
// constant.
TEST
(
HasDebugStringAndShortDebugStringTest
,
ValueIsCompileTimeConstant
)
{
GTEST_COMPILE_ASSERT_
(
HasDebugStringAndShortDebugString
<
HasDebugStringMethods
>::
value
,
const_true
);
GTEST_COMPILE_ASSERT_
(
HasDebugStringAndShortDebugString
<
InheritsDebugStringMethods
>::
value
,
const_true
);
GTEST_COMPILE_ASSERT_
(
HasDebugStringAndShortDebugString
<
const
InheritsDebugStringMethods
>::
value
,
const_true
);
GTEST_COMPILE_ASSERT_
(
!
HasDebugStringAndShortDebugString
<
WrongTypeDebugStringMethod
>::
value
,
const_false
);
GTEST_COMPILE_ASSERT_
(
!
HasDebugStringAndShortDebugString
<
NotConstDebugStringMethod
>::
value
,
const_false
);
GTEST_COMPILE_ASSERT_
(
!
HasDebugStringAndShortDebugString
<
MissingDebugStringMethod
>::
value
,
const_false
);
GTEST_COMPILE_ASSERT_
(
!
HasDebugStringAndShortDebugString
<
IncompleteType
>::
value
,
const_false
);
GTEST_COMPILE_ASSERT_
(
!
HasDebugStringAndShortDebugString
<
int
>::
value
,
const_false
);
}
// Tests that HasDebugStringAndShortDebugString<T>::value is true when T has
// needed methods.
TEST
(
HasDebugStringAndShortDebugStringTest
,
ValueIsTrueWhenTypeHasDebugStringAndShortDebugString
)
{
EXPECT_TRUE
(
HasDebugStringAndShortDebugString
<
InheritsDebugStringMethods
>::
value
);
}
// Tests that IsAProtocolMessage<T>::value is false when T is neither
// ::proto2::Message nor a sub-class of it.
TEST
(
IsAProtocolMessageTest
,
ValueIsFalseWhenTypeIsNotAProtocolMessage
)
{
EXPECT_FALSE
(
IsAProtocolMessage
<
int
>::
value
);
EXPECT_FALSE
(
IsAProtocolMessage
<
const
ConversionHelperBase
>::
value
);
// Tests that HasDebugStringAndShortDebugString<T>::value is false when T
// doesn't have needed methods.
TEST
(
HasDebugStringAndShortDebugStringTest
,
ValueIsFalseWhenTypeIsNotAProtocolMessage
)
{
EXPECT_FALSE
(
HasDebugStringAndShortDebugString
<
int
>::
value
);
EXPECT_FALSE
(
HasDebugStringAndShortDebugString
<
const
ConversionHelperBase
>::
value
);
}
// Tests GTEST_REMOVE_REFERENCE_AND_CONST_.
...
...
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