X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/cee8636e94d49319b1c108d8b2d826e080e2e366..eceb6af1586b7ec760bcbc1aca01ca59e4cd1711:/tests/xml/xmltest.cpp?ds=sidebyside diff --git a/tests/xml/xmltest.cpp b/tests/xml/xmltest.cpp index 153b9bcc4c..ee41451a38 100644 --- a/tests/xml/xmltest.cpp +++ b/tests/xml/xmltest.cpp @@ -34,7 +34,7 @@ namespace { -void CheckXml(const wxScopedPtr& n, ...) +void CheckXml(const wxXmlNode *n, ...) { va_list args; va_start(args, n); @@ -50,7 +50,7 @@ void CheckXml(const wxScopedPtr& n, ...) CPPUNIT_ASSERT( child ); CPPUNIT_ASSERT_EQUAL( childName, child->GetName() ); CPPUNIT_ASSERT( child->GetChildren() == NULL ); - CPPUNIT_ASSERT( child->GetParent() == n.get() ); + CPPUNIT_ASSERT( child->GetParent() == n ); child = child->GetNext(); } @@ -81,6 +81,7 @@ private: CPPUNIT_TEST( Escaping ); CPPUNIT_TEST( DetachRoot ); CPPUNIT_TEST( AppendToProlog ); + CPPUNIT_TEST( SetRoot ); CPPUNIT_TEST_SUITE_END(); void InsertChild(); @@ -91,6 +92,7 @@ private: void Escaping(); void DetachRoot(); void AppendToProlog(); + void SetRoot(); DECLARE_NO_COPY_CLASS(XmlTestCase) }; @@ -98,7 +100,7 @@ private: // register in the unnamed registry so that these tests are run by default CPPUNIT_TEST_SUITE_REGISTRATION( XmlTestCase ); -// also include in it's own registry so that these tests can be run alone +// also include in its own registry so that these tests can be run alone CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( XmlTestCase, "XmlTestCase" ); void XmlTestCase::InsertChild() @@ -108,17 +110,17 @@ void XmlTestCase::InsertChild() wxXmlNode *two = new wxXmlNode(wxXML_ELEMENT_NODE, "2"); root->AddChild(two); root->AddChild(new wxXmlNode(wxXML_ELEMENT_NODE, "3")); - CheckXml(root, "1", "2", "3", NULL); + CheckXml(root.get(), "1", "2", "3", NULL); // check inserting in front: root->InsertChild(new wxXmlNode(wxXML_ELEMENT_NODE, "A"), NULL); - CheckXml(root, "A", "1", "2", "3", NULL); + CheckXml(root.get(), "A", "1", "2", "3", NULL); root->InsertChild(new wxXmlNode(wxXML_ELEMENT_NODE, "B"), root->GetChildren()); - CheckXml(root, "B", "A", "1", "2", "3", NULL); + CheckXml(root.get(), "B", "A", "1", "2", "3", NULL); // and in the middle: root->InsertChild(new wxXmlNode(wxXML_ELEMENT_NODE, "C"), two); - CheckXml(root, "B", "A", "1", "C", "2", "3", NULL); + CheckXml(root.get(), "B", "A", "1", "C", "2", "3", NULL); } void XmlTestCase::InsertChildAfter() @@ -126,23 +128,23 @@ void XmlTestCase::InsertChildAfter() wxScopedPtr root(new wxXmlNode(wxXML_ELEMENT_NODE, "root")); root->InsertChildAfter(new wxXmlNode(wxXML_ELEMENT_NODE, "1"), NULL); - CheckXml(root, "1", NULL); + CheckXml(root.get(), "1", NULL); wxXmlNode *two = new wxXmlNode(wxXML_ELEMENT_NODE, "2"); root->AddChild(two); wxXmlNode *three = new wxXmlNode(wxXML_ELEMENT_NODE, "3"); root->AddChild(three); - CheckXml(root, "1", "2", "3", NULL); + CheckXml(root.get(), "1", "2", "3", NULL); // check inserting in the middle: root->InsertChildAfter(new wxXmlNode(wxXML_ELEMENT_NODE, "A"), root->GetChildren()); - CheckXml(root, "1", "A", "2", "3", NULL); + CheckXml(root.get(), "1", "A", "2", "3", NULL); root->InsertChildAfter(new wxXmlNode(wxXML_ELEMENT_NODE, "B"), two); - CheckXml(root, "1", "A", "2", "B", "3", NULL); + CheckXml(root.get(), "1", "A", "2", "B", "3", NULL); // and at the end: root->InsertChildAfter(new wxXmlNode(wxXML_ELEMENT_NODE, "C"), three); - CheckXml(root, "1", "A", "2", "B", "3", "C", NULL); + CheckXml(root.get(), "1", "A", "2", "B", "3", "C", NULL); } void XmlTestCase::LoadSave() @@ -424,3 +426,46 @@ void XmlTestCase::AppendToProlog() ; CPPUNIT_ASSERT_EQUAL( xmlTextResult, sos.GetString() ); } + +void XmlTestCase::SetRoot() +{ + wxXmlDocument doc; + CPPUNIT_ASSERT( !doc.IsOk() ); + wxXmlNode *root = new wxXmlNode(wxXML_ELEMENT_NODE, "root"); + + // Test for the problem of http://trac.wxwidgets.org/ticket/13135 + doc.SetRoot( root ); + wxXmlNode *docNode = doc.GetDocumentNode(); + CPPUNIT_ASSERT( docNode && root == docNode->GetChildren() ); + CPPUNIT_ASSERT( doc.IsOk() ); + + // Other tests. + CPPUNIT_ASSERT( docNode == root->GetParent() ); + doc.SetRoot(NULL); // Removes from doc but dosn't free mem, doc node left. + CPPUNIT_ASSERT( !doc.IsOk() ); + + wxXmlNode *comment = new wxXmlNode(wxXML_COMMENT_NODE, "comment", "Prolog Comment"); + wxXmlNode *pi = new wxXmlNode(wxXML_PI_NODE, "target", "PI instructions"); + doc.AppendToProlog(comment); + doc.SetRoot( root ); + doc.AppendToProlog(pi); + CPPUNIT_ASSERT( doc.IsOk() ); + wxXmlNode *node = docNode->GetChildren(); + CPPUNIT_ASSERT( node ); + CPPUNIT_ASSERT( node->GetType() == wxXML_COMMENT_NODE ); + CPPUNIT_ASSERT( node->GetParent() == docNode ); + node = node->GetNext(); + CPPUNIT_ASSERT( node ); + CPPUNIT_ASSERT( node->GetType() == wxXML_PI_NODE ); + CPPUNIT_ASSERT( node->GetParent() == docNode ); + node = node->GetNext(); + CPPUNIT_ASSERT( node ); + CPPUNIT_ASSERT( node->GetType() == wxXML_ELEMENT_NODE ); + CPPUNIT_ASSERT( node->GetParent() == docNode ); + node = node->GetNext(); + CPPUNIT_ASSERT( !node ); + doc.SetRoot(NULL); + CPPUNIT_ASSERT( !doc.IsOk() ); + doc.SetRoot(root); + CPPUNIT_ASSERT( doc.IsOk() ); +}