[Cppunit-cvs] cppunit2/src/cpput assert.cpp, 1.19, 1.20 assertstring.cpp, 1.4, 1.5 exceptionguard.c
Brought to you by:
blep
From: Baptiste L. <bl...@us...> - 2007-08-14 17:31:12
|
Update of /cvsroot/cppunit/cppunit2/src/cpput In directory sc8-pr-cvs4.sourceforge.net:/tmp/cvs-serv5281/src/cpput Modified Files: assert.cpp assertstring.cpp exceptionguard.cpp testinfo.cpp Log Message: Modified assertion implementation to force evaluation of user condition expression first, while preserving delegation to function, overloading and optional parameters feature. See CPPUT_BEGIN_ASSERTION_MACRO() documentation in testinfo.h for an example to update your custom assertion code. New implementation rely on operator evaluation order and operator overloading. The trick is documented in CPPUT_BEGIN_ASSERTION_MACRO(). Index: assert.cpp =================================================================== RCS file: /cvsroot/cppunit/cppunit2/src/cpput/assert.cpp,v retrieving revision 1.19 retrieving revision 1.20 diff -C2 -d -r1.19 -r1.20 *** assert.cpp 2 Sep 2006 11:24:53 -0000 1.19 --- assert.cpp 14 Aug 2007 17:30:52 -0000 1.20 *************** *** 9,106 **** ! void fail() { ! fail( translate("Assertion Failed") ); } ! void fail( const LazyMessage &message ) { ! currentAssertion().setMessages( message.makeMessage() ); ! realizeAssertion(); } ! void checkTrue( bool shouldBeTrue, const LazyMessage &message ) { ! if ( shouldBeTrue ) ! return; ! ! Message newMessage( message.makeMessage() ); ! newMessage.insertAt( 0, translate( "expression did not evaluate to true." ) ); ! fail( newMessage ); } ! void checkFalse( bool shouldBeFalse, const LazyMessage &message ) { ! if ( !shouldBeFalse ) ! return; ! ! Message newMessage( message.makeMessage() ); ! newMessage.insertAt( 0, translate( "expression did not evaluate to false." ) ); ! fail( newMessage ); } ! void checkAssertionFail( bool assertionFailed, const LazyMessage &message ) { ! if ( assertionFailed ) ! return; ! ! Message newMessage( translate( "Assertion expression did not fail as expected." ) ); ! newMessage.extend( message.makeMessage() ); ! fail( message ); } ! void checkAssertionPass( bool assertionFailed, const LazyMessage &message ) { ! if ( !assertionFailed ) ! return; ! ! Message newMessage( translate( "Assertion expression did not pass as expected." ) ); ! newMessage.extend( message.makeMessage() ); ! fail( message ); } ! Message ! buildEqualityFailedMessage( const std::string &expected, const std::string &actual, const LazyMessage &message ) { ! Message newMessage( message.makeMessage() ); ! newMessage.add( translate( "Equality assertion failed." ) ); ! newMessage.add( translate( "Expected: " ) + expected ); ! newMessage.add( translate( "Actual : " ) + actual ); ! return newMessage; } ! Message ! buildUnequalityFailedMessage( const std::string &expected, const std::string &actual, const LazyMessage &message ) { ! Message newMessage( message.makeMessage() ); ! newMessage.add( translate( "Unequality assertion failed (expected & actual should be different)." ) ); ! newMessage.add( translate( "Expected: " ) + expected ); ! newMessage.add( translate( "Actual : " ) + actual ); ! return newMessage; } ! void checkDoubleEquals( double expected, double actual, --- 9,125 ---- ! CheckerResult ! pass() ! { ! return CheckerResult(); ! } ! ! ! CheckerResult fail() { ! return fail( translate("Assertion Failed") ); } ! CheckerResult fail( const LazyMessage &message ) { ! CheckerResult result; ! result.setFailed(); ! result.message_ = message.makeMessage(); ! return result; } ! CheckerResult checkTrue( bool shouldBeTrue, const LazyMessage &message ) { ! CheckerResult result; ! if ( !shouldBeTrue ) ! { ! result.message_ = message.makeMessage(); ! result.message_.insertAt( 0, translate( "expression did not evaluate to true." ) ); ! result.setFailed(); ! } ! return result; } ! CheckerResult checkFalse( bool shouldBeFalse, const LazyMessage &message ) { ! CheckerResult result; ! if ( shouldBeFalse ) ! { ! result.message_ = message.makeMessage(); ! result.message_.insertAt( 0, translate( "expression did not evaluate to false." ) ); ! result.setFailed(); ! } ! return result; } ! CheckerResult checkAssertionFail( bool assertionFailed, const LazyMessage &message ) { ! CheckerResult result; ! if ( !assertionFailed ) ! { ! result.message_ = Message( translate( "Assertion expression did not fail as expected." ) ); ! result.message_.extend( message.makeMessage() ); ! result.setFailed(); ! } ! return result; } ! CheckerResult checkAssertionPass( bool assertionFailed, const LazyMessage &message ) { ! CheckerResult result; ! if ( assertionFailed ) ! { ! result.message_ = Message( translate( "Assertion expression did not pass as expected." ) ); ! result.message_.extend( message.makeMessage() ); ! result.setFailed(); ! } ! return result; } ! void ! buildEqualityFailedMessage( CheckerResult &result, ! const std::string &expected, const std::string &actual, const LazyMessage &message ) { ! result.setFailed(); ! result.message_ = message.makeMessage(); ! result.message_.add( translate( "Equality assertion failed." ) ); ! result.message_.add( translate( "Expected: " ) + expected ); ! result.message_.add( translate( "Actual : " ) + actual ); } ! void ! buildUnequalityFailedMessage( CheckerResult &result, ! const std::string &expected, const std::string &actual, const LazyMessage &message ) { ! result.setFailed(); ! result.message_ = message.makeMessage(); ! result.message_.add( translate( "Unequality assertion failed (expected & actual should be different)." ) ); ! result.message_.add( translate( "Expected: " ) + expected ); ! result.message_.add( translate( "Actual : " ) + actual ); } ! CheckerResult checkDoubleEquals( double expected, double actual, *************** *** 108,124 **** const LazyMessage &message ) { double diff = expected - actual; if ( diff < 0 ) diff = -diff; ! if ( diff <= tolerance ) ! return; ! ! Message newMessage( message.makeMessage() ); ! newMessage.add( translate( "Double equality assertion failed." ) ); ! newMessage.add( translate( "Expected: " ) + CppTL::toString( expected ) ); ! newMessage.add( translate( "Actual : " ) + CppTL::toString( actual ) ); ! newMessage.add( translate( "Tolerance : " ) + CppTL::toString( tolerance ) ); ! newMessage.add( translate( "Actual difference : " ) + CppTL::toString( diff ) ); ! fail( newMessage ); } --- 127,145 ---- const LazyMessage &message ) { + CheckerResult result; double diff = expected - actual; if ( diff < 0 ) diff = -diff; ! if ( diff > tolerance ) ! { ! result.setFailed(); ! result.message_ = message.makeMessage(); ! result.message_.add( translate( "Double equality assertion failed." ) ); ! result.message_.add( translate( "Expected: " ) + CppTL::toString( expected ) ); ! result.message_.add( translate( "Actual : " ) + CppTL::toString( actual ) ); ! result.message_.add( translate( "Tolerance : " ) + CppTL::toString( tolerance ) ); ! result.message_.add( translate( "Actual difference : " ) + CppTL::toString( diff ) ); ! } ! return result; } Index: assertstring.cpp =================================================================== RCS file: /cvsroot/cppunit/cppunit2/src/cpput/assertstring.cpp,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** assertstring.cpp 2 Jul 2005 20:27:36 -0000 1.4 --- assertstring.cpp 14 Aug 2007 17:30:52 -0000 1.5 *************** *** 4,84 **** namespace CppUT { ! void checkStdStringStartsWith( const std::string &string, const std::string &pattern, const Message &message ) { ! if ( string.substr( 0, pattern.length() ) == pattern ) ! return; ! ! Message newMessage( message ); ! newMessage.add( translate( "String does not start with the expected pattern." ) ); ! newMessage.add( translate( "Expected start: " ) + CppTL::quoteMultiLineString( pattern ) ); ! newMessage.add( translate( "Actual string: " ) + CppTL::quoteMultiLineString( string ) ); ! fail( newMessage ); } ! void checkStdStringEndsWith( const std::string &string, const std::string &pattern, const Message &message ) { ! if ( string.length() >= pattern.length() && ! string.substr( string.length() - pattern.length() ) == pattern ) ! return; ! ! Message newMessage( message ); ! newMessage.add( translate( "String does not end with the expected pattern." ) ); ! newMessage.add( translate( "Expected end: " ) + CppTL::quoteMultiLineString( pattern ) ); ! newMessage.add( translate( "Actual string: " ) + CppTL::quoteMultiLineString( string ) ); ! fail( newMessage ); } ! void checkStdStringContains( const std::string &string, const std::string &pattern, const Message &message ) { ! if ( string.find( pattern ) != std::string::npos ) ! return; ! ! Message newMessage( message ); ! newMessage.add( translate( "String does not contain the expected pattern." ) ); ! newMessage.add( translate( "Expected pattern: " ) + CppTL::quoteMultiLineString( pattern ) ); ! newMessage.add( translate( "Actual string: " ) + CppTL::quoteMultiLineString( string ) ); ! fail( newMessage ); } ! void checkStdStringEquals( const std::string &expected, const std::string &actual, const Message &message ) { ! if ( actual == expected ) ! return; ! ! unsigned int differenceIndex = 0; ! while ( differenceIndex < actual.length() && ! differenceIndex < expected.length() && ! actual[differenceIndex] == expected[differenceIndex] ) { ! ++differenceIndex; ! } ! std::string common = expected.substr( 0, differenceIndex ); ! std::string actualTail = actual.substr( differenceIndex ); ! std::string expectedTail = expected.substr( differenceIndex ); ! Message newMessage( message ); ! newMessage.add( translate( "Strings are not equal." ) ); ! if ( !common.empty() ) ! newMessage.add( translate( "Common: " ) + CppTL::quoteMultiLineString( common ) ); ! newMessage.add( translate( "Divergence position (0 based): " ) + stringize( differenceIndex ) ); ! newMessage.add( translate( "Expected (at divergence): " ) + CppTL::quoteMultiLineString( expectedTail ) ); ! newMessage.add( translate( "Actual (at divergence): " ) + CppTL::quoteMultiLineString( actualTail ) ); ! fail( newMessage ); } --- 4,92 ---- namespace CppUT { ! CheckerResult checkStdStringStartsWith( const std::string &string, const std::string &pattern, const Message &message ) { ! CheckerResult result; ! if ( string.substr( 0, pattern.length() ) != pattern ) ! { ! result.setFailed(); ! result.message_ = message; ! result.message_.add( translate( "String does not start with the expected pattern." ) ); ! result.message_.add( translate( "Expected start: " ) + CppTL::quoteMultiLineString( pattern ) ); ! result.message_.add( translate( "Actual string: " ) + CppTL::quoteMultiLineString( string ) ); ! } ! return result; } ! CheckerResult checkStdStringEndsWith( const std::string &string, const std::string &pattern, const Message &message ) { ! CheckerResult result; ! if ( string.length() < pattern.length() || ! string.substr( string.length() - pattern.length() ) != pattern ) ! { ! result.setFailed(); ! result.message_ = message; ! result.message_.add( translate( "String does not end with the expected pattern." ) ); ! result.message_.add( translate( "Expected end: " ) + CppTL::quoteMultiLineString( pattern ) ); ! result.message_.add( translate( "Actual string: " ) + CppTL::quoteMultiLineString( string ) ); ! } ! return result; } ! CheckerResult checkStdStringContains( const std::string &string, const std::string &pattern, const Message &message ) { ! CheckerResult result; ! if ( string.find( pattern ) == std::string::npos ) ! { ! result.setFailed(); ! result.message_ = message; ! result.message_.add( translate( "String does not contain the expected pattern." ) ); ! result.message_.add( translate( "Expected pattern: " ) + CppTL::quoteMultiLineString( pattern ) ); ! result.message_.add( translate( "Actual string: " ) + CppTL::quoteMultiLineString( string ) ); ! } ! return result; } ! CheckerResult checkStdStringEquals( const std::string &expected, const std::string &actual, const Message &message ) { ! CheckerResult result; ! if ( actual != expected ) { ! unsigned int differenceIndex = 0; ! while ( differenceIndex < actual.length() && ! differenceIndex < expected.length() && ! actual[differenceIndex] == expected[differenceIndex] ) ! { ! ++differenceIndex; ! } ! std::string common = expected.substr( 0, differenceIndex ); ! std::string actualTail = actual.substr( differenceIndex ); ! std::string expectedTail = expected.substr( differenceIndex ); ! result.setFailed(); ! result.message_ = message; ! result.message_.add( translate( "Strings are not equal." ) ); ! if ( !common.empty() ) ! result.message_.add( translate( "Common: " ) + CppTL::quoteMultiLineString( common ) ); ! result.message_.add( translate( "Divergence position (0 based): " ) + stringize( differenceIndex ) ); ! result.message_.add( translate( "Expected (at divergence): " ) + CppTL::quoteMultiLineString( expectedTail ) ); ! result.message_.add( translate( "Actual (at divergence): " ) + CppTL::quoteMultiLineString( actualTail ) ); ! } ! return result; } Index: testinfo.cpp =================================================================== RCS file: /cvsroot/cppunit/cppunit2/src/cpput/testinfo.cpp,v retrieving revision 1.21 retrieving revision 1.22 diff -C2 -d -r1.21 -r1.22 *** testinfo.cpp 5 Jun 2006 13:22:58 -0000 1.21 --- testinfo.cpp 14 Aug 2007 17:30:52 -0000 1.22 *************** *** 5,8 **** --- 5,29 ---- namespace CppUT { + + // ////////////////////////////////////////////////////////////////// + // ////////////////////////////////////////////////////////////////// + // Class AssertionTrigger + // ////////////////////////////////////////////////////////////////// + // ////////////////////////////////////////////////////////////////// + namespace Impl { + AssertionTrigger AssertionTrigger::aborting; + AssertionTrigger AssertionTrigger::checking; + + AssertionTrigger & + AssertionTrigger::operator +=( const CheckerFileLocation &fileLocation ) + { + const char *file = fileLocation.file_; + unsigned int line = fileLocation.lineData_->line_; + const CheckerResult &result = *(fileLocation.lineData_->result_); + TestInfo::threadInstance().handleAssertion( file, line, result, this == &aborting ); + return *this; + } + } // end namespace Impl + // ////////////////////////////////////////////////////////////////// // ////////////////////////////////////////////////////////////////// *************** *** 277,281 **** { testStatus_ = TestStatus( TestStatus::passed ); - currentAssertion_ = Assertion(); assertionType_ = abortingAssertion; } --- 298,301 ---- *************** *** 290,328 **** void ! TestInfo::newAssertion( AssertionType type, ! const char *fileName, ! unsigned int lineNumber, ! const char *functionName ) ! { ! currentAssertion_ = Assertion( Assertion::assertion, ! SourceLocation( fileName, ! lineNumber, ! functionName ) ); ! testStatus_.increaseAssertionCount(); ! assertionType_ = type; ! } ! ! ! Assertion & ! TestInfo::currentAssertion() ! { ! return currentAssertion_; ! } ! ! ! void ! TestInfo::realizeAssertion() { ! testStatus_.increaseFailedAssertionCount(); ! if ( updater_ ) ! updater_->addResultAssertion( currentAssertion_ ); ! if ( assertionType_ == abortingAssertion ) ! { ! std::string message; ! if ( abortingAssertionMode_ != fastAbortingAssertion ) ! message = currentAssertion_.toString().c_str(); ! throw AbortingAssertionException( message ); } } --- 310,347 ---- void ! TestInfo::handleAssertion( const char *file, ! unsigned int line, ! const CheckerResult &result, ! bool isAbortingAssertion ) { ! switch ( result.status_ ) ! { ! case TestStatus::passed: // do nothing (assertion count increased) ! testStatus_.increaseAssertionCount(); ! break; ! case TestStatus::failed: ! { ! testStatus_.increaseAssertionCount(); ! testStatus_.increaseFailedAssertionCount(); ! Assertion assertion( Assertion::assertion, SourceLocation( file, line ) ); ! assertion.setMessages( result.message_ ); ! if ( updater_ ) ! updater_->addResultAssertion( assertion ); ! if ( isAbortingAssertion ) ! { ! std::string message; ! if ( abortingAssertionMode_ != fastAbortingAssertion ) ! message = assertion.toString().c_str(); ! throw AbortingAssertionException( message ); ! } ! } ! break; ! case TestStatus::skipped: ! // @todo handle this correctly. ! break; ! default: ! CPPTL_DEBUG_ASSERT_UNREACHABLE; } } *************** *** 424,449 **** - //void newAssertion( AssertionType type, - // const char *fileName, - // unsigned int lineNumber, - // const char *functionName ) - //{ - // TestInfo::data().newAssertion( type, fileName, lineNumber, functionName ); - //} - - - Assertion & - currentAssertion() - { - return TestInfo::threadInstance().currentAssertion(); - } - - - void realizeAssertion() - { - TestInfo::threadInstance().realizeAssertion(); - } - - void log( const Json::Value &log ) { --- 443,446 ---- Index: exceptionguard.cpp =================================================================== RCS file: /cvsroot/cppunit/cppunit2/src/cpput/exceptionguard.cpp,v retrieving revision 1.11 retrieving revision 1.12 diff -C2 -d -r1.11 -r1.12 *** exceptionguard.cpp 5 Jun 2006 13:22:58 -0000 1.11 --- exceptionguard.cpp 14 Aug 2007 17:30:52 -0000 1.12 *************** *** 3,6 **** --- 3,7 ---- #include <cpptl/typename.h> #include <cpptl/functor.h> + #include <cpptl/conststring.h> namespace CppUT { |