| 
									
										
										
										
											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; | 
					
						
							|  |  |  |  } |