Fixed GitHub Issue #70

Interleave XML entities are now encoded correctly
This commit is contained in:
Phil Nash 2012-02-10 18:58:06 +00:00
parent a162e22fa3
commit 0b09d1c089
3 changed files with 36 additions and 25 deletions

1
.gitignore vendored
View File

@ -9,3 +9,4 @@ Release
*.xcuserstate
.DS_Store
xcuserdata
CatchSelfTest.xcscheme

View File

@ -294,31 +294,29 @@ namespace Catch
const std::string& text
)
{
// !TBD finish this
if( !findReplaceableString( text, "<", "&lt;" ) &&
!findReplaceableString( text, "&", "&amp;" ) &&
!findReplaceableString( text, "\"", "&quot;" ) )
static const char* charsToEncode = "<&\"";
std::string mtext = text;
std::string::size_type pos = mtext.find_first_of( charsToEncode );
while( pos != std::string::npos )
{
stream() << text;
}
}
stream() << mtext.substr( 0, pos );
///////////////////////////////////////////////////////////////////////
bool findReplaceableString
(
const std::string& text,
const std::string& replaceWhat,
const std::string& replaceWith
)
switch( mtext[pos] )
{
std::string::size_type pos = text.find_first_of( replaceWhat );
if( pos != std::string::npos )
{
stream() << text.substr( 0, pos ) << replaceWith;
writeEncodedText( text.substr( pos+1 ) );
return true;
case '<':
stream() << "&lt;";
break;
case '&':
stream() << "&amp;";
break;
case '\"':
stream() << "&quot;";
break;
}
return false;
mtext = mtext.substr( pos+1 );
pos = mtext.find_first_of( charsToEncode );
}
stream() << mtext;
}
bool m_tagIsOpen;

View File

@ -157,3 +157,15 @@ TEST_CASE( "./failing/checkedelse", "" )
{
REQUIRE( testCheckedElse( false ) );
}
TEST_CASE( "./misc/xmlentitycheck", "" )
{
SECTION( "embedded xml", "<test>it should be possible to embed xml characters, such as <, \" or &, or even whole <xml>documents</xml> within an attribute</test>" )
{
// No test
}
SECTION( "encoded chars", "these should all be encoded: &&&\"\"\"<<<&\"<<&\"" )
{
// No test
}
}