[gxml] Fixed GXml.TwDocument writer to use default NS prefix when enable



commit 2966a5a196dd831aa189ba4ab7da3ab1bd09362f
Author: Daniel Espinosa <esodan gmail com>
Date:   Wed May 13 13:09:02 2015 -0500

    Fixed GXml.TwDocument writer to use default NS prefix when enable
    
    * Set GXml.Document.prefix_default_ns to true makes all children
      nodes, including root, adds default document's namespace's prefix

 gxml/TwDocument.vala    |   20 +++++--
 test/TwElementTest.vala |  125 +++++++++++++++++++++++++++++++++++++++++++++--
 2 files changed, 135 insertions(+), 10 deletions(-)
---
diff --git a/gxml/TwDocument.vala b/gxml/TwDocument.vala
index 6c2119c..7f6bdcc 100644
--- a/gxml/TwDocument.vala
+++ b/gxml/TwDocument.vala
@@ -164,17 +164,25 @@ public class GXml.TwDocument : GXml.TwNode, GXml.Document
 #if DEBUG
       GLib.message ("Starting Element: start with NS");
 #endif
-          if (node.document.namespaces.first ().uri == node.ns_uri () && !node.document.prefix_default_ns) {
-            // Don't prefix. Using default namespace and prefix_default_ns = false
-            tw.start_element (node.name);
+          if (node.document.namespaces.first ().uri == node.ns_uri ()) {
+            if (node.document.prefix_default_ns)  // Default NS at root element
+              tw.start_element_ns (node.ns_prefix (), node.name, null);
+            else // Don't prefix. Using default namespace and prefix_default_ns = false
+              tw.start_element (node.name);
           }
           else
-            tw.start_element_ns (node.ns_prefix (), node.name, node.ns_uri ());
+            if (node.document.ns_top)
+              tw.start_element_ns (node.ns_prefix (), node.name, null);
+            else
+              tw.start_element_ns (node.ns_prefix (), node.name, node.ns_uri ());
         } else {
 #if DEBUG
-      GLib.message ("Starting Element: start no NS");
+      GLib.message ("Starting Element: start no NS: Check for default prefix_default_ns enabled");
 #endif
-          tw.start_element (node.name);
+          if (node.document.prefix_default_ns)
+            tw.start_element_ns (node.document.ns_prefix (), node.name, null);
+          else
+            tw.start_element (node.name);
         }
       }
 #if DEBUG
diff --git a/test/TwElementTest.vala b/test/TwElementTest.vala
index 4cf4c86..48cf64a 100644
--- a/test/TwElementTest.vala
+++ b/test/TwElementTest.vala
@@ -228,7 +228,86 @@ class TwElementTest : GXmlTest {
                        assert ("<childrenons/>" in str);
                        assert ("</ns:nons>" in str);
                        assert ("</dg:child>" in str);
-               });/*
+               });
+               Test.add_func ("/gxml/tw-element/multiple-namespaces/enable-prefix_default_ns", () => {
+                       var d = new TwDocument ();
+                       var r = d.create_element ("root");
+                       d.childs.add (r);
+                       d.prefix_default_ns = true;
+                       d.set_namespace ("http://git.gnome.org/browse/gxml";, "gxml");
+                       r.set_namespace ("http://git.gnome.org/browse/gxml";, "gxml");
+                       var e = d.create_element ("child");
+                       r.childs.add (e);
+                       assert (r.namespaces.size == 1);
+                       assert (d.namespaces.size == 1);
+                       e.set_namespace ("http://developer.gnome.org/";, "dg");
+                       assert (e.namespaces.size == 1);
+                       assert (r.namespaces.size == 1);
+                       assert (d.namespaces.size == 2);
+                       var e2 = d.create_element ("nons");
+                       e.childs.add (e2);
+                       e2.set_namespace ("http://www.gnome.org/";, "ns");
+                       assert (e.namespaces.size == 1);
+                       assert (r.namespaces.size == 1);
+                       assert (e2.namespaces.size == 1);
+                       assert (d.namespaces.size == 3);
+                       var e22 = d.create_element ("nonsd");
+                       e2.childs.add (e22);
+                       string str = d.to_string ();
+#if DEBUG
+                       GLib.message (@"$d");
+#endif
+                       assert ("<gxml:root xmlns:gxml=\"http://git.gnome.org/browse/gxml\";>" in str);
+                       assert ("</gxml:root>" in str);
+                       assert ("<dg:child xmlns:dg=\"http://developer.gnome.org/\";>" in str);
+                       assert ("<ns:nons xmlns:ns=\"http://www.gnome.org/\";>" in str);
+                       assert ("</ns:nons>" in str);
+                       assert ("<gxml:nonsd/>" in str);
+               });
+               Test.add_func ("/gxml/tw-element/multiple-namespaces/default", () => {
+                       var d = new TwDocument ();
+                       var r = d.create_element ("root");
+                       d.childs.add (r);
+                       // Default NS
+                       d.set_namespace ("http://git.gnome.org/browse/gxml";, null);
+                       var e = d.create_element ("child");
+                       r.childs.add (e);
+                       assert (d.namespaces.size == 1);
+                       e.set_namespace ("http://developer.gnome.org/";, "dg");
+                       assert (e.namespaces.size == 1);
+                       assert (d.namespaces.size == 2);
+                       var e2 = d.create_element ("children");
+                       e.childs.add (e2);
+                       assert (e.namespaces.size == 1);
+                       assert (e2.namespaces.size == 0);
+                       assert (d.namespaces.size == 2);
+                       var e3 = d.create_element ("nons");
+                       e.childs.add (e3);
+                       e3.set_namespace ("http://www.gnome.org/";, "ns");
+                       assert (e.namespaces.size == 1);
+                       assert (e2.namespaces.size == 0);
+                       assert (e3.namespaces.size == 1);
+                       assert (d.namespaces.size == 3);
+                       var e4 = d.create_element ("childrenons");
+                       e3.childs.add (e4);
+                       assert (e.namespaces.size == 1);
+                       assert (e2.namespaces.size == 0);
+                       assert (e3.namespaces.size == 1);
+                       assert (e4.namespaces.size == 0);
+                       assert (d.namespaces.size == 3);
+                       string str = d.to_string ();
+#if DEBUG
+                       GLib.message (@"$d");
+#endif
+                       assert ("<root xmlns=\"http://git.gnome.org/browse/gxml\";>" in str);
+                       assert ("</root>" in str);
+                       assert ("<dg:child xmlns:dg=\"http://developer.gnome.org/\";>" in str);
+                       assert ("<children/>" in str);
+                       assert ("<ns:nons xmlns:ns=\"http://www.gnome.org/\";>" in str);
+                       assert ("<childrenons/>" in str);
+                       assert ("</ns:nons>" in str);
+                       assert ("</dg:child>" in str);
+               });
                Test.add_func ("/gxml/tw-element/multiple-namespaces/default/enable-ns_top", () => {
                        var d = new TwDocument ();
                        var r = d.create_element ("root");
@@ -262,19 +341,57 @@ class TwElementTest : GXmlTest {
                        assert (e3.namespaces.size == 1);
                        assert (e4.namespaces.size == 0);
                        assert (d.namespaces.size == 3);
+                       var c2 = d.create_element ("soup");
+                       d.root.childs.add (c2);
+                       // apply default namespace, should avoid prefix
+                       c2.set_namespace ("http://git.gnome.org/browse/gxml";, null);
                        string str = d.to_string ();
 #if DEBUG
                        GLib.message (@"$d");
 #endif
-                       assert_not_reached ();
                        assert ("<root xmlns=\"http://git.gnome.org/browse/gxml\"; 
xmlns:dg=\"http://developer.gnome.org/\"; xmlns:ns=\"http://www.gnome.org/\";>" in str);
+                       assert ("<soup/>" in str);
                        assert ("</root>" in str);
                        assert ("<dg:child>" in str);
                        assert ("<children/>" in str);
-                       assert ("<ns:nons >" in str);
+                       assert ("<ns:nons>" in str);
                        assert ("<childrenons/>" in str);
                        assert ("</ns:nons>" in str);
                        assert ("</dg:child>" in str);
-               });*/
+               });
+               Test.add_func ("/gxml/tw-element/multiple-namespaces/default/enable-prefix_default_ns", () => 
{
+                       var d = new TwDocument ();
+                       var r = d.create_element ("root");
+                       d.childs.add (r);
+                       // Default NS
+                       d.set_namespace ("http://git.gnome.org/browse/gxml";, "gxml");
+                       // All namespaces declaration should be on root node
+                       d.prefix_default_ns = true;
+                       var e = d.create_element ("child");
+                       r.childs.add (e);
+                       assert (d.namespaces.size == 1);
+                       var e2 = d.create_element ("children");
+                       e.childs.add (e2);
+                       var e3 = d.create_element ("nons");
+                       e.childs.add (e3);
+                       var e4 = d.create_element ("childrenons");
+                       e3.childs.add (e4);
+                       var c2 = d.create_element ("soup");
+                       d.root.childs.add (c2);
+                       c2.set_namespace ("http://git.gnome.org/browse/gxml";, "gxml");
+                       string str = d.to_string ();
+#if DEBUG
+                       GLib.message (@"$d");
+#endif
+                       assert ("<gxml:root xmlns:gxml=\"http://git.gnome.org/browse/gxml\";>" in str);
+                       assert ("<gxml:soup/>" in str);
+                       assert ("</gxml:root>" in str);
+                       assert ("<gxml:child>" in str);
+                       assert ("<gxml:children/>" in str);
+                       assert ("<gxml:nons>" in str);
+                       assert ("<gxml:childrenons/>" in str);
+                       assert ("</gxml:nons>" in str);
+                       assert ("</gxml:child>" in str);
+               });
        }
 }


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]