From 6f24b81707fe53df2e2458ea928e071712f3bc72 Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Sun, 17 Apr 2011 00:09:45 +0000 Subject: [PATCH] Fix wxXmlDocument::SetRoot() broken by recent changes. Support for wxXML_PI_NODE introduced in r67346 broke SetRoot() and, because of this, saving XML documents. Correct this and add a unit test for this method. Closes #13135. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@67519 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- src/xml/xml.cpp | 12 ++++++++++-- tests/xml/xmltest.cpp | 45 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 55 insertions(+), 2 deletions(-) diff --git a/src/xml/xml.cpp b/src/xml/xml.cpp index 0e82fffd01..f9209d0fff 100644 --- a/src/xml/xml.cpp +++ b/src/xml/xml.cpp @@ -505,6 +505,12 @@ wxXmlNode *wxXmlDocument::DetachRoot() void wxXmlDocument::SetRoot(wxXmlNode *root) { + if (root) + { + wxASSERT_MSG( root->GetType() == wxXML_ELEMENT_NODE, + "Can only set an element type node as root" ); + } + wxXmlNode *node = m_docNode; if (node) { @@ -515,7 +521,7 @@ void wxXmlDocument::SetRoot(wxXmlNode *root) prev = node; node = node->GetNext(); } - if (node) + if (node && root) { root->SetNext( node->GetNext() ); wxDELETE(node); @@ -528,8 +534,10 @@ void wxXmlDocument::SetRoot(wxXmlNode *root) else { m_docNode = new wxXmlNode(wxXML_DOCUMENT_NODE, wxEmptyString); + m_docNode->SetChildren(root); } - root->SetParent(m_docNode); + if (root) + root->SetParent(m_docNode); } void wxXmlDocument::AppendToProlog(wxXmlNode *node) diff --git a/tests/xml/xmltest.cpp b/tests/xml/xmltest.cpp index 30e959f6b5..0deaa5fed3 100644 --- a/tests/xml/xmltest.cpp +++ b/tests/xml/xmltest.cpp @@ -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) }; @@ -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() ); +} -- 2.47.2