irrlicht/tests/testXML.cpp

170 lines
4.2 KiB
C++

// Copyright (C) 2009-2012 Christian Stehno
// No rights reserved: this software is in the public domain.
#include "testUtils.h"
using namespace irr;
using namespace core;
bool simple_xml( irr::io::IFileSystem * fs )
{
io::IXMLReaderUTF8* reader = fs->createXMLReaderUTF8("media/test.xml");
if (!reader)
{
logTestString("Could not create XML reader.\n");
return false;
}
const core::stringc expected[] = {
"a", "b", "c"
};
bool retVal = true;
u32 i=0;
while(reader->read())
{
if (reader->getNodeType() == io::EXN_ELEMENT)
{
if (expected[i++] != reader->getNodeName())
{
logTestString("Did not find expected string in XML element name.\n");
retVal = false;
break;
}
}
}
reader->drop();
return retVal;
}
// CDATA should return everything between "![CDATA[" and "]]>" as it's in the file
bool cdata( irr::io::IFileSystem * fs )
{
io::IXMLReaderUTF8* reader = fs->createXMLReaderUTF8("media/cdata.xml");
if (!reader)
{
logTestString("Could not create XML reader.\n");
return false;
}
const core::stringc textNode("text");
core::array< core::stringc > compareStrings;
compareStrings.push_back("simple");
compareStrings.push_back("");
compareStrings.push_back("] ]> ");
compareStrings.push_back("]\n]> ");
compareStrings.push_back("\nNewlines\n\tand tabs\n\t\tgogogo");
compareStrings.push_back("&&#@#$%*()@#$%*()#$%*(");
compareStrings.push_back("& & && &&& &a &ü &ä &ö &&#");
bool result = true;
size_t count = 0;
while(reader->read())
{
if (reader->getNodeType() == io::EXN_ELEMENT)
{
if ( core::stringc(reader->getNodeName()) == textNode )
{
while(reader->read())
{
if (reader->getNodeType() == io::EXN_CDATA)
{
core::stringc data = reader->getNodeData();
core::stringc name = reader->getNodeName();
if ( count == compareStrings.size() )
{
logTestString("too many cdata elements for reading in %s:%d\n", __FILE__, __LINE__);
}
else if ( count < compareStrings.size() )
{
core::stringc cmpString(compareStrings[count]);
// some (unused) variables to ease debugging
// const c8* dataRaw = data.c_str();
// const c8* cmpRaw = cmpString.c_str();
if ( cmpString != data )
{
result = false;
logTestString("cdata read failed for string %d in %s:%d\n", count, __FILE__, __LINE__);
}
}
++count;
}
if ( reader->getNodeType() == io::EXN_ELEMENT_END )
{
break;
}
}
}
}
}
reader->drop();
return result;
}
bool attributeValues(irr::io::IFileSystem * fs)
{
io::IXMLReaderUTF8* reader = fs->createXMLReaderUTF8("media/attributes.xml");
if (!reader)
{
logTestString("Could not create XML reader.\n");
return false;
}
bool result = true;
bool hasNode = false;
while (reader->read())
{
if (io::EXN_ELEMENT == reader->getNodeType() )
{
if ( core::stringc(reader->getNodeName()) == core::stringc("element_position") )
{
hasNode = true;
int id1 = reader->getAttributeValueAsInt("id1");
if ( id1 != 152722522 )
{
logTestString("id1 is %d in %s:%d\n", id1, __FILE__, __LINE__);
result = false;
}
int id2 = reader->getAttributeValueAsInt("id2");
result &= id2 == 3;
int x = reader->getAttributeValueAsInt("x");
result &= x == 301;
int y = reader->getAttributeValueAsInt("y");
result &= y == 118;
}
}
}
if ( !hasNode )
{
logTestString("missing node in xml in %s:%d\n", __FILE__, __LINE__);
return false;
}
reader->drop();
return result;
}
/** Tests for XML handling */
bool testXML(void)
{
IrrlichtDevice *device = createDevice(video::EDT_NULL, dimension2du(400, 200));
bool result = true;
logTestString("Test simple XML reader features.\n");
result &= simple_xml(device->getFileSystem());
logTestString("Test XML reader CDATA support.\n");
result &= cdata(device->getFileSystem());
logTestString("Test XML reader attribute support.\n");
result &= attributeValues(device->getFileSystem());
device->closeDevice();
device->run();
device->drop();
return result;
}