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
0fac8339
Commit
0fac8339
authored
Apr 10, 2013
by
zhanyong.wan
Browse files
prints type/value parameters when listing tests
parent
c97e3001
Changes
3
Show whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
185 additions
and
39 deletions
+185
-39
src/gtest.cc
src/gtest.cc
+49
-5
test/gtest_list_tests_unittest.py
test/gtest_list_tests_unittest.py
+61
-31
test/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"
,
k
TypeParam
Label
,
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
"
,
k
TypeParam
Label
,
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
(
" %s
\n
"
,
test_info
->
name
());
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
(
"
\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,16 +126,15 @@ def Run(args):
...
@@ -100,16 +126,15 @@ 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.
...
@@ -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