[gxml] Fixed parent implementation for TwNode



commit 98b8bc137106b02eeb19a5a182228456cd744fcd
Author: Daniel Espinosa <esodan gmail com>
Date:   Fri Feb 19 09:52:06 2016 -0600

    Fixed parent implementation for TwNode

 gxml/TwNode.vala         |   36 ++++++++++++++++++++++++++++++------
 test/TwDocumentTest.vala |    4 ++++
 test/TwElementTest.vala  |   29 +++++++++++++++++++++++++++++
 3 files changed, 63 insertions(+), 6 deletions(-)
---
diff --git a/gxml/TwNode.vala b/gxml/TwNode.vala
index 0bd0ef3..6bce9a2 100644
--- a/gxml/TwNode.vala
+++ b/gxml/TwNode.vala
@@ -59,17 +59,41 @@ public abstract class GXml.TwNode : Object, GXml.Node
   public virtual Gee.List<GXml.Namespace> namespaces { owned get { return new Gee.ArrayList<GXml.Node> (); } 
}
   public virtual GXml.NodeType type_node { get { return GXml.NodeType.DOCUMENT; } }
   public virtual string value { owned get { return _value.dup (); } set  { _value = value; } }
-  public virtual GXml.Node parent { owned get { return _parent; } }
+  public virtual GXml.Node parent {
+    owned get {
+      if (_parent == null) return null;
+      return (GXml.Node) _parent.ref ();
+    }
+  }
   public virtual void set_parent (GXml.Node node) { _parent = node; }
   
-  protected class TwChildrenList : Gee.ArrayList<GXml.Node> {
-    GXml.Node _parent;
+  protected class TwChildrenList : AbstractBidirList<GXml.Node> {
+    private GXml.Node _parent;
+    private Gee.ArrayList<GXml.Node> list = new Gee.ArrayList<GXml.Node> ();
+
     protected TwChildrenList (GXml.Node e) {
       _parent = e;
     }
-    protected new bool add (GXml.Node node) {
-      (node as GXml.TwNode).set_parent (_parent);
-      return base.add (node);
+
+    public inline override Gee.BidirListIterator<GXml.Node> bidir_list_iterator () { return 
list.bidir_list_iterator (); }
+
+    public inline override new GXml.Node @get (int index) { return list.get (index); }
+    public inline override int index_of (GXml.Node item) { return list.index_of (item); }
+    public inline override void insert (int index, GXml.Node item) { list.insert (index, item); }
+    public inline override Gee.ListIterator<GXml.Node> list_iterator () { return list.list_iterator (); }
+    public inline override GXml.Node remove_at (int index) { return list.remove_at (index); }
+    public inline override new void @set (int index, GXml.Node item) { list.set (index, item); }
+    public inline override Gee.List<GXml.Node>? slice (int start, int stop) { return list.slice (start, 
stop); }
+
+    public override bool add (GXml.Node item) {
+      (item as GXml.TwNode).set_parent (_parent);
+      return list.add (item);
     }
+    public inline override void clear () { list.clear (); }
+    public inline override bool contains (GXml.Node item) { return list.contains (item); }
+    public inline override Gee.Iterator<GXml.Node> iterator () { return list.iterator (); }
+    public inline override bool remove (GXml.Node item) { return list.remove (item); }
+    public inline override bool read_only { get { return list.read_only; } }
+    public inline override int size { get { return list.size; } }
   }
 }
diff --git a/test/TwDocumentTest.vala b/test/TwDocumentTest.vala
index 4628198..f64674d 100644
--- a/test/TwDocumentTest.vala
+++ b/test/TwDocumentTest.vala
@@ -422,5 +422,9 @@ class TwDocumentTest : GXmlTest {
                                        assert_not_reached ();
                                }
                        });
+               Test.add_func ("/gxml/tw-document/parent", () => {
+                       var doc = new TwDocument ();
+                       assert (doc.parent == null);
+               });
        }
 }
diff --git a/test/TwElementTest.vala b/test/TwElementTest.vala
index 0a5f69c..3f1d0e0 100644
--- a/test/TwElementTest.vala
+++ b/test/TwElementTest.vala
@@ -555,5 +555,34 @@ class TwElementTest : GXmlTest {
                        assert ("</root>" in str);
                        } catch { assert_not_reached (); }
                });
+               Test.add_func ("/gxml/tw-element/parent", () => {
+                       var doc = new TwDocument ();
+                       var e = doc.create_element ("root");
+                       doc.children.add (e);
+                       var c = doc.create_element ("child");
+                       e.children.add (c);
+                       assert (e.children.size == 1);
+                       assert (e.children[0] != null);
+                       assert (e.children[0].name == "child");
+                       assert (c.parent != null);
+                       assert (doc.root != null);
+                       assert (doc.root.children[0] != null);
+                       assert (doc.root.children[0].name == "child");
+                       assert (doc.root.children[0].parent != null);
+                       assert (doc.root.children[0].parent.name == "root");
+                       assert (doc.root.parent == null);
+               });
+               Test.add_func ("/gxml/tw-element/attribute/parent", () => {
+                       var doc = new TwDocument ();
+                       var e = doc.create_element ("root");
+                       doc.children.add (e);
+                       var c = doc.create_element ("child");
+                       e.children.add (c);
+                       (e as GXml.Element).set_attr ("attr", "val");
+                       assert (doc.root != null);
+                       assert (doc.root.attrs["attr"] != null);
+                       assert (doc.root.attrs["attr"].parent != null);
+                       assert (doc.root.attrs["attr"].parent.name == "root");
+               });
        }
 }


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