2010-04-15 Atsushi Enomoto <atsushi@ximian.com>
authorAtsushi Eno <atsushieno@gmail.com>
Thu, 15 Apr 2010 10:31:41 +0000 (10:31 -0000)
committerAtsushi Eno <atsushieno@gmail.com>
Thu, 15 Apr 2010 10:31:41 +0000 (10:31 -0000)
* XamlXmlReader.cs : ongoing bugfixes to pass start object.

* XamlXmlReaderTest.cs : added a couple more of read and load tests.

svn path=/trunk/mcs/; revision=155491

mcs/class/System.Xaml/System.Xaml/ChangeLog
mcs/class/System.Xaml/System.Xaml/XamlXmlReader.cs
mcs/class/System.Xaml/Test/System.Xaml/ChangeLog
mcs/class/System.Xaml/Test/System.Xaml/XamlXmlReaderTest.cs

index 716eac33d2089d65af828751276a7bdd982834bf..a929a93aa77ddcfa02bffd93766d6589f2b163e2 100644 (file)
@@ -1,3 +1,7 @@
+2010-04-15  Atsushi Enomoto  <atsushi@ximian.com>
+
+       * XamlXmlReader.cs : ongoing bugfixes to pass start object.
+
 2010-04-15  Atsushi Enomoto  <atsushi@ximian.com>
 
        * XamlObjectReader.cs, TypeExtensionMethods.cs :
index 05c8649e1d0e1cb6028443d874ab65769fb07d47..554a14743d1c8fbd1983d7b7f4d73eb498695578 100644 (file)
@@ -26,6 +26,8 @@ using System.IO;
 using System.Xml;
 using System.Xaml.Schema;
 
+using Pair = System.Collections.Generic.KeyValuePair<System.Xaml.XamlDirective,object>;
+
 namespace System.Xaml
 {
        // FIXME: is GetObject supported by this reader?
@@ -142,6 +144,9 @@ namespace System.Xaml
                Stack<XamlType> types = new Stack<XamlType> ();
                XamlMember current_member;
 
+               List<Pair> current_element_directives = new List<Pair> ();
+               IEnumerator<Pair> current_directive_enumerator;
+
                public bool HasLineInfo {
                        get { return line_info != null && line_info.HasLineInfo (); }
                }
@@ -207,6 +212,9 @@ namespace System.Xaml
                                                return true;
                        }
 
+                       if (CheckCurrentDirective ())
+                               return true;
+
                        if (!r.EOF)
                                r.MoveToContent ();
                        if (r.EOF) {
@@ -222,6 +230,7 @@ namespace System.Xaml
                                        if (CheckNextNamespace ())
                                                return true;
                                r.MoveToElement ();
+                               
                                if (inside_object_not_member)
                                        ReadStartMember ();
                                else
@@ -232,9 +241,9 @@ namespace System.Xaml
 
                                // could be: EndObject, EndMember
                                if (inside_object_not_member)
-                                       ReadEndMember ();
-                               else
                                        ReadEndType ();
+                               else
+                                       ReadEndMember ();
                                return true;
 
                        default:
@@ -248,7 +257,7 @@ namespace System.Xaml
                bool CheckNextNamespace ()
                {
                        do {
-                               if (r.NamespaceURI == XamlLanguage.Xml1998Namespace) {
+                               if (r.NamespaceURI == XamlLanguage.Xmlns2000Namespace) {
                                        current = new NamespaceDeclaration (r.Value, r.Prefix == "xmlns" ? r.LocalName : String.Empty);
                                        node_type = XamlNodeType.NamespaceDeclaration;
                                        return true;
@@ -262,6 +271,7 @@ namespace System.Xaml
                        string name = r.LocalName;
                        string ns = r.NamespaceURI;
                        type_args.Clear ();
+                       CollectDirectiveAttributes ();
 
                        if (!r.IsEmptyElement) {
                                r.Read ();
@@ -272,6 +282,11 @@ namespace System.Xaml
                                        // FIXME: parse type arguments etc.
                                        case XmlNodeType.EndElement:
                                                break;
+                                       default:
+                                               // this value is for Initialization
+                                               current_element_directives.Add (new Pair (XamlLanguage.Initialization, r.Value));
+                                               r.Read ();
+                                               continue;
                                        }
                                        break;
                                } while (true);
@@ -289,6 +304,9 @@ namespace System.Xaml
 
                        node_type = XamlNodeType.StartObject;
                        inside_object_not_member = true;
+
+                       // The next Read() results are likely directives.
+                       current_directive_enumerator = current_element_directives.GetEnumerator ();
                }
                
                void ReadStartMember ()
@@ -331,6 +349,45 @@ namespace System.Xaml
                        node_type = XamlNodeType.Value;
                }
 
+               void CollectDirectiveAttributes ()
+               {
+                       var l = current_element_directives;
+                       if (types.Count == 0 && r.BaseURI != null) // top
+                               l.Add (new Pair (XamlLanguage.Base, r.BaseURI));
+               }
+
+               bool CheckCurrentDirective ()
+               {
+                       if (current_directive_enumerator != null) {
+                               // FIXME: value might have to be deserialized.
+                               switch (node_type) {
+                               case XamlNodeType.StartObject:
+                               case XamlNodeType.EndMember:
+                                       // -> StartMember
+                                       if (current_directive_enumerator.MoveNext ()) {
+                                               current = current_member = current_directive_enumerator.Current.Key;
+                                               node_type = XamlNodeType.StartMember;
+                                               return true;
+                                       }
+                                       break;
+                               case XamlNodeType.StartMember:
+                                       // -> Value
+                                       current = current_directive_enumerator.Current.Value;
+                                       node_type = XamlNodeType.Value;
+                                       return true;
+                               case XamlNodeType.Value:
+                                       // -> EndMember
+                                       current = null;
+                                       node_type = XamlNodeType.EndMember;
+                                       return true;
+                               }
+                       }
+
+                       current_element_directives.Clear ();
+                       current_directive_enumerator = null;
+                       return false;
+               }
+               
                string GetLineString ()
                {
                        return HasLineInfo ? String.Format (" Line {0}, at {1}", LineNumber, LinePosition) : String.Empty;
index e6cbb35da49dc5c180b5c3ee5877c6c8c31224e2..6e521eee803a91d8911d72dae223cbb2c1beba1a 100644 (file)
@@ -1,3 +1,7 @@
+2010-04-15  Atsushi Enomoto  <atsushi@ximian.com>
+
+       * XamlXmlReaderTest.cs : added a couple more of read and load tests.
+
 2010-04-15  Atsushi Enomoto  <atsushi@ximian.com>
 
        * XamlObjectReaderTest.cs : add more read tests (lots of them are
index 69a36ed0bcb24e0f21f7b4b113c3e9a880385589..cdf30aafe8c9a21ff9d3d946e535b18beb439ae0 100644 (file)
@@ -24,6 +24,7 @@ using System;
 using System.Collections;
 using System.Collections.Generic;
 using System.ComponentModel;
+using System.Globalization;
 using System.IO;
 using System.Linq;
 using System.Reflection;
@@ -43,37 +44,58 @@ namespace MonoTests.System.Xaml
 
                // read test
 
+               XamlReader GetReader (string filename)
+               {
+                       return new XamlXmlReader (XmlReader.Create (Path.Combine ("Test/XmlFiles", filename), new XmlReaderSettings () { CloseInput =true }));
+               }
+
                void ReadTest (string filename)
                {
-                       using (var xr = XmlReader.Create (Path.Combine ("Test/XmlFiles", filename))) {
-                               var r = new XamlXmlReader (xr);
-                               while (!r.IsEof)
-                                       r.Read ();
-                       }
+                       var r = GetReader (filename);
+                       while (!r.IsEof)
+                               r.Read ();
+               }
+
+               void LoadTest (string filename, Type type)
+               {
+                       var obj = XamlServices.Load (GetReader (filename));
+                       Assert.AreEqual (type, obj.GetType (), "type");
                }
 
                [Test]
                public void Read_String ()
                {
                        ReadTest ("String.xml");
+                       //LoadTest ("String.xml", typeof (string));
                }
 
                [Test]
                public void Read_Int32 ()
                {
                        ReadTest ("Int32.xml");
+                       //LoadTest ("Int32.xml", typeof (int));
+               }
+
+               [Test]
+               [Category ("NotWorking")]
+               public void Read_DateTime ()
+               {
+                       ReadTest ("DateTime.xml");
+                       //LoadTest ("DateTime.xml", typeof (DateTime));
                }
 
                [Test]
                public void Read_TimeSpan ()
                {
                        ReadTest ("TimeSpan.xml");
+                       //LoadTest ("TimeSpan.xml", typeof (TimeSpan));
                }
 
                [Test]
                public void Read_ArrayInt32 ()
                {
                        ReadTest ("Array_Int32.xml");
+                       //LoadTest ("Array_Int32.xml", typeof (int []));
                }
 
                [Test]
@@ -81,6 +103,87 @@ namespace MonoTests.System.Xaml
                public void Read_ListInt32 ()
                {
                        ReadTest ("List_Int32.xml");
+                       LoadTest ("List_Int32.xml", typeof (List<int>));
+               }
+
+               [Test]
+               public void Read1 ()
+               {
+                       var r = GetReader ("Int32.xml");
+
+                       Assert.IsTrue (r.Read (), "ns#1");
+                       Assert.AreEqual (XamlNodeType.NamespaceDeclaration, r.NodeType, "ns#2");
+                       Assert.AreEqual (XamlLanguage.Xaml2006Namespace, r.Namespace.Namespace, "ns#3");
+
+                       Assert.IsTrue (r.Read (), "so#1");
+                       Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "so#2");
+                       Assert.AreEqual (XamlLanguage.Int32, r.Type, "so#3");
+
+                       Assert.IsTrue (r.Read (), "sbase#1");
+                       Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "sbase#2");
+                       Assert.AreEqual (XamlLanguage.Base, r.Member, "sbase#3");
+
+                       Assert.IsTrue (r.Read (), "vbase#1");
+                       Assert.AreEqual (XamlNodeType.Value, r.NodeType, "vbase#2");
+                       Assert.IsTrue (r.Value is string, "vbase#3");
+
+                       Assert.IsTrue (r.Read (), "ebase#21");
+
+                       Assert.IsTrue (r.Read (), "sinit#1");
+                       Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "sinit#2");
+                       Assert.AreEqual (XamlLanguage.Initialization, r.Member, "sinit#3");
+
+                       Assert.IsTrue (r.Read (), "vinit#1");
+                       Assert.AreEqual (XamlNodeType.Value, r.NodeType, "vinit#2");
+                       Assert.AreEqual ("5", r.Value, "vinit#3"); // string
+
+                       Assert.IsTrue (r.Read (), "einit#1");
+                       Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "einit#2");
+
+                       Assert.IsTrue (r.Read (), "eo#1");
+                       Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "eo#2");
+
+                       Assert.IsFalse (r.Read (), "end");
+               }
+
+               [Test]
+               [Category ("NotWorking")]
+               public void Read2 ()
+               {
+                       var r = GetReader ("DateTime.xml");
+
+                       Assert.IsTrue (r.Read (), "ns#1");
+                       Assert.AreEqual (XamlNodeType.NamespaceDeclaration, r.NodeType, "ns#2");
+                       Assert.AreEqual ("clr-namespace:System;assembly=mscorlib", r.Namespace.Namespace, "ns#3");
+
+                       Assert.IsTrue (r.Read (), "so#1");
+                       Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "so#2");
+                       Assert.AreEqual (r.SchemaContext.GetXamlType (typeof (DateTime)), r.Type, "so#3");
+
+                       Assert.IsTrue (r.Read (), "sbase#1");
+                       Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "sbase#2");
+                       Assert.AreEqual (XamlLanguage.Base, r.Member, "sbase#3");
+
+                       Assert.IsTrue (r.Read (), "vbase#1");
+                       Assert.AreEqual (XamlNodeType.Value, r.NodeType, "vbase#2");
+                       Assert.IsTrue (r.Value is string, "vbase#3");
+
+                       Assert.IsTrue (r.Read (), "ebase#21");
+
+                       Assert.IsTrue (r.Read (), "sinit#1");
+                       Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "sinit#2");
+                       Assert.AreEqual (XamlLanguage.Initialization, r.Member, "sinit#3");
+
+                       Assert.IsTrue (r.Read (), "vinit#1");
+                       Assert.AreEqual (XamlNodeType.Value, r.NodeType, "vinit#2");
+                       Assert.AreEqual ("2010-04-14", r.Value, "vinit#3"); // string
+
+                       Assert.IsTrue (r.Read (), "einit#1");
+                       Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "einit#2");
+
+                       Assert.IsTrue (r.Read (), "eo#1");
+                       Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "eo#2");
+                       Assert.IsFalse (r.Read (), "end");
                }
        }
 }