Skip to content

Commit

Permalink
Revert "Googletest export": disallow empty prefix
Browse files Browse the repository at this point in the history
This reverts commit 20b5b8e.
Reason for revert: Breaks existing applications, such as ANGLE
(angleproject.org), requires adding an extra prefix that needs to be
typed for no reason (when testing from command line) and increases the
logs' sizes by a non-trivial amount due to the very large number of
tests ANGLE runs.

Original commit message:

    Add a compile time check to ensure that the parameters to TEST_P and
    INSTANTIATE_TEST_SUITE_P are not empty. Some compilers already fail
    in that case and, even where it works, it's likely to result in
    technically invalid code by virtue of creating reserved identifiers:
    https://en.cppreference.com/w/cpp/language/identifiers

First, every project is perfectly capable of adding a prefix if they
want to support such a compiler. This change penalizes every
project.

Second, using a prefix such as `_p` also results in reserved
identifiers, so this change is not really solving the problem.  For that
matter, instead of generating `gtest_##prefix##...`, you can generate
`gtest_x##prefix##...` to correctly fix the issue, including when empty
prefixes are used.
  • Loading branch information
ShabbyX committed Dec 16, 2019
1 parent 4b7809c commit 1800a38
Show file tree
Hide file tree
Showing 4 changed files with 10 additions and 20 deletions.
20 changes: 5 additions & 15 deletions googletest/include/gtest/gtest-param-test.h
Original file line number Diff line number Diff line change
Expand Up @@ -58,9 +58,7 @@ class FooTest : public ::testing::TestWithParam<const char*> {

// Then, use the TEST_P macro to define as many parameterized tests
// for this fixture as you want. The _P suffix is for "parameterized"
// or "pattern", whichever you prefer to think. The arguments to the
// TEST_P macro are the test_suite_name and test_case (both which must be
// non-empty) that will form the test name.
// or "pattern", whichever you prefer to think.

TEST_P(FooTest, DoesBlah) {
// Inside a test, access the test parameter with the GetParam() method
Expand Down Expand Up @@ -103,10 +101,10 @@ INSTANTIATE_TEST_SUITE_P(InstantiationName,

// To distinguish different instances of the pattern, (yes, you
// can instantiate it more than once) the first argument to the
// INSTANTIATE_TEST_SUITE_P macro is a prefix (which must be non-empty) that
// will be added to the actual test suite name. Remember to pick unique prefixes
// for different instantiations. The tests from the instantiation above will
// have these names:
// INSTANTIATE_TEST_SUITE_P macro is a prefix that will be added to the
// actual test suite name. Remember to pick unique prefixes for different
// instantiations. The tests from the instantiation above will have
// these names:
//
// * InstantiationName/FooTest.DoesBlah/0 for "meeny"
// * InstantiationName/FooTest.DoesBlah/1 for "miny"
Expand Down Expand Up @@ -414,10 +412,6 @@ internal::CartesianProductHolder<Generator...> Combine(const Generator&... g) {
}

#define TEST_P(test_suite_name, test_name) \
static_assert(sizeof(GTEST_STRINGIFY_(test_suite_name)) > 1, \
"test_suite_name must not be empty"); \
static_assert(sizeof(GTEST_STRINGIFY_(test_name)) > 1, \
"test_name must not be empty"); \
class GTEST_TEST_CLASS_NAME_(test_suite_name, test_name) \
: public test_suite_name { \
public: \
Expand Down Expand Up @@ -464,10 +458,6 @@ internal::CartesianProductHolder<Generator...> Combine(const Generator&... g) {
#define GTEST_GET_SECOND_(first, second, ...) second

#define INSTANTIATE_TEST_SUITE_P(prefix, test_suite_name, ...) \
static_assert(sizeof(GTEST_STRINGIFY_(test_suite_name)) > 1, \
"test_suite_name must not be empty"); \
static_assert(sizeof(GTEST_STRINGIFY_(prefix)) > 1, \
"prefix must not be empty"); \
static ::testing::internal::ParamGenerator<test_suite_name::ParamType> \
gtest_##prefix##test_suite_name##_EvalGenerator_() { \
return GTEST_EXPAND_(GTEST_GET_FIRST_(__VA_ARGS__, DUMMY_PARAM_)); \
Expand Down
6 changes: 3 additions & 3 deletions googletest/test/googletest-output-test-golden-lin.txt
Original file line number Diff line number Diff line change
Expand Up @@ -966,9 +966,9 @@ Expected equality of these values:
Stack trace: (omitted)

[ FAILED ] PrintingFailingParams/FailingParamTest.Fails/0, where GetParam() = 2
[----------] 1 test from All/EmptyBasenameParamInst
[ RUN ] All/EmptyBasenameParamInst.Passes/0
[ OK ] All/EmptyBasenameParamInst.Passes/0
[----------] 1 test from EmptyBasenameParamInst
[ RUN ] EmptyBasenameParamInst.Passes/0
[ OK ] EmptyBasenameParamInst.Passes/0
[----------] 2 tests from PrintingStrings/ParamTest
[ RUN ] PrintingStrings/ParamTest.Success/a
[ OK ] PrintingStrings/ParamTest.Success/a
Expand Down
2 changes: 1 addition & 1 deletion googletest/test/googletest-output-test_.cc
Original file line number Diff line number Diff line change
Expand Up @@ -102,7 +102,7 @@ class EmptyBasenameParamInst : public testing::TestWithParam<int> {};

TEST_P(EmptyBasenameParamInst, Passes) { EXPECT_EQ(1, GetParam()); }

INSTANTIATE_TEST_SUITE_P(All, EmptyBasenameParamInst, testing::Values(1));
INSTANTIATE_TEST_SUITE_P(, EmptyBasenameParamInst, testing::Values(1));

static const char kGoldenString[] = "\"Line\0 1\"\nLine 2";

Expand Down
2 changes: 1 addition & 1 deletion googletest/test/gtest_unittest.cc
Original file line number Diff line number Diff line change
Expand Up @@ -5349,7 +5349,7 @@ TEST_P(CodeLocationForTESTP, Verify) {
VERIFY_CODE_LOCATION;
}

INSTANTIATE_TEST_SUITE_P(All, CodeLocationForTESTP, Values(0));
INSTANTIATE_TEST_SUITE_P(, CodeLocationForTESTP, Values(0));

template <typename T>
class CodeLocationForTYPEDTEST : public Test {
Expand Down

0 comments on commit 1800a38

Please sign in to comment.