2009-05-06 07:13:50 +00:00
|
|
|
/*! @file
|
|
|
|
|
|
|
|
@id $Id: serialization_test.cxx 31 2009-04-28 07:36:07Z $
|
|
|
|
*/
|
|
|
|
// 1 2 3 4 5 6 7 8
|
|
|
|
// 45678901234567890123456789012345678901234567890123456789012345678901234567890
|
|
|
|
|
|
|
|
#include <xml-cxx/xml.hxx>
|
|
|
|
#include <cppunit/TestFixture.h>
|
|
|
|
#include <cppunit/ui/text/TestRunner.h>
|
|
|
|
#include <cppunit/extensions/HelperMacros.h>
|
|
|
|
#include <cppunit/extensions/TestFactoryRegistry.h>
|
|
|
|
#include <cppunit/XmlOutputter.h>
|
|
|
|
#include <fstream>
|
|
|
|
|
|
|
|
class A: public xml::Serialize {
|
|
|
|
public:
|
|
|
|
xml::Optional<int> _int;
|
|
|
|
protected:
|
|
|
|
void initXmlMembers() {
|
|
|
|
className("A");
|
|
|
|
persist(_int, "int");
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
class B: public xml::Serialize {
|
|
|
|
public:
|
|
|
|
xml::Optional<long> _long;
|
|
|
|
xml::Optional<short> _short;
|
|
|
|
protected:
|
|
|
|
void initXmlMembers() {
|
|
|
|
className("B");
|
|
|
|
persist(_long, "long");
|
|
|
|
persist(_short, "short");
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
class B1: public B {
|
|
|
|
public:
|
|
|
|
xml::Optional<A> _a1;
|
|
|
|
xml::Optional<A> _a2;
|
|
|
|
xml::Optional<A> _a3;
|
|
|
|
protected:
|
|
|
|
void initXmlMembers() {
|
|
|
|
B::initXmlMembers();
|
|
|
|
className("B1");
|
|
|
|
persist(_a1, "a1");
|
|
|
|
persist(_a2, "a2");
|
|
|
|
persist(_a3, "a3");
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
class OptionalSerializationTest: public CppUnit::TestFixture {
|
|
|
|
public:
|
|
|
|
void checkOptional() {
|
|
|
|
std::string with("<A>\n"
|
|
|
|
"\t<int>13</int>\n"
|
|
|
|
"</A>");
|
|
|
|
std::string without("<A/>");
|
|
|
|
A a;
|
|
|
|
CPPUNIT_ASSERT_EQUAL(std::string("<A>\n"
|
|
|
|
"\t<int/>\n"
|
|
|
|
"</A>"), a.schema());
|
|
|
|
std::stringstream ss1a(with);
|
|
|
|
CPPUNIT_ASSERT_NO_THROW(a.loadXml(ss1a));
|
|
|
|
CPPUNIT_ASSERT_EQUAL(true, (bool)a._int);
|
|
|
|
CPPUNIT_ASSERT_EQUAL(13, *a._int);
|
|
|
|
std::stringstream ss1b;
|
|
|
|
CPPUNIT_ASSERT_NO_THROW(a.saveXml(ss1b));
|
|
|
|
CPPUNIT_ASSERT_EQUAL(with, ss1b.str());
|
|
|
|
std::stringstream ss2a(without);
|
|
|
|
CPPUNIT_ASSERT_NO_THROW(a.loadXml(ss2a));
|
|
|
|
CPPUNIT_ASSERT_EQUAL(false, (bool)a._int);
|
|
|
|
std::stringstream ss2b;
|
|
|
|
CPPUNIT_ASSERT_NO_THROW(a.saveXml(ss2b));
|
|
|
|
CPPUNIT_ASSERT_EQUAL(without, ss2b.str());
|
|
|
|
}
|
|
|
|
void checkMoreOptional() {
|
|
|
|
std::string first("<B1>\n"
|
|
|
|
"\t<short>13</short>\n"
|
|
|
|
"\t<a2/>\n"
|
|
|
|
"\t<a3>\n"
|
|
|
|
"\t\t<int>42</int>\n"
|
|
|
|
"\t</a3>\n"
|
|
|
|
"</B1>");
|
|
|
|
B1 b;
|
|
|
|
std::stringstream ifirst(first);
|
|
|
|
CPPUNIT_ASSERT_NO_THROW(b.loadXml(ifirst));
|
|
|
|
CPPUNIT_ASSERT_EQUAL(false, (bool)b._long);
|
|
|
|
CPPUNIT_ASSERT_EQUAL(true, (bool)b._short);
|
|
|
|
CPPUNIT_ASSERT_EQUAL((short)13, *b._short);
|
|
|
|
CPPUNIT_ASSERT_EQUAL(false, (bool)b._a1);
|
|
|
|
CPPUNIT_ASSERT_EQUAL(true, (bool)b._a2);
|
|
|
|
CPPUNIT_ASSERT_EQUAL(false, (bool)b._a2->_int);
|
|
|
|
CPPUNIT_ASSERT_EQUAL(true, (bool)b._a3);
|
|
|
|
CPPUNIT_ASSERT_EQUAL(true, (bool)b._a3->_int);
|
|
|
|
CPPUNIT_ASSERT_EQUAL(42, *b._a3->_int);
|
|
|
|
std::stringstream ofirst;
|
|
|
|
CPPUNIT_ASSERT_NO_THROW(b.saveXml(ofirst));
|
|
|
|
CPPUNIT_ASSERT_EQUAL(first, ofirst.str());
|
|
|
|
}
|
|
|
|
CPPUNIT_TEST_SUITE(OptionalSerializationTest);
|
|
|
|
CPPUNIT_TEST(checkOptional);
|
|
|
|
CPPUNIT_TEST(checkMoreOptional);
|
|
|
|
CPPUNIT_TEST_SUITE_END();
|
|
|
|
};
|
|
|
|
CPPUNIT_TEST_SUITE_REGISTRATION(OptionalSerializationTest);
|
|
|
|
|
|
|
|
int main(int argc, char** argv) try {
|
|
|
|
std::ofstream ofs((*argv+std::string(".xml")).c_str());
|
|
|
|
CppUnit::TextUi::TestRunner runner;
|
2011-11-18 16:02:55 +00:00
|
|
|
runner.setOutputter(new CppUnit::XmlOutputter(&runner.result(), ofs));
|
2009-05-06 07:13:50 +00:00
|
|
|
runner.addTest(CppUnit::TestFactoryRegistry::getRegistry().makeTest());
|
|
|
|
return runner.run() ? 0 : 1;
|
|
|
|
} catch (std::exception& e) {
|
|
|
|
std::cerr<<"***Exception: "<<e.what()<<std::endl;
|
|
|
|
return 1;
|
|
|
|
}
|