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
0fac8339
Commit
0fac8339
authored
Apr 10, 2013
by
zhanyong.wan
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
prints type/value parameters when listing tests
parent
c97e3001
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
185 additions
and
39 deletions
+185
-39
gtest.cc
src/gtest.cc
+49
-5
gtest_list_tests_unittest.py
test/gtest_list_tests_unittest.py
+61
-31
gtest_list_tests_unittest_.cc
test/gtest_list_tests_unittest_.cc
+75
-3
No files found.
src/gtest.cc
View file @
0fac8339
...
@@ -2638,6 +2638,11 @@ void ColoredPrintf(GTestColor color, const char* fmt, ...) {
...
@@ -2638,6 +2638,11 @@ void ColoredPrintf(GTestColor color, const char* fmt, ...) {
va_end
(
args
);
va_end
(
args
);
}
}
// Text printed in Google Test's text output and --gunit_list_tests
// output to label the type parameter and value parameter for a test.
static
const
char
kTypeParamLabel
[]
=
"TypeParam"
;
static
const
char
kValueParamLabel
[]
=
"GetParam()"
;
void
PrintFullTestCommentIfPresent
(
const
TestInfo
&
test_info
)
{
void
PrintFullTestCommentIfPresent
(
const
TestInfo
&
test_info
)
{
const
char
*
const
type_param
=
test_info
.
type_param
();
const
char
*
const
type_param
=
test_info
.
type_param
();
const
char
*
const
value_param
=
test_info
.
value_param
();
const
char
*
const
value_param
=
test_info
.
value_param
();
...
@@ -2645,12 +2650,12 @@ void PrintFullTestCommentIfPresent(const TestInfo& test_info) {
...
@@ -2645,12 +2650,12 @@ void PrintFullTestCommentIfPresent(const TestInfo& test_info) {
if
(
type_param
!=
NULL
||
value_param
!=
NULL
)
{
if
(
type_param
!=
NULL
||
value_param
!=
NULL
)
{
printf
(
", where "
);
printf
(
", where "
);
if
(
type_param
!=
NULL
)
{
if
(
type_param
!=
NULL
)
{
printf
(
"
TypeParam = %s"
,
type_param
);
printf
(
"
%s = %s"
,
kTypeParamLabel
,
type_param
);
if
(
value_param
!=
NULL
)
if
(
value_param
!=
NULL
)
printf
(
" and "
);
printf
(
" and "
);
}
}
if
(
value_param
!=
NULL
)
{
if
(
value_param
!=
NULL
)
{
printf
(
"
GetParam() = %s"
,
value_param
);
printf
(
"
%s = %s"
,
kValueParamLabel
,
value_param
);
}
}
}
}
}
}
...
@@ -2735,7 +2740,7 @@ void PrettyUnitTestResultPrinter::OnTestCaseStart(const TestCase& test_case) {
...
@@ -2735,7 +2740,7 @@ void PrettyUnitTestResultPrinter::OnTestCaseStart(const TestCase& test_case) {
if
(
test_case
.
type_param
()
==
NULL
)
{
if
(
test_case
.
type_param
()
==
NULL
)
{
printf
(
"
\n
"
);
printf
(
"
\n
"
);
}
else
{
}
else
{
printf
(
", where
TypeParam = %s
\n
"
,
test_case
.
type_param
());
printf
(
", where
%s = %s
\n
"
,
kTypeParamLabel
,
test_case
.
type_param
());
}
}
fflush
(
stdout
);
fflush
(
stdout
);
}
}
...
@@ -4408,8 +4413,33 @@ int UnitTestImpl::FilterTests(ReactionToSharding shard_tests) {
...
@@ -4408,8 +4413,33 @@ int UnitTestImpl::FilterTests(ReactionToSharding shard_tests) {
return
num_selected_tests
;
return
num_selected_tests
;
}
}
// Prints the given C-string on a single line by replacing all '\n'
// characters with string "\\n". If the output takes more than
// max_length characters, only prints the first max_length characters
// and "...".
static
void
PrintOnOneLine
(
const
char
*
str
,
int
max_length
)
{
if
(
str
!=
NULL
)
{
for
(
int
i
=
0
;
*
str
!=
'\0'
;
++
str
)
{
if
(
i
>=
max_length
)
{
printf
(
"..."
);
break
;
}
if
(
*
str
==
'\n'
)
{
printf
(
"
\\
n"
);
i
+=
2
;
}
else
{
printf
(
"%c"
,
*
str
);
++
i
;
}
}
}
}
// Prints the names of the tests matching the user-specified filter flag.
// Prints the names of the tests matching the user-specified filter flag.
void
UnitTestImpl
::
ListTestsMatchingFilter
()
{
void
UnitTestImpl
::
ListTestsMatchingFilter
()
{
// Print at most this many characters for each type/value parameter.
const
int
kMaxParamLength
=
250
;
for
(
size_t
i
=
0
;
i
<
test_cases_
.
size
();
i
++
)
{
for
(
size_t
i
=
0
;
i
<
test_cases_
.
size
();
i
++
)
{
const
TestCase
*
const
test_case
=
test_cases_
[
i
];
const
TestCase
*
const
test_case
=
test_cases_
[
i
];
bool
printed_test_case_name
=
false
;
bool
printed_test_case_name
=
false
;
...
@@ -4420,9 +4450,23 @@ void UnitTestImpl::ListTestsMatchingFilter() {
...
@@ -4420,9 +4450,23 @@ void UnitTestImpl::ListTestsMatchingFilter() {
if
(
test_info
->
matches_filter_
)
{
if
(
test_info
->
matches_filter_
)
{
if
(
!
printed_test_case_name
)
{
if
(
!
printed_test_case_name
)
{
printed_test_case_name
=
true
;
printed_test_case_name
=
true
;
printf
(
"%s.
\n
"
,
test_case
->
name
());
printf
(
"%s."
,
test_case
->
name
());
if
(
test_case
->
type_param
()
!=
NULL
)
{
printf
(
" # %s = "
,
kTypeParamLabel
);
// We print the type parameter on a single line to make
// the output easy to parse by a program.
PrintOnOneLine
(
test_case
->
type_param
(),
kMaxParamLength
);
}
printf
(
"
\n
"
);
}
printf
(
" %s"
,
test_info
->
name
());
if
(
test_info
->
value_param
()
!=
NULL
)
{
printf
(
" # %s = "
,
kValueParamLabel
);
// We print the value parameter on a single line to make the
// output easy to parse by a program.
PrintOnOneLine
(
test_info
->
value_param
(),
kMaxParamLength
);
}
}
printf
(
"
%s
\n
"
,
test_info
->
name
()
);
printf
(
"
\n
"
);
}
}
}
}
}
}
...
...
test/gtest_list_tests_unittest.py
View file @
0fac8339
...
@@ -40,6 +40,7 @@ Google Test) the command line flags.
...
@@ -40,6 +40,7 @@ Google Test) the command line flags.
__author__
=
'phanna@google.com (Patrick Hanna)'
__author__
=
'phanna@google.com (Patrick Hanna)'
import
gtest_test_utils
import
gtest_test_utils
import
re
# Constants.
# Constants.
...
@@ -52,38 +53,63 @@ EXE_PATH = gtest_test_utils.GetTestExecutablePath('gtest_list_tests_unittest_')
...
@@ -52,38 +53,63 @@ EXE_PATH = gtest_test_utils.GetTestExecutablePath('gtest_list_tests_unittest_')
# The expected output when running gtest_list_tests_unittest_ with
# The expected output when running gtest_list_tests_unittest_ with
# --gtest_list_tests
# --gtest_list_tests
EXPECTED_OUTPUT_NO_FILTER
=
"""FooDeathTest
.
EXPECTED_OUTPUT_NO_FILTER
_RE
=
re
.
compile
(
r"""FooDeathTest\
.
Test1
Test1
Foo.
Foo
\
.
Bar1
Bar1
Bar2
Bar2
DISABLED_Bar3
DISABLED_Bar3
Abc.
Abc
\
.
Xyz
Xyz
Def
Def
FooBar.
FooBar
\
.
Baz
Baz
FooTest.
FooTest
\
.
Test1
Test1
DISABLED_Test2
DISABLED_Test2
Test3
Test3
"""
TypedTest/0\. # TypeParam = (VeryLo{245}|class VeryLo{239})\.\.\.
TestA
TestB
TypedTest/1\. # TypeParam = int\s*\*
TestA
TestB
TypedTest/2\. # TypeParam = .*MyArray<bool,\s*42>
TestA
TestB
My/TypeParamTest/0\. # TypeParam = (VeryLo{245}|class VeryLo{239})\.\.\.
TestA
TestB
My/TypeParamTest/1\. # TypeParam = int\s*\*
TestA
TestB
My/TypeParamTest/2\. # TypeParam = .*MyArray<bool,\s*42>
TestA
TestB
MyInstantiation/ValueParamTest\.
TestA/0 # GetParam\(\) = one line
TestA/1 # GetParam\(\) = two\\nlines
TestA/2 # GetParam\(\) = a very\\nlo{241}\.\.\.
TestB/0 # GetParam\(\) = one line
TestB/1 # GetParam\(\) = two\\nlines
TestB/2 # GetParam\(\) = a very\\nlo{241}\.\.\.
"""
)
# The expected output when running gtest_list_tests_unittest_ with
# The expected output when running gtest_list_tests_unittest_ with
# --gtest_list_tests and --gtest_filter=Foo*.
# --gtest_list_tests and --gtest_filter=Foo*.
EXPECTED_OUTPUT_FILTER_FOO
=
"""FooDeathTest
.
EXPECTED_OUTPUT_FILTER_FOO
_RE
=
re
.
compile
(
r"""FooDeathTest\
.
Test1
Test1
Foo.
Foo
\
.
Bar1
Bar1
Bar2
Bar2
DISABLED_Bar3
DISABLED_Bar3
FooBar.
FooBar
\
.
Baz
Baz
FooTest.
FooTest
\
.
Test1
Test1
DISABLED_Test2
DISABLED_Test2
Test3
Test3
"""
"""
)
# Utilities.
# Utilities.
...
@@ -100,19 +126,18 @@ def Run(args):
...
@@ -100,19 +126,18 @@ def Run(args):
class
GTestListTestsUnitTest
(
gtest_test_utils
.
TestCase
):
class
GTestListTestsUnitTest
(
gtest_test_utils
.
TestCase
):
"""Tests using the --gtest_list_tests flag to list all tests."""
"""Tests using the --gtest_list_tests flag to list all tests."""
def
RunAndVerify
(
self
,
flag_value
,
expected_output
,
other_flag
):
def
RunAndVerify
(
self
,
flag_value
,
expected_output
_re
,
other_flag
):
"""Runs gtest_list_tests_unittest_ and verifies that it prints
"""Runs gtest_list_tests_unittest_ and verifies that it prints
the correct tests.
the correct tests.
Args:
Args:
flag_value: value of the --gtest_list_tests flag;
flag_value: value of the --gtest_list_tests flag;
None if the flag should not be present.
None if the flag should not be present.
expected_output_re: regular expression that matches the expected
expected_output: the expected output after running command;
output after running command;
other_flag: a different flag to be passed to command
other_flag: a different flag to be passed to command
along with gtest_list_tests;
along with gtest_list_tests;
None if the flag should not be present.
None if the flag should not be present.
"""
"""
if
flag_value
is
None
:
if
flag_value
is
None
:
...
@@ -132,36 +157,41 @@ class GTestListTestsUnitTest(gtest_test_utils.TestCase):
...
@@ -132,36 +157,41 @@ class GTestListTestsUnitTest(gtest_test_utils.TestCase):
output
=
Run
(
args
)
output
=
Run
(
args
)
msg
=
(
'when
%
s is
%
s, the output of "
%
s" is "
%
s".'
%
if
expected_output_re
:
(
LIST_TESTS_FLAG
,
flag_expression
,
' '
.
join
(
args
),
output
))
self
.
assert_
(
expected_output_re
.
match
(
output
),
if
expected_output
is
not
None
:
(
'when
%
s is
%
s, the output of "
%
s" is "
%
s",
\n
'
self
.
assert_
(
output
==
expected_output
,
msg
)
'which does not match regex "
%
s"'
%
(
LIST_TESTS_FLAG
,
flag_expression
,
' '
.
join
(
args
),
output
,
expected_output_re
.
pattern
)))
else
:
else
:
self
.
assert_
(
output
!=
EXPECTED_OUTPUT_NO_FILTER
,
msg
)
self
.
assert_
(
not
EXPECTED_OUTPUT_NO_FILTER_RE
.
match
(
output
),
(
'when
%
s is
%
s, the output of "
%
s" is "
%
s"'
%
(
LIST_TESTS_FLAG
,
flag_expression
,
' '
.
join
(
args
),
output
)))
def
testDefaultBehavior
(
self
):
def
testDefaultBehavior
(
self
):
"""Tests the behavior of the default mode."""
"""Tests the behavior of the default mode."""
self
.
RunAndVerify
(
flag_value
=
None
,
self
.
RunAndVerify
(
flag_value
=
None
,
expected_output
=
None
,
expected_output
_re
=
None
,
other_flag
=
None
)
other_flag
=
None
)
def
testFlag
(
self
):
def
testFlag
(
self
):
"""Tests using the --gtest_list_tests flag."""
"""Tests using the --gtest_list_tests flag."""
self
.
RunAndVerify
(
flag_value
=
'0'
,
self
.
RunAndVerify
(
flag_value
=
'0'
,
expected_output
=
None
,
expected_output
_re
=
None
,
other_flag
=
None
)
other_flag
=
None
)
self
.
RunAndVerify
(
flag_value
=
'1'
,
self
.
RunAndVerify
(
flag_value
=
'1'
,
expected_output
=
EXPECTED_OUTPUT_NO_FILTER
,
expected_output
_re
=
EXPECTED_OUTPUT_NO_FILTER_RE
,
other_flag
=
None
)
other_flag
=
None
)
def
testOverrideNonFilterFlags
(
self
):
def
testOverrideNonFilterFlags
(
self
):
"""Tests that --gtest_list_tests overrides the non-filter flags."""
"""Tests that --gtest_list_tests overrides the non-filter flags."""
self
.
RunAndVerify
(
flag_value
=
'1'
,
self
.
RunAndVerify
(
flag_value
=
'1'
,
expected_output
=
EXPECTED_OUTPUT_NO_FILTER
,
expected_output
_re
=
EXPECTED_OUTPUT_NO_FILTER_RE
,
other_flag
=
'--gtest_break_on_failure'
)
other_flag
=
'--gtest_break_on_failure'
)
def
testWithFilterFlags
(
self
):
def
testWithFilterFlags
(
self
):
...
@@ -169,7 +199,7 @@ class GTestListTestsUnitTest(gtest_test_utils.TestCase):
...
@@ -169,7 +199,7 @@ class GTestListTestsUnitTest(gtest_test_utils.TestCase):
--gtest_filter flag."""
--gtest_filter flag."""
self
.
RunAndVerify
(
flag_value
=
'1'
,
self
.
RunAndVerify
(
flag_value
=
'1'
,
expected_output
=
EXPECTED_OUTPUT_FILTER_FOO
,
expected_output
_re
=
EXPECTED_OUTPUT_FILTER_FOO_RE
,
other_flag
=
'--gtest_filter=Foo*'
)
other_flag
=
'--gtest_filter=Foo*'
)
...
...
test/gtest_list_tests_unittest_.cc
View file @
0fac8339
...
@@ -40,8 +40,6 @@
...
@@ -40,8 +40,6 @@
#include "gtest/gtest.h"
#include "gtest/gtest.h"
namespace
{
// Several different test cases and tests that will be listed.
// Several different test cases and tests that will be listed.
TEST
(
Foo
,
Bar1
)
{
TEST
(
Foo
,
Bar1
)
{
}
}
...
@@ -76,7 +74,81 @@ TEST_F(FooTest, Test3) {
...
@@ -76,7 +74,81 @@ TEST_F(FooTest, Test3) {
TEST
(
FooDeathTest
,
Test1
)
{
TEST
(
FooDeathTest
,
Test1
)
{
}
}
}
// namespace
// A group of value-parameterized tests.
class
MyType
{
public
:
explicit
MyType
(
const
std
::
string
&
a_value
)
:
value_
(
a_value
)
{}
const
std
::
string
&
value
()
const
{
return
value_
;
}
private
:
std
::
string
value_
;
};
// Teaches Google Test how to print a MyType.
void
PrintTo
(
const
MyType
&
x
,
std
::
ostream
*
os
)
{
*
os
<<
x
.
value
();
}
class
ValueParamTest
:
public
testing
::
TestWithParam
<
MyType
>
{
};
TEST_P
(
ValueParamTest
,
TestA
)
{
}
TEST_P
(
ValueParamTest
,
TestB
)
{
}
INSTANTIATE_TEST_CASE_P
(
MyInstantiation
,
ValueParamTest
,
testing
::
Values
(
MyType
(
"one line"
),
MyType
(
"two
\n
lines"
),
MyType
(
"a very
\n
loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong line"
)));
// NOLINT
// A group of typed tests.
// A deliberately long type name for testing the line-truncating
// behavior when printing a type parameter.
class
VeryLoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooogName
{
// NOLINT
};
template
<
typename
T
>
class
TypedTest
:
public
testing
::
Test
{
};
template
<
typename
T
,
int
kSize
>
class
MyArray
{
};
typedef
testing
::
Types
<
VeryLoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooogName
,
// NOLINT
int
*
,
MyArray
<
bool
,
42
>
>
MyTypes
;
TYPED_TEST_CASE
(
TypedTest
,
MyTypes
);
TYPED_TEST
(
TypedTest
,
TestA
)
{
}
TYPED_TEST
(
TypedTest
,
TestB
)
{
}
// A group of type-parameterized tests.
template
<
typename
T
>
class
TypeParamTest
:
public
testing
::
Test
{
};
TYPED_TEST_CASE_P
(
TypeParamTest
);
TYPED_TEST_P
(
TypeParamTest
,
TestA
)
{
}
TYPED_TEST_P
(
TypeParamTest
,
TestB
)
{
}
REGISTER_TYPED_TEST_CASE_P
(
TypeParamTest
,
TestA
,
TestB
);
INSTANTIATE_TYPED_TEST_CASE_P
(
My
,
TypeParamTest
,
MyTypes
);
int
main
(
int
argc
,
char
**
argv
)
{
int
main
(
int
argc
,
char
**
argv
)
{
::
testing
::
InitGoogleTest
(
&
argc
,
argv
);
::
testing
::
InitGoogleTest
(
&
argc
,
argv
);
...
...
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