]> git.saurik.com Git - wxWidgets.git/commitdiff
Fix wxXmlDocument::SetRoot() broken by recent changes.
authorVadim Zeitlin <vadim@wxwidgets.org>
Sun, 17 Apr 2011 00:09:45 +0000 (00:09 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Sun, 17 Apr 2011 00:09:45 +0000 (00:09 +0000)
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
tests/xml/xmltest.cpp

index 0e82fffd01181cfef98e95292364764c31d6efe5..f9209d0fffe7c6564ec0198dc6f4362a5bf383dd 100644 (file)
@@ -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)
index 30e959f6b59a4244e93d4b4c5f53261f3d04466e..0deaa5fed34f4e012abf75ca4576dcd8829376e5 100644 (file)
@@ -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() );
+}