[gxml] Fixed GElement get_nodes_by* methods



commit 0d0e6d0fb298a229592394e16b32b76e64cd252c
Author: Daniel Espinosa <esodan gmail com>
Date:   Wed Jul 20 16:28:33 2016 -0500

    Fixed GElement get_nodes_by* methods
    
    Fixed get_nodes_by_tag_name(), get_nodes_by_tag_name_ns() and
    get_nodes_by_class_name()
    
    Added Unit Test.

 gxml/GXmlElement.vala      |   39 +++++++++++++++++----------------------
 test/DomGDocumentTest.vala |   35 ++++++++++++++++++++++++++++++++++-
 2 files changed, 51 insertions(+), 23 deletions(-)
---
diff --git a/gxml/GXmlElement.vala b/gxml/GXmlElement.vala
index b969b33..e1af184 100644
--- a/gxml/GXmlElement.vala
+++ b/gxml/GXmlElement.vala
@@ -241,28 +241,20 @@ public class GXml.GElement : GXml.GNonDocumentChildNode,
 
   public DomHTMLCollection get_elements_by_tag_name (string local_name) {
     var l = new GDomHTMLCollection ();
-    foreach (GXml.DomNode n in child_nodes) {
-      if (!(n is GXml.DomElement)) continue;
+    foreach (GXml.DomElement n in children) {
+      l.add_all (n.get_elements_by_tag_name (local_name));
       if (n.node_name == local_name)
         l.add ((DomElement) n);
-      l.add_all ((n as DomElement).get_elements_by_tag_name (local_name));
     }
     return l;
   }
   public DomHTMLCollection get_elements_by_tag_name_ns (string? namespace, string local_name) {
     var l = new GDomHTMLCollection ();
-    string prefix = null;
-    string uri = namespace;
-    if (":" in namespace) {
-      string[] s = namespace.split (":");
-      prefix = s[0];
-      uri = s[1];
-    }
-    foreach (GXml.DomNode n in child_nodes) {
-      if (!(n is GXml.DomElement)) continue;
-      if ((n as GXml.DomElement).node_name == local_name
-          && n.lookup_namespace_uri (prefix) == uri)
-        l.add ((DomElement) n);
+    foreach (GXml.DomElement n in children) {
+      l.add_all (n.get_elements_by_tag_name_ns (namespace, local_name));
+      if (n.node_name == local_name
+          && n.namespace_uri == namespace)
+        l.add (n);
     }
     return l;
   }
@@ -278,15 +270,18 @@ public class GXml.GElement : GXml.GNonDocumentChildNode,
       l.add_all (n.get_elements_by_class_name (class_names));
       string cls = n.get_attribute ("class");
       if (cls == null) continue;
-      foreach (string s in cs) {
-        if (" " in cls) {
-          string[] ncls = cls.split (" ");
-          foreach (string snc in ncls) {
-            if (snc == s) l.add (n);
+      string[] ncls = {};
+      if (" " in cls)
+        ncls = cls.split (" ");
+      else
+        ncls += cls;
+      foreach (string cl in cs) {
+        foreach (string ncl in ncls) {
+          if (cl == ncl) {
+            l.add (n);
+            break;
           }
         }
-        else
-          if (s == cls) l.add (n);
       }
     }
     return l;
diff --git a/test/DomGDocumentTest.vala b/test/DomGDocumentTest.vala
index 1c5f96d..956c2f8 100644
--- a/test/DomGDocumentTest.vala
+++ b/test/DomGDocumentTest.vala
@@ -229,7 +229,6 @@ static const string HTMLDOC ="
                        pn4.set_attribute ("id", "newp2");
                        pn4.set_attribute ("class", "black");
                        p.replace_child (pn4, p.child_nodes[0]);
-                       GLib.message ("BODY:"+(p as GXml.Node).to_string ());
                        assert (p.children.length == 7);
                        assert (p.children[0] is DomElement);
                        assert (p.children[0].node_name == "p");
@@ -247,6 +246,40 @@ static const string HTMLDOC ="
                        assert (ng2.lookup_namespace_uri (null) == "http://live.gnome.org/GXml";);
                        assert (ng2.lookup_prefix ("http://live.gnome.org/GXml";) == null);
                        assert (ng2.tag_name == "OtherNode");
+
+                       GLib.message ("BODY:"+(doc.document_element as GXml.Node).to_string ());
+                       var l = doc.document_element.get_elements_by_tag_name ("p");
+                       assert (l != null);
+                       assert (l is DomHTMLCollection);
+                       assert (l.length == 4);
+                       assert (l[0] is DomElement);
+                       assert (l[1] is DomElement);
+                       assert (l[1] is DomElement);
+                       assert (l[0].node_name == "p");
+                       assert (l[1].node_name == "p");
+                       assert (l[2].node_name == "p");
+                       assert (doc.document_element.children.length == 1);
+                       var lnst = doc.document_element.get_elements_by_tag_name ("OtherNode");
+                       assert (lnst.length == 1);
+                       var nnst = lnst.item (0);
+                       assert (nnst.namespace_uri == "http://live.gnome.org/GXml";);
+                       var lns = doc.document_element.get_elements_by_tag_name_ns 
("http://live.gnome.org/GXml";, "OtherNode");
+                       assert (lns != null);
+                       assert (lns is DomHTMLCollection);
+                       GLib.message ("Node with default ns: "+lns.length.to_string ());
+                       assert (lns.length == 1);
+                       assert (lns.item (0) is DomElement);
+                       assert (lns.item (0).node_name == "OtherNode");
+                       var lcl = doc.document_element.get_elements_by_class_name ("black");
+                       assert (lcl != null);
+                       assert (lcl is DomHTMLCollection);
+                       assert (lcl.length == 3);
+                       assert (lcl.item (0) is DomElement);
+                       assert (lcl.item (1) is DomElement);
+                       assert (lcl.item (2) is DomElement);
+                       assert (lcl.item (0).node_name == "p");
+                       assert (lcl.item (1).node_name == "p");
+                       assert (lcl.item (2).node_name == "p");
                        } catch (GLib.Error e) {
                                GLib.message ("Error: "+e.message);
                                assert_not_reached ();


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