/*! @file @id $Id: serialization_test.cxx 31 2009-04-28 07:36:07Z $ */ // 1 2 3 4 5 6 7 8 // 45678901234567890123456789012345678901234567890123456789012345678901234567890 #include #include #include #include #include #include #include class A: public xml::Serialize { public: xml::Optional _int; protected: void initXmlMembers() { className("A"); persist(_int, "int"); } }; class B: public xml::Serialize { public: xml::Optional _long; xml::Optional _short; protected: void initXmlMembers() { className("B"); persist(_long, "long"); persist(_short, "short"); } }; class B1: public B { public: xml::Optional _a1; xml::Optional _a2; xml::Optional _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("\n" "\t13\n" ""); std::string without(""); A a; CPPUNIT_ASSERT_EQUAL(std::string("\n" "\t\n" ""), 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("\n" "\t13\n" "\t\n" "\t\n" "\t\t42\n" "\t\n" ""); 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: "<