@ -40,16 +40,21 @@ namespace {
enum FailureType { NO_FAILURE , NON_FATAL_FAILURE , FATAL_FAILURE } ;
// Was SetUp run?
bool set_up_was_run ;
// Was TearDown run?
bool tear_down_was_run ;
// Was the TEST run?
bool test_was_run ;
// For testing using global test environments.
class MyEnvironment : public testing : : Environment {
public :
MyEnvironment ( ) { Reset ( ) ; }
// Depending on the value of failure_in_set_up_, SetUp() will
// generate a non-fatal failure, generate a fatal failure, or
// succeed.
void SetUp ( ) override {
set_up_was_run_ = true ;
set_up_was_run = true ;
switch ( failure_in_set_up_ ) {
case NON_FATAL_FAILURE :
@ -65,36 +70,18 @@ class MyEnvironment : public testing::Environment {
// Generates a non-fatal failure.
void TearDown ( ) override {
tear_down_was_run_ = true ;
tear_down_was_run = true ;
ADD_FAILURE ( ) < < " Expected non-fatal failure in global tear-down. " ;
}
// Resets the state of the environment s.t. it can be reused.
void Reset ( ) {
failure_in_set_up_ = NO_FAILURE ;
set_up_was_run_ = false ;
tear_down_was_run_ = false ;
}
// We call this function to set the type of failure SetUp() should
// generate.
void set_failure_in_set_up ( FailureType type ) { failure_in_set_up_ = type ; }
// Was SetUp() run?
bool set_up_was_run ( ) const { return set_up_was_run_ ; }
// Was TearDown() run?
bool tear_down_was_run ( ) const { return tear_down_was_run_ ; }
private :
FailureType failure_in_set_up_ ;
bool set_up_was_run_ ;
bool tear_down_was_run_ ;
} ;
// Was the TEST run?
bool test_was_run ;
// The sole purpose of this TEST is to enable us to check whether it
// was run.
TEST ( FooTest , Bar ) { test_was_run = true ; }
@ -112,67 +99,88 @@ void Check(bool condition, const char* msg) {
// The 'failure' parameter specifies the type of failure that should
// be generated by the global set-up.
int RunAllTests ( MyEnvironment * env , FailureType failure ) {
env - > Reset ( ) ;
env - > set_failure_in_set_up ( failure ) ;
set_up_was_run = false ;
tear_down_was_run = false ;
test_was_run = false ;
env - > set_failure_in_set_up ( failure ) ;
testing : : internal : : GetUnitTestImpl ( ) - > ClearAdHocTestResult ( ) ;
return RUN_ALL_TESTS ( ) ;
}
} // namespace
int main ( int argc , char * * argv ) {
testing : : InitGoogleTest ( & argc , argv ) ;
// Registers a global test environment, and verifies that the
// registration function returns its argument.
// Registers a global test environment, and verifies that the
// registration function returns its argument.
MyEnvironment * RegisterTestEnv ( ) {
MyEnvironment * const env = new MyEnvironment ;
Check ( testing : : AddGlobalTestEnvironment ( env ) = = env ,
" AddGlobalTestEnvironment() should return its argument. " ) ;
return env ;
}
// Verifies that RUN_ALL_TESTS() runs the tests when the global
// set-up is successful.
// Verifies that RUN_ALL_TESTS() runs the tests when the global
// set-up is successful.
void TestGlobalSetUp ( ) {
MyEnvironment * const env = RegisterTestEnv ( ) ;
Check ( RunAllTests ( env , NO_FAILURE ) ! = 0 ,
" RUN_ALL_TESTS() should return non-zero, as the global tear-down "
" should generate a failure. " ) ;
Check ( test_was_run ,
" The tests should run, as the global set-up should generate no "
" failure " ) ;
Check ( env - > tear_down_was_run ( ) ,
Check ( tear_down_was_run ,
" The global tear-down should run, as the global set-up was run. " ) ;
}
// Verifies that RUN_ALL_TESTS() runs the tests when the global
// set-up generates no fatal failure.
// Verifies that RUN_ALL_TESTS() runs the tests when the global
// set-up generates no fatal failure.
void TestTestsRun ( ) {
MyEnvironment * const env = RegisterTestEnv ( ) ;
Check ( RunAllTests ( env , NON_FATAL_FAILURE ) ! = 0 ,
" RUN_ALL_TESTS() should return non-zero, as both the global set-up "
" and the global tear-down should generate a non-fatal failure. " ) ;
Check ( test_was_run ,
" The tests should run, as the global set-up should generate no "
" fatal failure. " ) ;
Check ( env - > tear_down_was_run ( ) ,
Check ( tear_down_was_run ,
" The global tear-down should run, as the global set-up was run. " ) ;
}
// Verifies that RUN_ALL_TESTS() runs no test when the global set-up
// generates a fatal failure.
// Verifies that RUN_ALL_TESTS() runs no test when the global set-up
// generates a fatal failure.
void TestNoTestsRunSetUpFailure ( ) {
MyEnvironment * const env = RegisterTestEnv ( ) ;
Check ( RunAllTests ( env , FATAL_FAILURE ) ! = 0 ,
" RUN_ALL_TESTS() should return non-zero, as the global set-up "
" should generate a fatal failure. " ) ;
Check ( ! test_was_run ,
" The tests should not run, as the global set-up should generate "
" a fatal failure. " ) ;
Check ( env - > tear_down_was_run ( ) ,
Check ( tear_down_was_run ,
" The global tear-down should run, as the global set-up was run. " ) ;
}
// Verifies that RUN_ALL_TESTS() doesn't do global set-up or
// tear-down when there is no test to run.
// Verifies that RUN_ALL_TESTS() doesn't do global set-up or
// tear-down when there is no test to run.
void TestNoTestsSkipsSetUp ( ) {
MyEnvironment * const env = RegisterTestEnv ( ) ;
GTEST_FLAG_SET ( filter , " -* " ) ;
Check ( RunAllTests ( env , NO_FAILURE ) = = 0 ,
" RUN_ALL_TESTS() should return zero, as there is no test to run. " ) ;
Check ( ! env - > set_up_was_run ( ) ,
Check ( ! set_up_was_run ,
" The global set-up should not run, as there is no test to run. " ) ;
Check ( ! env - > tear_down_was_run ( ) ,
Check ( ! tear_down_was_run ,
" The global tear-down should not run, "
" as the global set-up was not run. " ) ;
}
} // namespace
int main ( int argc , char * * argv ) {
testing : : InitGoogleTest ( & argc , argv ) ;
TestGlobalSetUp ( ) ;
TestTestsRun ( ) ;
TestNoTestsRunSetUpFailure ( ) ;
TestNoTestsSkipsSetUp ( ) ;
printf ( " PASS \n " ) ;
return 0 ;