[gxml] Fixed SerializableObjectModel.serialize for post-deserialization



commit 39e729e41fa3752c8c4d36b635df51a115425ab2
Author: Daniel Espinosa <esodan gmail com>
Date:   Fri Feb 26 13:58:31 2016 -0600

    Fixed SerializableObjectModel.serialize for post-deserialization
    
    * On serialization checks if the collection was serialized before,
      if no, run its deserialization first then continue

 gxml/SerializableObjectModel.vala        |    4 ++
 test/GDocumentTest.vala                  |    2 +-
 test/SerializableGeeCollectionsTest.vala |   74 ++++++++++++++++++++++++++++++
 3 files changed, 79 insertions(+), 1 deletions(-)
---
diff --git a/gxml/SerializableObjectModel.vala b/gxml/SerializableObjectModel.vala
index 7e87b3b..465c295 100644
--- a/gxml/SerializableObjectModel.vala
+++ b/gxml/SerializableObjectModel.vala
@@ -241,6 +241,10 @@ public abstract class GXml.SerializableObjectModel : Object, Serializable
       if (obj != null) {
         if (obj is SerializableProperty)
           return ((SerializableProperty) obj).serialize_property (element, prop, property_use_nick ());
+        if (obj is SerializableCollection) {
+          if (!(obj as SerializableCollection).deserialized ())
+            (obj as SerializableCollection).deserialize_children ();
+        }
         if (obj is Serializable)
           return ((Serializable) obj).serialize (element);
       }
diff --git a/test/GDocumentTest.vala b/test/GDocumentTest.vala
index effb0a1..b5ad0b3 100644
--- a/test/GDocumentTest.vala
+++ b/test/GDocumentTest.vala
@@ -77,7 +77,7 @@ class GDocumentTest : GXmlTest {
                                var s = new GLib.StringBuilder ();
                                s.append ("""<root />""");
                                var d = new GDocument.from_string (s.str);
-                               GLib.message ("Saving to file: "+f.get_uri ()+d.to_string ());
+                               Test.message ("Saving to file: "+f.get_uri ()+d.to_string ());
                                d.save_as (f);
                                assert (f.query_exists ());
                                var d2 = new GDocument.from_file (f);
diff --git a/test/SerializableGeeCollectionsTest.vala b/test/SerializableGeeCollectionsTest.vala
index 54fd95a..c16a111 100644
--- a/test/SerializableGeeCollectionsTest.vala
+++ b/test/SerializableGeeCollectionsTest.vala
@@ -179,6 +179,36 @@ class SerializableGeeCollectionsTest : GXmlTest
     public override string to_string () { return name; }
   }
 
+
+  class Ball : SerializableObjectModel
+  {
+    public string name { get; set; default = "ball"; }
+    public override string to_string () { return name; }
+    public override string node_name () { return "Ball"; }
+    public class Array : SerializableArrayList<Ball> {
+      public override bool deserialize_proceed () { return false; }
+    }
+  }
+
+  class SmallBag : SerializableObjectModel
+  {
+    public string name { get; set; default = "ball"; }
+    public Ball.Array balls { get; set; default = new Ball.Array (); }
+    public override string to_string () { return name; }
+    public override string node_name () { return "SmallBag"; }
+    public class Array : SerializableArrayList<SmallBag> {
+      public override bool deserialize_proceed () { return false; }
+    }
+  }
+
+  class BigBag : SerializableObjectModel
+  {
+    public string name { get; set; default = "ball"; }
+    public SmallBag.Array bags { get; set; default = new SmallBag.Array (); }
+    public override string to_string () { return name; }
+    public override string node_name () { return "BigBag"; }
+  }
+
   public static void add_tests ()
   {
     Test.add_func ("/gxml/serializable/convined_gee_containers/deserialize",
@@ -583,5 +613,49 @@ class SerializableGeeCollectionsTest : GXmlTest
         assert_not_reached ();
       }
     });
+    Test.add_func ("/gxml/serializable/containers/post-deserialization/serialize",
+    () => {
+      try {
+        // Construct Bag contents
+        var bag = new BigBag ();
+        assert (bag.bags != null);
+        for (int i = 0; i < 2; i++) {
+          var sbag = new SmallBag ();
+          assert (sbag.balls != null);
+          for (int j = 0; j < 2; j++) {
+            var b = new Ball ();
+            sbag.balls.add (b);
+          }
+          assert (sbag.balls.size == 2);
+          bag.bags.add (sbag);
+        }
+        assert (bag.bags.size == 2);
+        // Construct XML
+        var d = new TwDocument ();
+        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");
+        // Deserialize
+        var bag2 = new BigBag ();
+        bag2.deserialize (d);
+        assert (bag2.bags.size == 0);
+        // Serialize
+        var d2 = new TwDocument ();
+        bag2.serialize (d2);
+        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");
+      } 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]