📄 markupdlg.cpp
字号:
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() );
#if defined( MARKUP_STL )
CMarkupSTL xmlTest(xml);
#else
CMarkup xmlTest(xml);
#endif
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("]]>") );
CString csCDATASubDoc = _CSTR( xml.GetSubDoc() );
csCDATASubDoc.TrimRight();
Check( csCDATASubDoc == _T("<C><![CDATA[]]]]><![CDATA[>]]></C>") );
csCDATASubDoc = _T("<C><![CDATA[a]]>]]><![CDATA[a]]></C>");
Check( xml.AddSubDoc( csCDATASubDoc ) );
Check( xml.GetData() == _T("a]]>a") );
// Underscore tag name check
StartCheckZone( _T("Tag Name Test") );
xml.SetDoc( NULL );
Check( xml.AddElem( _T("_Underscore") ) );
CString csTagNameDoc = _CSTR(xml.GetDoc());
Check( xml.SetDoc( csTagNameDoc ) );
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") );
CString csList;
xml.ResetPos();
Check( xml.FindElem( _T("ORDER") ) );
while ( xml.FindChildElem( _T("ITEM") ) )
{
xml.IntoElem();
xml.FindChildElem( _T("NAME") );
csList += _CSTR(xml.GetChildData());
csList += _T("\n");
#ifndef MARKUP_MSXML
xml.SavePos();
#endif
xml.OutOfElem();
}
#if ! defined( MARKUP_MSXML )
xml.RestorePos();
Check( xml.GetChildData() == _T("onions") );
#endif
Check( csList == _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") };
CString csInside = _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] + csInside );
xml.ResetMainPos();
xml.AddElem( aszNums[3] + csInside );
xml.ResetMainPos();
xml.FindElem();
xml.InsertElem( aszNums[0] + csInside );
xml.RemoveElem();
xml.ResetMainPos();
xml.InsertElem( aszNums[0] + csInside );
xml.FindElem();
xml.AddElem( aszNums[2] + csInside );
xml.FindElem();
xml.AddElem( aszNums[4] + csInside );
xml.FindElem();
xml.AddElem( aszNums[5] + csInside );
// 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( _CSTR(xml.GetChildTagName()) == CString(aszNums[nITinner])+csInside );
}
}
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 );
}
CString csCarDoc = _CSTR(xml.GetDoc());
Check( xml.SetDoc( csCarDoc ) );
// 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();
CString csAttribName, csAttribs;
while ( xml.FindChildElem() )
{
xml.IntoElem();
nAt = 0;
csAttribs.Empty();
csAttribName = _CSTR(xml.GetAttribName( nAt ));
while ( ! csAttribName.IsEmpty() )
{
csAttribs += _CSTR(xml.GetAttrib( csAttribName ));
++nAt;
csAttribName = _CSTR(xml.GetAttribName( nAt ));
}
xml.OutOfElem();
}
int nAttribNavTime = TimeStop();
if ( nAttribCreateTime > 400 || nAttribNavTime > 400 )
{
CString csAttribTime;
csAttribTime.Format( _T("Attribute Performance Results: create %d search %d\r\n"), nAttribCreateTime, nAttribNavTime );
m_csChecks += csAttribTime;
}
// SubDoc Test, use subdocument methods
StartCheckZone( _T("SubDoc Test") );
CString csTestAttrib = _T("<<&\"symb>>");
CString csSubDoc, csChildSubDoc;
xml.SetDoc( _T("") );
Check( xml.AddElem(_T("ORDER")) );
xml.AddChildElem( _T("ITEM") );
xml.IntoElem();
Check( xml.AddChildSubDoc(_T("<?xml version=\"1.0\"?>\r\n<ITEM/>\r\n")) );
Check( xml.AddChildAttrib(_T("test"), csTestAttrib) );
Check( xml.IntoElem() );
Check( xml.AddChildElem(_T("NAME"), _T("carrots")) );
Check( xml.AddChildElem(_T("QTY"), _T("1")) );
csSubDoc = _CSTR(xml.GetSubDoc());
Check( xml.OutOfElem() );
csChildSubDoc = _CSTR(xml.GetChildSubDoc());
Check( csSubDoc == csChildSubDoc );
// Set xml2 from xml subdocument and modify
Check( xml2.SetDoc(_CSTR(xml.GetChildSubDoc())) );
Check( xml2.FindElem() );
Check( xml2.SetAttrib(_T("subtest"), csTestAttrib) );
Check( xml2.SetAttrib(_T("test"), _T("")) );
Check( xml2.FindChildElem(_T("QTY")) );
Check( xml2.RemoveChildElem() );
csSubDoc = _CSTR(xml2.GetDoc());
#if ! defined( MARKUP_MSXML )
// MSXML: Invalid subdocument causes first-chance exception
// It works, but this #ifdef avoids alarming us with the Debug output
Check( ! xml.AddChildSubDoc(_T("invalidsub<doc>")) );
#endif
Check( xml.AddChildSubDoc(csSubDoc) );
Check( xml.IntoElem() );
Check( xml.RemoveElem() );
Check( xml.AddSubDoc(csSubDoc) );
Check( _CSTR(xml.GetAttrib(_T("subtest"))) == csTestAttrib );
Check( xml.OutOfElem() );
Check( xml.InsertChildSubDoc(csSubDoc) );
xml.ResetChildPos();
Check( xml.InsertChildSubDoc(csSubDoc) );
xml.IntoElem();
xml.FindChildElem();
Check( xml.GetChildData() == _T("carrots") );
// Brannan Test: subdocument with no children getting flagged as empty in 7.0
xml.ResetChildPos();
xml.FindElem();
xml.FindChildElem( _T("QTY") );
xml.AddChildSubDoc( _CSTR(xml.GetChildSubDoc()) );
Check( xml.GetChildData() == _T("1") );
// Comments Test, make sure it bypasses declaration, DTD, and comments
StartCheckZone( _T("Comments Test") );
CString csPTDoc =
_T("<?xml version=\"1.0\"?>\n")
_T("<!DOCTYPE PARSETEST [\n")
_T("<!ELEMENT PARSETEST (ITEM*)>\n")
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -