[bcl] Remove more NET_2_0 checks from class libs
[mono.git] / mcs / class / Managed.Windows.Forms / Test / System.Resources / ResXDataNodeTest.cs
1 // Permission is hereby granted, free of charge, to any person obtaining
2 // a copy of this software and associated documentation files (the
3 // "Software"), to deal in the Software without restriction, including
4 // without limitation the rights to use, copy, modify, merge, publish,
5 // distribute, sublicense, and/or sell copies of the Software, and to
6 // permit persons to whom the Software is furnished to do so, subject to
7 // the following conditions:
8 // 
9 // The above copyright notice and this permission notice shall be
10 // included in all copies or substantial portions of the Software.
11 // 
12 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
13 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
14 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
15 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
16 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
17 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
18 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
19 //
20 // Copyright (c) 2007 Novell, Inc. (http://www.novell.com)
21 //
22 // ResXFileRefTest.cs: Unit Tests for ResXFileRef.
23 //
24 // Authors:
25 //              Andreia Gaita   (avidigal@novell.com)
26 //              Gary Barnett    (gary.barnett.mono@gmail.com)
27
28
29 using System;
30 using System.IO;
31 using System.Reflection;
32 using System.Drawing;
33 using System.Resources;
34 using System.Runtime.Serialization;
35 using System.Collections;
36 using NUnit.Framework;
37 using System.ComponentModel.Design;
38 using System.Runtime.Serialization.Formatters.Binary;
39
40 namespace MonoTests.System.Resources {
41         [TestFixture]
42         public class ResXDataNodeTest : ResourcesTestHelper
43         {
44                 string _tempDirectory;
45                 string _otherTempDirectory;
46
47                 [Test]
48                 [ExpectedException (typeof (ArgumentNullException))]
49                 public void ConstructorEx1 ()
50                 {
51                         ResXDataNode d = new ResXDataNode (null, (object)null);
52                 }
53
54                 [Test]
55                 [ExpectedException (typeof (ArgumentNullException))]
56                 public void ConstructorEx2A ()
57                 {
58                         ResXDataNode d = new ResXDataNode (null, new ResXFileRef ("filename", "typename"));
59                 }
60
61                 [Test]
62                 [ExpectedException (typeof (ArgumentNullException))]
63                 public void ConstructorEx2B ()
64                 {
65                         ResXDataNode d = new ResXDataNode ("aname", (ResXFileRef) null);
66                 }
67
68                 [Test]
69                 [ExpectedException (typeof (ArgumentException))]
70                 public void ConstructorEx3 ()
71                 {
72                         ResXDataNode d = new ResXDataNode ("", (object) null);
73                 }
74
75                 [Test]
76                 [ExpectedException (typeof (ArgumentNullException))]
77                 public void ConstructorEx4 ()
78                 {
79                         ResXDataNode d = new ResXDataNode ("", (ResXFileRef) null);
80                 }
81
82                 [Test]
83                 [ExpectedException (typeof (ArgumentException))]
84                 public void ConstructorEx5 ()
85                 {
86                         ResXDataNode d = new ResXDataNode ("", new ResXFileRef ("filename", "typename"));
87                 }
88
89                 [Test]
90                 [ExpectedException (typeof (InvalidOperationException))]
91                 public void ConstructorEx6 ()
92                 {
93                         ResXDataNode d = new ResXDataNode ("name", new notserializable ());
94                 }
95
96                 [Test]
97                 public void Name ()
98                 {
99                         ResXDataNode node = new ResXDataNode ("startname", (object) null);
100                         Assert.AreEqual ("startname", node.Name, "#A1");
101                         node.Name = "newname";
102                         Assert.AreEqual ("newname", node.Name, "#A2");
103                 }
104
105                 [Test, ExpectedException (typeof (ArgumentNullException))]
106                 public void NameCantBeNull ()
107                 {
108                         ResXDataNode node = new ResXDataNode ("startname", (object) null);
109                         node.Name = null;
110                 }
111         
112                 [Test, ExpectedException (typeof (ArgumentException))]
113                 public void NameCantBeEmpty ()
114                 {
115                         ResXDataNode node = new ResXDataNode ("name", (object) null);
116                         node.Name = "";
117                 }
118
119                 [Test]
120                 public void FileRef ()
121                 {
122                         ResXFileRef fileRef = new ResXFileRef ("fileName", "Type.Name");
123                         ResXDataNode node = new ResXDataNode ("name", fileRef);
124                         Assert.AreEqual (fileRef, node.FileRef, "#A1");
125                 }
126
127                 [Test]
128                 public void Comment ()
129                 {
130                         ResXDataNode node = new ResXDataNode ("name", (object) null);
131                         node.Comment = "acomment";
132                         Assert.AreEqual ("acomment", node.Comment, "#A1");
133                 }
134
135                 [Test]
136                 public void CommentNullToStringEmpty ()
137                 {
138                         ResXDataNode node = new ResXDataNode ("name", (object) null);
139                         node.Comment = null;
140                         Assert.AreEqual (String.Empty, node.Comment, "#A1");
141                 }
142
143                 [Test]
144                 public void WriteRead1 ()
145                 {
146                         serializable ser = new serializable ("aaaaa", "bbbbb");
147                         ResXDataNode dn = new ResXDataNode ("test", ser);
148                         dn.Comment = "comment";
149
150                         string resXFile = GetResXFileWithNode (dn, "resx.resx");
151
152                         bool found = false;
153                         ResXResourceReader rr = new ResXResourceReader (resXFile);
154                         rr.UseResXDataNodes = true;
155                         IDictionaryEnumerator en = rr.GetEnumerator ();
156                         while (en.MoveNext ()) {
157                                 ResXDataNode node = ((DictionaryEntry)en.Current).Value as ResXDataNode;
158                                 if (node == null)
159                                         break;
160                                 serializable o = node.GetValue ((AssemblyName []) null) as serializable;
161                                 if (o != null) {
162                                         found = true;
163                                         Assert.AreEqual (ser, o, "#A1");
164                                         Assert.AreEqual ("comment", node.Comment, "#A3");
165                                 }
166
167                         }
168                         rr.Close ();
169
170                         Assert.IsTrue (found, "#A2 - Serialized object not found on resx");
171                 }
172                 
173                 [Test]
174                 public void ConstructorResXFileRef()
175                 {
176                         ResXDataNode node = GetNodeFileRefToIcon ();
177                         Assert.IsNotNull (node.FileRef, "#A1");
178                         Assert.AreEqual (typeof (Icon).AssemblyQualifiedName, node.FileRef.TypeName, "#A2");
179                         Assert.AreEqual ("test", node.Name, "#A3");
180                 }
181
182                 [Test]
183                 public void NullObjectGetValueTypeNameIsNull ()
184                 {
185                         ResXDataNode node = new ResXDataNode ("aname", (object) null);
186                         Assert.IsNull (node.GetValueTypeName ((AssemblyName []) null), "#A1");
187                 }
188
189                 [Test]
190                 public void NullObjectWrittenToResXOK ()
191                 {
192                         ResXDataNode node = new ResXDataNode ("aname", (object) null);
193                         ResXDataNode returnedNode = GetNodeFromResXReader (node);
194                         Assert.IsNotNull (returnedNode, "#A1");
195                         Assert.IsNull (returnedNode.GetValue ((AssemblyName []) null), "#A2");
196                 }
197
198                 [Test]
199                 public void NullObjectReturnedFromResXGetValueTypeNameReturnsObject ()
200                 {
201                         ResXDataNode node = new ResXDataNode ("aname", (object) null);
202                         ResXDataNode returnedNode = GetNodeFromResXReader (node);
203                         Assert.IsNotNull (returnedNode, "#A1");
204                         Assert.IsNull (returnedNode.GetValue ((AssemblyName []) null), "#A2");
205                         string type = returnedNode.GetValueTypeName ((AssemblyName []) null);
206                         Assert.AreEqual (typeof (object).AssemblyQualifiedName, type, "#A3");
207                 }
208
209                 [Test]
210                 public void DoesNotRequireResXFileToBeOpen_Serializable ()
211                 {
212                         serializable ser = new serializable ("aaaaa", "bbbbb");
213                         ResXDataNode dn = new ResXDataNode ("test", ser);
214                         
215                         string resXFile = GetResXFileWithNode (dn,"resx.resx");
216
217                         ResXResourceReader rr = new ResXResourceReader (resXFile);
218                         rr.UseResXDataNodes = true;
219                         IDictionaryEnumerator en = rr.GetEnumerator ();
220                         en.MoveNext (); 
221
222                         ResXDataNode node = ((DictionaryEntry) en.Current).Value as ResXDataNode;
223                         rr.Close ();
224
225                         Assert.IsNotNull (node,"#A1");
226
227                         serializable o = node.GetValue ((AssemblyName []) null) as serializable;
228                         Assert.IsNotNull (o, "#A2");
229                 }
230
231                 [Test]
232                 public void DoesNotRequireResXFileToBeOpen_TypeConverter ()
233                 {
234                         ResXDataNode dn = new ResXDataNode ("test", 34L);
235                         string resXFile = GetResXFileWithNode (dn,"resx.resx");
236
237                         ResXResourceReader rr = new ResXResourceReader (resXFile);
238                         rr.UseResXDataNodes = true;
239                         IDictionaryEnumerator en = rr.GetEnumerator ();
240                         en.MoveNext ();
241
242                         ResXDataNode node = ((DictionaryEntry) en.Current).Value as ResXDataNode;
243                         rr.Close ();
244
245                         Assert.IsNotNull (node, "#A1");
246
247                         object o = node.GetValue ((AssemblyName []) null);
248                         Assert.IsInstanceOfType (typeof (long), o, "#A2");
249                         Assert.AreEqual (34L, o, "#A3");
250                 }
251
252                 [Test,ExpectedException (typeof(TypeLoadException))]
253                 public void AssemblyNamesPassedToResourceReaderDoesNotAffectResXDataNode_TypeConverter ()
254                 {
255                         string aName = "DummyAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null";
256                         AssemblyName [] assemblyNames = new AssemblyName [] { new AssemblyName (aName) };
257                         
258                         string resXFile = GetFileFromString ("test.resx", convertableResXWithoutAssemblyName);
259
260                         using (ResXResourceReader rr = new ResXResourceReader (resXFile, assemblyNames)) {
261                                 rr.UseResXDataNodes = true;
262                                 IDictionaryEnumerator en = rr.GetEnumerator ();
263                                 en.MoveNext ();
264
265                                 ResXDataNode node = ((DictionaryEntry) en.Current).Value as ResXDataNode;
266                                 
267                                 Assert.IsNotNull (node, "#A1");
268
269                                 //should raise exception 
270                                 object o = node.GetValue ((AssemblyName []) null);
271                         }
272                 }
273
274                 [Test]
275                 public void ITRSPassedToResourceReaderDoesNotAffectResXDataNode_TypeConverter ()
276                 {
277                         ResXDataNode dn = new ResXDataNode ("test", 34L);
278                         
279                         string resXFile = GetResXFileWithNode (dn,"resx.resx");
280
281                         ResXResourceReader rr = new ResXResourceReader (resXFile, new ReturnIntITRS ());
282                         rr.UseResXDataNodes = true;
283                         IDictionaryEnumerator en = rr.GetEnumerator ();
284                         en.MoveNext ();
285
286                         ResXDataNode node = ((DictionaryEntry) en.Current).Value as ResXDataNode;
287                         
288                         Assert.IsNotNull (node, "#A1");
289
290                         object o = node.GetValue ((AssemblyName []) null);
291
292                         Assert.IsInstanceOfType (typeof (long), o, "#A2");
293                         Assert.AreEqual (34L, o, "#A3");
294
295                         rr.Close ();
296                 }
297
298                 [Test]
299                 public void ITRSPassedToResourceReaderDoesNotAffectResXDataNode_Serializable ()
300                 {
301                         serializable ser = new serializable ("aaaaa", "bbbbb");
302                         ResXDataNode dn = new ResXDataNode ("test", ser);
303                         
304                         string resXFile = GetResXFileWithNode (dn,"resx.resx");
305
306                         ResXResourceReader rr = new ResXResourceReader (resXFile, new ReturnSerializableSubClassITRS ());
307                         rr.UseResXDataNodes = true;
308                         IDictionaryEnumerator en = rr.GetEnumerator ();
309                         en.MoveNext ();
310
311                         ResXDataNode node = ((DictionaryEntry) en.Current).Value as ResXDataNode;
312
313                         Assert.IsNotNull (node, "#A1");
314
315                         object o = node.GetValue ((AssemblyName []) null);
316
317                         Assert.IsNotInstanceOfType (typeof (serializableSubClass), o, "#A2");
318                         Assert.IsInstanceOfType (typeof (serializable), o, "#A3");
319                         rr.Close ();
320                 }
321
322                 [Test]
323                 public void BasePathSetOnResXResourceReaderDoesAffectResXDataNode ()
324                 {
325                         ResXFileRef fileRef = new ResXFileRef ("file.name", "type.name");
326                         ResXDataNode node = new ResXDataNode("anode", fileRef);
327                         string resXFile = GetResXFileWithNode (node, "afilename.xxx");
328
329                         using (ResXResourceReader rr = new ResXResourceReader (resXFile)) {
330                                 rr.BasePath = "basePath";
331                                 rr.UseResXDataNodes = true;
332                                 IDictionaryEnumerator en = rr.GetEnumerator ();
333                                 en.MoveNext ();
334
335                                 ResXDataNode returnedNode = ((DictionaryEntry) en.Current).Value as ResXDataNode;
336
337                                 Assert.IsNotNull (node, "#A1");
338                                 Assert.AreEqual (Path.Combine ("basePath", "file.name"), returnedNode.FileRef.FileName, "#A2");
339                         }
340                 }
341
342                 [TearDown]
343                 protected override void TearDown ()
344                 {
345                         //teardown
346                         if (Directory.Exists (_tempDirectory))
347                                 Directory.Delete (_tempDirectory, true);
348
349                         base.TearDown ();
350                 }
351
352                 string GetResXFileWithNode (ResXDataNode node, string filename)
353                 {
354                         string fullfileName;
355
356                         _tempDirectory = Path.Combine (Path.GetTempPath (), "ResXDataNodeTest");
357                         _otherTempDirectory = Path.Combine (_tempDirectory, "in");
358                         if (!Directory.Exists (_otherTempDirectory)) {
359                                 Directory.CreateDirectory (_otherTempDirectory);
360                         }
361
362                         fullfileName = Path.Combine (_tempDirectory, filename);
363
364                         using (ResXResourceWriter writer = new ResXResourceWriter (fullfileName)) {
365                                 writer.AddResource (node);
366                         }
367
368                         return fullfileName;
369                 }
370
371                 private string GetFileFromString (string filename, string filecontents)
372                 {
373                         _tempDirectory = Path.Combine (Path.GetTempPath (), "ResXDataNodeTest");
374                         _otherTempDirectory = Path.Combine (_tempDirectory, "in");
375                         if (!Directory.Exists (_otherTempDirectory)) {
376                                 Directory.CreateDirectory (_otherTempDirectory);
377                         }
378
379                         string filepath = Path.Combine (_tempDirectory, filename);
380                         
381                         StreamWriter writer = new StreamWriter(filepath,false);
382
383                         writer.Write (filecontents);
384                         writer.Close ();
385
386                         return filepath;
387                 }
388
389                 static string convertableResXWithoutAssemblyName =
390 @"<?xml version=""1.0"" encoding=""utf-8""?>
391 <root>
392   
393   <resheader name=""resmimetype"">
394         <value>text/microsoft-resx</value>
395   </resheader>
396   <resheader name=""version"">
397         <value>2.0</value>
398   </resheader>
399   <resheader name=""reader"">
400         <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
401   </resheader>
402   <resheader name=""writer"">
403         <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
404   </resheader>
405   
406   <data name=""test"" type=""DummyAssembly.Convertable"">
407         <value>im a name        im a value</value>
408   </data>
409 </root>";
410
411         }
412         
413 }
414