Handle section ends in the event of unexpected exceptions

This commit is contained in:
Phil Nash 2013-02-19 19:45:09 +00:00
parent 3f503851d7
commit 10ed1e0e34
4 changed files with 106 additions and 39 deletions

View File

@ -201,6 +201,11 @@ namespace Catch {
} }
virtual void sectionEnded( SectionInfo const& info, Counts const& prevAssertions ) { virtual void sectionEnded( SectionInfo const& info, Counts const& prevAssertions ) {
if( std::uncaught_exception() ) {
m_unfinishedSections.push_back( UnfinishedSections( info, prevAssertions ) );
return;
}
Counts assertions = m_totals.assertions - prevAssertions; Counts assertions = m_totals.assertions - prevAssertions;
bool missingAssertions = false; bool missingAssertions = false;
if( assertions.total() == 0 && if( assertions.total() == 0 &&
@ -286,10 +291,25 @@ namespace Catch {
exResult << translateActiveException(); exResult << translateActiveException();
actOnCurrentResult( exResult.buildResult( m_lastAssertionInfo ) ); actOnCurrentResult( exResult.buildResult( m_lastAssertionInfo ) );
} }
for( std::vector<UnfinishedSections>::const_iterator it = m_unfinishedSections.begin(),
itEnd = m_unfinishedSections.end();
it != itEnd;
++it )
sectionEnded( it->info, it->prevAssertions );
m_unfinishedSections.clear();
m_messages.clear(); m_messages.clear();
} }
private: private:
struct UnfinishedSections {
UnfinishedSections( SectionInfo const& _info, Counts const& _prevAssertions )
: info( _info ), prevAssertions( _prevAssertions )
{}
SectionInfo info;
Counts prevAssertions;
};
TestRunInfo m_runInfo; TestRunInfo m_runInfo;
IMutableContext& m_context; IMutableContext& m_context;
RunningTest* m_runningTest; RunningTest* m_runningTest;
@ -303,6 +323,7 @@ namespace Catch {
IResultCapture* m_prevResultCapture; IResultCapture* m_prevResultCapture;
const IConfig* m_prevConfig; const IConfig* m_prevConfig;
AssertionInfo m_lastAssertionInfo; AssertionInfo m_lastAssertionInfo;
std::vector<UnfinishedSections> m_unfinishedSections;
}; };
} // end namespace Catch } // end namespace Catch

View File

@ -1060,6 +1060,16 @@ due to unexpected exception with message:
unexpected exception unexpected exception
ExceptionTests.cpp:60: ExceptionTests.cpp:60:
-------------------------------------------------------------------------------
./failing/exceptions/implicit/3
section name
...............................................................................
FAILED:
due to unexpected exception with message:
unexpected exception
ExceptionTests.cpp:66:
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
./succeeding/exceptions/implicit ./succeeding/exceptions/implicit
............................................................................... ...............................................................................
@ -1074,7 +1084,7 @@ No assertions in test case, './succeeding/exceptions/implicit'
FAILED: FAILED:
due to unexpected exception with message: due to unexpected exception with message:
custom exception custom exception
ExceptionTests.cpp:102: ExceptionTests.cpp:110:
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
./failing/exceptions/custom/nothrow ./failing/exceptions/custom/nothrow
@ -1084,7 +1094,7 @@ FAILED:
REQUIRE_NOTHROW( throw CustomException( "unexpected custom exception" ) ) REQUIRE_NOTHROW( throw CustomException( "unexpected custom exception" ) )
due to unexpected exception with message: due to unexpected exception with message:
unexpected custom exception unexpected custom exception
ExceptionTests.cpp:109: ExceptionTests.cpp:117:
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
./failing/exceptions/custom/throw ./failing/exceptions/custom/throw
@ -1094,7 +1104,7 @@ FAILED:
REQUIRE_THROWS_AS( throw CustomException( "custom exception - not std" ) ) REQUIRE_THROWS_AS( throw CustomException( "custom exception - not std" ) )
due to unexpected exception with message: due to unexpected exception with message:
custom exception - not std custom exception - not std
ExceptionTests.cpp:114: ExceptionTests.cpp:122:
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
./failing/exceptions/custom/double ./failing/exceptions/custom/double
@ -1103,7 +1113,7 @@ ExceptionTests.cpp:114:
FAILED: FAILED:
due to unexpected exception with message: due to unexpected exception with message:
3.14 3.14
ExceptionTests.cpp:118: ExceptionTests.cpp:126:
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
./succeeding/exceptions/notimplemented ./succeeding/exceptions/notimplemented
@ -1111,7 +1121,7 @@ ExceptionTests.cpp:118:
PASSED: PASSED:
REQUIRE_THROWS( thisFunctionNotImplemented( 7 ) ) REQUIRE_THROWS( thisFunctionNotImplemented( 7 ) )
ExceptionTests.cpp:129: ExceptionTests.cpp:137:
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
./succeeding/generators/1 ./succeeding/generators/1
@ -2883,6 +2893,11 @@ with message:
Tests failed, as expected Tests failed, as expected
catch_self_test.hpp:114: catch_self_test.hpp:114:
PASSED:
with message:
Tests failed, as expected
catch_self_test.hpp:114:
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
selftest/main selftest/main
selftest/expected result selftest/expected result
@ -3158,9 +3173,9 @@ with expansion:
TestMain.cpp:47: TestMain.cpp:47:
PASSED: PASSED:
CHECK( totals.assertions.failed == 72 ) CHECK( totals.assertions.failed == 73 )
with expansion: with expansion:
72 == 72 73 == 73
TestMain.cpp:48: TestMain.cpp:48:
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
@ -4261,7 +4276,7 @@ with expansion:
BDDTests.cpp:29: BDDTests.cpp:29:
=============================================================================== ===============================================================================
98 test cases - 46 failed (614 assertions - 103 failed) 99 test cases - 47 failed (616 assertions - 104 failed)
CatchSelfTest is a CATCH v0.9 b18 (integration) host application. CatchSelfTest is a CATCH v0.9 b18 (integration) host application.
@ -4543,7 +4558,7 @@ ConditionTests.cpp:72:
12 test cases - 3 failed (38 assertions - 4 failed) 12 test cases - 3 failed (38 assertions - 4 failed)
<testsuites> <testsuites>
<testsuite name="~dummy" errors="8" failures="77" tests="614" hostname="tbd" time="tbd" timestamp="tbd"> <testsuite name="~dummy" errors="9" failures="77" tests="616" hostname="tbd" time="tbd" timestamp="tbd">
<testcase classname="global" name="./succeeding/Approx/simple" time="tbd"/> <testcase classname="global" name="./succeeding/Approx/simple" time="tbd"/>
<testcase classname="global" name="./succeeding/Approx/epsilon" time="tbd"/> <testcase classname="global" name="./succeeding/Approx/epsilon" time="tbd"/>
<testcase classname="global" name="./succeeding/Approx/float" time="tbd"/> <testcase classname="global" name="./succeeding/Approx/float" time="tbd"/>
@ -4737,25 +4752,30 @@ ExceptionTests.cpp:52
ExceptionTests.cpp:60 ExceptionTests.cpp:60
</error> </error>
</testcase> </testcase>
<testcase classname="global" name="./failing/exceptions/implicit/3" time="tbd">
<error type="TEST_CASE">
ExceptionTests.cpp:66
</error>
</testcase>
<testcase classname="global" name="./succeeding/exceptions/implicit" time="tbd"/> <testcase classname="global" name="./succeeding/exceptions/implicit" time="tbd"/>
<testcase classname="global" name="./failing/exceptions/custom" time="tbd"> <testcase classname="global" name="./failing/exceptions/custom" time="tbd">
<error type="TEST_CASE"> <error type="TEST_CASE">
ExceptionTests.cpp:102 ExceptionTests.cpp:110
</error> </error>
</testcase> </testcase>
<testcase classname="global" name="./failing/exceptions/custom/nothrow" time="tbd"> <testcase classname="global" name="./failing/exceptions/custom/nothrow" time="tbd">
<error message="throw CustomException( &quot;unexpected custom exception&quot; )" type="REQUIRE_NOTHROW"> <error message="throw CustomException( &quot;unexpected custom exception&quot; )" type="REQUIRE_NOTHROW">
ExceptionTests.cpp:109 ExceptionTests.cpp:117
</error> </error>
</testcase> </testcase>
<testcase classname="global" name="./failing/exceptions/custom/throw" time="tbd"> <testcase classname="global" name="./failing/exceptions/custom/throw" time="tbd">
<error message="throw CustomException( &quot;custom exception - not std&quot; )" type="REQUIRE_THROWS_AS"> <error message="throw CustomException( &quot;custom exception - not std&quot; )" type="REQUIRE_THROWS_AS">
ExceptionTests.cpp:114 ExceptionTests.cpp:122
</error> </error>
</testcase> </testcase>
<testcase classname="global" name="./failing/exceptions/custom/double" time="tbd"> <testcase classname="global" name="./failing/exceptions/custom/double" time="tbd">
<error type="TEST_CASE"> <error type="TEST_CASE">
ExceptionTests.cpp:118 ExceptionTests.cpp:126
</error> </error>
</testcase> </testcase>
<testcase classname="global" name="./succeeding/exceptions/notimplemented" time="tbd"/> <testcase classname="global" name="./succeeding/exceptions/notimplemented" time="tbd"/>
@ -6381,51 +6401,60 @@ ExceptionTests.cpp" line="60">
</Expression> </Expression>
<OverallResult success="false"/> <OverallResult success="false"/>
</TestCase> </TestCase>
<TestCase name="./failing/exceptions/implicit/3">
<Section name="section name">
ExceptionTests.cpp" line="66">
unexpected exception
</Exception>
<OverallResults successes="0" failures="1"/>
</Section>
<OverallResult success="false"/>
</TestCase>
<TestCase name="./succeeding/exceptions/implicit"> <TestCase name="./succeeding/exceptions/implicit">
<OverallResult success="true"/> <OverallResult success="true"/>
</TestCase> </TestCase>
<TestCase name="./failing/exceptions/custom"> <TestCase name="./failing/exceptions/custom">
ExceptionTests.cpp" line="102"> ExceptionTests.cpp" line="110">
custom exception custom exception
</Exception> </Exception>
<OverallResult success="false"/> <OverallResult success="false"/>
</TestCase> </TestCase>
<TestCase name="./failing/exceptions/custom/nothrow"> <TestCase name="./failing/exceptions/custom/nothrow">
ExceptionTests.cpp" line="109"> ExceptionTests.cpp" line="117">
<Original> <Original>
throw CustomException( &quot;unexpected custom exception&quot; ) throw CustomException( &quot;unexpected custom exception&quot; )
</Original> </Original>
<Expanded> <Expanded>
throw CustomException( &quot;unexpected custom exception&quot; ) throw CustomException( &quot;unexpected custom exception&quot; )
</Expanded> </Expanded>
ExceptionTests.cpp" line="109"> ExceptionTests.cpp" line="117">
unexpected custom exception unexpected custom exception
</Exception> </Exception>
</Expression> </Expression>
<OverallResult success="false"/> <OverallResult success="false"/>
</TestCase> </TestCase>
<TestCase name="./failing/exceptions/custom/throw"> <TestCase name="./failing/exceptions/custom/throw">
ExceptionTests.cpp" line="114"> ExceptionTests.cpp" line="122">
<Original> <Original>
throw CustomException( &quot;custom exception - not std&quot; ) throw CustomException( &quot;custom exception - not std&quot; )
</Original> </Original>
<Expanded> <Expanded>
throw CustomException( &quot;custom exception - not std&quot; ) throw CustomException( &quot;custom exception - not std&quot; )
</Expanded> </Expanded>
ExceptionTests.cpp" line="114"> ExceptionTests.cpp" line="122">
custom exception - not std custom exception - not std
</Exception> </Exception>
</Expression> </Expression>
<OverallResult success="false"/> <OverallResult success="false"/>
</TestCase> </TestCase>
<TestCase name="./failing/exceptions/custom/double"> <TestCase name="./failing/exceptions/custom/double">
ExceptionTests.cpp" line="118"> ExceptionTests.cpp" line="126">
3.14 3.14
</Exception> </Exception>
<OverallResult success="false"/> <OverallResult success="false"/>
</TestCase> </TestCase>
<TestCase name="./succeeding/exceptions/notimplemented"> <TestCase name="./succeeding/exceptions/notimplemented">
ExceptionTests.cpp" line="129"> ExceptionTests.cpp" line="137">
<Original> <Original>
thisFunctionNotImplemented( 7 ) thisFunctionNotImplemented( 7 )
</Original> </Original>
@ -8339,9 +8368,9 @@ MiscTests.cpp" line="273">
<TestCase name="selftest/main"> <TestCase name="selftest/main">
<Section name="selftest/expected result" description="Tests do what they claim"> <Section name="selftest/expected result" description="Tests do what they claim">
<Section name="selftest/expected result/failing tests" description="Tests in the 'failing' branch fail"> <Section name="selftest/expected result/failing tests" description="Tests in the 'failing' branch fail">
<OverallResults successes="25" failures="0"/> <OverallResults successes="26" failures="0"/>
</Section> </Section>
<OverallResults successes="25" failures="0"/> <OverallResults successes="26" failures="0"/>
</Section> </Section>
<Section name="selftest/expected result" description="Tests do what they claim"> <Section name="selftest/expected result" description="Tests do what they claim">
<Section name="selftest/expected result/succeeding tests" description="Tests in the 'succeeding' branch succeed"> <Section name="selftest/expected result/succeeding tests" description="Tests in the 'succeeding' branch succeed">
@ -8386,10 +8415,10 @@ TestMain.cpp" line="47">
</Expression> </Expression>
TestMain.cpp" line="48"> TestMain.cpp" line="48">
<Original> <Original>
totals.assertions.failed == 72 totals.assertions.failed == 73
</Original> </Original>
<Expanded> <Expanded>
72 == 72 73 == 73
</Expanded> </Expanded>
</Expression> </Expression>
<OverallResults successes="2" failures="0"/> <OverallResults successes="2" failures="0"/>
@ -9792,9 +9821,9 @@ BDDTests.cpp" line="29">
</Section> </Section>
<OverallResult success="true"/> <OverallResult success="true"/>
</TestCase> </TestCase>
<OverallResults successes="511" failures="103"/> <OverallResults successes="512" failures="104"/>
</Group> </Group>
<OverallResults successes="511" failures="103"/> <OverallResults successes="512" failures="104"/>
</Catch> </Catch>
[Started testing: CatchSelfTest] [Started testing: CatchSelfTest]
[Started group: '~dummy'] [Started group: '~dummy']
@ -10045,6 +10074,14 @@ ExceptionTests.cpp:60: 1 == 1 succeeded
ExceptionTests.cpp:60: {Unknown expression after the reported line} failed with unexpected exception with message: 'unexpected exception' ExceptionTests.cpp:60: {Unknown expression after the reported line} failed with unexpected exception with message: 'unexpected exception'
[Finished: './failing/exceptions/implicit/2' 1 test case failed (1 of 2 assertions failed)] [Finished: './failing/exceptions/implicit/2' 1 test case failed (1 of 2 assertions failed)]
[Running: ./failing/exceptions/implicit/3]
[Started section: 'section name']
ExceptionTests.cpp:66: Unexpected exception with message: 'unexpected exception'
[End of section: 'section name' 1 assertion failed]
[Finished: './failing/exceptions/implicit/3' 1 test case failed (1 assertion failed)]
[Running: ./succeeding/exceptions/implicit] [Running: ./succeeding/exceptions/implicit]
No assertions in test case, './succeeding/exceptions/implicit' No assertions in test case, './succeeding/exceptions/implicit'
@ -10052,23 +10089,23 @@ No assertions in test case, './succeeding/exceptions/implicit'
[Finished: './succeeding/exceptions/implicit' 1 test case failed (1 assertion failed)] [Finished: './succeeding/exceptions/implicit' 1 test case failed (1 assertion failed)]
[Running: ./failing/exceptions/custom] [Running: ./failing/exceptions/custom]
ExceptionTests.cpp:102: Unexpected exception with message: 'custom exception' ExceptionTests.cpp:110: Unexpected exception with message: 'custom exception'
[Finished: './failing/exceptions/custom' 1 test case failed (1 assertion failed)] [Finished: './failing/exceptions/custom' 1 test case failed (1 assertion failed)]
[Running: ./failing/exceptions/custom/nothrow] [Running: ./failing/exceptions/custom/nothrow]
ExceptionTests.cpp:109: throw CustomException( "unexpected custom exception" ) failed with unexpected exception with message: 'unexpected custom exception' ExceptionTests.cpp:117: throw CustomException( "unexpected custom exception" ) failed with unexpected exception with message: 'unexpected custom exception'
[Finished: './failing/exceptions/custom/nothrow' 1 test case failed (1 assertion failed)] [Finished: './failing/exceptions/custom/nothrow' 1 test case failed (1 assertion failed)]
[Running: ./failing/exceptions/custom/throw] [Running: ./failing/exceptions/custom/throw]
ExceptionTests.cpp:114: throw CustomException( "custom exception - not std" ) failed with unexpected exception with message: 'custom exception - not std' ExceptionTests.cpp:122: throw CustomException( "custom exception - not std" ) failed with unexpected exception with message: 'custom exception - not std'
[Finished: './failing/exceptions/custom/throw' 1 test case failed (1 assertion failed)] [Finished: './failing/exceptions/custom/throw' 1 test case failed (1 assertion failed)]
[Running: ./failing/exceptions/custom/double] [Running: ./failing/exceptions/custom/double]
ExceptionTests.cpp:118: Unexpected exception with message: '3.14' ExceptionTests.cpp:126: Unexpected exception with message: '3.14'
[Finished: './failing/exceptions/custom/double' 1 test case failed (1 assertion failed)] [Finished: './failing/exceptions/custom/double' 1 test case failed (1 assertion failed)]
[Running: ./succeeding/exceptions/notimplemented] [Running: ./succeeding/exceptions/notimplemented]
ExceptionTests.cpp:129: thisFunctionNotImplemented( 7 ) succeeded ExceptionTests.cpp:137: thisFunctionNotImplemented( 7 ) succeeded
[Finished: './succeeding/exceptions/notimplemented' All tests passed (1 assertion in 1 test case)] [Finished: './succeeding/exceptions/notimplemented' All tests passed (1 assertion in 1 test case)]
[Running: ./succeeding/generators/1] [Running: ./succeeding/generators/1]
@ -10251,7 +10288,6 @@ MessageTests.cpp:51: failed with message: 'This is a failure'
[Finished: './failing/message/fail' 1 test case failed (1 assertion failed)] [Finished: './failing/message/fail' 1 test case failed (1 assertion failed)]
[Running: ./failing/message/sections] [Running: ./failing/message/sections]
[Started section: 'one'] [Started section: 'one']
MessageTests.cpp:58: failed with message: 'Message from section one' MessageTests.cpp:58: failed with message: 'Message from section one'
[End of section: 'one' 1 assertion failed] [End of section: 'one' 1 assertion failed]
@ -10597,9 +10633,11 @@ catch_self_test.hpp:114: succeeded
[with message: Tests failed, as expected] [with message: Tests failed, as expected]
catch_self_test.hpp:114: succeeded catch_self_test.hpp:114: succeeded
[with message: Tests failed, as expected] [with message: Tests failed, as expected]
[End of section: 'selftest/expected result/failing tests' All 25 assertions passed] catch_self_test.hpp:114: succeeded
[with message: Tests failed, as expected]
[End of section: 'selftest/expected result/failing tests' All 26 assertions passed]
[End of section: 'selftest/expected result' All 25 assertions passed] [End of section: 'selftest/expected result' All 26 assertions passed]
[Started section: 'selftest/expected result'] [Started section: 'selftest/expected result']
[Started section: 'selftest/expected result/succeeding tests'] [Started section: 'selftest/expected result/succeeding tests']
@ -10718,12 +10756,12 @@ TestMain.cpp:41: totals.assertions.failed == 0 succeeded for: 0 == 0
[Started section: 'selftest/test counts'] [Started section: 'selftest/test counts']
[Started section: 'selftest/test counts/failing tests'] [Started section: 'selftest/test counts/failing tests']
TestMain.cpp:47: totals.assertions.passed == 1 succeeded for: 1 == 1 TestMain.cpp:47: totals.assertions.passed == 1 succeeded for: 1 == 1
TestMain.cpp:48: totals.assertions.failed == 72 succeeded for: 72 == 72 TestMain.cpp:48: totals.assertions.failed == 73 succeeded for: 73 == 73
[End of section: 'selftest/test counts/failing tests' All 2 assertions passed] [End of section: 'selftest/test counts/failing tests' All 2 assertions passed]
[End of section: 'selftest/test counts' All 2 assertions passed] [End of section: 'selftest/test counts' All 2 assertions passed]
[Finished: 'selftest/main' All tests passed (75 assertions in 1 test case)] [Finished: 'selftest/main' All tests passed (76 assertions in 1 test case)]
[Running: meta/Misc/Sections] [Running: meta/Misc/Sections]
TestMain.cpp:57: totals.assertions.passed == 2 succeeded for: 2 == 2 TestMain.cpp:57: totals.assertions.passed == 2 succeeded for: 2 == 2
@ -11136,10 +11174,10 @@ BDDTests.cpp:29: itDoesThis() succeeded for: true
[End of section: ' Given: This stuff exists' 1 assertion passed] [End of section: ' Given: This stuff exists' 1 assertion passed]
[Finished: 'Scenario: Do that thing with the thing' All tests passed (1 assertion in 1 test case)] [Finished: 'Scenario: Do that thing with the thing' All tests passed (1 assertion in 1 test case)]
[End of group: '~dummy'. 46 of 98 test cases failed (103 of 614 assertions failed)] [End of group: '~dummy'. 47 of 99 test cases failed (104 of 616 assertions failed)]
[Testing completed. 46 of 98 test cases failed (103 of 614 assertions failed)] [Testing completed. 47 of 99 test cases failed (104 of 616 assertions failed)]
[Started testing: CatchSelfTest] [Started testing: CatchSelfTest]
[Started group: '~dummy'] [Started group: '~dummy']

View File

@ -61,6 +61,14 @@ TEST_CASE_NORETURN( "./failing/exceptions/implicit/2", "An unchecked exception r
throw std::domain_error( "unexpected exception" ); throw std::domain_error( "unexpected exception" );
/*NOTREACHED*/ /*NOTREACHED*/
} }
TEST_CASE( "./failing/exceptions/implicit/3", "When unchecked exceptions are thrown they are always failures" )
{
SECTION( "section name", "" )
{
throw std::domain_error( "unexpected exception" );
/*NOTREACHED*/
}
}
TEST_CASE( "./succeeding/exceptions/implicit", "When unchecked exceptions are thrown, but caught, they do not affect the test" ) TEST_CASE( "./succeeding/exceptions/implicit", "When unchecked exceptions are thrown, but caught, they do not affect the test" )
{ {

View File

@ -45,7 +45,7 @@ TEST_CASE( "selftest/main", "Runs all Catch self tests and checks their results"
"Number of 'failing' tests is fixed" ) { "Number of 'failing' tests is fixed" ) {
Totals totals = runner.runMatching( "./failing/*", 1, 2 ); Totals totals = runner.runMatching( "./failing/*", 1, 2 );
CHECK( totals.assertions.passed == 1 ); CHECK( totals.assertions.passed == 1 );
CHECK( totals.assertions.failed == 72 ); CHECK( totals.assertions.failed == 73 );
} }
} }
} }