irrlicht/tests/testXML.cpp
hybrid 3f47f80798 Added two macros to call tests for all drivers, or for all hw drivers, with just one call.
Added tests to check whether the driver supports the necessary features, and stop early if it does not make sense.
Fixed line endings for testXML.cpp

git-svn-id: svn://svn.code.sf.net/p/irrlicht/code/trunk@3819 dfc29bdd-3216-0410-991c-e03cc46cb475
2011-06-07 21:09:32 +00:00

170 lines
4.2 KiB
C++

// Copyright (C) 2009-2011 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;
}