@ -468,40 +468,80 @@ int UnitTestOptions::GTestShouldProcessSEH(DWORD exception_code) {
class UnitTestEventListenerInterface {
public :
// The d'tor is pure virtual as this is an abstract class.
virtual ~ UnitTestEventListenerInterface ( ) = 0 ;
virtual ~ UnitTestEventListenerInterface ( ) { }
// Called before the unit test starts.
virtual void OnUnitTestStart ( const UnitTest * ) { }
virtual void OnUnitTestStart ( const UnitTest & unit_test ) = 0 ;
// Called after the unit test ends.
virtual void OnUnitTestEnd ( const UnitTest * ) { }
virtual void OnUnitTestEnd ( const UnitTest & unit_test ) = 0 ;
// Called before the test case starts.
virtual void OnTestCaseStart ( const TestCase * ) { }
virtual void OnTestCaseStart ( const TestCase & test_case ) = 0 ;
// Called after the test case ends.
virtual void OnTestCaseEnd ( const TestCase * ) { }
virtual void OnTestCaseEnd ( const TestCase & test_case ) = 0 ;
// Called before the global set-up starts.
virtual void OnGlobalSetUpStart ( const UnitTest * ) { }
virtual void OnGlobalSetUpStart ( const UnitTest & unit_test ) = 0 ;
// Called after the global set-up ends.
virtual void OnGlobalSetUpEnd ( const UnitTest * ) { }
virtual void OnGlobalSetUpEnd ( const UnitTest & unit_test ) = 0 ;
// Called before the global tear-down starts.
virtual void OnGlobalTearDownStart ( const UnitTest * ) { }
virtual void OnGlobalTearDownStart ( const UnitTest & unit_test ) = 0 ;
// Called after the global tear-down ends.
virtual void OnGlobalTearDownEnd ( const UnitTest * ) { }
virtual void OnGlobalTearDownEnd ( const UnitTest & unit_test ) = 0 ;
// Called before the test starts.
virtual void OnTestStart ( const TestInfo * ) { }
virtual void OnTestStart ( const TestInfo & test_info ) = 0 ;
// Called after the test ends.
virtual void OnTestEnd ( const TestInfo * ) { }
virtual void OnTestEnd ( const TestInfo & test_info ) = 0 ;
// Called after an assertion.
virtual void OnNewTestPartResult ( const TestPartResult * ) { }
virtual void OnNewTestPartResult ( const TestPartResult & test_part_result ) = 0 ;
} ;
// The convenience class for users who need to override just one or two
// methods and are not concerned that a possible change to a signature of
// the methods they override will not be caught during the build.
class EmptyTestEventListener : public UnitTestEventListenerInterface {
public :
// Called before the unit test starts.
virtual void OnUnitTestStart ( const UnitTest & /*unit_test*/ ) { }
// Called after the unit test ends.
virtual void OnUnitTestEnd ( const UnitTest & /*unit_test*/ ) { }
// Called before the test case starts.
virtual void OnTestCaseStart ( const TestCase & /*test_case*/ ) { }
// Called after the test case ends.
virtual void OnTestCaseEnd ( const TestCase & /*test_case&*/ ) { }
// Called before the global set-up starts.
virtual void OnGlobalSetUpStart ( const UnitTest & /*unit_test*/ ) { }
// Called after the global set-up ends.
virtual void OnGlobalSetUpEnd ( const UnitTest & /*unit_test*/ ) { }
// Called before the global tear-down starts.
virtual void OnGlobalTearDownStart ( const UnitTest & /*unit_test*/ ) { }
// Called after the global tear-down ends.
virtual void OnGlobalTearDownEnd ( const UnitTest & /*unit_test*/ ) { }
// Called before the test starts.
virtual void OnTestStart ( const TestInfo & /*test_info*/ ) { }
// Called after the test ends.
virtual void OnTestEnd ( const TestInfo & /*test_info*/ ) { }
// Called after an assertion.
virtual void OnNewTestPartResult ( const TestPartResult & /*test_part_result*/ ) {
}
} ;
// The c'tor sets this object as the test part result reporter used by
@ -638,7 +678,7 @@ DefaultGlobalTestPartResultReporter::DefaultGlobalTestPartResultReporter(
void DefaultGlobalTestPartResultReporter : : ReportTestPartResult (
const TestPartResult & result ) {
unit_test_ - > current_test_result ( ) - > AddTestPartResult ( result ) ;
unit_test_ - > result_printer ( ) - > OnNewTestPartResult ( & result ) ;
unit_test_ - > result_printer ( ) - > OnNewTestPartResult ( result ) ;
}
DefaultPerThreadTestPartResultReporter : : DefaultPerThreadTestPartResultReporter (
@ -1790,6 +1830,19 @@ TestResult::TestResult()
TestResult : : ~ TestResult ( ) {
}
// Returns the i-th test part result among all the results. i can range
// from 0 to total_part_count() - 1. If i is not in that range, returns
// NULL.
const TestPartResult * TestResult : : GetTestPartResult ( int i ) const {
return test_part_results_ - > GetElement ( i ) ;
}
// Returns the i-th test property. i can range from 0 to
// test_property_count() - 1. If i is not in that range, returns NULL.
const TestProperty * TestResult : : GetTestProperty ( int i ) const {
return test_properties_ - > GetElement ( i ) ;
}
// Clears the test part results.
void TestResult : : ClearTestPartResults ( ) {
test_part_results_ - > Clear ( ) ;
@ -1887,6 +1940,11 @@ int TestResult::total_part_count() const {
return test_part_results_ - > size ( ) ;
}
// Returns the number of the test properties.
int TestResult : : test_property_count ( ) const {
return test_properties_ - > size ( ) ;
}
} // namespace internal
// class Test
@ -2261,7 +2319,7 @@ void TestInfoImpl::Run() {
// start.
UnitTestEventListenerInterface * const result_printer =
impl - > result_printer ( ) ;
result_printer - > OnTestStart ( parent_ ) ;
result_printer - > OnTestStart ( * parent_ ) ;
const TimeInMillis start = GetTimeInMillis ( ) ;
@ -2304,7 +2362,7 @@ void TestInfoImpl::Run() {
result_ . set_elapsed_time ( GetTimeInMillis ( ) - start ) ;
// Notifies the unit test event listener that a test has just finished.
result_printer - > OnTestEnd ( parent_ ) ;
result_printer - > OnTestEnd ( * parent_ ) ;
// Tells UnitTest to stop associating assertion results to this
// test.
@ -2366,6 +2424,12 @@ TestCase::~TestCase() {
test_info_list_ = NULL ;
}
// Returns the i-th test among all the tests. i can range from 0 to
// total_test_count() - 1. If i is not in that range, returns NULL.
const TestInfo * TestCase : : GetTestInfo ( int i ) const {
return test_info_list_ - > GetElementOr ( i , NULL ) ;
}
// Adds a test to this test case. Will delete the test upon
// destruction of the TestCase object.
void TestCase : : AddTestInfo ( TestInfo * test_info ) {
@ -2382,7 +2446,7 @@ void TestCase::Run() {
UnitTestEventListenerInterface * const result_printer =
impl - > result_printer ( ) ;
result_printer - > OnTestCaseStart ( this ) ;
result_printer - > OnTestCaseStart ( * this ) ;
impl - > os_stack_trace_getter ( ) - > UponLeavingGTest ( ) ;
set_up_tc_ ( ) ;
@ -2392,7 +2456,7 @@ void TestCase::Run() {
impl - > os_stack_trace_getter ( ) - > UponLeavingGTest ( ) ;
tear_down_tc_ ( ) ;
result_printer - > OnTestCaseEnd ( this ) ;
result_printer - > OnTestCaseEnd ( * this ) ;
impl - > set_current_test_case ( NULL ) ;
}
@ -2425,15 +2489,9 @@ bool TestCase::ShouldRunTest(const TestInfo *test_info) {
} // namespace internal
// class UnitTestEventListenerInterface
// The virtual d'tor.
UnitTestEventListenerInterface : : ~ UnitTestEventListenerInterface ( ) {
}
// A result printer that never prints anything. Used in the child process
// of an exec-style death test to avoid needless output clutter.
class NullUnitTestResultPrinter : public UnitTestEventListenerInterface { } ;
class NullUnitTestResultPrinter : public EmptyTestEventListener { } ;
// Formats a countable noun. Depending on its quantity, either the
// singular form or the plural form is used. e.g.
@ -2628,24 +2686,25 @@ class PrettyUnitTestResultPrinter : public UnitTestEventListenerInterface {
// The following methods override what's in the
// UnitTestEventListenerInterface class.
virtual void OnUnitTestStart ( const UnitTest * unit_test ) ;
virtual void OnGlobalSetUpStart ( const UnitTest * ) ;
virtual void OnTestCaseStart ( const TestCase * test_case ) ;
virtual void OnTestCaseEnd ( const TestCase * test_case ) ;
virtual void OnTestStart ( const TestInfo * test_info ) ;
virtual void OnNewTestPartResult ( const TestPartResult * result ) ;
virtual void OnTestEnd ( const TestInfo * test_info ) ;
virtual void OnGlobalTearDownStart ( const UnitTest * ) ;
virtual void OnUnitTestEnd ( const UnitTest * unit_test ) ;
virtual void OnUnitTestStart ( const UnitTest & unit_test ) ;
virtual void OnGlobalSetUpStart ( const UnitTest & unit_test ) ;
virtual void OnGlobalSetUpEnd ( const UnitTest & /*unit_test*/ ) { }
virtual void OnTestCaseStart ( const TestCase & test_case ) ;
virtual void OnTestCaseEnd ( const TestCase & test_case ) ;
virtual void OnTestStart ( const TestInfo & test_info ) ;
virtual void OnNewTestPartResult ( const TestPartResult & result ) ;
virtual void OnTestEnd ( const TestInfo & test_info ) ;
virtual void OnGlobalTearDownStart ( const UnitTest & unit_test ) ;
virtual void OnGlobalTearDownEnd ( const UnitTest & /*unit_test*/ ) { }
virtual void OnUnitTestEnd ( const UnitTest & unit_test ) ;
private :
internal : : String test_case_name_ ;
} ;
// Called before the unit test starts.
void PrettyUnitTestResultPrinter : : OnUnitTestStart (
const UnitTest * unit_test ) {
const char * const filter = GTEST_FLAG ( filter ) . c_str ( ) ;
void PrettyUnitTestResultPrinter : : OnUnitTestStart ( const UnitTest & unit_test ) {
const char * const filter = GTEST_FLAG ( filter ) . c_str ( ) ;
// Prints the filter if it's not *. This reminds the user that some
// tests may be skipped.
@ -2661,7 +2720,7 @@ void PrettyUnitTestResultPrinter::OnUnitTestStart(
internal : : posix : : GetEnv ( kTestTotalShards ) ) ;
}
const internal : : UnitTestImpl * const impl = unit_test - > impl ( ) ;
const internal : : UnitTestImpl * const impl = unit_test . impl ( ) ;
ColoredPrintf ( COLOR_GREEN , " [==========] " ) ;
printf ( " Running %s from %s. \n " ,
FormatTestCount ( impl - > test_to_run_count ( ) ) . c_str ( ) ,
@ -2669,62 +2728,61 @@ void PrettyUnitTestResultPrinter::OnUnitTestStart(
fflush ( stdout ) ;
}
void PrettyUnitTestResultPrinter : : OnGlobalSetUpStart ( const UnitTest * ) {
void PrettyUnitTestResultPrinter : : OnGlobalSetUpStart (
const UnitTest & /*unit_test*/ ) {
ColoredPrintf ( COLOR_GREEN , " [----------] " ) ;
printf ( " Global test environment set-up. \n " ) ;
fflush ( stdout ) ;
}
void PrettyUnitTestResultPrinter : : OnTestCaseStart (
const TestCase * test_case ) {
test_case_name_ = test_case - > name ( ) ;
void PrettyUnitTestResultPrinter : : OnTestCaseStart ( const TestCase & test_case ) {
test_case_name_ = test_case . name ( ) ;
const internal : : String counts =
FormatCountableNoun ( test_case - > test_to_run_count ( ) , " test " , " tests " ) ;
FormatCountableNoun ( test_case . test_to_run_count ( ) , " test " , " tests " ) ;
ColoredPrintf ( COLOR_GREEN , " [----------] " ) ;
printf ( " %s from %s " , counts . c_str ( ) , test_case_name_ . c_str ( ) ) ;
if ( test_case - > comment ( ) [ 0 ] = = ' \0 ' ) {
if ( test_case . comment ( ) [ 0 ] = = ' \0 ' ) {
printf ( " \n " ) ;
} else {
printf ( " , where %s \n " , test_case - > comment ( ) ) ;
printf ( " , where %s \n " , test_case . comment ( ) ) ;
}
fflush ( stdout ) ;
}
void PrettyUnitTestResultPrinter : : OnTestCaseEnd (
const TestCase * test_case ) {
void PrettyUnitTestResultPrinter : : OnTestCaseEnd ( const TestCase & test_case ) {
if ( ! GTEST_FLAG ( print_time ) ) return ;
test_case_name_ = test_case - > name ( ) ;
test_case_name_ = test_case . name ( ) ;
const internal : : String counts =
FormatCountableNoun ( test_case - > test_to_run_count ( ) , " test " , " tests " ) ;
FormatCountableNoun ( test_case . test_to_run_count ( ) , " test " , " tests " ) ;
ColoredPrintf ( COLOR_GREEN , " [----------] " ) ;
printf ( " %s from %s (%s ms total) \n \n " ,
counts . c_str ( ) , test_case_name_ . c_str ( ) ,
internal : : StreamableToString ( test_case - > elapsed_time ( ) ) . c_str ( ) ) ;
internal : : StreamableToString ( test_case . elapsed_time ( ) ) . c_str ( ) ) ;
fflush ( stdout ) ;
}
void PrettyUnitTestResultPrinter : : OnTestStart ( const TestInfo * test_info ) {
void PrettyUnitTestResultPrinter : : OnTestStart ( const TestInfo & test_info ) {
ColoredPrintf ( COLOR_GREEN , " [ RUN ] " ) ;
PrintTestName ( test_case_name_ . c_str ( ) , test_info - > name ( ) ) ;
if ( test_info - > comment ( ) [ 0 ] = = ' \0 ' ) {
PrintTestName ( test_case_name_ . c_str ( ) , test_info . name ( ) ) ;
if ( test_info . comment ( ) [ 0 ] = = ' \0 ' ) {
printf ( " \n " ) ;
} else {
printf ( " , where %s \n " , test_info - > comment ( ) ) ;
printf ( " , where %s \n " , test_info . comment ( ) ) ;
}
fflush ( stdout ) ;
}
void PrettyUnitTestResultPrinter : : OnTestEnd ( const TestInfo * test_info ) {
if ( test_info - > result ( ) - > Passed ( ) ) {
void PrettyUnitTestResultPrinter : : OnTestEnd ( const TestInfo & test_info ) {
if ( test_info . result ( ) - > Passed ( ) ) {
ColoredPrintf ( COLOR_GREEN , " [ OK ] " ) ;
} else {
ColoredPrintf ( COLOR_RED , " [ FAILED ] " ) ;
}
PrintTestName ( test_case_name_ . c_str ( ) , test_info - > name ( ) ) ;
PrintTestName ( test_case_name_ . c_str ( ) , test_info . name ( ) ) ;
if ( GTEST_FLAG ( print_time ) ) {
printf ( " (%s ms) \n " , internal : : StreamableToString (
test_info - > result ( ) - > elapsed_time ( ) ) . c_str ( ) ) ;
test_info . result ( ) - > elapsed_time ( ) ) . c_str ( ) ) ;
} else {
printf ( " \n " ) ;
}
@ -2733,17 +2791,18 @@ void PrettyUnitTestResultPrinter::OnTestEnd(const TestInfo * test_info) {
// Called after an assertion failure.
void PrettyUnitTestResultPrinter : : OnNewTestPartResult (
const TestPartResult * result ) {
const TestPartResult & result ) {
// If the test part succeeded, we don't need to do anything.
if ( result - > type ( ) = = TPRT_SUCCESS )
if ( result . type ( ) = = TPRT_SUCCESS )
return ;
// Print failure message from the assertion (e.g. expected this and got that).
PrintTestPartResult ( * result ) ;
PrintTestPartResult ( result ) ;
fflush ( stdout ) ;
}
void PrettyUnitTestResultPrinter : : OnGlobalTearDownStart ( const UnitTest * ) {
void PrettyUnitTestResultPrinter : : OnGlobalTearDownStart (
const UnitTest & /*unit_test*/ ) {
ColoredPrintf ( COLOR_GREEN , " [----------] " ) ;
printf ( " Global test environment tear-down \n " ) ;
fflush ( stdout ) ;
@ -2788,9 +2847,8 @@ static void PrintFailedTestsPretty(const UnitTestImpl* impl) {
} // namespace internal
void PrettyUnitTestResultPrinter : : OnUnitTestEnd (
const UnitTest * unit_test ) {
const internal : : UnitTestImpl * const impl = unit_test - > impl ( ) ;
void PrettyUnitTestResultPrinter : : OnUnitTestEnd ( const UnitTest & unit_test ) {
const internal : : UnitTestImpl * const impl = unit_test . impl ( ) ;
ColoredPrintf ( COLOR_GREEN , " [==========] " ) ;
printf ( " %s from %s ran. " ,
@ -2841,17 +2899,17 @@ class UnitTestEventsRepeater : public UnitTestEventListenerInterface {
virtual ~ UnitTestEventsRepeater ( ) ;
void AddListener ( UnitTestEventListenerInterface * listener ) ;
virtual void OnUnitTestStart ( const UnitTest * unit_test ) ;
virtual void OnUnitTestEnd ( const UnitTest * unit_test ) ;
virtual void OnGlobalSetUpStart ( const UnitTest * unit_test ) ;
virtual void OnGlobalSetUpEnd ( const UnitTest * unit_test ) ;
virtual void OnGlobalTearDownStart ( const UnitTest * unit_test ) ;
virtual void OnGlobalTearDownEnd ( const UnitTest * unit_test ) ;
virtual void OnTestCaseStart ( const TestCase * test_case ) ;
virtual void OnTestCaseEnd ( const TestCase * test_case ) ;
virtual void OnTestStart ( const TestInfo * test_info ) ;
virtual void OnTestEnd ( const TestInfo * test_info ) ;
virtual void OnNewTestPartResult ( const TestPartResult * result ) ;
virtual void OnUnitTestStart ( const UnitTest & unit_test ) ;
virtual void OnUnitTestEnd ( const UnitTest & unit_test ) ;
virtual void OnGlobalSetUpStart ( const UnitTest & unit_test ) ;
virtual void OnGlobalSetUpEnd ( const UnitTest & unit_test ) ;
virtual void OnGlobalTearDownStart ( const UnitTest & unit_test ) ;
virtual void OnGlobalTearDownEnd ( const UnitTest & unit_test ) ;
virtual void OnTestCaseStart ( const TestCase & test_case ) ;
virtual void OnTestCaseEnd ( const TestCase & test_case ) ;
virtual void OnTestStart ( const TestInfo & test_info ) ;
virtual void OnTestEnd ( const TestInfo & test_info ) ;
virtual void OnNewTestPartResult ( const TestPartResult & result ) ;
private :
Listeners listeners_ ;
@ -2875,7 +2933,7 @@ void UnitTestEventsRepeater::AddListener(
// Since the methods are identical, use a macro to reduce boilerplate.
// This defines a member that repeats the call to all listeners.
# define GTEST_REPEATER_METHOD_(Name, Type) \
void UnitTestEventsRepeater : : Name ( const Type * parameter ) { \
void UnitTestEventsRepeater : : Name ( const Type & parameter ) { \
for ( ListenersNode * listener = listeners_ . Head ( ) ; \
listener ! = NULL ; \
listener = listener - > next ( ) ) { \
@ -2900,11 +2958,11 @@ GTEST_REPEATER_METHOD_(OnNewTestPartResult, TestPartResult)
// End PrettyUnitTestResultPrinter
// This class generates an XML output file.
class XmlUnitTestResultPrinter : public UnitTestEventListenerInterface {
class XmlUnitTestResultPrinter : public EmptyTestEventListener {
public :
explicit XmlUnitTestResultPrinter ( const char * output_file ) ;
virtual void OnUnitTestEnd ( const UnitTest * unit_test ) ;
virtual void OnUnitTestEnd ( const UnitTest & unit_test ) ;
private :
// Is c a whitespace character that is normalized to a space character
@ -2944,7 +3002,7 @@ class XmlUnitTestResultPrinter : public UnitTestEventListenerInterface {
static void PrintXmlTestCase ( FILE * out , const TestCase * test_case ) ;
// Prints an XML summary of unit_test to output stream out.
static void PrintXmlUnitTest ( FILE * out , const UnitTest * unit_test ) ;
static void PrintXmlUnitTest ( FILE * out , const UnitTest & unit_test ) ;
// Produces a string representing the test properties in a result as space
// delimited XML attributes based on the property key="value" pairs.
@ -2970,7 +3028,7 @@ XmlUnitTestResultPrinter::XmlUnitTestResultPrinter(const char* output_file)
}
// Called after the unit test ends.
void XmlUnitTestResultPrinter : : OnUnitTestEnd ( const UnitTest * unit_test ) {
void XmlUnitTestResultPrinter : : OnUnitTestEnd ( const UnitTest & unit_test ) {
FILE * xmlout = NULL ;
internal : : FilePath output_file ( output_file_ ) ;
internal : : FilePath output_dir ( output_file . RemoveFileName ( ) ) ;
@ -3149,8 +3207,8 @@ void XmlUnitTestResultPrinter::PrintXmlTestCase(FILE* out,
// Prints an XML summary of unit_test to output stream out.
void XmlUnitTestResultPrinter : : PrintXmlUnitTest ( FILE * out ,
const UnitTest * unit_test ) {
const internal : : UnitTestImpl * const impl = unit_test - > impl ( ) ;
const UnitTest & unit_test ) {
const internal : : UnitTestImpl * const impl = unit_test . impl ( ) ;
fprintf ( out , " <?xml version= \" 1.0 \" encoding= \" UTF-8 \" ?> \n " ) ;
fprintf ( out ,
" <testsuites tests= \" %d \" failures= \" %d \" disabled= \" %d \" "
@ -3267,6 +3325,64 @@ UnitTest * UnitTest::GetInstance() {
# endif // (_MSC_VER == 1310 && !defined(_DEBUG)) || defined(__BORLANDC__)
}
// Gets the number of successful test cases.
int UnitTest : : successful_test_case_count ( ) const {
return impl ( ) - > successful_test_case_count ( ) ;
}
// Gets the number of failed test cases.
int UnitTest : : failed_test_case_count ( ) const {
return impl ( ) - > failed_test_case_count ( ) ;
}
// Gets the number of all test cases.
int UnitTest : : total_test_case_count ( ) const {
return impl ( ) - > total_test_case_count ( ) ;
}
// Gets the number of all test cases that contain at least one test
// that should run.
int UnitTest : : test_case_to_run_count ( ) const {
return impl ( ) - > test_case_to_run_count ( ) ;
}
// Gets the number of successful tests.
int UnitTest : : successful_test_count ( ) const {
return impl ( ) - > successful_test_count ( ) ;
}
// Gets the number of failed tests.
int UnitTest : : failed_test_count ( ) const { return impl ( ) - > failed_test_count ( ) ; }
// Gets the number of disabled tests.
int UnitTest : : disabled_test_count ( ) const {
return impl ( ) - > disabled_test_count ( ) ;
}
// Gets the number of all tests.
int UnitTest : : total_test_count ( ) const { return impl ( ) - > total_test_count ( ) ; }
// Gets the number of tests that should run.
int UnitTest : : test_to_run_count ( ) const { return impl ( ) - > test_to_run_count ( ) ; }
// Gets the elapsed time, in milliseconds.
internal : : TimeInMillis UnitTest : : elapsed_time ( ) const {
return impl ( ) - > elapsed_time ( ) ;
}
// Returns true iff the unit test passed (i.e. all test cases passed).
bool UnitTest : : Passed ( ) const { return impl ( ) - > Passed ( ) ; }
// Returns true iff the unit test failed (i.e. some test case failed
// or something outside of all tests failed).
bool UnitTest : : Failed ( ) const { return impl ( ) - > Failed ( ) ; }
// Gets the i-th test case among all the test cases. i can range from 0 to
// total_test_case_count() - 1. If i is not in that range, returns NULL.
const TestCase * UnitTest : : GetTestCase ( int i ) const {
return impl ( ) - > GetTestCase ( i ) ;
}
// Registers and returns a global test environment. When a test
// program is run, all global test environments will be set-up in the
// order they were registered. After all tests in the program have
@ -3683,16 +3799,16 @@ int UnitTestImpl::RunAllTests() {
// Tells the unit test event listener that the tests are about to
// start.
printer - > OnUnitTestStart ( parent_ ) ;
printer - > OnUnitTestStart ( * parent_ ) ;
const TimeInMillis start = GetTimeInMillis ( ) ;
// Runs each test case if there is at least one test to run.
if ( has_tests_to_run ) {
// Sets up all environments beforehand.
printer - > OnGlobalSetUpStart ( parent_ ) ;
printer - > OnGlobalSetUpStart ( * parent_ ) ;
environments_ . ForEach ( SetUpEnvironment ) ;
printer - > OnGlobalSetUpEnd ( parent_ ) ;
printer - > OnGlobalSetUpEnd ( * parent_ ) ;
// Runs the tests only if there was no fatal failure during global
// set-up.
@ -3701,16 +3817,16 @@ int UnitTestImpl::RunAllTests() {
}
// Tears down all environments in reverse order afterwards.
printer - > OnGlobalTearDownStart ( parent_ ) ;
printer - > OnGlobalTearDownStart ( * parent_ ) ;
environments_in_reverse_order_ . ForEach ( TearDownEnvironment ) ;
printer - > OnGlobalTearDownEnd ( parent_ ) ;
printer - > OnGlobalTearDownEnd ( * parent_ ) ;
}
elapsed_time_ = GetTimeInMillis ( ) - start ;
// Tells the unit test event listener that the tests have just
// finished.
printer - > OnUnitTestEnd ( parent_ ) ;
printer - > OnUnitTestEnd ( * parent_ ) ;
// Gets the result and clears it.
if ( ! Passed ( ) ) {