[gxml/serialization] Serializable honors properties nick. SerializableObjectModel Unit Tests added.



commit 997399722ddfadcb16f65cb440040ed305ba89b6
Author: Daniel Espinosa <esodan gmail com>
Date:   Wed Oct 23 20:31:49 2013 -0500

    Serializable honors properties nick. SerializableObjectModel Unit Tests added.

 gxml/Serializable.vala                |    3 +
 gxml/SerializableObjectModel.vala     |   22 +-
 test/GXmlTest.vala                    |    1 +
 test/Makefile.am                      |    1 +
 test/SerializableObjectModelTest.vala |  459 +++++++++++++++++++++++++++++++++
 5 files changed, 475 insertions(+), 11 deletions(-)
---
diff --git a/gxml/Serializable.vala b/gxml/Serializable.vala
index db43c66..dd018cb 100644
--- a/gxml/Serializable.vala
+++ b/gxml/Serializable.vala
@@ -244,6 +244,9 @@ namespace GXml {
                        foreach (ParamSpec spec in props) {
                                if (spec.name.down () == property_name.down ())
                                        return spec;
+                               if (serializable_property_use_nick)
+                                       if (spec.get_nick ().down () == property_name.down ())
+                                               return spec;
                        }
                        return null;
                }
diff --git a/gxml/SerializableObjectModel.vala b/gxml/SerializableObjectModel.vala
index 9f2b89a..58aeb48 100644
--- a/gxml/SerializableObjectModel.vala
+++ b/gxml/SerializableObjectModel.vala
@@ -69,17 +69,17 @@ public abstract class GXml.SerializableObjectModel : Object, Serializable
                        doc = (Document) node;
                else
                        doc = node.owner_document;
-               GLib.message ("Serialing on ..." + node.node_name);
+               //GLib.message ("Serialing on ..." + node.node_name);
                var element = doc.create_element (serializable_node_name);
                node.append_child (element);
                if (serialized_xml_node_value != null)
                        element.content = serialized_xml_node_value;
-               GLib.message ("Node Value is: ?" + element.content);
+               //GLib.message ("Node Value is: ?" + element.content);
                foreach (ParamSpec spec in list_serializable_properties ()) {
-                       GLib.message ("Property to Serialize: " + spec.name);
+                       //GLib.message ("Property to Serialize: " + spec.name);
                        serialize_property (element, spec);
                }
-               GLib.message ("Added a new top node: " + element.node_name);
+               //GLib.message ("Added a new top node: " + element.node_name);
                return element;
        }
        
@@ -89,7 +89,7 @@ public abstract class GXml.SerializableObjectModel : Object, Serializable
        {
                if (prop.value_type.is_a (typeof (Serializable))) 
                {
-                       GLib.message (@"$(prop.name) Is a Serializable");
+                       //GLib.message (@"$(prop.name) Is a Serializable");
                        var v = Value (typeof (Object));
                        get_property (prop.name, ref v);
                        var obj = (Serializable) v.get_object ();
@@ -107,7 +107,7 @@ public abstract class GXml.SerializableObjectModel : Object, Serializable
                        string attr_name = prop.name.down ();
                        var attr = element.get_attribute_node (attr_name);
                        if (attr == null) {
-                               GLib.message (@"New Attr to add... $(attr_name)");
+                               //GLib.message (@"New Attr to add... $(attr_name)");
                                element.set_attribute (attr_name, val);
                        }
                        else
@@ -136,15 +136,15 @@ public abstract class GXml.SerializableObjectModel : Object, Serializable
                return_val_if_fail (element.node_name.down () == serializable_node_name, null);
                foreach (Attr attr in element.attributes.get_values ())
                {
-                       GLib.message (@"Deseralizing Attribute: $(attr.name)");
+                       //GLib.message (@"Deseralizing Attribute: $(attr.name)");
                        deserialize_property (attr);
                }
                if (element.has_child_nodes ())
                {
-                       GLib.message ("Have child Elements ...");
+                       //GLib.message ("Have child Elements ...");
                        foreach (Node n in element.child_nodes)
                        {
-                               GLib.message (@"Deseralizing Element: $(n.node_name)");
+                               //GLib.message (@"Deseralizing Element: $(n.node_name)");
                                deserialize_property (n);
                        }
                }
@@ -159,14 +159,14 @@ public abstract class GXml.SerializableObjectModel : Object, Serializable
                bool ret = false;
                var prop = find_property_spec (property_node.node_name);
                if (prop == null) {
-                       GLib.message ("Found Unknown property: " + property_node.node_name);
+                       //GLib.message ("Found Unknown property: " + property_node.node_name);
                        // FIXME: Event emit
                        unknown_serializable_property.set (property_node.node_name, property_node);
                        return true;
                }
                if (prop.value_type.is_a (typeof (Serializable)))
                {
-                       GLib.message (@"$(prop.name): Is Serializable...");
+                       //GLib.message (@"$(prop.name): Is Serializable...");
                        Value vobj = Value (typeof(Object));
                        get_property (prop.name, ref vobj);
                        if (vobj.get_object () == null) {
diff --git a/test/GXmlTest.vala b/test/GXmlTest.vala
index e52aca4..ef242a1 100644
--- a/test/GXmlTest.vala
+++ b/test/GXmlTest.vala
@@ -36,6 +36,7 @@ class GXmlTest {
                ValaLibxml2Test.add_tests ();
                SerializationTest.add_tests ();
                SerializableTest.add_tests ();
+               SerializableObjectModelTest.add_tests ();
 
                Test.run ();
 
diff --git a/test/Makefile.am b/test/Makefile.am
index 87675cd..82dc5bc 100644
--- a/test/Makefile.am
+++ b/test/Makefile.am
@@ -37,6 +37,7 @@ gxml_test_SOURCES = \
        ValaLibxml2Test.vala \
        SerializableTest.vala \
        SerializationTest.vala \
+       SerializableObjectModelTest.vala \
        $(NULL)
 
 gxml_test.vala.stamp: $(gxml_test_SOURCES)
diff --git a/test/SerializableObjectModelTest.vala b/test/SerializableObjectModelTest.vala
new file mode 100644
index 0000000..ed45fd4
--- /dev/null
+++ b/test/SerializableObjectModelTest.vala
@@ -0,0 +1,459 @@
+using GXml;
+
+const string XML_COMPUTER_FILE = 
+"""<?xml version="1.0"?>
+<computer manufacturer="ThecnicalGroup" model="YH576G" cores="4" ghz="2.8"/>""";
+
+const string SERIALIZED_XML_COMPUTER_FILE = 
+"""<?xml version="1.0"?><computer manufacturer="MexicanLaptop, Inc." model="LQ59678" cores="8" 
ghz="3.5"/>""";
+
+
+const string XML_MANUAL_FILE =
+"""<?xml version="1.0"?>
+<manual document="Specification" pages="3">This is an Specification file</manual>""";
+
+
+const string XML_PACKAGE_FILE =
+"""<?xml version="1.0"?>
+<PACKAGE source="Mexico/Central" destiny="Japan">
+<manual document="Specification" pages="3">This is an Specification file</manual>
+<Computer manufacturer="LanCorop" model="Lap39120" cores="16" ghz="3.5"/>
+<tag>Printer</tag><tag>Partner</tag><tag>Support</tag>
+</PACKAGE>""";
+
+const string XML_PACKAGE_UNKNOWN_FILE =
+"""<?xml version="1.0"?>
+<PACKAGE source="Mexico/North" destiny="Brazil" Hope="2/4.04">
+  <manual document="Sales Card" pages="1">Selling Card Specification</manual>
+  <Computer manufacturer="BoxingLAN" model="J24-EX9" cores="32" ghz="1.8"/>
+  <Box size="1" volume="33.15" units="cm3" />
+</PACKAGE>""";
+
+public class ObjectModel : SerializableObjectModel
+{
+       public override string to_string ()
+       {
+               var lp = list_serializable_properties ();
+               string ret = this.get_type ().name () +"{Properties:\n";
+               foreach (ParamSpec p in lp) {
+                       Value v = Value (p.value_type);
+                       get_property_value (p, ref v);
+                       string t;
+                       try { t = gvalue_to_string (v); } catch { t = "[CANT_TRANSFORM]"; }
+                       ret += @"[$(p.name)]{" + t + "}\n";
+               }
+               return ret + "}";
+       }
+}
+
+public class Computer : ObjectModel
+{
+       [Description (nick="Manufacturer")]
+       public string manufacturer { get; set; }
+       public string model { get; set; }
+       public int cores { get; set; }
+       public float ghz { get; set; }
+       
+       public Computer ()
+       {
+               manufacturer = "MexicanLaptop, Inc.";
+               model = "LQ59678";
+               cores = 8;
+               ghz = (float) 3.5;
+       }
+}
+
+public class Manual : ObjectModel
+{
+       public string document { get; set; }
+       public int pages { get; set; }
+       public string contents {
+               get { return serialized_xml_node_value; }
+               set { serialized_xml_node_value = value; }
+       }
+       
+       public Manual ()
+       {
+               document = "MANUAL DOCUMENTATION";
+               pages = 3;
+               contents = "TEXT INTO THE MANUAL DOCUMENT";
+               init_properties ();
+               ignored_serializable_properties.set ("contents", get_class ().find_property ("contents"));
+       }
+       
+       public override string to_string ()
+       {
+               return base.to_string () + @"CONTENTS: { $contents }";
+       }
+}
+
+public class Package : ObjectModel
+{
+       Array<string> _tags = new Array<string> ();
+       public Computer computer { get; set; }
+       public Manual manual { get; set; }
+       public string source { get; set; }
+       public string destiny { get; set; }
+       [Description (nick="tag", blurb="tags in package")]
+       public Array<string> tags { get {return _tags;} }
+       
+
+       public Package ()
+       {
+               computer = new Computer ();
+               manual = new Manual ();
+               source = "Mexico";
+               destiny = "World";
+               ((Serializable) this).serialize_unknown_property.connect ( (element, prop, out node) => {
+                       //GLib.message (@"Serializing Unknown Property: $(prop.name) | $(prop.get_nick ())");
+                       if (prop.name == "tags")
+                       {
+                               try {
+                                       for (int i = 0; i < tags.length; i++) {
+                                               var str = tags.index (i);
+                                               node = element.owner_document.create_element ("tag");
+                                               ((Element) node).content = str;
+                                               element.append_child (node);
+                                       }
+                               } catch (Error e) {
+                                       GLib.message (e.message);
+                                       assert_not_reached ();
+                               }
+                       }
+               });
+               ((Serializable) this).deserialize_unknown_property.connect ( (element, prop) => {
+                       //GLib.message (@"Deserializing Unknown Property: $(prop.name) | $(prop.get_nick 
())");
+                       if (prop.get_nick () == "tag")
+                       {
+                               try {
+                                       if (element.node_name == "tag") {
+                                                       tags.append_val (((Element) element).content);
+                                       }
+                               } catch (Error e) {
+                                       GLib.message (e.message);
+                                       assert_not_reached ();
+                               }
+                       }
+               });
+               //GLib.message ("PACKAGE: Properties.");
+//             ParamSpec[] par = this.get_class().list_properties();
+//             for (int i = 0; i < par.length; i++ ) {
+//                     GLib.message (@"Package: Property: $(par[i].name); Type: $(par[i].value_type)");
+//             }
+       }
+
+       public string unknown_to_string ()
+       {
+               string t = "";
+               foreach (GXml.Node node in unknown_serializable_property.get_values ())
+               {
+                       t+= node.to_string () ;
+               }
+               return @"Unknown Properties: {$t}";
+       }
+}
+
+class SerializableObjectModelTest : GXmlTest
+{
+       public static void add_tests ()
+       {
+               Test.add_func ("/gxml/serializable/object_model/serialize/simple_object",
+               () => {
+                       try {
+                               var computer = new Computer ();
+                               var doc = new Document ();
+                               computer.serialize (doc);
+                               if (doc.document_element.tag_name.down () != "computer") {
+                                       stdout.printf ("ERROR XML_COMPUTER: computer\n");
+                                       assert_not_reached ();
+                               }
+                               var m = doc.document_element.get_attribute_node ("manufacturer");
+                               if (m == null) assert_not_reached ();
+                               if (m.node_value != "MexicanLaptop, Inc.") {
+                               stdout.printf ("ERROR XML_COMPUTER: manufacturer\n");
+                                       assert_not_reached ();
+                               }
+                               var mod = doc.document_element.get_attribute_node ("model");
+                               if (mod == null) assert_not_reached ();
+                               if (mod.node_value != "LQ59678") {
+                                       stdout.printf ("ERROR XML_COMPUTER: model\n");
+                                       assert_not_reached ();
+                               }
+                               var c = doc.document_element.get_attribute_node ("cores");
+                               if (c == null) assert_not_reached ();
+                               if (c.node_value != "8") {
+                                       stdout.printf ("ERROR XML_COMPUTER: cores val\n");
+                                       assert_not_reached ();
+                               }
+                               var g = doc.document_element.get_attribute_node ("ghz");
+                               if (g == null) assert_not_reached ();
+                               if (double.parse (g.node_value) != (double) 3.5) {
+                                       stdout.printf ("ERROR XML_COMPUTER: ghz val\n");
+                                       assert_not_reached ();
+                               }
+                       }
+                       catch (Error e) 
+                       {
+                               GLib.message (e.message);
+                               assert_not_reached ();
+                       }
+               }
+               );
+               Test.add_func ("/gxml/serializable/object_model/deserialize_simple_object",
+               () => {
+                       var computer = new Computer ();
+                       try {
+                               var doc = new Document.from_string (XML_COMPUTER_FILE);
+                               computer.deserialize (doc);
+                               if (computer.manufacturer != "ThecnicalGroup") {
+                                       stdout.printf (@"ERROR XML_COMPUTER: manufacturer val: 
$(computer.manufacturer)\n");
+                                       assert_not_reached ();
+                               }
+                               if (computer.model !="YH576G") {
+                                       stdout.printf (@"ERROR XML_COMPUTER: model val: $(computer.model)\n");
+                                       assert_not_reached ();
+                               }
+                               if (computer.cores != 4) {
+                                       stdout.printf (@"ERROR XML_COMPUTER: cores val: $(computer.cores)\n");
+                                       assert_not_reached ();
+                               }
+                               if (computer.ghz != (float) 2.8) {
+                                       stdout.printf (@"ERROR XML_COMPUTER: ghz val: $(computer.ghz)\n");
+                                       assert_not_reached ();
+                               }
+                       } catch (Error e)
+                       {
+                               GLib.message (@"GHz : $(computer.to_string ()) ERROR: $(e.message)");
+                               assert_not_reached ();
+                       }
+               }
+               );
+               Test.add_func ("/gxml/serializable/object_model/deserialize_object_contents",
+               () => {
+                       var manual = new Manual ();
+                       try {
+                               var doc = new Document.from_string (XML_MANUAL_FILE);
+                               manual.deserialize (doc);
+                               if (manual.document != "Specification") {
+                                       stdout.printf (@"ERROR MANUAL:  document: $(manual.document)\n");
+                                       assert_not_reached ();
+                               }
+                               if (manual.pages != 3) {
+                                       stdout.printf (@"ERROR MANUAL:  pages: $(manual.pages)\n");
+                                       assert_not_reached ();
+                               }
+                               if (manual.contents != "This is an Specification file") {
+                                       stdout.printf (@"ERROR MANUAL:  value: $(manual.contents)\n");
+                                       assert_not_reached ();
+                               }
+                       }
+                       catch (Error e) {
+                               GLib.message (@"Error: $(e.message)");
+                               assert_not_reached ();
+                       }
+               }
+               );
+               Test.add_func ("/gxml/serializable/object_model/serialize_object_contents",
+               () => {
+                       var doc = new Document ();
+                       var manual = new Manual ();
+                       try {
+                       manual.serialize (doc);
+                       if (doc.document_element.node_name != "manual") {
+                               stdout.printf (@"ERROR MANUAL:  Element: 
$(doc.document_element.node_name)\n");
+                               assert_not_reached ();
+                       }
+                       Element element = doc.document_element;
+                       serialize_manual_check (element, manual);
+                       } catch (Error e) {
+                               stdout.printf (@"$(e.message)");
+                               assert_not_reached ();
+                       }
+               }
+               );
+               Test.add_func ("/gxml/serializable/object_model/deserialize_serializable_properties",
+               () => {
+                       var package = new Package ();
+                       try {
+                               var doc = new Document.from_string (XML_PACKAGE_FILE);
+                               package.deserialize (doc);
+                               if (package.source != "Mexico/Central") {
+                                       stdout.printf (@"ERROR PACKAGE: source: $(package.source)\n");
+                                       assert_not_reached ();
+                               }
+                               if (package.destiny != "Japan") {
+                                       stdout.printf (@"ERROR PACKAGE: destiny: $(package.destiny)\n");
+                                       assert_not_reached ();
+                               }
+                               if (package.unknown_to_string () != "Unknown Properties: {\n}") {
+                                       stdout.printf (@"ERROR PACKAGE: package unknown properties: 
$(package.unknown_to_string ())\n");
+                                       assert_not_reached ();
+                               }
+                               if (package.manual.document != "Specification") {
+                                       stdout.printf (@"ERROR PACKAGE: manual document: 
$(package.manual.document)\n");
+                                       assert_not_reached ();
+                               }
+                               if (package.manual.pages != 3) {
+                                       stdout.printf (@"ERROR PACKAGE: manual pages: 
$(package.manual.pages)\n");
+                                       assert_not_reached ();
+                               }
+                               if (package.manual.contents != "This is an Specification file") {
+                                       stdout.printf (@"ERROR PACKAGE: manual value: 
$(package.manual.contents)\n");
+                                       assert_not_reached ();
+                               }
+                               if (package.computer.manufacturer != "LanCorop") {
+                                       stdout.printf (@"ERROR PACKAGE: computer manufacturer: 
$(package.computer.manufacturer)\n");
+                                       assert_not_reached ();
+                               }
+                               if (package.computer.model != "Lap39120") {
+                                       stdout.printf (@"ERROR PACKAGE: computer model: 
$(package.computer.model)\n");
+                                       assert_not_reached ();
+                               }
+                               if (package.computer.cores != 16) {
+                                       stdout.printf (@"ERROR PACKAGE: computer cores: 
$(package.computer.cores)\n");
+                                       assert_not_reached ();
+                               }
+                               if (package.computer.ghz != (float) 3.5) {
+                                       stdout.printf (@"ERROR PACKAGE: computer ghz 
$(package.computer.ghz)\n");
+                                       assert_not_reached ();
+                               }
+                       }
+                       catch (Error e) {
+                               GLib.message (@"Error: $(e.message)");
+                               assert_not_reached ();
+                       }
+               }
+               );
+               Test.add_func ("/gxml/serializable/object_model/serialize_serializable_properties",
+               () => {
+                       var doc = new Document ();
+                       var package = new Package ();
+                       try {
+                               package.serialize (doc);
+                               if (doc.document_element.node_name != "package") {
+                                       stdout.printf (@"ERROR MANUAL:  Element: 
$(doc.document_element.node_name)\n");
+                                       assert_not_reached ();
+                               }
+                               Element element = doc.document_element;
+                               var source = element.get_attribute_node ("source");
+                               if (source == null ) assert_not_reached ();
+                               if (source.node_value != "Mexico") {
+                                       stdout.printf (@"ERROR PACKAGE: source: $(source.node_value)\n");
+                                       assert_not_reached ();
+                               }
+                               var destiny = element.get_attribute_node ("destiny");
+                               if (destiny == null ) assert_not_reached ();
+                               if (destiny.node_value != "World") {
+                                       stdout.printf (@"ERROR PACKAGE: source: $(destiny.node_value)\n");
+                                       assert_not_reached ();
+                               }
+                       }
+                       catch (Error e) {
+                               GLib.message (@"Error: $(e.message)");
+                               assert_not_reached ();
+                       }
+               }
+               );
+               Test.add_func ("/gxml/serializable/object_model/deserialize_array_property",
+               () => {
+                       var doc = new Document.from_string (XML_PACKAGE_FILE);
+                       var package = new Package ();
+                       try {
+                               package.deserialize (doc);
+                               if (package.tags.length != 3) {
+                                       stdout.printf (@"ERROR PACKAGE: tags length: $(package.tags.length)");
+                                       assert_not_reached ();
+                               }
+                               if (package.tags.index (0) != "Printer") {
+                                       stdout.printf (@"ERROR PACKAGE: tags index 0: $(package.tags.index 
(0))");
+                                       assert_not_reached ();
+                               }
+                               if (package.tags.index (1) != "Partner") {
+                                       stdout.printf (@"ERROR PACKAGE: tags index 1: $(package.tags.index 
(1))");
+                                       assert_not_reached ();
+                               }
+                               if (package.tags.index (2) != "Support") {
+                                       stdout.printf (@"ERROR PACKAGE: tags index 0: $(package.tags.index 
(2))");
+                                       assert_not_reached ();
+                               }
+                       }
+                       catch (Error e) {
+                               GLib.message (@"Error: $(e.message)");
+                               assert_not_reached ();
+                       }
+               }
+               );
+               Test.add_func ("/gxml/serializable/object_model/serialize_array_property",
+               () => {
+                       var doc = new Document ();
+                       var package = new Package ();
+                       package.tags.append_val ("Computer");
+                       package.tags.append_val ("Customer");
+                       package.tags.append_val ("Sale");
+                       try {
+                               package.serialize (doc);
+                               //stdout.printf (@"$(doc)");
+                               if (doc.document_element.node_name != "package")
+                                       assert_not_reached ();
+                               Element element = doc.document_element;
+                               bool com = false;
+                               bool cus = false;
+                               bool sal = false;
+                               foreach (GXml.Node n in element.child_nodes) {
+                                       //stdout.printf (@"Found Element: $(n.node_name)");
+                                       if (n.node_name == "tag") {
+                                               //stdout.printf (@"Found: $(n.node_name)");
+                                               if (((Element) n).content == "Computer")
+                                                       com = true;
+                                               if (((Element) n).content == "Customer")
+                                                       cus = true;
+                                               if (((Element) n).content == "Sale")
+                                                       sal = true;
+                                       }
+                               }
+                               if (!com) {
+                                       stdout.printf (@"ERROR PACKAGE tag Computer not found!");
+                                       assert_not_reached ();
+                               }
+                               if (!cus) {
+                                       stdout.printf (@"ERROR PACKAGE tag Customer not found!");
+                                       assert_not_reached ();
+                               }
+                               if (!sal) {
+                                       stdout.printf (@"ERROR PACKAGE tag Sale not found!");
+                                       assert_not_reached ();
+                               }
+                       }
+                       catch (Error e) {
+                               GLib.message (@"Error: $(e.message)");
+                               assert_not_reached ();
+                       }
+               }
+               );
+       }
+       static void serialize_manual_check (Element element, Manual manual)
+       {
+               try {
+                       var document = element.get_attribute_node ("document");
+                       if (document == null) assert_not_reached ();
+                       if (document.node_value != manual.document) {
+                               stdout.printf (@"ERROR MANUAL:  document: $(document.node_value)\n");
+                               assert_not_reached ();
+                       }
+                       var pages = element.get_attribute_node ("pages");
+                       if (pages == null) assert_not_reached ();
+                       if (int.parse (pages.node_value) != manual.pages) {
+                               stdout.printf (@"ERROR MANUAL: pages: $(pages.node_value)\n");
+                               assert_not_reached ();
+                       }
+                       if (element.content != manual.contents) {
+                               stdout.printf (@"ERROR MANUAL: content: $(element.content)\n");
+                               assert_not_reached ();
+                       }
+               }
+               catch (Error e) {
+                       GLib.message (@"Error: $(e.message)");
+                       assert_not_reached ();
+               }
+       }
+}


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