[gxml] Fixed post-deserialization for SerializableHashMap and TreeMap



commit 308a693c6d379568150a1cd2cce2ad2370f38e9e
Author: Daniel Espinosa <esodan gmail com>
Date:   Fri Feb 26 15:50:36 2016 -0600

    Fixed post-deserialization for SerializableHashMap and TreeMap
    
    * On serialization all pending deserializations are executed

 gxml/SerializableGeeHashMap.vala       |    8 ++-
 gxml/SerializableGeeTreeMap.vala       |   10 ++-
 test/SerializableGeeArrayListTest.vala |    5 +-
 test/SerializableGeeHashMapTest.vala   |  125 ++++++++++++++++++++++++++++--
 test/SerializableGeeTreeMapTest.vala   |  133 ++++++++++++++++++++++++++++++--
 5 files changed, 260 insertions(+), 21 deletions(-)
---
diff --git a/gxml/SerializableGeeHashMap.vala b/gxml/SerializableGeeHashMap.vala
index 0b890e4..96b94f7 100644
--- a/gxml/SerializableGeeHashMap.vala
+++ b/gxml/SerializableGeeHashMap.vala
@@ -43,8 +43,12 @@ public class GXml.SerializableHashMap<K,V> : Gee.HashMap<K,V>, Serializable, Ser
     if (node is Element) {
       var obj = Object.new (value_type);
       if (node.name.down () == ((Serializable) obj).node_name ().down ()) {
-        ((Serializable) obj).deserialize (node);
-        @set (((SerializableMapKey<K>) obj).get_map_key (), obj);
+        if (obj is SerializableCollection)
+          (obj as SerializableCollection).deserialize_children ();
+        else {
+          ((Serializable) obj).deserialize (node);
+          @set (((SerializableMapKey<K>) obj).get_map_key (), obj);
+        }
       }
     }
     return true;
diff --git a/gxml/SerializableGeeTreeMap.vala b/gxml/SerializableGeeTreeMap.vala
index b7e813e..6289097 100644
--- a/gxml/SerializableGeeTreeMap.vala
+++ b/gxml/SerializableGeeTreeMap.vala
@@ -33,7 +33,7 @@ public class GXml.SerializableTreeMap<K,V> : Gee.TreeMap<K,V>, Serializable, Ser
 
   // SerializableCollection interface
   public virtual bool deserialize_proceed () { return true; }
-  public virtual bool deserialized () { return true; }
+  public virtual bool deserialized () { return _deserialized; }
   public virtual bool deserialize_node (GXml.Node node) throws GLib.Error {
     if (!(value_type.is_a (typeof (GXml.Serializable)) &&
         value_type.is_a (typeof (SerializableMapKey)))) {
@@ -43,8 +43,12 @@ public class GXml.SerializableTreeMap<K,V> : Gee.TreeMap<K,V>, Serializable, Ser
     if (node is Element) {
       var obj = Object.new (value_type);
       if (node.name.down () == ((Serializable) obj).node_name ().down ()) {
-        ((Serializable) obj).deserialize (node);
-        @set (((SerializableMapKey<K>) obj).get_map_key (), obj);
+        if (obj is SerializableCollection)
+          (obj as SerializableCollection).deserialize_children ();
+        else {
+          ((Serializable) obj).deserialize (node);
+          @set (((SerializableMapKey<K>) obj).get_map_key (), obj);
+        }
       }
     }
     return true;
diff --git a/test/SerializableGeeArrayListTest.vala b/test/SerializableGeeArrayListTest.vala
index f38f3f9..c562b98 100644
--- a/test/SerializableGeeArrayListTest.vala
+++ b/test/SerializableGeeArrayListTest.vala
@@ -45,7 +45,6 @@ class CElement : SerializableObjectModel {
 
 class SerializableGeeArrayListTest : GXmlTest
 {
-  
   class BallFill : SerializableObjectModel
   {
     public string name { get; set; default = "Fill"; }
@@ -286,7 +285,7 @@ class SerializableGeeArrayListTest : GXmlTest
         assert (d.root.children[0].children[0].children[0].children.size == 1);
         assert (d.root.children[0].children[0].children[0].children[0] is Text);
         assert (d.root.children[0].children[0].children[0].children[0].value == "golden dust");
-        GLib.message (d.to_string ());
+        //GLib.message (d.to_string ());
         // Deserialize
         var bagt = new BigBag ();
         bagt.deserialize (d);
@@ -304,7 +303,7 @@ class SerializableGeeArrayListTest : GXmlTest
         // Serialize
         var d2 = new GDocument ();
         bag2.serialize (d2);
-        GLib.message ("SECOND:"+d2.to_string ());
+        //GLib.message ("SECOND:"+d2.to_string ());
         assert (d2.root != null);
         assert (d2.root.name == "BigBag");
         assert (d2.root.children.size == 2);
diff --git a/test/SerializableGeeHashMapTest.vala b/test/SerializableGeeHashMapTest.vala
index 3ccff5d..86cebaa 100644
--- a/test/SerializableGeeHashMapTest.vala
+++ b/test/SerializableGeeHashMapTest.vala
@@ -59,9 +59,50 @@ class SerializableGeeHashMapTest : GXmlTest
     }
   }
 
+  class BallFill : SerializableObjectModel
+  {
+    public string name { get; set; default = "Fill"; }
+    public void set_text (string txt) { serialized_xml_node_value = txt; }
+    public override string to_string () { return name; }
+    public override string node_name () { return "BallFill"; }
+    public override bool serialize_use_xml_node_value () { return true; }
+  }
+
+  class Ball : SerializableObjectModel, SerializableMapKey<string>
+  {
+    public string name { get; set; default = "Ball"; }
+    public BallFill ballfill { get; set; }
+    public override string to_string () { return name; }
+    public override string node_name () { return "Ball"; }
+    public string get_map_key () { return name; }
+    public class HashMap : SerializableHashMap<string,Ball> {
+      public override bool deserialize_proceed () { return false; }
+    }
+  }
+
+  class SmallBag : SerializableObjectModel, SerializableMapKey<string>
+  {
+    public string name { get; set; default = "SmallBag"; }
+    public Ball.HashMap balls { get; set; default = new Ball.HashMap (); }
+    public override string to_string () { return name; }
+    public override string node_name () { return "SmallBag"; }
+    public string get_map_key () { return name; }
+    public class HashMap : SerializableHashMap<string,SmallBag> {
+      public override bool deserialize_proceed () { return false; }
+    }
+  }
+
+  class BigBag : SerializableObjectModel
+  {
+    public string name { get; set; default = "ball"; }
+    public SmallBag.HashMap bags { get; set; default = new SmallBag.HashMap (); }
+    public override string to_string () { return name; }
+    public override string node_name () { return "BigBag"; }
+  }
+
   public static void add_tests ()
   {
-    Test.add_func ("/gxml/serializable/serializable_hash_map/api",
+    Test.add_func ("/gxml/serializable/hashmap/api",
     () => {
       try {
         var c = new SerializableHashMap<string,Space> ();
@@ -101,7 +142,7 @@ class SerializableGeeHashMapTest : GXmlTest
         GLib.message (@"ERROR: $(e.message)");
       }
     });
-    Test.add_func ("/gxml/serializable/serializable_hash_map/serialize",
+    Test.add_func ("/gxml/serializable/hashmap/serialize",
     () => {
       try {
         var c = new SerializableHashMap<string,Space> ();
@@ -151,7 +192,7 @@ class SerializableGeeHashMapTest : GXmlTest
         assert_not_reached ();
       }
     });
-    Test.add_func ("/gxml/serializable/serializable_hash_map/deserialize",
+    Test.add_func ("/gxml/serializable/hashmap/deserialize",
     () => {
       try {
         var doc = new GDocument.from_string ("""<?xml version="1.0"?>
@@ -182,7 +223,7 @@ class SerializableGeeHashMapTest : GXmlTest
         assert_not_reached ();
       }
     });
-    Test.add_func ("/gxml/serializable/serializable_hash_map/container_class/deserialize",
+    Test.add_func ("/gxml/serializable/hashmap/container_class/deserialize",
     () => {
       try {
         var doc = new GDocument.from_string ("""<?xml version="1.0"?>
@@ -217,7 +258,7 @@ class SerializableGeeHashMapTest : GXmlTest
         assert_not_reached ();
       }
     });
-    Test.add_func ("/gxml/serializable/serializable_hash_map/containder_class/serialize",
+    Test.add_func ("/gxml/serializable/hashmap/containder_class/serialize",
     () => {
       try {
         var c = new SpaceContainer ();
@@ -251,7 +292,7 @@ class SerializableGeeHashMapTest : GXmlTest
         assert_not_reached ();
       }
     });
-    Test.add_func ("/gxml/serializable/serializable_hash_map/deserialize-serialize",
+    Test.add_func ("/gxml/serializable/hashmap/deserialize-serialize",
     () => {
       try {
         var idoc = new GDocument.from_string ("""<?xml version="1.0"?>
@@ -296,7 +337,7 @@ class SerializableGeeHashMapTest : GXmlTest
         assert_not_reached ();
       }
     });
-    Test.add_func ("/gxml/serializable/serializable_hash_map/deserialize-node-names",
+    Test.add_func ("/gxml/serializable/hashmap/deserialize-node-names",
     () => {
       try {
         var d = new GDocument.from_path (GXmlTestConfig.TEST_DIR + "/test-collection.xml");
@@ -324,5 +365,75 @@ class SerializableGeeHashMapTest : GXmlTest
         assert_not_reached ();
       }
     });
+    Test.add_func ("/gxml/serializable/hashmap/post-deserialization/serialize/contents",
+    () => {
+      try {
+        // Construct Bag contents
+        var bag = new BigBag ();
+        assert (bag.bags != null);
+        for (int i = 0; i < 2; i++) {
+          var sbag = new SmallBag ();
+          sbag.name = "SmallBag"+i.to_string ();
+          assert (sbag.balls != null);
+          for (int j = 0; j < 2; j++) {
+            var b = new Ball ();
+            b.name = "Ball"+j.to_string ();
+            b.ballfill = new BallFill ();
+            b.ballfill.set_text ("golden dust");
+            sbag.balls.set (b.name,b);
+          }
+          assert (sbag.balls.size == 2);
+          bag.bags.set (sbag.name, sbag);
+        }
+        assert (bag.bags.size == 2);
+        // Construct XML
+        var d = new GDocument ();
+        bag.serialize (d);
+        assert (d.root != null);
+        assert (d.root.name == "BigBag");
+        assert (d.root.children.size == 2);
+        assert (d.root.children[0].name == "SmallBag");
+        assert (d.root.children[0].children.size == 2);
+        assert (d.root.children[0].children[0].name == "Ball");
+        assert (d.root.children[0].children[0].children.size == 1);
+        assert (d.root.children[0].children[0].children[0].name == "BallFill");
+        assert (d.root.children[0].children[0].children[0].children.size == 1);
+        assert (d.root.children[0].children[0].children[0].children[0] is Text);
+        assert (d.root.children[0].children[0].children[0].children[0].value == "golden dust");
+        //GLib.message (d.to_string ());
+        // Deserialize
+        var bagt = new BigBag ();
+        bagt.deserialize (d);
+        assert (bagt.bags.deserialize_children ());
+        assert (bagt.bags.size == 2);
+        assert (bagt.bags.get("SmallBag1").balls.deserialize_children ());
+        assert (bagt.bags.get("SmallBag1").balls.size == 2);
+        assert (bagt.bags.get("SmallBag1").balls.get("Ball1").name == "Ball1");
+        assert (bagt.bags.get("SmallBag1").balls.get("Ball1").ballfill !=null);
+        assert (bagt.bags.get("SmallBag1").balls.get("Ball1").ballfill.serialized_xml_node_value !=null);
+        assert (bagt.bags.get("SmallBag1").balls.get("Ball1").ballfill.serialized_xml_node_value =="golden 
dust");
+        var bag2 = new BigBag ();
+        bag2.deserialize (d);
+        assert (bag2.bags.size == 0);
+        // Serialize
+        var d2 = new GDocument ();
+        bag2.serialize (d2);
+        //GLib.message ("SECOND:"+d2.to_string ());
+        assert (d2.root != null);
+        assert (d2.root.name == "BigBag");
+        assert (d2.root.children.size == 2);
+        assert (d2.root.children[0].name == "SmallBag");
+        assert (d2.root.children[0].children.size == 2);
+        assert (d2.root.children[0].children[0].name == "Ball");
+        assert (d2.root.children[0].children[0].children.size == 1);
+        assert (d2.root.children[0].children[0].children[0].name == "BallFill");
+        assert (d2.root.children[0].children[0].children[0].children.size == 1);
+        assert (d2.root.children[0].children[0].children[0].children[0] is GXml.Text);
+        assert (d2.root.children[0].children[0].children[0].children[0].value == "golden dust");
+      } catch (GLib.Error e) {
+        GLib.message ("ERROR: "+e.message);
+        assert_not_reached ();
+      }
+    });
   }
 }
diff --git a/test/SerializableGeeTreeMapTest.vala b/test/SerializableGeeTreeMapTest.vala
index 7c70d59..e6c587d 100644
--- a/test/SerializableGeeTreeMapTest.vala
+++ b/test/SerializableGeeTreeMapTest.vala
@@ -51,9 +51,52 @@ class SerializableGeeTreeMapTest : GXmlTest
     }
   }
 
+
+  class BallFill : SerializableObjectModel
+  {
+    public string name { get; set; default = "Fill"; }
+    public void set_text (string txt) { serialized_xml_node_value = txt; }
+    public override string to_string () { return name; }
+    public override string node_name () { return "BallFill"; }
+    public override bool serialize_use_xml_node_value () { return true; }
+  }
+
+  class Ball : SerializableObjectModel, SerializableMapKey<string>
+  {
+    public string name { get; set; default = "Ball"; }
+    public BallFill ballfill { get; set; }
+    public override string to_string () { return name; }
+    public override string node_name () { return "Ball"; }
+    public string get_map_key () { return name; }
+    public class TreeMap : SerializableTreeMap<string,Ball> {
+      public override bool deserialize_proceed () { return false; }
+    }
+  }
+
+  class SmallBag : SerializableObjectModel, SerializableMapKey<string>
+  {
+    public string name { get; set; default = "SmallBag"; }
+    public Ball.TreeMap balls { get; set; default = new Ball.TreeMap (); }
+    public override string to_string () { return name; }
+    public override string node_name () { return "SmallBag"; }
+    public string get_map_key () { return name; }
+    public class TreeMap : SerializableTreeMap<string,SmallBag> {
+      public override bool deserialize_proceed () { return false; }
+    }
+  }
+
+  class BigBag : SerializableObjectModel
+  {
+    public string name { get; set; default = "ball"; }
+    public SmallBag.TreeMap bags { get; set; default = new SmallBag.TreeMap (); }
+    public override string to_string () { return name; }
+    public override string node_name () { return "BigBag"; }
+  }
+
+
   public static void add_tests ()
   {
-    Test.add_func ("/gxml/serializable/serializable_tree_map/api",
+    Test.add_func ("/gxml/serializable/treemap/api",
     () => {
         var c = new SerializableTreeMap<string,Space> ();
         var o1 = new Space.named ("Big");
@@ -88,7 +131,7 @@ class SerializableGeeTreeMapTest : GXmlTest
           assert_not_reached ();
         }
     });
-    Test.add_func ("/gxml/serializable/serializable_tree_map/serialize",
+    Test.add_func ("/gxml/serializable/treemap/serialize",
     () => {
       try {
         var c = new SerializableTreeMap<string,Space> ();
@@ -126,7 +169,7 @@ class SerializableGeeTreeMapTest : GXmlTest
         assert_not_reached ();
       }
     });
-    Test.add_func ("/gxml/serializable/serializable_tree_map/deserialize",
+    Test.add_func ("/gxml/serializable/treemap/deserialize",
     () => {
       try {
         var doc = new GDocument.from_string ("""<?xml version="1.0"?>
@@ -157,7 +200,7 @@ class SerializableGeeTreeMapTest : GXmlTest
         assert_not_reached ();
       }
     });
-    Test.add_func ("/gxml/serializable/serializable_tree_map/container_class/deserialize",
+    Test.add_func ("/gxml/serializable/treemap/container_class/deserialize",
     () => {
       try {
         var doc = new GDocument.from_string ("""<?xml version="1.0"?>
@@ -196,7 +239,7 @@ class SerializableGeeTreeMapTest : GXmlTest
         assert_not_reached ();
       }
     });
-    Test.add_func ("/gxml/serializable/serializable_tree_map/containder_class/serialize",
+    Test.add_func ("/gxml/serializable/treemap/containder_class/serialize",
     () => {
       try {
         var c = new SpaceContainer ();
@@ -242,7 +285,7 @@ class SerializableGeeTreeMapTest : GXmlTest
         assert_not_reached ();
       }
     });
-    Test.add_func ("/gxml/serializable/serializable_tree_map/deserialize-node-names",
+    Test.add_func ("/gxml/serializable/treemap/deserialize-node-names",
     () => {
       try {
         var d = new GDocument.from_path (GXmlTestConfig.TEST_DIR + "/test-collection.xml");
@@ -271,5 +314,83 @@ class SerializableGeeTreeMapTest : GXmlTest
         assert_not_reached ();
       }
     });
+    Test.add_func ("/gxml/serializable/treemap/post-deserialization/serialize/contents",
+    () => {
+      try {
+        // Construct Bag contents
+        var bag = new BigBag ();
+        assert (bag.bags != null);
+        for (int i = 0; i < 2; i++) {
+          var sbag = new SmallBag ();
+          sbag.name = "SmallBag"+i.to_string ();
+          assert (sbag.balls != null);
+          for (int j = 0; j < 2; j++) {
+            var b = new Ball ();
+            b.name = "Ball"+j.to_string ();
+            b.ballfill = new BallFill ();
+            b.ballfill.set_text ("golden dust");
+            sbag.balls.set (b.name,b);
+          }
+          assert (sbag.balls.size == 2);
+          bag.bags.set (sbag.name, sbag);
+        }
+        assert (bag.bags.size == 2);
+        // Construct XML
+        var d = new GDocument ();
+        bag.serialize (d);
+        assert (d.root != null);
+        assert (d.root.name == "BigBag");
+        assert (d.root.children.size == 2);
+        assert (d.root.children[0].name == "SmallBag");
+        assert (d.root.children[0].children.size == 2);
+        assert (d.root.children[0].children[0].name == "Ball");
+        assert (d.root.children[0].children[0].children.size == 1);
+        assert (d.root.children[0].children[0].children[0].name == "BallFill");
+        assert (d.root.children[0].children[0].children[0].children.size == 1);
+        assert (d.root.children[0].children[0].children[0].children[0] is Text);
+        assert (d.root.children[0].children[0].children[0].children[0].value == "golden dust");
+        GLib.message (d.to_string ());
+        // Deserialize
+        var bagt = new BigBag ();
+        bagt.deserialize (d);
+        assert (bagt.bags.size == 0);
+        assert (bagt.bags.deserialize_children ());
+        assert (bagt.bags.size == 2);
+        assert (bagt.bags.get("SmallBag1").balls.deserialize_children ());
+        assert (bagt.bags.get("SmallBag1").balls.size == 2);
+        assert (bagt.bags.get("SmallBag1").balls.get("Ball1").name == "Ball1");
+        assert (bagt.bags.get("SmallBag1").balls.get("Ball1").ballfill !=null);
+        assert (bagt.bags.get("SmallBag1").balls.get("Ball1").ballfill.serialized_xml_node_value !=null);
+        assert (bagt.bags.get("SmallBag1").balls.get("Ball1").ballfill.serialized_xml_node_value =="golden 
dust");
+        var bag3 = new BigBag ();
+        bag3.deserialize (d);
+        assert (bag3.bags.size == 0);
+        assert (bag3.bags.deserialize_children ());
+        assert (bag3.bags.size == 2);
+        bag3.deserialize (d);
+        assert (!bag3.bags.deserialized ());
+        // Serialize
+        var bag2 = new BigBag ();
+        bag2.deserialize (d);
+        assert (!bag2.bags.deserialized ());
+        var d2 = new GDocument ();
+        bag2.serialize (d2);
+        GLib.message ("SECOND:"+d2.to_string ());
+        assert (d2.root != null);
+        assert (d2.root.name == "BigBag");
+        assert (d2.root.children.size == 2);
+        assert (d2.root.children[0].name == "SmallBag");
+        assert (d2.root.children[0].children.size == 2);
+        assert (d2.root.children[0].children[0].name == "Ball");
+        assert (d2.root.children[0].children[0].children.size == 1);
+        assert (d2.root.children[0].children[0].children[0].name == "BallFill");
+        assert (d2.root.children[0].children[0].children[0].children.size == 1);
+        assert (d2.root.children[0].children[0].children[0].children[0] is GXml.Text);
+        assert (d2.root.children[0].children[0].children[0].children[0].value == "golden dust");
+      } 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]