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
eed64b5f
Commit
eed64b5f
authored
Aug 08, 2019
by
Krystian Kuzniarek
Browse files
replace autogenerated TypesX classes by variadic ones
parent
37f32278
Changes
5
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
102 additions
and
1651 deletions
+102
-1651
googletest/include/gtest/gtest-typed-test.h
googletest/include/gtest/gtest-typed-test.h
+8
-10
googletest/include/gtest/internal/gtest-internal.h
googletest/include/gtest/internal/gtest-internal.h
+2
-2
googletest/include/gtest/internal/gtest-type-util.h
googletest/include/gtest/internal/gtest-type-util.h
+45
-1545
googletest/include/gtest/internal/gtest-type-util.h.pump
googletest/include/gtest/internal/gtest-type-util.h.pump
+42
-90
googletest/test/gtest-unittest-api_test.cc
googletest/test/gtest-unittest-api_test.cc
+5
-4
No files found.
googletest/include/gtest/gtest-typed-test.h
View file @
eed64b5f
...
...
@@ -27,7 +27,6 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
// GOOGLETEST_CM0001 DO NOT DELETE
#ifndef GTEST_INCLUDE_GTEST_GTEST_TYPED_TEST_H_
...
...
@@ -188,13 +187,13 @@ INSTANTIATE_TYPED_TEST_SUITE_P(My, FooTest, MyTypes);
#define GTEST_NAME_GENERATOR_(TestSuiteName) \
gtest_type_params_##TestSuiteName##_NameGenerator
#define TYPED_TEST_SUITE(CaseName, Types, ...)
\
typedef ::testing::internal::TypeList<Types>::type
GTEST_TYPE_PARAMS_(
\
CaseName);
\
typedef ::testing::internal::NameGeneratorSelector<__VA_ARGS__>::type
\
#define TYPED_TEST_SUITE(CaseName, Types, ...) \
typedef ::testing::internal::
Generate
TypeList<Types>::type
\
GTEST_TYPE_PARAMS_(CaseName);
\
typedef ::testing::internal::NameGeneratorSelector<__VA_ARGS__>::type \
GTEST_NAME_GENERATOR_(CaseName)
#
define TYPED_TEST(CaseName, TestName) \
#define TYPED_TEST(CaseName, TestName)
\
template <typename gtest_TypeParam_> \
class GTEST_TEST_CLASS_NAME_(CaseName, TestName) \
: public CaseName<gtest_TypeParam_> { \
...
...
@@ -204,8 +203,7 @@ INSTANTIATE_TYPED_TEST_SUITE_P(My, FooTest, MyTypes);
void TestBody() override; \
}; \
static bool gtest_##CaseName##_##TestName##_registered_ \
GTEST_ATTRIBUTE_UNUSED_ = \
::testing::internal::TypeParameterizedTest< \
GTEST_ATTRIBUTE_UNUSED_ = ::testing::internal::TypeParameterizedTest< \
CaseName, \
::testing::internal::TemplateSel<GTEST_TEST_CLASS_NAME_(CaseName, \
TestName)>, \
...
...
@@ -307,7 +305,7 @@ INSTANTIATE_TYPED_TEST_SUITE_P(My, FooTest, MyTypes);
static bool gtest_##Prefix##_##SuiteName GTEST_ATTRIBUTE_UNUSED_ = \
::testing::internal::TypeParameterizedTestSuite< \
SuiteName, GTEST_SUITE_NAMESPACE_(SuiteName)::gtest_AllTests_, \
::testing::internal::TypeList<Types>::type>::
\
::testing::internal::
Generate
TypeList<Types>::type>:: \
Register(#Prefix, \
::testing::internal::CodeLocation(__FILE__, __LINE__), \
>EST_TYPED_TEST_SUITE_P_STATE_(SuiteName), #SuiteName, \
...
...
@@ -315,7 +313,7 @@ INSTANTIATE_TYPED_TEST_SUITE_P(My, FooTest, MyTypes);
::testing::internal::GenerateNames< \
::testing::internal::NameGeneratorSelector< \
__VA_ARGS__>::type, \
::testing::internal::TypeList<Types>::type>())
::testing::internal::
Generate
TypeList<Types>::type>())
// Legacy API is deprecated but still available
#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_
...
...
googletest/include/gtest/internal/gtest-internal.h
View file @
eed64b5f
...
...
@@ -662,7 +662,7 @@ struct NameGeneratorSelector {
};
template
<
typename
NameGenerator
>
void
GenerateNamesRecursively
(
Types0
,
std
::
vector
<
std
::
string
>*
,
int
)
{}
void
GenerateNamesRecursively
(
internal
::
None
,
std
::
vector
<
std
::
string
>*
,
int
)
{}
template
<
typename
NameGenerator
,
typename
Types
>
void
GenerateNamesRecursively
(
Types
,
std
::
vector
<
std
::
string
>*
result
,
int
i
)
{
...
...
@@ -729,7 +729,7 @@ class TypeParameterizedTest {
// The base case for the compile time recursion.
template
<
GTEST_TEMPLATE_
Fixture
,
class
TestSel
>
class
TypeParameterizedTest
<
Fixture
,
TestSel
,
Types0
>
{
class
TypeParameterizedTest
<
Fixture
,
TestSel
,
internal
::
None
>
{
public:
static
bool
Register
(
const
char
*
/*prefix*/
,
const
CodeLocation
&
,
const
char
*
/*case_name*/
,
const
char
*
/*test_names*/
,
...
...
googletest/include/gtest/internal/gtest-type-util.h
View file @
eed64b5f
This diff is collapsed.
Click to expand it.
googletest/include/gtest/internal/gtest-type-util.h.pump
View file @
eed64b5f
...
...
@@ -33,8 +33,8 @@ $var n = 50 $$ Maximum length of type lists we want to support.
// Type utilities needed for implementing typed and type-parameterized
// tests. This file is generated by a SCRIPT. DO NOT EDIT BY HAND!
//
// Currently we support at most $n type
s in a list, and at most $n
//
type-parameterized tests
in one type-parameterized test suite.
// Currently we support at most $n type
-parameterized tests
// in one type-parameterized test suite.
// Please contact googletestframework@googlegroups.com if you need
// more.
...
...
@@ -104,84 +104,6 @@ std::string GetTypeName() {
#if GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P
// A unique type used as the default value for the arguments of class
// template Types. This allows us to simulate variadic templates
// (e.g. Types<int>, Type<int, double>, and etc), which C++ doesn't
// support directly.
struct
None
{};
// The following family of struct and struct templates are used to
// represent type lists. In particular, TypesN<T1, T2, ..., TN>
// represents a type list with N types (T1, T2, ..., and TN) in it.
// Except for Types0, every struct in the family has two member types:
// Head for the first type in the list, and Tail for the rest of the
// list.
// The empty type list.
struct
Types0
{};
// Type lists of length 1, 2, 3, and so on.
template
<
typename
T1
>
struct
Types1
{
typedef
T1
Head
;
typedef
Types0
Tail
;
};
$
range
i
2.
.
n
$
for
i
[[
$
range
j
1.
.
i
$
range
k
2.
.
i
template
<
$
for
j
,
[[
typename
T
$
j
]]>
struct
Types
$
i
{
typedef
T1
Head
;
typedef
Types
$
(
i
-
1
)
<
$
for
k
,
[[
T
$
k
]]
>
Tail
;
};
]]
}
// namespace internal
// We don't want to require the users to write TypesN<...> directly,
// as that would require them to count the length. Types<...> is much
// easier to write, but generates horrible messages when there is a
// compiler error, as gcc insists on printing out each template
// argument, even if it has the default value (this means Types<int>
// will appear as Types<int, None, None, ..., None> in the compiler
// errors).
//
// Our solution is to combine the best part of the two approaches: a
// user would write Types<T1, ..., TN>, and Google Test will translate
// that to TypesN<T1, ..., TN> internally to make error messages
// readable. The translation is done by the 'type' member of the
// Types template.
$
range
i
1.
.
n
template
<
$
for
i
,
[[
typename
T
$
i
=
internal
::
None
]]>
struct
Types
{
typedef
internal
::
Types
$
n
<
$
for
i
,
[[
T
$
i
]]
>
type
;
};
template
<
>
struct
Types
<
$
for
i
,
[[
internal
::
None
]]
>
{
typedef
internal
::
Types0
type
;
};
$
range
i
1.
.
n
-
1
$
for
i
[[
$
range
j
1.
.
i
$
range
k
i
+
1.
.
n
template
<
$
for
j
,
[[
typename
T
$
j
]]>
struct
Types
<
$
for
j
,
[[
T
$
j
]]
$
for
k
[[,
internal
::
None
]]
>
{
typedef
internal
::
Types
$
i
<
$
for
j
,
[[
T
$
j
]]
>
type
;
};
]]
namespace
internal
{
# define GTEST_TEMPLATE_ template <typename T> class
// The template "selector" struct TemplateSel<Tmpl> is used to
...
...
@@ -278,25 +200,55 @@ struct Templates<$for j, [[T$j]]$for k[[, NoneT]]> {
]]
// The TypeList template makes it possible to use either a single type
// or a Types<...> list in TYPED_TEST_SUITE() and
// INSTANTIATE_TYPED_TEST_SUITE_P().
// A unique type indicating an empty node
struct
None
{};
template
<
typename
T
>
struct
TypeList
{
typedef
Types1
<
T
>
type
;
// Tuple-like type lists
template
<
typename
Head_
,
typename
...
Tail_
>
struct
Types
{
using
Head
=
Head_
;
using
Tail
=
Types
<
Tail_
...
>
;
};
template
<
typename
Head_
>
struct
Types
<
Head_
>
{
using
Head
=
Head_
;
using
Tail
=
None
;
};
$
range
i
1.
.
n
template
<
$
for
i
,
[[
typename
T
$
i
]]>
struct
TypeList
<
Types
<
$
for
i
,
[[
T
$
i
]]
>
>
{
typedef
typename
Types
<
$
for
i
,
[[
T
$
i
]]
>::
type
type
;
// Helper metafunctions to tell apart a single type from types
// generated by ::testing::Types
template
<
typename
...
Ts
>
struct
ProxyTypeList
{
typedef
Types
<
Ts
...
>
type
;
};
template
<
typename
>
struct
is_proxy_type_list
:
std
::
false_type
{};
template
<
typename
...
Ts
>
struct
is_proxy_type_list
<
ProxyTypeList
<
Ts
...
>>
:
std
::
true_type
{};
// Generator which conditionally creates type lists.
// It recognizes if a requested type list should be created
// and prevents creating a new type list nested within another one.
template
<
typename
T
>
struct
GenerateTypeList
{
private:
using
proxy
=
typename
std
::
conditional
<
is_proxy_type_list
<
T
>::
value
,
T
,
ProxyTypeList
<
T
>>::
type
;
public:
using
type
=
typename
proxy
::
type
;
};
#endif // GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P
}
// namespace internal
template
<
typename
...
Ts
>
using
Types
=
internal
::
ProxyTypeList
<
Ts
...
>
;
}
// namespace testing
#endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TYPE_UTIL_H_
googletest/test/gtest-unittest-api_test.cc
View file @
eed64b5f
...
...
@@ -188,7 +188,7 @@ TEST(ApiTest, TestSuiteImmutableAccessorsWork) {
ASSERT_TRUE
(
test_suite
!=
nullptr
);
EXPECT_STREQ
(
"TestSuiteWithCommentTest/0"
,
test_suite
->
name
());
EXPECT_STREQ
(
GetTypeName
<
int
>
().
c_str
(),
test_suite
->
type_param
());
EXPECT_STREQ
(
GetTypeName
<
Types
<
int
>
>
().
c_str
(),
test_suite
->
type_param
());
EXPECT_TRUE
(
test_suite
->
should_run
());
EXPECT_EQ
(
0
,
test_suite
->
disabled_test_count
());
EXPECT_EQ
(
1
,
test_suite
->
test_to_run_count
());
...
...
@@ -199,7 +199,7 @@ TEST(ApiTest, TestSuiteImmutableAccessorsWork) {
EXPECT_STREQ
(
"Dummy"
,
tests
[
0
]
->
name
());
EXPECT_STREQ
(
"TestSuiteWithCommentTest/0"
,
tests
[
0
]
->
test_suite_name
());
EXPECT_TRUE
(
IsNull
(
tests
[
0
]
->
value_param
()));
EXPECT_STREQ
(
GetTypeName
<
int
>
().
c_str
(),
tests
[
0
]
->
type_param
());
EXPECT_STREQ
(
GetTypeName
<
Types
<
int
>
>
().
c_str
(),
tests
[
0
]
->
type_param
());
EXPECT_TRUE
(
tests
[
0
]
->
should_run
());
delete
[]
tests
;
...
...
@@ -265,7 +265,8 @@ class FinalSuccessChecker : public Environment {
#if GTEST_HAS_TYPED_TEST
EXPECT_STREQ
(
"TestSuiteWithCommentTest/0"
,
test_suites
[
2
]
->
name
());
EXPECT_STREQ
(
GetTypeName
<
int
>
().
c_str
(),
test_suites
[
2
]
->
type_param
());
EXPECT_STREQ
(
GetTypeName
<
Types
<
int
>>
().
c_str
(),
test_suites
[
2
]
->
type_param
());
EXPECT_TRUE
(
test_suites
[
2
]
->
should_run
());
EXPECT_EQ
(
0
,
test_suites
[
2
]
->
disabled_test_count
());
ASSERT_EQ
(
1
,
test_suites
[
2
]
->
total_test_count
());
...
...
@@ -317,7 +318,7 @@ class FinalSuccessChecker : public Environment {
EXPECT_STREQ
(
"Dummy"
,
tests
[
0
]
->
name
());
EXPECT_STREQ
(
"TestSuiteWithCommentTest/0"
,
tests
[
0
]
->
test_suite_name
());
EXPECT_TRUE
(
IsNull
(
tests
[
0
]
->
value_param
()));
EXPECT_STREQ
(
GetTypeName
<
int
>
().
c_str
(),
tests
[
0
]
->
type_param
());
EXPECT_STREQ
(
GetTypeName
<
Types
<
int
>
>
().
c_str
(),
tests
[
0
]
->
type_param
());
EXPECT_TRUE
(
tests
[
0
]
->
should_run
());
EXPECT_TRUE
(
tests
[
0
]
->
result
()
->
Passed
());
EXPECT_EQ
(
0
,
tests
[
0
]
->
result
()
->
test_property_count
());
...
...
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