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
e55fded0
Commit
e55fded0
authored
Jan 30, 2018
by
Gennadiy Civil
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Code merges
parent
2a468302
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
64 additions
and
22 deletions
+64
-22
gtest-printers.h
googletest/include/gtest/gtest-printers.h
+57
-15
gtest-printers_test.cc
googletest/test/gtest-printers_test.cc
+7
-7
No files found.
googletest/include/gtest/gtest-printers.h
View file @
e55fded0
...
@@ -133,7 +133,11 @@ enum TypeKind {
...
@@ -133,7 +133,11 @@ enum TypeKind {
kProtobuf
,
// a protobuf type
kProtobuf
,
// a protobuf type
kConvertibleToInteger
,
// a type implicitly convertible to BiggestInt
kConvertibleToInteger
,
// a type implicitly convertible to BiggestInt
// (e.g. a named or unnamed enum type)
// (e.g. a named or unnamed enum type)
kOtherType
// anything else
#if GTEST_HAS_ABSL
kConvertibleToStringView
,
// a type implicitly convertible to
// absl::string_view
#endif
kOtherType
// anything else
};
};
// TypeWithoutFormatter<T, kTypeKind>::PrintValue(value, os) is called
// TypeWithoutFormatter<T, kTypeKind>::PrintValue(value, os) is called
...
@@ -146,7 +150,7 @@ class TypeWithoutFormatter {
...
@@ -146,7 +150,7 @@ class TypeWithoutFormatter {
// This default version is called when kTypeKind is kOtherType.
// This default version is called when kTypeKind is kOtherType.
static
void
PrintValue
(
const
T
&
value
,
::
std
::
ostream
*
os
)
{
static
void
PrintValue
(
const
T
&
value
,
::
std
::
ostream
*
os
)
{
PrintBytesInObjectTo
(
static_cast
<
const
unsigned
char
*>
(
PrintBytesInObjectTo
(
static_cast
<
const
unsigned
char
*>
(
reinterpret_cast
<
const
void
*>
(
&
value
)),
reinterpret_cast
<
const
void
*>
(
&
value
)),
sizeof
(
value
),
os
);
sizeof
(
value
),
os
);
}
}
};
};
...
@@ -184,6 +188,19 @@ class TypeWithoutFormatter<T, kConvertibleToInteger> {
...
@@ -184,6 +188,19 @@ class TypeWithoutFormatter<T, kConvertibleToInteger> {
}
}
};
};
#if GTEST_HAS_ABSL
template
<
typename
T
>
class
TypeWithoutFormatter
<
T
,
kConvertibleToStringView
>
{
public
:
// Since T has neither operator<< nor PrintTo() but can be implicitly
// converted to absl::string_view, we print it as a absl::string_view.
//
// Note: the implementation is further below, as it depends on
// internal::PrintTo symbol which is defined later in the file.
static
void
PrintValue
(
const
T
&
value
,
::
std
::
ostream
*
os
);
};
#endif
// Prints the given value to the given ostream. If the value is a
// Prints the given value to the given ostream. If the value is a
// protocol message, its debug string is printed; if it's an enum or
// protocol message, its debug string is printed; if it's an enum or
// of a type implicitly convertible to BiggestInt, it's printed as an
// of a type implicitly convertible to BiggestInt, it's printed as an
...
@@ -211,10 +228,19 @@ class TypeWithoutFormatter<T, kConvertibleToInteger> {
...
@@ -211,10 +228,19 @@ class TypeWithoutFormatter<T, kConvertibleToInteger> {
template
<
typename
Char
,
typename
CharTraits
,
typename
T
>
template
<
typename
Char
,
typename
CharTraits
,
typename
T
>
::
std
::
basic_ostream
<
Char
,
CharTraits
>&
operator
<<
(
::
std
::
basic_ostream
<
Char
,
CharTraits
>&
operator
<<
(
::
std
::
basic_ostream
<
Char
,
CharTraits
>&
os
,
const
T
&
x
)
{
::
std
::
basic_ostream
<
Char
,
CharTraits
>&
os
,
const
T
&
x
)
{
TypeWithoutFormatter
<
T
,
TypeWithoutFormatter
<
T
,
(
internal
::
IsAProtocolMessage
<
T
>::
value
(
internal
::
IsAProtocolMessage
<
T
>::
value
?
kProtobuf
:
?
kProtobuf
internal
::
ImplicitlyConvertible
<
const
T
&
,
internal
::
BiggestInt
>::
value
?
:
internal
::
ImplicitlyConvertible
<
kConvertibleToInteger
:
kOtherType
)
>::
PrintValue
(
x
,
&
os
);
const
T
&
,
internal
::
BiggestInt
>::
value
?
kConvertibleToInteger
:
#if GTEST_HAS_ABSL
internal
::
ImplicitlyConvertible
<
const
T
&
,
absl
::
string_view
>::
value
?
kConvertibleToStringView
:
#endif
kOtherType
)
>::
PrintValue
(
x
,
&
os
);
return
os
;
return
os
;
}
}
...
@@ -435,7 +461,8 @@ void DefaultPrintTo(WrapPrinterType<kPrintFunctionPointer> /* dummy */,
...
@@ -435,7 +461,8 @@ void DefaultPrintTo(WrapPrinterType<kPrintFunctionPointer> /* dummy */,
*
os
<<
"NULL"
;
*
os
<<
"NULL"
;
}
else
{
}
else
{
// T is a function type, so '*os << p' doesn't do what we want
// T is a function type, so '*os << p' doesn't do what we want
// (it just prints p as bool). Cast p to const void* to print it.
// (it just prints p as bool). We want to print p as a const
// void*.
*
os
<<
reinterpret_cast
<
const
void
*>
(
p
);
*
os
<<
reinterpret_cast
<
const
void
*>
(
p
);
}
}
}
}
...
@@ -464,17 +491,15 @@ void PrintTo(const T& value, ::std::ostream* os) {
...
@@ -464,17 +491,15 @@ void PrintTo(const T& value, ::std::ostream* os) {
// DefaultPrintTo() is overloaded. The type of its first argument
// DefaultPrintTo() is overloaded. The type of its first argument
// determines which version will be picked.
// determines which version will be picked.
//
//
// Note that we check for
recursive and other container types here, prior
// Note that we check for
container types here, prior to we check
//
to we check
for protocol message types in our operator<<. The rationale is:
// for protocol message types in our operator<<. The rationale is:
//
//
// For protocol messages, we want to give people a chance to
// For protocol messages, we want to give people a chance to
// override Google Mock's format by defining a PrintTo() or
// override Google Mock's format by defining a PrintTo() or
// operator<<. For STL containers, other formats can be
// operator<<. For STL containers, other formats can be
// incompatible with Google Mock's format for the container
// incompatible with Google Mock's format for the container
// elements; therefore we check for container types here to ensure
// elements; therefore we check for container types here to ensure
// that our format is used. To prevent an infinite runtime recursion
// that our format is used.
// during the output of recursive container types, we check first for
// those.
//
//
// Note that MSVC and clang-cl do allow an implicit conversion from
// Note that MSVC and clang-cl do allow an implicit conversion from
// pointer-to-function to pointer-to-object, but clang-cl warns on it.
// pointer-to-function to pointer-to-object, but clang-cl warns on it.
...
@@ -492,8 +517,8 @@ void PrintTo(const T& value, ::std::ostream* os) {
...
@@ -492,8 +517,8 @@ void PrintTo(const T& value, ::std::ostream* os) {
#else
#else
:
!
internal
::
ImplicitlyConvertible
<
T
,
const
void
*>::
value
:
!
internal
::
ImplicitlyConvertible
<
T
,
const
void
*>::
value
#endif
#endif
?
kPrintFunctionPointer
?
kPrintFunctionPointer
:
kPrintPointer
>
(),
:
kPrintPointer
>
(),
value
,
os
);
value
,
os
);
}
}
...
@@ -601,6 +626,13 @@ inline void PrintTo(const ::std::wstring& s, ::std::ostream* os) {
...
@@ -601,6 +626,13 @@ inline void PrintTo(const ::std::wstring& s, ::std::ostream* os) {
}
}
#endif // GTEST_HAS_STD_WSTRING
#endif // GTEST_HAS_STD_WSTRING
#if GTEST_HAS_ABSL
// Overload for absl::string_view.
inline
void
PrintTo
(
absl
::
string_view
sp
,
::
std
::
ostream
*
os
)
{
PrintTo
(
string
(
sp
),
os
);
}
#endif // GTEST_HAS_ABSL
#if GTEST_HAS_TR1_TUPLE || GTEST_HAS_STD_TUPLE_
#if GTEST_HAS_TR1_TUPLE || GTEST_HAS_STD_TUPLE_
// Helper function for printing a tuple. T must be instantiated with
// Helper function for printing a tuple. T must be instantiated with
// a tuple type.
// a tuple type.
...
@@ -896,7 +928,7 @@ void UniversalPrint(const T& value, ::std::ostream* os) {
...
@@ -896,7 +928,7 @@ void UniversalPrint(const T& value, ::std::ostream* os) {
UniversalPrinter
<
T1
>::
Print
(
value
,
os
);
UniversalPrinter
<
T1
>::
Print
(
value
,
os
);
}
}
typedef
::
std
::
vector
<
string
>
Strings
;
typedef
::
std
::
vector
<
::
std
::
string
>
Strings
;
// TuplePolicy<TupleT> must provide:
// TuplePolicy<TupleT> must provide:
// - tuple_size
// - tuple_size
...
@@ -1016,6 +1048,16 @@ Strings UniversalTersePrintTupleFieldsToStrings(const Tuple& value) {
...
@@ -1016,6 +1048,16 @@ Strings UniversalTersePrintTupleFieldsToStrings(const Tuple& value) {
}
// namespace internal
}
// namespace internal
#if GTEST_HAS_ABSL
namespace
internal2
{
template
<
typename
T
>
void
TypeWithoutFormatter
<
T
,
kConvertibleToStringView
>::
PrintValue
(
const
T
&
value
,
::
std
::
ostream
*
os
)
{
internal
::
PrintTo
(
absl
::
string_view
(
value
),
os
);
}
}
// namespace internal2
#endif
template
<
typename
T
>
template
<
typename
T
>
::
std
::
string
PrintToString
(
const
T
&
value
)
{
::
std
::
string
PrintToString
(
const
T
&
value
)
{
::
std
::
stringstream
ss
;
::
std
::
stringstream
ss
;
...
...
googletest/test/gtest-printers_test.cc
View file @
e55fded0
...
@@ -837,22 +837,22 @@ TEST(PrintTypeWithGenericStreamingTest, TypeImplicitlyConvertible) {
...
@@ -837,22 +837,22 @@ TEST(PrintTypeWithGenericStreamingTest, TypeImplicitlyConvertible) {
EXPECT_EQ
(
"AllowsGenericStreamingAndImplicitConversionTemplate"
,
Print
(
a
));
EXPECT_EQ
(
"AllowsGenericStreamingAndImplicitConversionTemplate"
,
Print
(
a
));
}
}
#if GTEST_HAS_
STRING_PIECE_
#if GTEST_HAS_
ABSL
// Tests printing
StringPiece
.
// Tests printing
::absl::string_view
.
TEST
(
PrintString
PieceTest
,
SimpleStringPiece
)
{
TEST
(
PrintString
ViewTest
,
SimpleStringView
)
{
const
StringPiece
sp
=
"Hello"
;
const
::
absl
::
string_view
sp
=
"Hello"
;
EXPECT_EQ
(
"
\"
Hello
\"
"
,
Print
(
sp
));
EXPECT_EQ
(
"
\"
Hello
\"
"
,
Print
(
sp
));
}
}
TEST
(
PrintString
Piece
Test
,
UnprintableCharacters
)
{
TEST
(
PrintString
View
Test
,
UnprintableCharacters
)
{
const
char
str
[]
=
"NUL (
\0
) and
\r\t
"
;
const
char
str
[]
=
"NUL (
\0
) and
\r\t
"
;
const
StringPiece
sp
(
str
,
sizeof
(
str
)
-
1
);
const
::
absl
::
string_view
sp
(
str
,
sizeof
(
str
)
-
1
);
EXPECT_EQ
(
"
\"
NUL (
\\
0) and
\\
r
\\
t
\"
"
,
Print
(
sp
));
EXPECT_EQ
(
"
\"
NUL (
\\
0) and
\\
r
\\
t
\"
"
,
Print
(
sp
));
}
}
#endif // GTEST_HAS_
STRING_PIECE_
#endif // GTEST_HAS_
ABSL
// Tests printing STL containers.
// Tests printing STL containers.
...
...
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