Get List<int> working with XamlXmlReader and XamlObjectWriter.
[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 CategoryAttribute = 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                 T LoadTest<T> (string filename)
60                 {
61                         Type type = typeof (T);
62                         var obj = XamlServices.Load (GetReader (filename));
63                         Assert.AreEqual (type, obj.GetType (), "type");
64                         return (T) obj;
65                 }
66
67                 [Test]
68                 public void Read_String ()
69                 {
70                         ReadTest ("String.xml");
71                         var ret = LoadTest<string> ("String.xml");
72                         Assert.AreEqual ("foo", ret, "ret");
73                 }
74
75                 [Test]
76                 public void Read_Int32 ()
77                 {
78                         ReadTest ("Int32.xml");
79                         var ret = LoadTest<int> ("Int32.xml");
80                         Assert.AreEqual (5, ret, "ret");
81                 }
82
83                 [Test]
84                 public void Read_DateTime ()
85                 {
86                         ReadTest ("DateTime.xml");
87                         var ret = LoadTest<DateTime> ("DateTime.xml");
88                         Assert.AreEqual (new DateTime (2010, 4, 14), ret, "ret");
89                 }
90
91                 [Test]
92                 public void Read_TimeSpan ()
93                 {
94                         ReadTest ("TimeSpan.xml");
95                         var ret = LoadTest<TimeSpan> ("TimeSpan.xml");
96                         Assert.AreEqual (TimeSpan.FromMinutes (7), ret, "ret");
97                 }
98
99                 [Test]
100                 public void Read_ArrayInt32 ()
101                 {
102                         ReadTest ("Array_Int32.xml");
103                         //LoadTest<int[]> ("Array_Int32.xml");
104                 }
105
106                 [Test]
107                 public void Read_ListInt32 ()
108                 {
109                         ReadTest ("List_Int32.xml");
110                         var ret = LoadTest<List<int>> ("List_Int32.xml");
111                         Assert.AreEqual (5, ret.Count, "#1");
112                         Assert.AreEqual (2147483647, ret [4], "#2");
113                 }
114
115                 [Test]
116                 [Category ("NotWorking")]
117                 public void Read_DictionaryInt32String ()
118                 {
119                         ReadTest ("Dictionary_Int32_String.xml");
120                         //LoadTest<Dictionary<int,string>> ("Dictionary_Int32_String.xml");
121                 }
122
123                 [Test]
124                 [Category ("NotWorking")]
125                 public void Read_DictionaryStringType ()
126                 {
127                         ReadTest ("Dictionary_String_Type.xml");
128                         //LoadTest<Dictionary<string,Type>> ("Dictionary_String_Type.xml");
129                 }
130
131                 [Test]
132                 public void Read_SilverlightApp1 ()
133                 {
134                         ReadTest ("SilverlightApp1.xaml");
135                 }
136
137                 [Test]
138                 public void Read1 ()
139                 {
140                         var r = GetReader ("Int32.xml");
141
142                         Assert.IsTrue (r.Read (), "ns#1");
143                         Assert.AreEqual (XamlNodeType.NamespaceDeclaration, r.NodeType, "ns#2");
144                         Assert.AreEqual (XamlLanguage.Xaml2006Namespace, r.Namespace.Namespace, "ns#3");
145
146                         Assert.IsTrue (r.Read (), "so#1");
147                         Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "so#2");
148                         Assert.AreEqual (XamlLanguage.Int32, r.Type, "so#3");
149
150                         Assert.IsTrue (r.Read (), "sbase#1");
151                         Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "sbase#2");
152                         Assert.AreEqual (XamlLanguage.Base, r.Member, "sbase#3");
153
154                         Assert.IsTrue (r.Read (), "vbase#1");
155                         Assert.AreEqual (XamlNodeType.Value, r.NodeType, "vbase#2");
156                         Assert.IsTrue (r.Value is string, "vbase#3");
157
158                         Assert.IsTrue (r.Read (), "ebase#1");
159                         Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "ebase#2");
160
161                         Assert.IsTrue (r.Read (), "sinit#1");
162                         Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "sinit#2");
163                         Assert.AreEqual (XamlLanguage.Initialization, r.Member, "sinit#3");
164
165                         Assert.IsTrue (r.Read (), "vinit#1");
166                         Assert.AreEqual (XamlNodeType.Value, r.NodeType, "vinit#2");
167                         Assert.AreEqual ("5", r.Value, "vinit#3"); // string
168
169                         Assert.IsTrue (r.Read (), "einit#1");
170                         Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "einit#2");
171
172                         Assert.IsTrue (r.Read (), "eo#1");
173                         Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "eo#2");
174
175                         Assert.IsFalse (r.Read (), "end");
176                 }
177
178                 [Test]
179                 public void Read2 ()
180                 {
181                         var r = GetReader ("DateTime.xml");
182
183                         Assert.IsTrue (r.Read (), "ns#1");
184                         Assert.AreEqual (XamlNodeType.NamespaceDeclaration, r.NodeType, "ns#2");
185                         Assert.AreEqual ("clr-namespace:System;assembly=mscorlib", r.Namespace.Namespace, "ns#3");
186
187                         Assert.IsTrue (r.Read (), "so#1");
188                         Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "so#2");
189                         Assert.AreEqual (r.SchemaContext.GetXamlType (typeof (DateTime)), r.Type, "so#3");
190
191                         Assert.IsTrue (r.Read (), "sbase#1");
192                         Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "sbase#2");
193                         Assert.AreEqual (XamlLanguage.Base, r.Member, "sbase#3");
194
195                         Assert.IsTrue (r.Read (), "vbase#1");
196                         Assert.AreEqual (XamlNodeType.Value, r.NodeType, "vbase#2");
197                         Assert.IsTrue (r.Value is string, "vbase#3");
198
199                         Assert.IsTrue (r.Read (), "ebase#21");
200
201                         Assert.IsTrue (r.Read (), "sinit#1");
202                         Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "sinit#2");
203                         Assert.AreEqual (XamlLanguage.Initialization, r.Member, "sinit#3");
204
205                         Assert.IsTrue (r.Read (), "vinit#1");
206                         Assert.AreEqual (XamlNodeType.Value, r.NodeType, "vinit#2");
207                         Assert.AreEqual ("2010-04-14", r.Value, "vinit#3"); // string
208
209                         Assert.IsTrue (r.Read (), "einit#1");
210                         Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "einit#2");
211
212                         Assert.IsTrue (r.Read (), "eo#1");
213                         Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "eo#2");
214                         Assert.IsFalse (r.Read (), "end");
215                 }
216
217                 [Test]
218                 public void Read3 ()
219                 {
220                         var r = GetReader ("Type.xml");
221
222                         Assert.IsTrue (r.Read (), "ns#1");
223                         Assert.AreEqual (XamlNodeType.NamespaceDeclaration, r.NodeType, "ns#2");
224                         Assert.AreEqual (XamlLanguage.Xaml2006Namespace, r.Namespace.Namespace, "ns#3");
225
226                         Assert.IsTrue (r.Read (), "so#1");
227                         Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "so#2");
228                         Assert.AreEqual (XamlLanguage.Type, r.Type, "so#3");
229
230                         Assert.IsTrue (r.Read (), "sbase#1");
231                         Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "sbase#2");
232                         Assert.AreEqual (XamlLanguage.Base, r.Member, "sbase#3");
233
234                         Assert.IsTrue (r.Read (), "vbase#1");
235                         Assert.AreEqual (XamlNodeType.Value, r.NodeType, "vbase#2");
236                         Assert.IsTrue (r.Value is string, "vbase#3");
237
238                         Assert.IsTrue (r.Read (), "ebase#1");
239                         Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "ebase#2");
240
241                         Assert.IsTrue (r.Read (), "sinit#1");
242                         Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "sinit#2");
243                         // FIXME: They are identical on .NET.
244                         // They aren't on mono, every GetMember() returns different object
245                         // (it is the same as .NET; see XamlMemberTest.EqualsTest.) 
246                         // and XamlMember is almost non-comparable unless they
247                         // are identical, so we fail here.
248                         Assert.AreEqual (XamlLanguage.Type.GetMember ("Type").ToString (), r.Member.ToString (), "sinit#3");
249                         //Assert.AreEqual (XamlLanguage.Type.GetMember ("Type"), r.Member, "sinit#3-2");
250                         //Assert.IsTrue (Object.ReferenceEquals (XamlLanguage.Type.GetMember ("Type"), r.Member), "sinit#3-3");
251
252                         Assert.IsTrue (r.Read (), "vinit#1");
253                         Assert.AreEqual (XamlNodeType.Value, r.NodeType, "vinit#2");
254                         Assert.AreEqual ("x:Int32", r.Value, "vinit#3"); // string
255
256                         Assert.IsTrue (r.Read (), "einit#1");
257                         Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "einit#2");
258
259                         Assert.IsTrue (r.Read (), "eo#1");
260                         Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "eo#2");
261
262                         Assert.IsFalse (r.Read (), "end");
263                 }
264
265                 [Test]
266                 //[Category ("NotWorking")]
267                 public void Read4 ()
268                 {
269                         var r = GetReader ("List_Int32.xml");
270
271                         Assert.IsTrue (r.Read (), "ns#1");
272                         Assert.AreEqual (XamlNodeType.NamespaceDeclaration, r.NodeType, "ns#2");
273                         Assert.AreEqual ("clr-namespace:System.Collections.Generic;assembly=mscorlib", r.Namespace.Namespace, "ns#3");
274                         Assert.AreEqual (String.Empty, r.Namespace.Prefix, "ns#4");
275
276                         Assert.IsTrue (r.Read (), "ns2#1");
277                         Assert.AreEqual (XamlNodeType.NamespaceDeclaration, r.NodeType, "ns2#2");
278                         Assert.AreEqual (XamlLanguage.Xaml2006Namespace, r.Namespace.Namespace, "ns2#3");
279                         Assert.AreEqual ("x", r.Namespace.Prefix, "ns2#4");
280
281                         Assert.IsTrue (r.Read (), "so#1");
282                         Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "so#2");
283                         var xt = new XamlType (typeof (List<int>), r.SchemaContext);
284                         Assert.AreEqual (xt, r.Type, "so#3");
285
286                         Assert.IsTrue (r.Read (), "sbase#1");
287                         Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "sbase#2");
288                         Assert.AreEqual (XamlLanguage.Base, r.Member, "sbase#3");
289
290                         Assert.IsTrue (r.Read (), "vbase#1");
291                         Assert.AreEqual (XamlNodeType.Value, r.NodeType, "vbase#2");
292                         Assert.IsTrue (r.Value is string, "vbase#3");
293
294                         Assert.IsTrue (r.Read (), "ebase#1");
295                         Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "ebase#2");
296
297                         Assert.IsTrue (r.Read (), "scap#1");
298                         Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "scap#2");
299                         Assert.AreEqual (xt.GetMember ("Capacity"), r.Member, "scap#3");
300
301                         Assert.IsTrue (r.Read (), "vcap#1");
302                         Assert.AreEqual (XamlNodeType.Value, r.NodeType, "vcap#2");
303                         Assert.AreEqual ("5", r.Value, "vcap#3"); // string
304
305                         Assert.IsTrue (r.Read (), "ecap#1");
306                         Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "ecap#2");
307
308                         Assert.IsTrue (r.Read (), "sItems#1");
309                         Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "sItems#2");
310                         Assert.AreEqual (XamlLanguage.Items, r.Member, "sItems#3");
311
312                         int [] values = {4, -5, 0, 255, int.MaxValue};
313                         var ci = new CultureInfo ("en-US");
314
315                         for (int i = 0; i < 5; i++) {
316                                 Assert.IsTrue (r.Read (), "soItem#1." + i);
317                                 Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "soItem#2." + i);
318                                 Assert.AreEqual (XamlLanguage.Int32, r.Type, "soItem#3." + i);
319
320                                 Assert.IsTrue (r.Read (), "sItem#1." + i);
321                                 Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "sItem#2." + i);
322                                 Assert.AreEqual (XamlLanguage.Initialization, r.Member, "sItem#3." + i);
323
324                                 Assert.IsTrue (r.Read (), "vItem#1." + i);
325                                 Assert.AreEqual (XamlNodeType.Value, r.NodeType, "vItem#2." + i);
326                                 Assert.AreEqual (values [i].ToString (ci), r.Value, "vItem#3." + i);
327
328                                 Assert.IsTrue (r.Read (), "eItem#1." + i);
329                                 Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "eItem#2." + i);
330
331                                 Assert.IsTrue (r.Read (), "eoItem#1");
332                                 Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "eoItem#2");
333                         }
334
335                         Assert.IsTrue (r.Read (), "eItems#1");
336                         Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "eItems#2");
337
338                         Assert.IsTrue (r.Read (), "eo#1");
339                         Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "eo#2");
340
341                         Assert.IsFalse (r.Read (), "end");
342                 }
343
344                 [Test]
345                 public void Read5 ()
346                 {
347                         var r = GetReader ("String.xml");
348
349                         Assert.IsTrue (r.Read (), "ns#1");
350                         Assert.AreEqual (XamlNodeType.NamespaceDeclaration, r.NodeType, "ns#2");
351                         Assert.AreEqual (XamlLanguage.Xaml2006Namespace, r.Namespace.Namespace, "ns#3");
352
353                         Assert.IsTrue (r.Read (), "so#1");
354                         Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "so#2");
355                         Assert.AreEqual (XamlLanguage.String, r.Type, "so#3");
356
357                         Assert.IsTrue (r.Read (), "sbase#1");
358                         Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "sbase#2");
359                         Assert.AreEqual (XamlLanguage.Base, r.Member, "sbase#3");
360
361                         Assert.IsTrue (r.Read (), "vbase#1");
362                         Assert.AreEqual (XamlNodeType.Value, r.NodeType, "vbase#2");
363                         Assert.IsTrue (r.Value is string, "vbase#3");
364
365                         Assert.IsTrue (r.Read (), "ebase#1");
366                         Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "ebase#2");
367
368                         Assert.IsTrue (r.Read (), "sinit#1");
369                         Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "sinit#2");
370                         Assert.AreEqual (XamlLanguage.Initialization, r.Member, "sinit#3");
371
372                         Assert.IsTrue (r.Read (), "vinit#1");
373                         Assert.AreEqual (XamlNodeType.Value, r.NodeType, "vinit#2");
374                         Assert.AreEqual ("foo", r.Value, "vinit#3"); // string
375
376                         Assert.IsTrue (r.Read (), "einit#1");
377                         Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "einit#2");
378
379                         Assert.IsTrue (r.Read (), "eo#1");
380                         Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "eo#2");
381
382                         Assert.IsFalse (r.Read (), "end");
383                 }
384         }
385 }