📄 parsertest.cpp
字号:
/*
* Contains unit tests for the EAXP XML/SAX parser
*/
#include <e32base.h>
#include <e32cons.h>
#include <e32svr.h>
#include "ParserTest.h"
#include "eaxp_dom.h"
LOCAL_D CEAXPParser* parser;
CSAXListener::CSAXListener()
{
}
void CSAXListener::StartElement(const TDesC &aName,
const TDesC &aNamespace,
const RAttributeList &aAttrList)
{
RDebug::Print(_L("StartElement(): name: %S, namespace: %S"), &aName, &aNamespace);
for( TInt i = 0; i < aAttrList.Count(); i++ ) {
const CAttribute *attr = aAttrList[i];
RDebug::Print(_L("attr %d: name=%S, ns=%S, value=%S"),
i, &(attr->GetName()), &(attr->GetNamespace()), &(attr->GetValue()));
}
}
void CSAXListener::EndElement(const TDesC &aName, const TDesC &aNamespace)
{
RDebug::Print(_L("EndElement(): name: '%S', namespace: '%S'"), &aName, &aNamespace);
}
void CSAXListener::FreeText(const TDesC &aText)
{
RDebug::Print(_L("FreeText(): '%S'"), &aText);
}
void CSAXListener::ParsingError(const TDesC &aReason)
{
RDebug::Print(_L("ParsingError(): %S"), &aReason);
}
void CSAXListener::Comment( const TDesC& aCommentText )
{
RDebug::Print(_L("Comment(): '%S'"), &aCommentText );
}
void RunTestL(const TDesC &aXML, TBool aShouldSucceed)
{
RDebug::Print(_L("Testing XML: %S"), &aXML);
if( parser->ParseL(aXML) != aShouldSucceed ) {
RDebug::Print(_L("-> FAILED!"));
} else {
RDebug::Print(_L("-> OK"));
}
}
////////////////////////
// THE TEST CASES
////////////////////////
void RunDomTest1L()
{
__UHEAP_MARK;
CDomDocumentNode* document = CDomDocumentNode::NewLC();
CDomElementNode* root = CDomElementNode::NewLC( _L("Kala"), _L("myns") );
document->AddChildL( root );
CleanupStack::Pop( root );
root->AddAttributeL( _L("attr1"), _L("ns1"), _L("value <>&\"\' ends.") );
CDomTextNode* text = CDomTextNode::NewLC( _L("Text node <>&\"\' ends.") );
root->AddChildL( text );
CleanupStack::Pop( text );
HBufC* xml = document->GetXmlLC();
RDebug::Print( _L("XML=%S"), xml );
CleanupStack::PopAndDestroy( xml );
CleanupStack::PopAndDestroy( document );
__UHEAP_MARKEND;
}
// OK:
_LIT(KTestOK1, "<ns1:tag1>\n<tag2 attr2=\"kissa\" k=\"p\"/>\n</ns1:tag1>\n");
_LIT(KTestOK2, "<a b=\"kala\" c=\"kissa\" />\n<dg/>");
_LIT(KTestOK3, "\n<a>Kissa kala Koira!</a>\n<b>Foo bar </b> orror\n");
_LIT(KTestOK4, "<?xml version=\"1.0\"?>\n<abc><def></def>Test</abc>");
_LIT(KTestOK5, "<a>Pete & Mary do "stuff"</a>");
_LIT(KTestOK6, "<a b=\"Vodka & beer!\" >'Stuff'</a>");
_LIT(KTestOK7, "<a><![CDATA[room \"for\" <free> [&text&]!]]></a>");
_LIT(KTestOK8, "<tag my-ns:attr=\"xsd:string\" />");
_LIT(KTestOK9, "\n<a\n attr1=\"kala\"\n attr2=\""kissa"\"\n />\n");
_LIT(KTestOK10, "<a ns1:arg=\"first\n\n\n second\nthird\"/>");
_LIT(KTestOK11, "<a><![CDATA[hula\n\nbaloo!<kissa\"koira>kala/]]></a>");
_LIT(KTestOK12, "<a><![CDATA[kissa;kala\nkoira:kissa!;kala]]></a>");
_LIT(KTestOK13, "<a attr1=\"wtf can't this handle; that semicolon?\" />");
_LIT(KTestOK14, "<a><!-- simple comment --></a>\n" );
_LIT(KTestOK15, "<?xml version=\"1.0\"?>\n \n<!-- this is\na multiline\ncomment -->\n<node />\n");
// fail:
_LIT(KTestFail1, "<t attr=\"kis>sa\" />");
_LIT(KTestFail2, "<a><b:> kissa</b:></a>");
_LIT(KTestFail3, "<:a><ti/></:a>");
_LIT(KTestFail4, "<a>\n<b>Bad escape: &fails;</b></a>");
_LIT(KTestFail5, "< a/>");
_LIT(KTestFail6, "<a>Bad end tag< /a>");
void RunAllTestsL()
{
RunTestL(KTestOK1, ETrue);
RunTestL(KTestOK2, ETrue);
RunTestL(KTestOK3, ETrue);
RunTestL(KTestOK4, ETrue);
RunTestL(KTestOK5, ETrue);
RunTestL(KTestOK6, ETrue);
RunTestL(KTestOK7, ETrue);
RunTestL(KTestOK8, ETrue);
RunTestL(KTestOK9, ETrue);
RunTestL(KTestOK10, ETrue);
RunTestL(KTestOK11, ETrue);
RunTestL(KTestOK12, ETrue);
RunTestL(KTestOK13, ETrue);
RunTestL(KTestOK14, ETrue);
RunTestL(KTestOK15, ETrue);
RunTestL(KTestFail1, EFalse);
RunTestL(KTestFail2, EFalse);
RunTestL(KTestFail3, EFalse);
RunTestL(KTestFail4, EFalse);
RunTestL(KTestFail5, EFalse);
RunTestL(KTestFail6, EFalse);
RunDomTest1L();
}
void MainImplL()
{
__UHEAP_MARK;
CSAXListener *listener = new (ELeave) CSAXListener();
CleanupStack::PushL(listener);
__UHEAP_MARK;
parser = CEAXPParser::NewLC(*listener);
__UHEAP_MARK;
TRAPD(error, RunAllTestsL());
if( error != KErrNone ) {
RDebug::Print(_L("error: %d"), error);
}
__UHEAP_MARKEND;
CleanupStack::PopAndDestroy(); // parser
__UHEAP_MARKEND;
CleanupStack::PopAndDestroy(); // listener
__UHEAP_MARKEND;
}
GLDEF_C TInt E32Main()
{
__UHEAP_MARK;
CTrapCleanup* cleanup = CTrapCleanup::New();
TRAPD(err, MainImplL());
delete cleanup;
__UHEAP_MARKEND;
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -