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?
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 (); }
}
return true;
}
+ if (CheckCurrentDirective ())
+ return true;
+
if (!r.EOF)
r.MoveToContent ();
if (r.EOF) {
if (CheckNextNamespace ())
return true;
r.MoveToElement ();
+
if (inside_object_not_member)
ReadStartMember ();
else
// could be: EndObject, EndMember
if (inside_object_not_member)
- ReadEndMember ();
- else
ReadEndType ();
+ else
+ ReadEndMember ();
return true;
default:
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;
string name = r.LocalName;
string ns = r.NamespaceURI;
type_args.Clear ();
+ CollectDirectiveAttributes ();
if (!r.IsEmptyElement) {
r.Read ();
// 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);
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 ()
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;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
+using System.Globalization;
using System.IO;
using System.Linq;
using System.Reflection;
// 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]
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");
}
}
}