};
GTEST_API_ void InsertSyntheticTestCase(const std::string& name,
- CodeLocation location);
+ CodeLocation location, bool has_test_p);
// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
//
if (!generated_instantiations) {
// There are no generaotrs, or they all generate nothing ...
- InsertSyntheticTestCase(GetTestSuiteName(), code_location_);
+ InsertSyntheticTestCase(GetTestSuiteName(), code_location_,
+ !tests_.empty());
}
} // RegisterTests
// If this parameterized test suite has no instantiations (and that
// has not been marked as okay), emit a test case reporting that.
-void InsertSyntheticTestCase(const std::string &name, CodeLocation location) {
+void InsertSyntheticTestCase(const std::string& name, CodeLocation location,
+ bool has_test_p) {
const auto& ignored = *GetIgnoredParameterizedTestSuites();
if (ignored.find(name) != ignored.end()) return;
- std::string message =
- "Paramaterized test suite " + name +
+ const char kMissingInstantiation[] = //
" is defined via TEST_P, but never instantiated. None of the test cases "
"will run. Either no INSTANTIATE_TEST_SUITE_P is provided or the only "
"ones provided expand to nothing."
"\n\n"
"Ideally, TEST_P definitions should only ever be included as part of "
"binaries that intend to use them. (As opposed to, for example, being "
- "placed in a library that may be linked in to get other utilities.)"
+ "placed in a library that may be linked in to get other utilities.)";
+
+ const char kMissingTestCase[] = //
+ " is instantiated via INSTANTIATE_TEST_SUITE_P, but no tests are "
+ "defined via TEST_P . No test cases will run."
+ "\n\n"
+ "Ideally, INSTANTIATE_TEST_SUITE_P should only ever be invoked from "
+ "code that always depend on code that provides TEST_P. Failing to do "
+ "so is often an indication of dead code, e.g. the last TEST_P was "
+ "removed but the rest got left behind.";
+
+ std::string message =
+ "Paramaterized test suite " + name +
+ (has_test_p ? kMissingInstantiation : kMissingTestCase) +
"\n\n"
"To suppress this error for this test suite, insert the following line "
"(in a non-header) in the namespace it is defined in:"
3
Stack trace: (omitted)
-\e[0;32m[==========] \e[mRunning 87 tests from 41 test suites.
+\e[0;32m[==========] \e[mRunning 88 tests from 41 test suites.
\e[0;32m[----------] \e[mGlobal test environment set-up.
FooEnvironment::SetUp() called.
BarEnvironment::SetUp() called.
Stack trace: (omitted)
\e[0;31m[ FAILED ] \e[mPrintingStrings/ParamTest.Failure/a, where GetParam() = "a"
-\e[0;32m[----------] \e[m2 tests from GoogleTestVerification
+\e[0;32m[----------] \e[m3 tests from GoogleTestVerification
+\e[0;32m[ RUN ] \e[mGoogleTestVerification.UninstantiatedParamaterizedTestSuite<NoTests>
+Paramaterized test suite NoTests is instantiated via INSTANTIATE_TEST_SUITE_P, but no tests are defined via TEST_P . No test cases will run.
+
+Ideally, INSTANTIATE_TEST_SUITE_P should only ever be invoked from code that always depend on code that provides TEST_P. Failing to do so is often an indication of dead code, e.g. the last TEST_P was removed but the rest got left behind.
+
+To suppress this error for this test suite, insert the following line (in a non-header) in the namespace it is defined in:
+
+GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(NoTests);
+\e[0;32m[ OK ] \e[mGoogleTestVerification.UninstantiatedParamaterizedTestSuite<NoTests>
\e[0;32m[ RUN ] \e[mGoogleTestVerification.UninstantiatedParamaterizedTestSuite<DetectNotInstantiatedTest>
Paramaterized test suite DetectNotInstantiatedTest is defined via TEST_P, but never instantiated. None of the test cases will run. Either no INSTANTIATE_TEST_SUITE_P is provided or the only ones provided expand to nothing.
Expected fatal failure.
Stack trace: (omitted)
-\e[0;32m[==========] \e[m87 tests from 41 test suites ran.
-\e[0;32m[ PASSED ] \e[m33 tests.
+\e[0;32m[==========] \e[m88 tests from 41 test suites ran.
+\e[0;32m[ PASSED ] \e[m34 tests.
\e[0;31m[ FAILED ] \e[m54 tests, listed below:
\e[0;31m[ FAILED ] \e[mNonfatalFailureTest.EscapesStringOperands
\e[0;31m[ FAILED ] \e[mNonfatalFailureTest.DiffForLongStrings
testing::Values(std::string("a")),
ParamNameFunc);
+// The case where a suite has INSTANTIATE_TEST_SUITE_P but not TEST_P.
+using NoTests = ParamTest;
+INSTANTIATE_TEST_SUITE_P(ThisIsOdd, NoTests, ::testing::Values("Hello"));
+
// fails under kErrorOnUninstantiatedParameterizedTest=true
class DetectNotInstantiatedTest : public testing::TestWithParam<int> {};
TEST_P(DetectNotInstantiatedTest, Used) { }