capture file/ line of test case - for reporting on uncaught exceptions

This commit is contained in:
Phil Nash 2011-04-21 08:59:42 +01:00
parent 77d72fb852
commit 81e42ce139
5 changed files with 66 additions and 16 deletions

View File

@ -286,6 +286,17 @@ public:
m_message = message; m_message = message;
} }
///////////////////////////////////////////////////////////////////////////
void setFileAndLine
(
const std::string& filename,
std::size_t line
)
{
m_filename = filename;
m_line = line;
}
/////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////
template<typename RhsT> template<typename RhsT>
STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator || STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator ||

View File

@ -553,6 +553,8 @@ namespace Catch
m_runningTest->reset(); m_runningTest->reset();
StreamRedirect coutRedir( std::cout, redirectedCout ); StreamRedirect coutRedir( std::cout, redirectedCout );
StreamRedirect cerrRedir( std::cerr, redirectedCerr ); StreamRedirect cerrRedir( std::cerr, redirectedCerr );
m_currentResult.setFileAndLine( m_runningTest->getTestCaseInfo().getFilename(),
m_runningTest->getTestCaseInfo().getLine() );
m_runningTest->getTestCaseInfo().invoke(); m_runningTest->getTestCaseInfo().invoke();
m_runningTest->ranToCompletion(); m_runningTest->ranToCompletion();
} }

View File

@ -27,11 +27,15 @@ namespace Catch
( (
ITestCase* testCase, ITestCase* testCase,
const char* name, const char* name,
const char* description const char* description,
const char* filename,
std::size_t line
) )
: m_test( testCase ), : m_test( testCase ),
m_name( name ), m_name( name ),
m_description( description ) m_description( description ),
m_filename( filename ),
m_line( line )
{ {
} }
@ -49,7 +53,9 @@ namespace Catch
) )
: m_test( other.m_test->clone() ), : m_test( other.m_test->clone() ),
m_name( other.m_name ), m_name( other.m_name ),
m_description( other.m_description ) m_description( other.m_description ),
m_filename( other.m_filename ),
m_line( other.m_line )
{ {
} }
@ -61,7 +67,9 @@ namespace Catch
) )
: m_test( other.m_test->clone() ), : m_test( other.m_test->clone() ),
m_name( name ), m_name( name ),
m_description( other.m_description ) m_description( other.m_description ),
m_filename( other.m_filename ),
m_line( other.m_line )
{ {
} }
@ -107,6 +115,22 @@ namespace Catch
return m_description; return m_description;
} }
///////////////////////////////////////////////////////////////////////
const std::string& getFilename
()
const
{
return m_filename;
}
///////////////////////////////////////////////////////////////////////
std::size_t getLine
()
const
{
return m_line;
}
/////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////
bool isHidden bool isHidden
() ()
@ -155,6 +179,9 @@ namespace Catch
ITestCase* m_test; ITestCase* m_test;
std::string m_name; std::string m_name;
std::string m_description; std::string m_description;
std::string m_filename;
std::size_t m_line;
}; };
/////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////

View File

@ -151,10 +151,12 @@ namespace Catch
( (
TestFunction function, TestFunction function,
const char* name, const char* name,
const char* description const char* description,
const char* filename,
std::size_t line
) )
{ {
registerTestCase( new FreeFunctionTestCase( function ), name, description ); registerTestCase( new FreeFunctionTestCase( function ), name, description, filename, line );
} }
/////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////
@ -168,10 +170,12 @@ namespace Catch
( (
ITestCase* testCase, ITestCase* testCase,
const char* name, const char* name,
const char* description const char* description,
const char* filename,
std::size_t line
) )
{ {
Hub::getTestCaseRegistry().registerTest( TestCaseInfo( testCase, name, description ) ); Hub::getTestCaseRegistry().registerTest( TestCaseInfo( testCase, name, description, filename, line ) );
} }
} // end namespace Catch } // end namespace Catch

View File

@ -79,7 +79,9 @@ struct AutoReg
AutoReg AutoReg
( TestFunction function, ( TestFunction function,
const char* name, const char* name,
const char* description const char* description,
const char* filename,
std::size_t line
); );
/////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////
@ -88,10 +90,12 @@ struct AutoReg
( (
void (C::*method)(), void (C::*method)(),
const char* name, const char* name,
const char* description const char* description,
const char* filename,
std::size_t line
) )
{ {
registerTestCase( new MethodTestCase<C>( method ), name, description ); registerTestCase( new MethodTestCase<C>( method ), name, description, filename, line );
} }
/////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////
@ -99,7 +103,9 @@ struct AutoReg
( (
ITestCase* testCase, ITestCase* testCase,
const char* name, const char* name,
const char* description const char* description,
const char* filename,
std::size_t line
); );
~AutoReg ~AutoReg
@ -118,18 +124,18 @@ private:
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
#define INTERNAL_CATCH_TESTCASE( Name, Desc ) \ #define INTERNAL_CATCH_TESTCASE( Name, Desc ) \
static void INTERNAL_CATCH_UNIQUE_NAME( catch_internal_TestFunction )(); \ static void INTERNAL_CATCH_UNIQUE_NAME( catch_internal_TestFunction )(); \
namespace{ Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar )( &INTERNAL_CATCH_UNIQUE_NAME( catch_internal_TestFunction ), Name, Desc ); }\ namespace{ Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar )( &INTERNAL_CATCH_UNIQUE_NAME( catch_internal_TestFunction ), Name, Desc, __FILE__, __LINE__ ); }\
static void INTERNAL_CATCH_UNIQUE_NAME( catch_internal_TestFunction )() static void INTERNAL_CATCH_UNIQUE_NAME( catch_internal_TestFunction )()
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
#define INTERNAL_CATCH_TESTCASE_NORETURN( Name, Desc ) \ #define INTERNAL_CATCH_TESTCASE_NORETURN( Name, Desc ) \
static void INTERNAL_CATCH_UNIQUE_NAME( catch_internal_TestFunction )() ATTRIBUTE_NORETURN; \ static void INTERNAL_CATCH_UNIQUE_NAME( catch_internal_TestFunction )() ATTRIBUTE_NORETURN; \
namespace{ Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar )( &INTERNAL_CATCH_UNIQUE_NAME( catch_internal_TestFunction ), Name, Desc ); }\ namespace{ Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar )( &INTERNAL_CATCH_UNIQUE_NAME( catch_internal_TestFunction ), Name, Desc, __FILE__, __LINE__ ); }\
static void INTERNAL_CATCH_UNIQUE_NAME( catch_internal_TestFunction )() static void INTERNAL_CATCH_UNIQUE_NAME( catch_internal_TestFunction )()
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
#define CATCH_METHOD_AS_TEST_CASE( QualifiedMethod, Name, Desc ) \ #define CATCH_METHOD_AS_TEST_CASE( QualifiedMethod, Name, Desc ) \
namespace{ Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar )( &QualifiedMethod, Name, Desc ); } namespace{ Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar )( &QualifiedMethod, Name, Desc, __FILE__, __LINE__ ); }
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
#define TEST_CASE_METHOD( ClassName, TestName, Desc )\ #define TEST_CASE_METHOD( ClassName, TestName, Desc )\
@ -137,7 +143,7 @@ private:
{ \ { \
void test(); \ void test(); \
}; \ }; \
namespace{ Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar ) ( &INTERNAL_CATCH_UNIQUE_NAME( Catch_FixtureWrapper )::test, TestName, Desc ); } \ namespace{ Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar ) ( &INTERNAL_CATCH_UNIQUE_NAME( Catch_FixtureWrapper )::test, TestName, Desc, __FILE__, __LINE__ ); } \
void INTERNAL_CATCH_UNIQUE_NAME( Catch_FixtureWrapper )::test() void INTERNAL_CATCH_UNIQUE_NAME( Catch_FixtureWrapper )::test()
#endif // TWOBLUECUBES_CATCH_REGISTRY_HPP_INCLUDED #endif // TWOBLUECUBES_CATCH_REGISTRY_HPP_INCLUDED