2010-04-16 Atsushi Enomoto <atsushi@ximian.com>
authorAtsushi Eno <atsushieno@gmail.com>
Fri, 16 Apr 2010 09:31:50 +0000 (09:31 -0000)
committerAtsushi Eno <atsushieno@gmail.com>
Fri, 16 Apr 2010 09:31:50 +0000 (09:31 -0000)
* XamlXmlReader.cs : Resolve generic type names. Process attribute
  members.
* XamlLanguage.cs : add XamlTypeName-to-ClrType method.
* XmlSchemaContext.cs : extracted special type name handling to above.

* XamlXmlReaderTest.cs : add more detailed read tests, and more
  file-based tests (not working yet).

* Dictionary_Int32_String.xml, Dictionary_String_Type.xml :
  add more test files (not working though).

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

mcs/class/System.Xaml/System.Xaml/ChangeLog
mcs/class/System.Xaml/System.Xaml/XamlLanguage.cs
mcs/class/System.Xaml/System.Xaml/XamlSchemaContext.cs
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
mcs/class/System.Xaml/Test/XmlFiles/ChangeLog
mcs/class/System.Xaml/Test/XmlFiles/Dictionary_Int32_String.xml [new file with mode: 0644]
mcs/class/System.Xaml/Test/XmlFiles/Dictionary_String_Type.xml [new file with mode: 0644]

index 822a01daef53890e5de6c8b0ca1aa2d8ae4bffb6..f40f80a5febc56e3848935556d578046a53801c5 100644 (file)
@@ -1,3 +1,10 @@
+2010-04-16  Atsushi Enomoto  <atsushi@ximian.com>
+
+       * XamlXmlReader.cs : Resolve generic type names. Process attribute
+         members.
+       * XamlLanguage.cs : add XamlTypeName-to-ClrType method.
+       * XmlSchemaContext.cs : extracted special type name handling to above.
+
 2010-04-16  Atsushi Enomoto  <atsushi@ximian.com>
 
        * XamlType.cs : sort of reverted AllowedContentTypes.
index 266a85246e64eaf6f6270c464d425c280b4af926..c91838186b8313a35bcbec3522083089728da4dc 100644 (file)
@@ -24,6 +24,7 @@ using System;
 using System.Collections.Generic;
 using System.Collections.ObjectModel;
 using System.Globalization;
+using System.Linq;
 using System.Reflection;
 using System.Xaml.Schema;
 using System.Windows.Markup;
@@ -215,24 +216,72 @@ namespace System.Xaml
                        }
                }
 
+               internal static XamlType GetSpecialXaml2006Type (string name)
+               {
+                       // FIXME: I'm not really sure if these *special* names 
+                       // should be resolved here and there. There just does
+                       // not seem to be any other appropriate places.
+                       switch (name) {
+                       case "Array":
+                               return XamlLanguage.Array;
+                       case "Member":
+                               return XamlLanguage.Member;
+                       case "Null":
+                               return XamlLanguage.Null;
+                       case "Property":
+                               return XamlLanguage.Property;
+                       case "Static":
+                               return XamlLanguage.Static;
+                       case "Type":
+                               return XamlLanguage.Type;
+                       }
+                       return null;
+               }
+
                static readonly int clr_ns_len = "clr-namespace:".Length;
                static readonly int clr_ass_len = "assembly=".Length;
 
-               internal static Type ParseClrTypeName (string xmlNamespace, string xmlLocalName)
+               internal static Type ResolveXamlTypeName (string xmlNamespace, string xmlLocalName, IList<XamlTypeName> typeArguments, IXamlNamespaceResolver nsResolver)
                {
                        string ns = xmlNamespace;
                        string name = xmlLocalName;
 
-                       if (!ns.StartsWith ("clr-namespace:", StringComparison.Ordinal))
-                               return null;
+                       if (ns == XamlLanguage.Xaml2006Namespace) {
+                               var xt = GetSpecialXaml2006Type (name);
+                               if (xt == null)
+                                       xt = AllTypes.FirstOrDefault (t => t.Name == xmlLocalName);
+                               if (xt == null)
+                                       throw new FormatException (string.Format ("There is no type '{0}' in XAML namespace", name));
+                               return xt.UnderlyingType;
+                       }
+                       else if (!ns.StartsWith ("clr-namespace:", StringComparison.Ordinal))
+                               throw new FormatException (string.Format ("Unexpected XAML namespace '{0}'", ns));
+
+                       Type [] genArgs = null;
+                       if (typeArguments != null) {
+                               var xtns = typeArguments;
+                               genArgs = new Type [xtns.Count];
+                               for (int i = 0; i < genArgs.Length; i++) {
+                                       var xtn = xtns [i];
+                                       genArgs [i] = ResolveXamlTypeName (xtn.Namespace, xtn.Name, xtn.TypeArguments, nsResolver);
+                               }
+                       }
 
+                       // convert xml namespace to clr namespace and assembly
                        string [] split = ns.Split (';');
                        if (split.Length != 2 || split [0].Length <= clr_ns_len || split [1].Length <= clr_ass_len)
                                throw new XamlParseException (string.Format ("Cannot resolve runtime namespace from XML namespace '{0}'", ns));
-                       var tns = split [0].Substring (clr_ns_len);
-                       var tan = split [1].Substring (clr_ass_len);
-                       string aqn = (tns.Length > 0 ? tns + '.' + name : name) + (tan.Length > 0 ? ", " + tan : string.Empty);
-                       return System.Type.GetType (aqn);
+                       string tns = split [0].Substring (clr_ns_len);
+                       string aname = split [1].Substring (clr_ass_len);
+
+                       string tfn = tns.Length > 0 ? tns + '.' + name : name;
+                       if (genArgs != null)
+                               tfn += "`" + genArgs.Length;
+                       string taqn = tfn + (aname.Length > 0 ? ", " + aname : string.Empty);
+                       var ret = System.Type.GetType (taqn);
+                       if (ret == null)
+                               throw new XamlParseException (string.Format ("Cannot resolve runtime type from XML namespace '{0}', local name '{1}' with {2} type arguments ({3})", ns, name, typeArguments.Count, taqn));
+                       return genArgs == null ? ret : ret.MakeGenericType (genArgs);
                }
        }
 }
index b07dd66a589fafeab702179bcf06a142d480a176..e5eaaf7128737277230be0a34b0996c6e7743bf1 100644 (file)
@@ -189,25 +189,9 @@ namespace System.Xaml
 
                        XamlType ret;
                        if (xamlNamespace == XamlLanguage.Xaml2006Namespace) {
-                               // FIXME: I'm not really sure if these *special*
-                               // names should be resolved here. There just
-                               // does not seem to be any other appropriate
-                               // places.
-                               switch (name) {
-                               case "Array":
-                                       return XamlLanguage.Array;
-                               case "Member":
-                                       return XamlLanguage.Member;
-                               case "Null":
-                                       return XamlLanguage.Null;
-                               case "Property":
-                                       return XamlLanguage.Property;
-                               case "Static":
-                                       return XamlLanguage.Static;
-                               case "Type":
-                                       return XamlLanguage.Type;
-                               }
-                               ret = XamlLanguage.AllTypes.FirstOrDefault (t => TypeMatches (t, xamlNamespace, name, typeArguments));
+                               ret = XamlLanguage.GetSpecialXaml2006Type (name);
+                               if (ret == null)
+                                       ret = XamlLanguage.AllTypes.FirstOrDefault (t => TypeMatches (t, xamlNamespace, name, typeArguments));
                                if (ret != null)
                                        return ret;
                        }
index dfde4d166f12e1a8c0322d5c15bf1dc21e090fbf..eab41741282ba3179c7e3d1fbe82125248f23ac6 100644 (file)
 using System;
 using System.Collections.Generic;
 using System.IO;
+using System.Linq;
 using System.Xml;
 using System.Xaml.Schema;
 
-using Pair = System.Collections.Generic.KeyValuePair<System.Xaml.XamlDirective,object>;
+using Pair = System.Collections.Generic.KeyValuePair<System.Xaml.XamlMember,string>;
 
 namespace System.Xaml
 {
        // FIXME: is GetObject supported by this reader?
        public class XamlXmlReader : XamlReader, IXamlLineInfo
        {
+               #region constructors
+
                public XamlXmlReader (Stream stream)
                        : this (stream, (XamlXmlReaderSettings) null)
                {
@@ -129,7 +132,10 @@ namespace System.Xaml
 
                        r = XmlReader.Create (xmlReader, xrs);
                        line_info = r as IXmlLineInfo;
+                       xaml_namespace_resolver = new NamespaceResolver (r as IXmlNamespaceResolver);
                }
+               
+               #endregion
 
                XmlReader r;
                IXmlLineInfo line_info;
@@ -140,12 +146,12 @@ namespace System.Xaml
                
                object current;
                bool inside_object_not_member, is_empty_object, is_empty_member;
-               List<XamlTypeName> type_args = new List<XamlTypeName> ();
                Stack<XamlType> types = new Stack<XamlType> ();
                XamlMember current_member;
 
-               List<Pair> current_element_directives = new List<Pair> ();
-               IEnumerator<Pair> current_directive_enumerator;
+               List<Pair> stored_members = new List<Pair> ();
+               IEnumerator<Pair> stored_member_enumerator;
+               IXamlNamespaceResolver xaml_namespace_resolver;
 
                public bool HasLineInfo {
                        get { return line_info != null && line_info.HasLineInfo (); }
@@ -193,6 +199,10 @@ namespace System.Xaml
                        if (is_eof)
                                return false;
 
+                       // check this before is_empty_* so that they aren't ignored.
+                       if (MoveToNextAttributeMember ())
+                               return true;
+
                        if (is_empty_object) {
                                is_empty_object = false;
                                ReadEndType ();
@@ -212,9 +222,6 @@ namespace System.Xaml
                                                return true;
                        }
 
-                       if (CheckCurrentDirective ())
-                               return true;
-
                        if (!r.EOF)
                                r.MoveToContent ();
                        if (r.EOF) {
@@ -270,8 +277,8 @@ namespace System.Xaml
                {
                        string name = r.LocalName;
                        string ns = r.NamespaceURI;
-                       type_args.Clear ();
-                       CollectDirectiveAttributes ();
+                       string typeArgNames = null;
+                       var atts = ProcessAttributes ();
 
                        if (!r.IsEmptyElement) {
                                r.Read ();
@@ -284,7 +291,8 @@ namespace System.Xaml
                                                break;
                                        default:
                                                // this value is for Initialization
-                                               current_element_directives.Add (new Pair (XamlLanguage.Initialization, r.Value));
+                                               // FIXME: this could also be a WrappedContents
+                                               stored_members.Add (new Pair (XamlLanguage.Initialization, r.Value));
                                                r.Read ();
                                                continue;
                                        }
@@ -294,15 +302,21 @@ namespace System.Xaml
                        else
                                is_empty_object = true;
 
-                       XamlType xt;
-                       if (ns.StartsWith ("clr-namespace:", StringComparison.Ordinal)) {
-                               Type rtype = XamlLanguage.ParseClrTypeName (ns, name);
-                               if (rtype == null)
-                                       throw new XamlParseException (String.Format ("Cannot resolve runtime namespace from XML namespace '{0}' and local name '{1}'", ns, name));
-                               xt = sctx.GetXamlType (rtype);
+                       // check TypeArguments to resolve Type, and remove them from the list. They don't appear as a node.
+                       foreach (var p in stored_members) {
+                               if (p.Key == XamlLanguage.TypeArguments) {
+                                       typeArgNames = p.Value;
+                                       stored_members.Remove (p);
+                                       break;
+                               }
                        }
-                       else
-                               xt = sctx.GetXamlType (new XamlTypeName (ns, name, type_args.ToArray ()));
+
+                       XamlType xt;
+                       IList<XamlTypeName> typeArgs = typeArgNames == null ? null : XamlTypeName.ParseList (typeArgNames, xaml_namespace_resolver);
+                       Type rtype = XamlLanguage.ResolveXamlTypeName (ns, name, typeArgs, xaml_namespace_resolver);
+                       if (rtype == null)
+                               throw new XamlParseException (String.Format ("Cannot resolve runtime namespace from XML namespace '{0}', local name '{1}' and type argument '{2}'", ns, name, typeArgNames));
+                       xt = sctx.GetXamlType (rtype);
                        if (xt == null)
                                // FIXME: .NET just treats the node as empty!
                                // we have to sort out what to do here.
@@ -310,11 +324,18 @@ namespace System.Xaml
                        types.Push (xt);
                        current = xt;
 
+                       foreach (var p in atts) {
+                               var xm = xt.GetMember (p.Key);
+                               if (xm != null)
+                                       stored_members.Add (new Pair (xm, p.Value));
+                               // ignore unknown attribute
+                       }
+
                        node_type = XamlNodeType.StartObject;
                        inside_object_not_member = true;
 
                        // The next Read() results are likely directives.
-                       current_directive_enumerator = current_element_directives.GetEnumerator ();
+                       stored_member_enumerator = stored_members.GetEnumerator ();
                }
                
                void ReadStartMember ()
@@ -357,30 +378,56 @@ namespace System.Xaml
                        node_type = XamlNodeType.Value;
                }
 
-               void CollectDirectiveAttributes ()
+               // returns remaining attributes to be processed
+               Dictionary<string,string> ProcessAttributes ()
                {
-                       var l = current_element_directives;
-                       if (types.Count == 0 && r.BaseURI != null) // top
-                               l.Add (new Pair (XamlLanguage.Base, r.BaseURI));
+                       var l = stored_members;
+
+                       // base
+                       string xmlbase = r.GetAttribute ("base", XamlLanguage.Xml1998Namespace) ?? r.BaseURI;
+                       if (types.Count == 0 && xmlbase != null) // top
+                               l.Add (new Pair (XamlLanguage.Base, xmlbase));
+
+                       var atts = new Dictionary<string,string> ();
+
+                       if (r.MoveToFirstAttribute ()) {
+                               do {
+                                       if (r.NamespaceURI == XamlLanguage.Xmlns2000Namespace)
+                                               continue;
+                                       XamlDirective d = XamlLanguage.AllDirectives.FirstOrDefault (dd => (dd.AllowedLocation & AllowedMemberLocations.Attribute) != 0 && dd.Name == r.LocalName);
+                                       if (d != null) {
+                                               l.Add (new Pair (d, r.Value));
+                                               continue;
+                                       }
+                                       if (r.NamespaceURI == String.Empty) {
+                                               atts.Add (r.LocalName, r.Value);
+                                               continue;
+                                       }
+                                       // Should we just ignore unknown attribute in XAML namespace or any other namespaces ?
+                                       // Probably yes for compatibility with future version.
+                               } while (r.MoveToNextAttribute ());
+                               r.MoveToElement ();
+                       }
+                       return atts;
                }
 
-               bool CheckCurrentDirective ()
+               bool MoveToNextAttributeMember ()
                {
-                       if (current_directive_enumerator != null) {
+                       if (stored_member_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;
+                                       if (stored_member_enumerator.MoveNext ()) {
+                                               current = current_member = stored_member_enumerator.Current.Key;
                                                node_type = XamlNodeType.StartMember;
                                                return true;
                                        }
                                        break;
                                case XamlNodeType.StartMember:
                                        // -> Value
-                                       current = current_directive_enumerator.Current.Value;
+                                       current = stored_member_enumerator.Current.Value;
                                        node_type = XamlNodeType.Value;
                                        return true;
                                case XamlNodeType.Value:
@@ -391,8 +438,8 @@ namespace System.Xaml
                                }
                        }
 
-                       current_element_directives.Clear ();
-                       current_directive_enumerator = null;
+                       stored_members.Clear ();
+                       stored_member_enumerator = null;
                        return false;
                }
                
@@ -400,5 +447,26 @@ namespace System.Xaml
                {
                        return HasLineInfo ? String.Format (" Line {0}, at {1}", LineNumber, LinePosition) : String.Empty;
                }
+
+               class NamespaceResolver : IXamlNamespaceResolver
+               {
+                       IXmlNamespaceResolver source;
+
+                       public NamespaceResolver (IXmlNamespaceResolver source)
+                       {
+                               this.source = source;
+                       }
+
+                       public string GetNamespace (string prefix)
+                       {
+                               return source.LookupNamespace (prefix);
+                       }
+
+                       public IEnumerable<NamespaceDeclaration> GetNamespacePrefixes ()
+                       {
+                               foreach (var p in source.GetNamespacesInScope (XmlNamespaceScope.All))
+                                       yield return new NamespaceDeclaration (p.Value, p.Key);
+                       }
+               }
        }
 }
index 58a3eebcea8f2c2fb8bb00073612f6095ea873df..da52b564028b422244ef0e4153308e2914dfe104 100644 (file)
@@ -1,3 +1,8 @@
+2010-04-16  Atsushi Enomoto  <atsushi@ximian.com>
+
+       * XamlXmlReaderTest.cs : add more detailed read tests, and more
+         file-based tests (not working yet).
+
 2010-04-15  Atsushi Enomoto  <atsushi@ximian.com>
 
        * XamlTypeTest.cs, XamlLanguageTest.cs : enable AllowedContentTypes
index 6a47ea7741af96cf8307c4e733c5717683cbabd7..a51c7e3a402faa325f7ff5cffb07bccef97b9dd9 100644 (file)
@@ -105,6 +105,22 @@ namespace MonoTests.System.Xaml
                        LoadTest ("List_Int32.xml", typeof (List<int>));
                }
 
+               [Test]
+               [Category ("NotWorking")]
+               public void Read_DictionaryInt32String ()
+               {
+                       ReadTest ("Dictionary_Int32_String.xml");
+                       LoadTest ("Dictionary_Int32_String.xml", typeof (Dictionary<int,string>));
+               }
+
+               [Test]
+               [Category ("NotWorking")]
+               public void Read_DictionaryStringType ()
+               {
+                       ReadTest ("Dictionary_String_Type.xml");
+                       LoadTest ("Dictionary_String_Type.xml", typeof (Dictionary<string,Type>));
+               }
+
                [Test]
                public void Read1 ()
                {
@@ -184,5 +200,127 @@ namespace MonoTests.System.Xaml
                        Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "eo#2");
                        Assert.IsFalse (r.Read (), "end");
                }
+
+               [Test]
+               public void Read3 ()
+               {
+                       var r = GetReader ("Type.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.Type, 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#1");
+                       Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "ebase#2");
+
+                       Assert.IsTrue (r.Read (), "sinit#1");
+                       Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "sinit#2");
+                       // FIXME: fix XamlMember.Equals()
+                       //Assert.AreEqual (XamlLanguage.Type.GetMember ("Type"), r.Member, "sinit#3");
+                       Assert.AreEqual (XamlLanguage.Type.GetMember ("Type").ToString (), r.Member.ToString (), "sinit#3");
+
+                       Assert.IsTrue (r.Read (), "vinit#1");
+                       Assert.AreEqual (XamlNodeType.Value, r.NodeType, "vinit#2");
+                       Assert.AreEqual ("x:Int32", 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 Read4 ()
+               {
+                       var r = GetReader ("List_Int32.xml");
+
+                       Assert.IsTrue (r.Read (), "ns#1");
+                       Assert.AreEqual (XamlNodeType.NamespaceDeclaration, r.NodeType, "ns#2");
+                       Assert.AreEqual ("clr-namespace:System.Collections.Generic;assembly=mscorlib", r.Namespace.Namespace, "ns#3");
+                       Assert.AreEqual (String.Empty, r.Namespace.Prefix, "ns#4");
+
+                       Assert.IsTrue (r.Read (), "ns2#1");
+                       Assert.AreEqual (XamlNodeType.NamespaceDeclaration, r.NodeType, "ns2#2");
+                       Assert.AreEqual (XamlLanguage.Xaml2006Namespace, r.Namespace.Namespace, "ns2#3");
+                       Assert.AreEqual ("x", r.Namespace.Prefix, "ns2#4");
+
+                       Assert.IsTrue (r.Read (), "so#1");
+                       Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "so#2");
+                       var xt = new XamlType (typeof (List<int>), r.SchemaContext);
+                       Assert.AreEqual (xt, 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#1");
+                       Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "ebase#2");
+
+                       Assert.IsTrue (r.Read (), "scap#1");
+                       Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "scap#2");
+                       Assert.AreEqual (xt.GetMember ("Capacity"), r.Member, "scap#3");
+
+                       Assert.IsTrue (r.Read (), "vcap#1");
+                       Assert.AreEqual (XamlNodeType.Value, r.NodeType, "vcap#2");
+                       Assert.AreEqual ("5", r.Value, "vcap#3"); // string
+
+                       Assert.IsTrue (r.Read (), "ecap#1");
+                       Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "ecap#2");
+
+                       Assert.IsTrue (r.Read (), "sItems#1");
+                       Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "sItems#2");
+                       Assert.AreEqual (XamlLanguage.Items, r.Member, "sItems#3");
+
+                       int [] values = {4, -5, 0, 255, int.MaxValue};
+                       var ci = new CultureInfo ("en-US");
+
+                       for (int i = 0; i < 5; i++) {
+                               Assert.IsTrue (r.Read (), "soItem#1." + i);
+                               Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "soItem#2." + i);
+                               Assert.AreEqual (XamlLanguage.Int32, r.Type, "soItem#3." + i);
+
+                               Assert.IsTrue (r.Read (), "sItem#1." + i);
+                               Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "sItem#2." + i);
+                               Assert.AreEqual (XamlLanguage.Initialization, r.Member, "sItem#3." + i);
+
+                               Assert.IsTrue (r.Read (), "vItem#1." + i);
+                               Assert.AreEqual (XamlNodeType.Value, r.NodeType, "vItem#2." + i);
+                               Assert.AreEqual (values [i].ToString (ci), r.Value, "vItem#3." + i);
+
+                               Assert.IsTrue (r.Read (), "eItem#1." + i);
+                               Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "eItem#2." + i);
+
+                               Assert.IsTrue (r.Read (), "eoItem#1");
+                               Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "eoItem#2");
+                       }
+
+                       Assert.IsTrue (r.Read (), "eItems#1");
+                       Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "eItems#2");
+
+                       Assert.IsTrue (r.Read (), "eo#1");
+                       Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "eo#2");
+
+                       Assert.IsFalse (r.Read (), "end");
+               }
        }
 }
index 7c0de9f5f184cfa5ef9d23b2b6656c9ed7b5b7ee..a4a430c80c4e32396e52b021655da7a0cc179fb4 100644 (file)
@@ -1,3 +1,8 @@
+2010-04-16  Atsushi Enomoto  <atsushi@ximian.com>
+
+       * Dictionary_Int32_String.xml, Dictionary_String_Type.xml :
+         add more test files (not working though).
+
 2010-04-15  Atsushi Enomoto  <atsushi@ximian.com>
 
        * DateTime.xml : new test file. (not working though)
diff --git a/mcs/class/System.Xaml/Test/XmlFiles/Dictionary_Int32_String.xml b/mcs/class/System.Xaml/Test/XmlFiles/Dictionary_Int32_String.xml
new file mode 100644 (file)
index 0000000..04d5a56
--- /dev/null
@@ -0,0 +1,5 @@
+<Dictionary x:TypeArguments="x:Int32, x:String" xmlns="clr-namespace:System.Collections.Generic;assembly=mscorlib" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
+  <x:String x:Key="0">foo</x:String>
+  <x:String x:Key="5">bar</x:String>
+  <x:String x:Key="-2">baz</x:String>
+</Dictionary>
\ No newline at end of file
diff --git a/mcs/class/System.Xaml/Test/XmlFiles/Dictionary_String_Type.xml b/mcs/class/System.Xaml/Test/XmlFiles/Dictionary_String_Type.xml
new file mode 100644 (file)
index 0000000..90520b2
--- /dev/null
@@ -0,0 +1,8 @@
+<Dictionary x:TypeArguments="x:String, s:Type" xmlns="clr-namespace:System.Collections.Generic;assembly=mscorlib" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
+  <x:Type Type="x:Int32" x:Key="t1" />
+  <x:Type Type="s:Int32[]" x:Key="t2" />
+  <x:Type Type="s:Nullable(x:Int32)" x:Key="t3" />
+  <x:Type Type="List(x:Int32)" x:Key="t4" />
+  <x:Type Type="Dictionary(x:Int32, s:DateTime)" x:Key="t5" />
+  <x:Type Type="List(KeyValuePair(x:Int32, s:DateTime))" x:Key="t6" />
+</Dictionary>
\ No newline at end of file