⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 markupdlg.cpp

📁 MarkUP ,用于VC环境下
💻 CPP
📖 第 1 页 / 共 4 页
字号:
			{
				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]]>]]&gt;<![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 + -