📄 markupdlg.cpp
字号:
{
while ( xmlUpdate.FindChildElem() )
{
xmlMaster.AddChildSubDoc( xmlUpdate.GetChildSubDoc() );
xmlUpdate.RemoveChildElem();
}
xmlUpdate.RemoveElem();
}
if ( xmlMaster.OutOfElem() )
{
xmlUpdate.OutOfElem();
bChildFound = xmlMaster.FindChildElem();
if ( ! bChildFound )
{
bMatched = TRUE;
xmlUpdate.ResetChildPos();
}
}
else
bMergeFinished = TRUE;
}
}
}
CString TruncToLastEOL( CString csVal )
{
// locate and truncate from final EOL
// also cuts any trailing indentation
int nLength = csVal.GetLength();
const _TCHAR* pszVal = (const _TCHAR*)csVal;
int nLastEOL = nLength;
int nChar = 0;
while ( nChar < nLength )
{
// Go to next EOL
nLastEOL = nLength;
while ( nChar < nLength && pszVal[nChar] != _T('\r')
&& pszVal[nChar] != _T('\n') )
nChar += (int)_tclen(&pszVal[nChar]);
nLastEOL = nChar;
while ( nChar < nLength
&& _tcschr(_T(" \t\n\r"),pszVal[nChar]) )
++nChar;
}
if ( nLastEOL < nLength )
csVal = csVal.Left( nLastEOL );
return csVal;
}
int CMarkupDlg::RunTest()
{
// Instantiate XML objects for use in tests
// Mostly the same code can be used to test the different versions of CMarkup
// However, to convert both CString and std::string to const char *, use MCD_2PCSZ()
#ifdef MARKUP_MSXML
CMarkupMSXML xml, xml2, xml3;
#else
CMarkup xml, xml2, xml3;
#endif
// Integer Method Test
StartCheckZone( _T("Integer Method Test") );
xml.SetDoc( NULL );
xml.AddElem( _T("R"), 5 );
Check( _ttoi(MCD_2PCSZ(xml.GetData())) == 5 );
xml.SetData( _T("") );
Check( xml.InsertChildElem( _T("C"), 1 ) );
Check( xml.AddChildElem( _T("C"), 3 ) );
Check( xml.IntoElem() );
Check( xml.InsertElem( _T("C"), 2 ) );
xml.ResetMainPos();
Check( xml.FindElem() );
Check( _ttoi(MCD_2PCSZ(xml.GetData())) == 1 );
Check( xml.FindElem() );
Check( _ttoi(MCD_2PCSZ(xml.GetData())) == 2 );
Check( xml.FindElem() );
Check( _ttoi(MCD_2PCSZ(xml.GetData())) == 3 );
// Quote and special chars in attrib value test
StartCheckZone( _T("Attrib Value Test") );
Check( xml.SetDoc( _T("<H g1=\">\" g2=\'>\' d=\"d\'d\" s=\'s\"s\'/>") ) );
Check( xml.FindElem() );
Check( xml.GetAttrib(_T("d")) == _T("d\'d") );
Check( xml.GetAttrib(_T("s")) == _T("s\"s") );
Check( xml.SetAttrib( _T("d"), _T("d\'d") ) );
Check( xml.GetAttrib(_T("d")) == _T("d\'d") );
Check( xml.GetAttrib(_T("s")) == _T("s\"s") );
Check( xml.GetAttrib(_T("g1")) == _T(">") );
Check( xml.GetAttrib(_T("g2")) == _T(">") );
// FindElem Tag Name Test
StartCheckZone( _T("FindElem Tag Name Test") );
xml.SetDoc( NULL );
xml.AddElem( _T("R") );
xml.AddChildElem( _T("N"), _T("A") );
xml.AddChildElem( _T("Name"), _T("B") );
xml.AddChildElem( _T("Na"), _T("C") );
xml.AddChildElem( _T("Nam"), _T("D") );
xml.ResetChildPos();
Check( xml.FindChildElem(_T("Name")) );
Check( xml.GetChildData() == _T("B") );
Check( xml.FindChildElem(_T("Nam")) );
Check( xml.GetChildData() == _T("D") );
// Copy Constructor Heap Test
#ifndef MARKUP_MSXML
StartCheckZone( _T("Copy Constructor Heap Test") );
Check( AfxCheckMemory() );
CMarkup xmlTest(xml);
Check( AfxCheckMemory() );
xmlTest.AddElem( _T("AfterCopyEmpty") );
Check( AfxCheckMemory() );
xmlTest.SetDoc( NULL );
xml = xmlTest;
xml.AddElem( _T("AfterCopyEmpty") );
Check( AfxCheckMemory() );
#endif
// CDATA Section Test
StartCheckZone( _T("CDATA Section Test") );
xml.SetDoc( NULL );
Check( xml.AddElem( _T("R") ) );
Check( xml.AddChildElem( _T("C") ) );
Check( xml.SetChildData( _T("a]]>b]]>c]]>d"), 1 ) );
Check( xml.GetChildData() == _T("a]]>b]]>c]]>d") );
Check( xml.IntoElem() );
Check( xml.SetData( _T("]]>"), 1 ) );
Check( xml.GetData() == _T("]]>") );
MCD_STR strCDATASubDoc = _T("<C><![CDATA[a]]>]]><![CDATA[a]]></C>");
Check( xml.AddSubDoc( strCDATASubDoc ) );
Check( xml.GetData() == _T("a]]>a") );
// Underscore tag name check
StartCheckZone( _T("Tag Name Test") );
xml.SetDoc( NULL );
Check( xml.AddElem( _T("_Underscore") ) );
MCD_STR strTagNameDoc = xml.GetDoc();
Check( xml.SetDoc( strTagNameDoc ) );
xml.FindElem();
Check( xml.GetTagName() == _T("_Underscore") );
// ORDER Test, simple XML example
StartCheckZone( _T("ORDER Test") );
xml.SetDoc( NULL );
Check( xml.AddElem( _T("ORDER") ) );
Check( xml.IntoElem() );
Check( xml.AddElem( _T("ITEM") ) );
Check( xml.AddChildElem( _T("NAME"), _T("carrots") ) );
Check( xml.AddChildElem( _T("QTY"), _T("1") ) );
Check( xml.AddChildElem( _T("PRICE"), _T(".98") ) );
Check( xml.AddChildAttrib( _T("unit"), _T("1 lb") ) );
Check( xml.AddElem( _T("ITEM") ) );
Check( xml.AddChildElem( _T("NAME"), _T("onions") ) );
Check( xml.AddChildElem( _T("QTY"), _T("1") ) );
Check( xml.AddChildElem( _T("PRICE"), _T("1.10") ) );
Check( xml.AddChildAttrib( _T("unit"), _T("3 lb bag") ) );
Check( xml.AddChildElem( _T("SUPPLIER"), _T("Hanover") ) );
// Create List
StartCheckZone( _T("List Test") );
MCD_STR strList;
xml.ResetPos();
Check( xml.FindElem( _T("ORDER") ) );
while ( xml.FindChildElem( _T("ITEM") ) )
{
xml.IntoElem();
xml.FindChildElem( _T("NAME") );
strList += xml.GetChildData();
strList += _T("\n");
#ifndef MARKUP_MSXML
xml.SavePos();
#endif
xml.OutOfElem();
}
#if ! defined( MARKUP_MSXML )
xml.RestorePos();
Check( xml.GetChildData() == _T("onions") );
#endif
Check( strList == _T("carrots\nonions\n") );
// December Test, add and remove five elements repeatedly
StartCheckZone( _T("December Test") );
struct TestData { _TCHAR* szName; _TCHAR* szValue; } td[] =
{
_T("patridge"), _T("PEARTREE"),
_T("2turtle"), _T("DOVES"),
_T("3french"), _T("HENS"),
_T("4calling"), _T("BIRDS"),
_T("5golden"), _T("RINGS"),
};
int nTD;
xml.SetDoc( _T("") );
Check( xml.AddElem( _T("RESULT") ) );
for ( nTD=0; nTD<=4; ++nTD )
{
xml.AddChildElem( _T("VAR"), td[nTD].szValue );
xml.SetChildAttrib( _T("name"), td[nTD].szName );
}
for ( nTD=0; nTD<=4; ++nTD )
{
xml.ResetPos();
while ( xml.FindChildElem( _T("VAR") ) )
if ( xml.GetChildAttrib( _T("name") ) == td[nTD].szName )
{
xml.RemoveChildElem();
break;
}
xml.AddChildElem( _T("VAR"), td[nTD].szValue );
xml.SetChildAttrib( _T("name"), td[nTD].szName );
}
for ( nTD=4; nTD>=0; --nTD )
{
xml.ResetPos();
while ( xml.FindChildElem( _T("VAR") ) )
if ( xml.GetChildAttrib( _T("name") ) == td[nTD].szName )
{
xml.RemoveChildElem();
break;
}
xml.ResetChildPos();
xml.AddChildElem( _T("VAR"), td[nTD].szValue );
xml.SetChildAttrib( _T("name"), td[nTD].szName );
}
// <RESULT>
// <VAR name="5golden">RINGS</VAR>
// <VAR name="4calling">BIRDS</VAR>
// <VAR name="3french">HENS</VAR>
// <VAR name="2turtle">DOVES</VAR>
// <VAR name="patridge">PEARTREE</VAR>
// </RESULT>
xml.ResetPos();
for ( nTD=4; nTD>=0; --nTD )
{
Check( xml.FindChildElem() );
Check( xml.GetChildData() == td[nTD].szValue );
Check( xml.GetChildAttrib( _T("name") ) == td[nTD].szName );
}
// Add Insert Test, test siblings created in correct sequence
_TCHAR* aszNums[] = { _T("zero"),_T("one"),_T("two"),_T("three"),_T("four"),_T("five"),_T("six") };
MCD_STR strInside = _T("_in6");
StartCheckZone( _T("Insert Test") );
xml.SetDoc( _T("") );
xml.AddElem( _T("root") );
xml.AddChildElem( aszNums[1] );
xml.ResetChildPos();
xml.AddChildElem( aszNums[3] );
xml.ResetChildPos();
xml.FindChildElem();
xml.InsertChildElem( aszNums[0] );
xml.RemoveChildElem();
xml.InsertChildElem( aszNums[0] );
xml.FindChildElem();
xml.AddChildElem( aszNums[2] );
xml.FindChildElem();
xml.AddChildElem( aszNums[4] );
xml.FindChildElem();
xml.AddChildElem( aszNums[5] );
xml.ResetChildPos();
xml.IntoElem();
xml.FindElem();
xml.RemoveElem();
xml.InsertElem( aszNums[0] );
xml.ResetMainPos();
xml.AddElem( aszNums[6] );
xml.IntoElem();
xml.AddElem( aszNums[1] + strInside );
xml.ResetMainPos();
xml.AddElem( aszNums[3] + strInside );
xml.ResetMainPos();
xml.FindElem();
xml.InsertElem( aszNums[0] + strInside );
xml.RemoveElem();
xml.ResetMainPos();
xml.InsertElem( aszNums[0] + strInside );
xml.FindElem();
xml.AddElem( aszNums[2] + strInside );
xml.FindElem();
xml.AddElem( aszNums[4] + strInside );
xml.FindElem();
xml.AddElem( aszNums[5] + strInside );
// Should result in the following (indented to illustrate):
// <root>
// <zero/>
// <one/>
// <two/>
// <three/>
// <four/>
// <five/>
// <six>
// <zero_in6/>
// <one_in6/>
// <two_in6/>
// <three_in6/>
// <four_in6/>
// <five_in6/>
// </six>
// </root>
xml.ResetPos();
for ( int nIT=0; nIT<7; ++nIT )
{
Check( xml.FindChildElem() );
Check( xml.IntoElem() );
Check( xml.GetTagName() == aszNums[nIT] );
if ( nIT == 6 )
{
for ( int nITinner=0; nITinner<6; ++nITinner )
{
Check( xml.FindChildElem() );
Check( xml.GetChildTagName() == aszNums[nITinner]+strInside );
}
}
Check( xml.OutOfElem() );
}
// Palmer Test
StartCheckZone( _T("Palmer Test") );
xml.SetDoc( _T("") );
Check( xml.AddElem( _T("one") ) );
Check( xml.AddChildElem( _T("two") ) );
Check( xml.RemoveChildElem() );
Check( xml.AddChildElem( _T("three") ) );
// <one>
// <three/>
// </one>
xml.ResetPos();
Check( xml.FindChildElem() );
Check( xml.GetChildTagName() == _T("three") );
// SetData Test, check empty elements, normal, and CDATA
StartCheckZone( _T("SetData Test") );
Check( xml.SetDoc( _T("<?xml version=\"1.0\"?>\r\n<ROOT>data</ROOT>") ) );
Check( xml.FindElem() );
xml.SetData( _T("moredata<>&") );
Check( xml.GetData() == _T("moredata<>&") );
xml.SetData( _T("n<6"), 1 );
Check( xml.GetData() == _T("n<6") );
xml.SetData( _T("") );
xml.AddChildElem( _T("CHILD") );
xml.SetChildData( _T("data<>&") );
Check( xml.GetChildData() == _T("data<>&") );
xml.SetChildData( _T("n<6"), 1 );
xml.InsertChildElem( _T("CHILD") );
xml.IntoElem();
Check( xml.SetData(_T("")) );
xml.SetData( _T("final") );
Check( xml.GetData() == _T("final") );
xml.FindElem();
Check( xml.GetData() == _T("n<6") );
// Car Test, add and replace randomly chosen attributes
StartCheckZone( _T("Random Car Part Test") );
struct CarTestData { _TCHAR* szLow; _TCHAR* szUp; _TCHAR* szMix; } aCT[] =
{
_T("up"), _T("SKY"), _T("Light"),
_T("down"), _T("FLOOR"), _T("Dust"),
_T("left"), _T("DOOR"), _T("Handle"),
_T("right"), _T("SEAT"), _T("Gear"),
_T("back"), _T("TRUNK"), _T("Tread"),
_T("forward"), _T("GRILL"), _T("Motor"),
_T(""), _T(""), _T("")
};
xml.SetDoc( _T("") );
xml.AddElem( _T("CAR") );
int nAt, nPart;
LPCTSTR szLow, szUp, szMix;
for ( nAt = 0; nAt < 20; ++nAt )
{
szLow = aCT[RandInt(6)].szLow;
szMix = aCT[RandInt(6)].szMix;
xml.SetAttrib( szLow, szMix );
Check( xml.GetAttrib(szLow) == szMix );
}
for ( nPart=0; nPart<100; ++nPart )
{
xml.AddChildElem( aCT[RandInt(6)].szUp );
for ( nAt = 0; nAt < 8; ++nAt )
{
szLow = aCT[RandInt(6)].szLow;
szMix = aCT[RandInt(6)].szMix;
xml.SetChildAttrib( szLow, szMix );
Check( xml.GetChildAttrib(szLow) == szMix );
}
szLow = aCT[RandInt(6)].szLow;
szUp = aCT[RandInt(6)].szUp;
xml.SetChildAttrib( szLow, szUp );
Check( xml.GetChildAttrib(szLow) == szUp );
}
MCD_STR strCarDoc = xml.GetDoc();
Check( xml.SetDoc( strCarDoc ) );
// Car Attrib Speed Test
StartCheckZone( _T("Car Attrib Speed Test") );
xml.SetDoc( NULL );
xml.AddElem( _T("CARSPEED") );
TimeStart();
for ( nPart=0; nPart<200; ++nPart )
{
xml.AddChildElem( aCT[RandInt(6)].szUp );
for ( nAt = 0; nAt < 4; ++nAt )
{
szLow = aCT[RandInt(6)].szLow;
szMix = aCT[RandInt(6)].szMix;
xml.SetChildAttrib( szLow, szMix );
szLow = aCT[RandInt(6)].szLow;
szUp = aCT[RandInt(6)].szUp;
xml.SetChildAttrib( szLow, szUp );
}
}
int nAttribCreateTime = TimeStop();
xml.ResetPos();
TimeStart();
MCD_STR strAttribName, strAttribs;
while ( xml.FindChildElem() )
{
xml.IntoElem();
nAt = 0;
MCD_STRCLEAR(strAttribs);
strAttribName = xml.GetAttribName( nAt );
while ( ! MCD_STRISEMPTY(strAttribName) )
{
strAttribs += xml.GetAttrib( strAttribName );
++nAt;
strAttribName = xml.GetAttribName( nAt );
}
xml.OutOfElem();
}
int nAttribNavTime = TimeStop();
if ( nAttribCreateTime > 400 || nAttribNavTime > 400 )
{
CString strAttribTime;
strAttribTime.Format( _T("Attribute Performance Results: create %d search %d\r\n"), nAttribCreateTime, nAttribNavTime );
m_csChecks += strAttribTime;
}
// SubDoc Test, use subdocument methods
StartCheckZone( _T("SubDoc Test") );
MCD_STR strTestAttrib = _T("<<&\"symb>>");
MCD_STR strSubDoc, strChildSubDoc;
xml.SetDoc( _T("") );
Check( xml.AddElem(_T("ORDER")) );
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -