closes #1
parent
f17c1d5995
commit
2860cdf5ec
7 changed files with 277 additions and 52 deletions
@ -0,0 +1,46 @@ |
||||
/*! @file
|
||||
|
||||
@id $Id$ |
||||
*/ |
||||
// 1 2 3 4 5 6 7 8
|
||||
// 45678901234567890123456789012345678901234567890123456789012345678901234567890
|
||||
|
||||
#include <xml-cxx/xml.hxx> |
||||
#include <iostream> |
||||
#include <sstream> |
||||
|
||||
class A: public xml::Serialize { |
||||
public: |
||||
xml::Optional<int> a; |
||||
xml::Optional<std::string> txt; |
||||
protected: |
||||
void initXmlMembers() { |
||||
className("A"); |
||||
persist(a, "a"); |
||||
persist(txt, "txt"); |
||||
} |
||||
}; |
||||
|
||||
class B: public xml::Serialize { |
||||
public: |
||||
xml::Optional<A> a; |
||||
xml::Optional<int> i; |
||||
xml::Optional<std::string> txt; |
||||
protected: |
||||
void initXmlMembers() { |
||||
className("B"); |
||||
persist(a, "a"); |
||||
persist(i, "i"); |
||||
persist(txt, "txt"); |
||||
} |
||||
}; |
||||
|
||||
int main(int, char**) { |
||||
{ // Serialization as a member
|
||||
std::stringstream ss("<B/>"); |
||||
B b; |
||||
b.loadXml(ss); |
||||
b.saveXml(std::cout)<<std::endl; |
||||
} |
||||
return 0; |
||||
} |
@ -0,0 +1,118 @@ |
||||
/*! @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; |
||||
//runner.setOutputter(new CppUnit::XmlOutputter(&runner.result(), ofs));
|
||||
runner.addTest(CppUnit::TestFactoryRegistry::getRegistry().makeTest()); |
||||
return runner.run() ? 0 : 1; |
||||
} catch (std::exception& e) { |
||||
std::cerr<<"***Exception: "<<e.what()<<std::endl; |
||||
return 1; |
||||
} |
Loading…
Reference in new issue