New tests.
[mono.git] / mcs / class / System.Xaml / Test / System.Xaml / XamlXmlReaderTest.cs
1 //
2 // Copyright (C) 2010 Novell Inc. http://novell.com
3 //
4 // Permission is hereby granted, free of charge, to any person obtaining
5 // a copy of this software and associated documentation files (the
6 // "Software"), to deal in the Software without restriction, including
7 // without limitation the rights to use, copy, modify, merge, publish,
8 // distribute, sublicense, and/or sell copies of the Software, and to
9 // permit persons to whom the Software is furnished to do so, subject to
10 // the following conditions:
11 // 
12 // The above copyright notice and this permission notice shall be
13 // included in all copies or substantial portions of the Software.
14 // 
15 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
19 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
20 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
21 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22 //
23 using System;
24 using System.Collections;
25 using System.Collections.Generic;
26 using System.ComponentModel;
27 using System.Globalization;
28 using System.IO;
29 using System.Linq;
30 using System.Reflection;
31 using System.Windows.Markup;
32 using System.Xaml;
33 using System.Xaml.Schema;
34 using System.Xml;
35 using NUnit.Framework;
36
37 using Category = NUnit.Framework.CategoryAttribute;
38
39 namespace MonoTests.System.Xaml
40 {
41         [TestFixture]
42         public class XamlXmlReaderTest
43         {
44
45                 // read test
46
47                 XamlReader GetReader (string filename)
48                 {
49                         return new XamlXmlReader (XmlReader.Create (Path.Combine ("Test/XmlFiles", filename), new XmlReaderSettings () { CloseInput =true }));
50                 }
51
52                 void ReadTest (string filename)
53                 {
54                         var r = GetReader (filename);
55                         while (!r.IsEof)
56                                 r.Read ();
57                 }
58
59                 void LoadTest (string filename, Type type)
60                 {
61                         var obj = XamlServices.Load (GetReader (filename));
62                         Assert.AreEqual (type, obj.GetType (), "type");
63                 }
64
65                 [Test]
66                 public void Read_String ()
67                 {
68                         ReadTest ("String.xml");
69                         //LoadTest ("String.xml", typeof (string));
70                 }
71
72                 [Test]
73                 public void Read_Int32 ()
74                 {
75                         ReadTest ("Int32.xml");
76                         //LoadTest ("Int32.xml", typeof (int));
77                 }
78
79                 [Test]
80                 public void Read_DateTime ()
81                 {
82                         ReadTest ("DateTime.xml");
83                         //LoadTest ("DateTime.xml", typeof (DateTime));
84                 }
85
86                 [Test]
87                 public void Read_TimeSpan ()
88                 {
89                         ReadTest ("TimeSpan.xml");
90                         //LoadTest ("TimeSpan.xml", typeof (TimeSpan));
91                 }
92
93                 [Test]
94                 public void Read_ArrayInt32 ()
95                 {
96                         ReadTest ("Array_Int32.xml");
97                         //LoadTest ("Array_Int32.xml", typeof (int []));
98                 }
99
100                 [Test]
101                 public void Read_ListInt32 ()
102                 {
103                         ReadTest ("List_Int32.xml");
104                         //LoadTest ("List_Int32.xml", typeof (List<int>));
105                 }
106
107                 [Test]
108                 [Category ("NotWorking")]
109                 public void Read_DictionaryInt32String ()
110                 {
111                         ReadTest ("Dictionary_Int32_String.xml");
112                         //LoadTest ("Dictionary_Int32_String.xml", typeof (Dictionary<int,string>));
113                 }
114
115                 [Test]
116                 [Category ("NotWorking")]
117                 public void Read_DictionaryStringType ()
118                 {
119                         ReadTest ("Dictionary_String_Type.xml");
120                         //LoadTest ("Dictionary_String_Type.xml", typeof (Dictionary<string,Type>));
121                 }
122
123                 [Test]
124                 public void Read1 ()
125                 {
126                         var r = GetReader ("Int32.xml");
127
128                         Assert.IsTrue (r.Read (), "ns#1");
129                         Assert.AreEqual (XamlNodeType.NamespaceDeclaration, r.NodeType, "ns#2");
130                         Assert.AreEqual (XamlLanguage.Xaml2006Namespace, r.Namespace.Namespace, "ns#3");
131
132                         Assert.IsTrue (r.Read (), "so#1");
133                         Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "so#2");
134                         Assert.AreEqual (XamlLanguage.Int32, r.Type, "so#3");
135
136                         Assert.IsTrue (r.Read (), "sbase#1");
137                         Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "sbase#2");
138                         Assert.AreEqual (XamlLanguage.Base, r.Member, "sbase#3");
139
140                         Assert.IsTrue (r.Read (), "vbase#1");
141                         Assert.AreEqual (XamlNodeType.Value, r.NodeType, "vbase#2");
142                         Assert.IsTrue (r.Value is string, "vbase#3");
143
144                         Assert.IsTrue (r.Read (), "ebase#1");
145                         Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "ebase#2");
146
147                         Assert.IsTrue (r.Read (), "sinit#1");
148                         Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "sinit#2");
149                         Assert.AreEqual (XamlLanguage.Initialization, r.Member, "sinit#3");
150
151                         Assert.IsTrue (r.Read (), "vinit#1");
152                         Assert.AreEqual (XamlNodeType.Value, r.NodeType, "vinit#2");
153                         Assert.AreEqual ("5", r.Value, "vinit#3"); // string
154
155                         Assert.IsTrue (r.Read (), "einit#1");
156                         Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "einit#2");
157
158                         Assert.IsTrue (r.Read (), "eo#1");
159                         Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "eo#2");
160
161                         Assert.IsFalse (r.Read (), "end");
162                 }
163
164                 [Test]
165                 public void Read2 ()
166                 {
167                         var r = GetReader ("DateTime.xml");
168
169                         Assert.IsTrue (r.Read (), "ns#1");
170                         Assert.AreEqual (XamlNodeType.NamespaceDeclaration, r.NodeType, "ns#2");
171                         Assert.AreEqual ("clr-namespace:System;assembly=mscorlib", r.Namespace.Namespace, "ns#3");
172
173                         Assert.IsTrue (r.Read (), "so#1");
174                         Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "so#2");
175                         Assert.AreEqual (r.SchemaContext.GetXamlType (typeof (DateTime)), r.Type, "so#3");
176
177                         Assert.IsTrue (r.Read (), "sbase#1");
178                         Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "sbase#2");
179                         Assert.AreEqual (XamlLanguage.Base, r.Member, "sbase#3");
180
181                         Assert.IsTrue (r.Read (), "vbase#1");
182                         Assert.AreEqual (XamlNodeType.Value, r.NodeType, "vbase#2");
183                         Assert.IsTrue (r.Value is string, "vbase#3");
184
185                         Assert.IsTrue (r.Read (), "ebase#21");
186
187                         Assert.IsTrue (r.Read (), "sinit#1");
188                         Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "sinit#2");
189                         Assert.AreEqual (XamlLanguage.Initialization, r.Member, "sinit#3");
190
191                         Assert.IsTrue (r.Read (), "vinit#1");
192                         Assert.AreEqual (XamlNodeType.Value, r.NodeType, "vinit#2");
193                         Assert.AreEqual ("2010-04-14", r.Value, "vinit#3"); // string
194
195                         Assert.IsTrue (r.Read (), "einit#1");
196                         Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "einit#2");
197
198                         Assert.IsTrue (r.Read (), "eo#1");
199                         Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "eo#2");
200                         Assert.IsFalse (r.Read (), "end");
201                 }
202
203                 [Test]
204                 public void Read3 ()
205                 {
206                         var r = GetReader ("Type.xml");
207
208                         Assert.IsTrue (r.Read (), "ns#1");
209                         Assert.AreEqual (XamlNodeType.NamespaceDeclaration, r.NodeType, "ns#2");
210                         Assert.AreEqual (XamlLanguage.Xaml2006Namespace, r.Namespace.Namespace, "ns#3");
211
212                         Assert.IsTrue (r.Read (), "so#1");
213                         Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "so#2");
214                         Assert.AreEqual (XamlLanguage.Type, r.Type, "so#3");
215
216                         Assert.IsTrue (r.Read (), "sbase#1");
217                         Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "sbase#2");
218                         Assert.AreEqual (XamlLanguage.Base, r.Member, "sbase#3");
219
220                         Assert.IsTrue (r.Read (), "vbase#1");
221                         Assert.AreEqual (XamlNodeType.Value, r.NodeType, "vbase#2");
222                         Assert.IsTrue (r.Value is string, "vbase#3");
223
224                         Assert.IsTrue (r.Read (), "ebase#1");
225                         Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "ebase#2");
226
227                         Assert.IsTrue (r.Read (), "sinit#1");
228                         Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "sinit#2");
229                         // FIXME: They are identical on .NET.
230                         // They aren't on mono, every GetMember() returns different object
231                         // (it is the same as .NET; see XamlMemberTest.EqualsTest.) 
232                         // and XamlMember is almost non-comparable unless they
233                         // are identical, so we fail here.
234                         Assert.AreEqual (XamlLanguage.Type.GetMember ("Type").ToString (), r.Member.ToString (), "sinit#3");
235                         //Assert.AreEqual (XamlLanguage.Type.GetMember ("Type"), r.Member, "sinit#3-2");
236                         //Assert.IsTrue (Object.ReferenceEquals (XamlLanguage.Type.GetMember ("Type"), r.Member), "sinit#3-3");
237
238                         Assert.IsTrue (r.Read (), "vinit#1");
239                         Assert.AreEqual (XamlNodeType.Value, r.NodeType, "vinit#2");
240                         Assert.AreEqual ("x:Int32", r.Value, "vinit#3"); // string
241
242                         Assert.IsTrue (r.Read (), "einit#1");
243                         Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "einit#2");
244
245                         Assert.IsTrue (r.Read (), "eo#1");
246                         Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "eo#2");
247
248                         Assert.IsFalse (r.Read (), "end");
249                 }
250
251                 [Test]
252                 [Category ("NotWorking")]
253                 public void Read4 ()
254                 {
255                         var r = GetReader ("List_Int32.xml");
256
257                         Assert.IsTrue (r.Read (), "ns#1");
258                         Assert.AreEqual (XamlNodeType.NamespaceDeclaration, r.NodeType, "ns#2");
259                         Assert.AreEqual ("clr-namespace:System.Collections.Generic;assembly=mscorlib", r.Namespace.Namespace, "ns#3");
260                         Assert.AreEqual (String.Empty, r.Namespace.Prefix, "ns#4");
261
262                         Assert.IsTrue (r.Read (), "ns2#1");
263                         Assert.AreEqual (XamlNodeType.NamespaceDeclaration, r.NodeType, "ns2#2");
264                         Assert.AreEqual (XamlLanguage.Xaml2006Namespace, r.Namespace.Namespace, "ns2#3");
265                         Assert.AreEqual ("x", r.Namespace.Prefix, "ns2#4");
266
267                         Assert.IsTrue (r.Read (), "so#1");
268                         Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "so#2");
269                         var xt = new XamlType (typeof (List<int>), r.SchemaContext);
270                         Assert.AreEqual (xt, r.Type, "so#3");
271
272                         Assert.IsTrue (r.Read (), "sbase#1");
273                         Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "sbase#2");
274                         Assert.AreEqual (XamlLanguage.Base, r.Member, "sbase#3");
275
276                         Assert.IsTrue (r.Read (), "vbase#1");
277                         Assert.AreEqual (XamlNodeType.Value, r.NodeType, "vbase#2");
278                         Assert.IsTrue (r.Value is string, "vbase#3");
279
280                         Assert.IsTrue (r.Read (), "ebase#1");
281                         Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "ebase#2");
282
283                         Assert.IsTrue (r.Read (), "scap#1");
284                         Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "scap#2");
285                         Assert.AreEqual (xt.GetMember ("Capacity"), r.Member, "scap#3");
286
287                         Assert.IsTrue (r.Read (), "vcap#1");
288                         Assert.AreEqual (XamlNodeType.Value, r.NodeType, "vcap#2");
289                         Assert.AreEqual ("5", r.Value, "vcap#3"); // string
290
291                         Assert.IsTrue (r.Read (), "ecap#1");
292                         Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "ecap#2");
293
294                         Assert.IsTrue (r.Read (), "sItems#1");
295                         Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "sItems#2");
296                         Assert.AreEqual (XamlLanguage.Items, r.Member, "sItems#3");
297
298                         int [] values = {4, -5, 0, 255, int.MaxValue};
299                         var ci = new CultureInfo ("en-US");
300
301                         for (int i = 0; i < 5; i++) {
302                                 Assert.IsTrue (r.Read (), "soItem#1." + i);
303                                 Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "soItem#2." + i);
304                                 Assert.AreEqual (XamlLanguage.Int32, r.Type, "soItem#3." + i);
305
306                                 Assert.IsTrue (r.Read (), "sItem#1." + i);
307                                 Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "sItem#2." + i);
308                                 Assert.AreEqual (XamlLanguage.Initialization, r.Member, "sItem#3." + i);
309
310                                 Assert.IsTrue (r.Read (), "vItem#1." + i);
311                                 Assert.AreEqual (XamlNodeType.Value, r.NodeType, "vItem#2." + i);
312                                 Assert.AreEqual (values [i].ToString (ci), r.Value, "vItem#3." + i);
313
314                                 Assert.IsTrue (r.Read (), "eItem#1." + i);
315                                 Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "eItem#2." + i);
316
317                                 Assert.IsTrue (r.Read (), "eoItem#1");
318                                 Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "eoItem#2");
319                         }
320
321                         Assert.IsTrue (r.Read (), "eItems#1");
322                         Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "eItems#2");
323
324                         Assert.IsTrue (r.Read (), "eo#1");
325                         Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "eo#2");
326
327                         Assert.IsFalse (r.Read (), "end");
328                 }
329         }
330 }