Adds tests for EXPECT_FATAL_FAILURE and reduces the golden file bloat (by Zhanyong Wan). Fixes more warnings on Windows (by Vlad Losev).
This commit is contained in:
parent
ad99ca1446
commit
3750499433
@ -749,7 +749,7 @@ String GetCurrentOsStackTraceExceptTop(UnitTest* unit_test, int skip_count);
|
|||||||
int GetFailedPartCount(const TestResult* result);
|
int GetFailedPartCount(const TestResult* result);
|
||||||
|
|
||||||
// A helper for suppressing warnings on unreachable code in some macros.
|
// A helper for suppressing warnings on unreachable code in some macros.
|
||||||
inline bool True() { return true; }
|
bool AlwaysTrue();
|
||||||
|
|
||||||
} // namespace internal
|
} // namespace internal
|
||||||
} // namespace testing
|
} // namespace testing
|
||||||
@ -767,12 +767,18 @@ inline bool True() { return true; }
|
|||||||
#define GTEST_SUCCESS_(message) \
|
#define GTEST_SUCCESS_(message) \
|
||||||
GTEST_MESSAGE_(message, ::testing::TPRT_SUCCESS)
|
GTEST_MESSAGE_(message, ::testing::TPRT_SUCCESS)
|
||||||
|
|
||||||
|
// Suppresses MSVC warnings 4072 (unreachable code) for the code following
|
||||||
|
// statement if it returns or throws (or doesn't return or throw in some
|
||||||
|
// situations).
|
||||||
|
#define GTEST_HIDE_UNREACHABLE_CODE_(statement) \
|
||||||
|
if (::testing::internal::AlwaysTrue()) { statement; }
|
||||||
|
|
||||||
#define GTEST_TEST_THROW_(statement, expected_exception, fail) \
|
#define GTEST_TEST_THROW_(statement, expected_exception, fail) \
|
||||||
GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
|
GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
|
||||||
if (const char* gtest_msg = "") { \
|
if (const char* gtest_msg = "") { \
|
||||||
bool gtest_caught_expected = false; \
|
bool gtest_caught_expected = false; \
|
||||||
try { \
|
try { \
|
||||||
statement; \
|
GTEST_HIDE_UNREACHABLE_CODE_(statement); \
|
||||||
} \
|
} \
|
||||||
catch (expected_exception const&) { \
|
catch (expected_exception const&) { \
|
||||||
gtest_caught_expected = true; \
|
gtest_caught_expected = true; \
|
||||||
@ -796,7 +802,7 @@ inline bool True() { return true; }
|
|||||||
GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
|
GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
|
||||||
if (const char* gtest_msg = "") { \
|
if (const char* gtest_msg = "") { \
|
||||||
try { \
|
try { \
|
||||||
statement; \
|
GTEST_HIDE_UNREACHABLE_CODE_(statement); \
|
||||||
} \
|
} \
|
||||||
catch (...) { \
|
catch (...) { \
|
||||||
gtest_msg = "Expected: " #statement " doesn't throw an exception.\n" \
|
gtest_msg = "Expected: " #statement " doesn't throw an exception.\n" \
|
||||||
@ -812,7 +818,7 @@ inline bool True() { return true; }
|
|||||||
if (const char* gtest_msg = "") { \
|
if (const char* gtest_msg = "") { \
|
||||||
bool gtest_caught_any = false; \
|
bool gtest_caught_any = false; \
|
||||||
try { \
|
try { \
|
||||||
statement; \
|
GTEST_HIDE_UNREACHABLE_CODE_(statement); \
|
||||||
} \
|
} \
|
||||||
catch (...) { \
|
catch (...) { \
|
||||||
gtest_caught_any = true; \
|
gtest_caught_any = true; \
|
||||||
@ -838,7 +844,7 @@ inline bool True() { return true; }
|
|||||||
GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
|
GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
|
||||||
if (const char* gtest_msg = "") { \
|
if (const char* gtest_msg = "") { \
|
||||||
::testing::internal::HasNewFatalFailureHelper gtest_fatal_failure_checker; \
|
::testing::internal::HasNewFatalFailureHelper gtest_fatal_failure_checker; \
|
||||||
if (::testing::internal::True()) { statement; } \
|
GTEST_HIDE_UNREACHABLE_CODE_(statement); \
|
||||||
if (gtest_fatal_failure_checker.has_new_fatal_failure()) { \
|
if (gtest_fatal_failure_checker.has_new_fatal_failure()) { \
|
||||||
gtest_msg = "Expected: " #statement " doesn't generate new fatal " \
|
gtest_msg = "Expected: " #statement " doesn't generate new fatal " \
|
||||||
"failures in the current thread.\n" \
|
"failures in the current thread.\n" \
|
||||||
|
16
src/gtest.cc
16
src/gtest.cc
@ -3771,6 +3771,22 @@ int GetFailedPartCount(const TestResult* result) {
|
|||||||
return result->failed_part_count();
|
return result->failed_part_count();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Used by the GTEST_HIDE_UNREACHABLE_CODE_ macro to suppress unreachable
|
||||||
|
// code warnings.
|
||||||
|
namespace {
|
||||||
|
class ClassUniqueToAlwaysTrue {};
|
||||||
|
}
|
||||||
|
|
||||||
|
bool AlwaysTrue() {
|
||||||
|
#if GTEST_HAS_EXCEPTIONS
|
||||||
|
// This condition is always false so AlwaysTrue() never actually throws,
|
||||||
|
// but it makes the compiler think that it may throw.
|
||||||
|
if (atoi("42") == 36) // NOLINT
|
||||||
|
throw ClassUniqueToAlwaysTrue();
|
||||||
|
#endif // GTEST_HAS_EXCEPTIONS
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
// Parses a string as a command line flag. The string should have
|
// Parses a string as a command line flag. The string should have
|
||||||
// the format "--flag=value". When def_optional is true, the "=value"
|
// the format "--flag=value". When def_optional is true, the "=value"
|
||||||
// part can be omitted.
|
// part can be omitted.
|
||||||
|
@ -61,11 +61,16 @@ else:
|
|||||||
GOLDEN_NAME = 'gtest_output_test_golden_lin.txt'
|
GOLDEN_NAME = 'gtest_output_test_golden_lin.txt'
|
||||||
|
|
||||||
PROGRAM_PATH = os.path.join(gtest_test_utils.GetBuildDir(), PROGRAM)
|
PROGRAM_PATH = os.path.join(gtest_test_utils.GetBuildDir(), PROGRAM)
|
||||||
|
|
||||||
|
# At least one command we exercise must not have the
|
||||||
|
# --gtest_internal_skip_environment_and_ad_hoc_tests flag.
|
||||||
COMMAND_WITH_COLOR = PROGRAM_PATH + ' --gtest_color=yes'
|
COMMAND_WITH_COLOR = PROGRAM_PATH + ' --gtest_color=yes'
|
||||||
COMMAND_WITH_TIME = (PROGRAM_PATH + ' --gtest_print_time '
|
COMMAND_WITH_TIME = (PROGRAM_PATH + ' --gtest_print_time '
|
||||||
+ '--gtest_filter="FatalFailureTest.*:LoggingTest.*"')
|
'--gtest_internal_skip_environment_and_ad_hoc_tests '
|
||||||
|
'--gtest_filter="FatalFailureTest.*:LoggingTest.*"')
|
||||||
COMMAND_WITH_DISABLED = (PROGRAM_PATH + ' --gtest_also_run_disabled_tests '
|
COMMAND_WITH_DISABLED = (PROGRAM_PATH + ' --gtest_also_run_disabled_tests '
|
||||||
+ '--gtest_filter="*DISABLED_*"')
|
'--gtest_internal_skip_environment_and_ad_hoc_tests '
|
||||||
|
'--gtest_filter="*DISABLED_*"')
|
||||||
|
|
||||||
GOLDEN_PATH = os.path.join(gtest_test_utils.GetSourceDir(),
|
GOLDEN_PATH = os.path.join(gtest_test_utils.GetSourceDir(),
|
||||||
GOLDEN_NAME)
|
GOLDEN_NAME)
|
||||||
|
@ -60,6 +60,8 @@
|
|||||||
using testing::ScopedFakeTestPartResultReporter;
|
using testing::ScopedFakeTestPartResultReporter;
|
||||||
using testing::TestPartResultArray;
|
using testing::TestPartResultArray;
|
||||||
|
|
||||||
|
using testing::internal::String;
|
||||||
|
|
||||||
// Tests catching fatal failures.
|
// Tests catching fatal failures.
|
||||||
|
|
||||||
// A subroutine used by the following test.
|
// A subroutine used by the following test.
|
||||||
@ -958,6 +960,10 @@ class BarEnvironment : public testing::Environment {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
GTEST_DEFINE_bool_(internal_skip_environment_and_ad_hoc_tests, false,
|
||||||
|
"This flag causes the program to skip test environment "
|
||||||
|
"tests and ad hoc tests.");
|
||||||
|
|
||||||
// The main function.
|
// The main function.
|
||||||
//
|
//
|
||||||
// The idea is to use Google Test to run all the tests we have defined (some
|
// The idea is to use Google Test to run all the tests we have defined (some
|
||||||
@ -968,6 +974,9 @@ int main(int argc, char **argv) {
|
|||||||
// We will use a separate Python script to compare the output of
|
// We will use a separate Python script to compare the output of
|
||||||
// this program with the golden file.
|
// this program with the golden file.
|
||||||
testing::InitGoogleTest(&argc, argv);
|
testing::InitGoogleTest(&argc, argv);
|
||||||
|
if (argc >= 2 &&
|
||||||
|
String(argv[1]) == "--gtest_internal_skip_environment_and_ad_hoc_tests")
|
||||||
|
GTEST_FLAG(internal_skip_environment_and_ad_hoc_tests) = true;
|
||||||
|
|
||||||
#ifdef GTEST_HAS_DEATH_TEST
|
#ifdef GTEST_HAS_DEATH_TEST
|
||||||
if (testing::internal::GTEST_FLAG(internal_run_death_test) != "") {
|
if (testing::internal::GTEST_FLAG(internal_run_death_test) != "") {
|
||||||
@ -978,6 +987,9 @@ int main(int argc, char **argv) {
|
|||||||
}
|
}
|
||||||
#endif // GTEST_HAS_DEATH_TEST
|
#endif // GTEST_HAS_DEATH_TEST
|
||||||
|
|
||||||
|
if (GTEST_FLAG(internal_skip_environment_and_ad_hoc_tests))
|
||||||
|
return RUN_ALL_TESTS();
|
||||||
|
|
||||||
// Registers two global test environments.
|
// Registers two global test environments.
|
||||||
// The golden file verifies that they are set up in the order they
|
// The golden file verifies that they are set up in the order they
|
||||||
// are registered, and torn down in the reverse order.
|
// are registered, and torn down in the reverse order.
|
||||||
|
@ -536,20 +536,9 @@ Expected fatal failure.
|
|||||||
33 FAILED TESTS
|
33 FAILED TESTS
|
||||||
[0;33m YOU HAVE 1 DISABLED TEST
|
[0;33m YOU HAVE 1 DISABLED TEST
|
||||||
|
|
||||||
[mThe non-test part of the code is expected to have 2 failures.
|
[mNote: Google Test filter = FatalFailureTest.*:LoggingTest.*
|
||||||
|
|
||||||
gtest_output_test_.cc:#: Failure
|
|
||||||
Value of: false
|
|
||||||
Actual: false
|
|
||||||
Expected: true
|
|
||||||
gtest_output_test_.cc:#: Failure
|
|
||||||
Value of: 3
|
|
||||||
Expected: 2
|
|
||||||
Note: Google Test filter = FatalFailureTest.*:LoggingTest.*
|
|
||||||
[==========] Running 4 tests from 2 test cases.
|
[==========] Running 4 tests from 2 test cases.
|
||||||
[----------] Global test environment set-up.
|
[----------] Global test environment set-up.
|
||||||
FooEnvironment::SetUp() called.
|
|
||||||
BarEnvironment::SetUp() called.
|
|
||||||
[----------] 3 tests from FatalFailureTest
|
[----------] 3 tests from FatalFailureTest
|
||||||
[ RUN ] FatalFailureTest.FatalFailureInSubroutine
|
[ RUN ] FatalFailureTest.FatalFailureInSubroutine
|
||||||
(expecting a failure that x should be 1)
|
(expecting a failure that x should be 1)
|
||||||
@ -589,14 +578,6 @@ Expected: (3) >= (a[i]), actual: 3 vs 6
|
|||||||
[----------] 1 test from LoggingTest (? ms total)
|
[----------] 1 test from LoggingTest (? ms total)
|
||||||
|
|
||||||
[----------] Global test environment tear-down
|
[----------] Global test environment tear-down
|
||||||
BarEnvironment::TearDown() called.
|
|
||||||
gtest_output_test_.cc:#: Failure
|
|
||||||
Failed
|
|
||||||
Expected non-fatal failure.
|
|
||||||
FooEnvironment::TearDown() called.
|
|
||||||
gtest_output_test_.cc:#: Failure
|
|
||||||
Failed
|
|
||||||
Expected fatal failure.
|
|
||||||
[==========] 4 tests from 2 test cases ran. (? ms total)
|
[==========] 4 tests from 2 test cases ran. (? ms total)
|
||||||
[ PASSED ] 0 tests.
|
[ PASSED ] 0 tests.
|
||||||
[ FAILED ] 4 tests, listed below:
|
[ FAILED ] 4 tests, listed below:
|
||||||
@ -608,34 +589,12 @@ Expected fatal failure.
|
|||||||
4 FAILED TESTS
|
4 FAILED TESTS
|
||||||
YOU HAVE 1 DISABLED TEST
|
YOU HAVE 1 DISABLED TEST
|
||||||
|
|
||||||
The non-test part of the code is expected to have 2 failures.
|
|
||||||
|
|
||||||
gtest_output_test_.cc:#: Failure
|
|
||||||
Value of: false
|
|
||||||
Actual: false
|
|
||||||
Expected: true
|
|
||||||
gtest_output_test_.cc:#: Failure
|
|
||||||
Value of: 3
|
|
||||||
Expected: 2
|
|
||||||
Note: Google Test filter = *DISABLED_*
|
Note: Google Test filter = *DISABLED_*
|
||||||
[==========] Running 1 test from 1 test case.
|
[==========] Running 1 test from 1 test case.
|
||||||
[----------] Global test environment set-up.
|
[----------] Global test environment set-up.
|
||||||
FooEnvironment::SetUp() called.
|
|
||||||
BarEnvironment::SetUp() called.
|
|
||||||
[----------] 1 test from DisabledTestsWarningTest
|
[----------] 1 test from DisabledTestsWarningTest
|
||||||
[ RUN ] DisabledTestsWarningTest.DISABLED_AlsoRunDisabledTestsFlagSuppressesWarning
|
[ RUN ] DisabledTestsWarningTest.DISABLED_AlsoRunDisabledTestsFlagSuppressesWarning
|
||||||
[ OK ] DisabledTestsWarningTest.DISABLED_AlsoRunDisabledTestsFlagSuppressesWarning
|
[ OK ] DisabledTestsWarningTest.DISABLED_AlsoRunDisabledTestsFlagSuppressesWarning
|
||||||
[----------] Global test environment tear-down
|
[----------] Global test environment tear-down
|
||||||
BarEnvironment::TearDown() called.
|
|
||||||
gtest_output_test_.cc:#: Failure
|
|
||||||
Failed
|
|
||||||
Expected non-fatal failure.
|
|
||||||
FooEnvironment::TearDown() called.
|
|
||||||
gtest_output_test_.cc:#: Failure
|
|
||||||
Failed
|
|
||||||
Expected fatal failure.
|
|
||||||
[==========] 1 test from 1 test case ran.
|
[==========] 1 test from 1 test case ran.
|
||||||
[ PASSED ] 1 test.
|
[ PASSED ] 1 test.
|
||||||
[ FAILED ] 0 tests, listed below:
|
|
||||||
|
|
||||||
0 FAILED TESTS
|
|
||||||
|
@ -483,18 +483,9 @@ Expected fatal failure.
|
|||||||
36 FAILED TESTS
|
36 FAILED TESTS
|
||||||
YOU HAVE 1 DISABLED TEST
|
YOU HAVE 1 DISABLED TEST
|
||||||
|
|
||||||
The non-test part of the code is expected to have 2 failures.
|
|
||||||
|
|
||||||
gtest_output_test_.cc:#: error: Value of: false
|
|
||||||
Actual: false
|
|
||||||
Expected: true
|
|
||||||
gtest_output_test_.cc:#: error: Value of: 3
|
|
||||||
Expected: 2
|
|
||||||
Note: Google Test filter = FatalFailureTest.*:LoggingTest.*
|
Note: Google Test filter = FatalFailureTest.*:LoggingTest.*
|
||||||
[==========] Running 4 tests from 2 test cases.
|
[==========] Running 4 tests from 2 test cases.
|
||||||
[----------] Global test environment set-up.
|
[----------] Global test environment set-up.
|
||||||
FooEnvironment::SetUp() called.
|
|
||||||
BarEnvironment::SetUp() called.
|
|
||||||
[----------] 3 tests from FatalFailureTest
|
[----------] 3 tests from FatalFailureTest
|
||||||
[ RUN ] FatalFailureTest.FatalFailureInSubroutine
|
[ RUN ] FatalFailureTest.FatalFailureInSubroutine
|
||||||
(expecting a failure that x should be 1)
|
(expecting a failure that x should be 1)
|
||||||
@ -529,12 +520,6 @@ gtest_output_test_.cc:#: error: Expected: (3) >= (a[i]), actual: 3 vs 6
|
|||||||
[----------] 1 test from LoggingTest (? ms total)
|
[----------] 1 test from LoggingTest (? ms total)
|
||||||
|
|
||||||
[----------] Global test environment tear-down
|
[----------] Global test environment tear-down
|
||||||
BarEnvironment::TearDown() called.
|
|
||||||
gtest_output_test_.cc:#: error: Failed
|
|
||||||
Expected non-fatal failure.
|
|
||||||
FooEnvironment::TearDown() called.
|
|
||||||
gtest_output_test_.cc:#: error: Failed
|
|
||||||
Expected fatal failure.
|
|
||||||
[==========] 4 tests from 2 test cases ran. (? ms total)
|
[==========] 4 tests from 2 test cases ran. (? ms total)
|
||||||
[ PASSED ] 0 tests.
|
[ PASSED ] 0 tests.
|
||||||
[ FAILED ] 4 tests, listed below:
|
[ FAILED ] 4 tests, listed below:
|
||||||
@ -546,30 +531,12 @@ Expected fatal failure.
|
|||||||
4 FAILED TESTS
|
4 FAILED TESTS
|
||||||
YOU HAVE 1 DISABLED TEST
|
YOU HAVE 1 DISABLED TEST
|
||||||
|
|
||||||
The non-test part of the code is expected to have 2 failures.
|
|
||||||
|
|
||||||
gtest_output_test_.cc:#: error: Value of: false
|
|
||||||
Actual: false
|
|
||||||
Expected: true
|
|
||||||
gtest_output_test_.cc:#: error: Value of: 3
|
|
||||||
Expected: 2
|
|
||||||
Note: Google Test filter = *DISABLED_*
|
Note: Google Test filter = *DISABLED_*
|
||||||
[==========] Running 1 test from 1 test case.
|
[==========] Running 1 test from 1 test case.
|
||||||
[----------] Global test environment set-up.
|
[----------] Global test environment set-up.
|
||||||
FooEnvironment::SetUp() called.
|
|
||||||
BarEnvironment::SetUp() called.
|
|
||||||
[----------] 1 test from DisabledTestsWarningTest
|
[----------] 1 test from DisabledTestsWarningTest
|
||||||
[ RUN ] DisabledTestsWarningTest.DISABLED_AlsoRunDisabledTestsFlagSuppressesWarning
|
[ RUN ] DisabledTestsWarningTest.DISABLED_AlsoRunDisabledTestsFlagSuppressesWarning
|
||||||
[ OK ] DisabledTestsWarningTest.DISABLED_AlsoRunDisabledTestsFlagSuppressesWarning
|
[ OK ] DisabledTestsWarningTest.DISABLED_AlsoRunDisabledTestsFlagSuppressesWarning
|
||||||
[----------] Global test environment tear-down
|
[----------] Global test environment tear-down
|
||||||
BarEnvironment::TearDown() called.
|
|
||||||
gtest_output_test_.cc:#: error: Failed
|
|
||||||
Expected non-fatal failure.
|
|
||||||
FooEnvironment::TearDown() called.
|
|
||||||
gtest_output_test_.cc:#: error: Failed
|
|
||||||
Expected fatal failure.
|
|
||||||
[==========] 1 test from 1 test case ran.
|
[==========] 1 test from 1 test case ran.
|
||||||
[ PASSED ] 1 test.
|
[ PASSED ] 1 test.
|
||||||
[ FAILED ] 0 tests, listed below:
|
|
||||||
|
|
||||||
0 FAILED TESTS
|
|
||||||
|
@ -869,37 +869,58 @@ TEST_F(ScopedFakeTestPartResultReporterWithThreadsTest,
|
|||||||
|
|
||||||
#endif // GTEST_IS_THREADSAFE && GTEST_HAS_PTHREAD
|
#endif // GTEST_IS_THREADSAFE && GTEST_HAS_PTHREAD
|
||||||
|
|
||||||
// Tests EXPECT_{,NON}FATAL_FAILURE{,ON_ALL_THREADS}.
|
// Tests EXPECT_FATAL_FAILURE{,ON_ALL_THREADS}.
|
||||||
|
|
||||||
typedef ScopedFakeTestPartResultReporterTest ExpectFailureTest;
|
typedef ScopedFakeTestPartResultReporterTest ExpectFatalFailureTest;
|
||||||
|
|
||||||
TEST_F(ExpectFailureTest, ExpectFatalFaliure) {
|
TEST_F(ExpectFatalFailureTest, CatchesFatalFaliure) {
|
||||||
EXPECT_FATAL_FAILURE(AddFailure(FATAL_FAILURE), "Expected fatal failure.");
|
EXPECT_FATAL_FAILURE(AddFailure(FATAL_FAILURE), "Expected fatal failure.");
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(ExpectFailureTest, ExpectNonFatalFailure) {
|
TEST_F(ExpectFatalFailureTest, CatchesFatalFailureOnAllThreads) {
|
||||||
EXPECT_NONFATAL_FAILURE(AddFailure(NONFATAL_FAILURE),
|
// We have another test below to verify that the macro catches fatal
|
||||||
"Expected non-fatal failure.");
|
// failures generated on another thread.
|
||||||
}
|
|
||||||
|
|
||||||
TEST_F(ExpectFailureTest, ExpectFatalFailureOnAllThreads) {
|
|
||||||
EXPECT_FATAL_FAILURE_ON_ALL_THREADS(AddFailure(FATAL_FAILURE),
|
EXPECT_FATAL_FAILURE_ON_ALL_THREADS(AddFailure(FATAL_FAILURE),
|
||||||
"Expected fatal failure.");
|
"Expected fatal failure.");
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(ExpectFailureTest, ExpectNonFatalFailureOnAllThreads) {
|
// Tests that EXPECT_FATAL_FAILURE() can be used in a non-void
|
||||||
EXPECT_NONFATAL_FAILURE_ON_ALL_THREADS(AddFailure(NONFATAL_FAILURE),
|
// function even when the statement in it contains ASSERT_*.
|
||||||
"Expected non-fatal failure.");
|
|
||||||
|
int NonVoidFunction() {
|
||||||
|
EXPECT_FATAL_FAILURE(ASSERT_TRUE(false), "");
|
||||||
|
EXPECT_FATAL_FAILURE_ON_ALL_THREADS(FAIL(), "");
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Tests that the EXPECT_{,NON}FATAL_FAILURE{,_ON_ALL_THREADS} accepts
|
TEST_F(ExpectFatalFailureTest, CanBeUsedInNonVoidFunction) {
|
||||||
// a statement that contains a macro which expands to code containing
|
NonVoidFunction();
|
||||||
// an unprotected comma.
|
}
|
||||||
|
|
||||||
|
// Tests that EXPECT_FATAL_FAILURE(statement, ...) doesn't abort the
|
||||||
|
// current function even though 'statement' generates a fatal failure.
|
||||||
|
|
||||||
|
void DoesNotAbortHelper(bool* aborted) {
|
||||||
|
EXPECT_FATAL_FAILURE(ASSERT_TRUE(false), "");
|
||||||
|
EXPECT_FATAL_FAILURE_ON_ALL_THREADS(FAIL(), "");
|
||||||
|
|
||||||
|
*aborted = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_F(ExpectFatalFailureTest, DoesNotAbort) {
|
||||||
|
bool aborted = true;
|
||||||
|
DoesNotAbortHelper(&aborted);
|
||||||
|
EXPECT_FALSE(aborted);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Tests that the EXPECT_FATAL_FAILURE{,_ON_ALL_THREADS} accepts a
|
||||||
|
// statement that contains a macro which expands to code containing an
|
||||||
|
// unprotected comma.
|
||||||
|
|
||||||
static int global_var = 0;
|
static int global_var = 0;
|
||||||
#define GTEST_USE_UNPROTECTED_COMMA_ global_var++, global_var++
|
#define GTEST_USE_UNPROTECTED_COMMA_ global_var++, global_var++
|
||||||
|
|
||||||
TEST_F(ExpectFailureTest, AcceptsMacroThatExpandsToUnprotectedComma) {
|
TEST_F(ExpectFatalFailureTest, AcceptsMacroThatExpandsToUnprotectedComma) {
|
||||||
EXPECT_FATAL_FAILURE({
|
EXPECT_FATAL_FAILURE({
|
||||||
GTEST_USE_UNPROTECTED_COMMA_;
|
GTEST_USE_UNPROTECTED_COMMA_;
|
||||||
AddFailure(FATAL_FAILURE);
|
AddFailure(FATAL_FAILURE);
|
||||||
@ -909,7 +930,28 @@ TEST_F(ExpectFailureTest, AcceptsMacroThatExpandsToUnprotectedComma) {
|
|||||||
GTEST_USE_UNPROTECTED_COMMA_;
|
GTEST_USE_UNPROTECTED_COMMA_;
|
||||||
AddFailure(FATAL_FAILURE);
|
AddFailure(FATAL_FAILURE);
|
||||||
}, "");
|
}, "");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Tests EXPECT_NONFATAL_FAILURE{,ON_ALL_THREADS}.
|
||||||
|
|
||||||
|
typedef ScopedFakeTestPartResultReporterTest ExpectNonfatalFailureTest;
|
||||||
|
|
||||||
|
TEST_F(ExpectNonfatalFailureTest, CatchesNonfatalFailure) {
|
||||||
|
EXPECT_NONFATAL_FAILURE(AddFailure(NONFATAL_FAILURE),
|
||||||
|
"Expected non-fatal failure.");
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_F(ExpectNonfatalFailureTest, CatchesNonfatalFailureOnAllThreads) {
|
||||||
|
// We have another test below to verify that the macro catches
|
||||||
|
// non-fatal failures generated on another thread.
|
||||||
|
EXPECT_NONFATAL_FAILURE_ON_ALL_THREADS(AddFailure(NONFATAL_FAILURE),
|
||||||
|
"Expected non-fatal failure.");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Tests that the EXPECT_NONFATAL_FAILURE{,_ON_ALL_THREADS} accepts a
|
||||||
|
// statement that contains a macro which expands to code containing an
|
||||||
|
// unprotected comma.
|
||||||
|
TEST_F(ExpectNonfatalFailureTest, AcceptsMacroThatExpandsToUnprotectedComma) {
|
||||||
EXPECT_NONFATAL_FAILURE({
|
EXPECT_NONFATAL_FAILURE({
|
||||||
GTEST_USE_UNPROTECTED_COMMA_;
|
GTEST_USE_UNPROTECTED_COMMA_;
|
||||||
AddFailure(NONFATAL_FAILURE);
|
AddFailure(NONFATAL_FAILURE);
|
||||||
@ -3091,6 +3133,20 @@ TEST(AssertionSyntaxTest, BasicAssertionsBehavesLikeSingleStatement) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#if GTEST_HAS_EXCEPTIONS
|
#if GTEST_HAS_EXCEPTIONS
|
||||||
|
// Tests that the compiler will not complain about unreachable code in the
|
||||||
|
// EXPECT_THROW/EXPECT_ANY_THROW/EXPECT_NO_THROW macros.
|
||||||
|
TEST(ExpectThrowTest, DoesNotGenerateUnreachableCodeWarning) {
|
||||||
|
int n = 0;
|
||||||
|
|
||||||
|
EXPECT_THROW(throw 1, int);
|
||||||
|
EXPECT_NONFATAL_FAILURE(EXPECT_THROW(n++, int), "");
|
||||||
|
EXPECT_NONFATAL_FAILURE(EXPECT_THROW(throw 1, const char*), "");
|
||||||
|
EXPECT_NO_THROW(n++);
|
||||||
|
EXPECT_NONFATAL_FAILURE(EXPECT_NO_THROW(throw 1), "");
|
||||||
|
EXPECT_ANY_THROW(throw 1);
|
||||||
|
EXPECT_NONFATAL_FAILURE(EXPECT_ANY_THROW(n++), "");
|
||||||
|
}
|
||||||
|
|
||||||
TEST(AssertionSyntaxTest, ExceptionAssertionsBehavesLikeSingleStatement) {
|
TEST(AssertionSyntaxTest, ExceptionAssertionsBehavesLikeSingleStatement) {
|
||||||
if (false)
|
if (false)
|
||||||
EXPECT_THROW(1, bool);
|
EXPECT_THROW(1, bool);
|
||||||
|
Loading…
Reference in New Issue
Block a user