Merge pull request #409 from Alkarex/patch-1
[mono.git] / mcs / class / Managed.Windows.Forms / Test / System.Resources / ResXDataNodeWriteBehavior.cs
1 //
2 // ResXDataNodeWriteBehavior.cs : Tests how ResXDataNode's are written to
3 // resx files.
4 // 
5 // Author:
6 //      Gary Barnett (gary.barnett.mono@gmail.com)
7 // 
8 // Copyright (C) Gary Barnett (2012)
9 //
10 // Permission is hereby granted, free of charge, to any person obtaining
11 // a copy of this software and associated documentation files (the
12 // "Software"), to deal in the Software without restriction, including
13 // without limitation the rights to use, copy, modify, merge, publish,
14 // distribute, sublicense, and/or sell copies of the Software, and to
15 // permit persons to whom the Software is furnished to do so, subject to
16 // the following conditions:
17 // 
18 // The above copyright notice and this permission notice shall be
19 // included in all copies or substantial portions of the Software.
20 // 
21 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
22 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
23 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
24 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
25 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
26 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
27 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
28
29 #if NET_2_0
30 using System;
31 using System.IO;
32 using System.Reflection;
33 using System.Resources;
34 using System.Collections;
35 using NUnit.Framework;
36 using System.Text;
37 using System.ComponentModel.Design;
38
39 namespace MonoTests.System.Resources {
40         [TestFixture]
41         public class ResXDataNodeWriteBehavior : ResourcesTestHelper {
42                 
43                 [Test]
44                 public void TypeConverterObjectNotLoaded ()
45                 {
46                         ResXDataNode node = GetNodeFromResXReader (convertableResXWithoutAssemblyName);
47                         Assert.IsNotNull (node, "#A1");
48                         // would cause error if object loaded
49                         GetNodeFromResXReader (node);
50                 }
51
52                 [Test]
53                 public void SerializedObjectNotLoaded ()
54                 {
55                         ResXDataNode node = GetNodeFromResXReader (serializedResXCorruped);
56                         Assert.IsNotNull (node, "#A1");
57                         // would cause error if object loaded
58                         GetNodeFromResXReader (node);
59                 }
60
61                 [Test, ExpectedException (typeof (ArgumentException))]
62                 public void FileRefIsLoaded ()
63                 {
64                         // .NET doesnt instantiate the encoding until the write
65                         ResXDataNode node = GetNodeFromResXReader (fileRefResXCorrupted);
66                         Assert.IsNotNull (node, "#A1");
67                         // would cause error if object loaded
68                         GetNodeFromResXReader (node);
69                 }
70
71                 [Test]
72                 public void ResXNullRef_WriteBack ()
73                 {
74                         ResXDataNode node = new ResXDataNode ("NullRef", (object) null);
75                         node.Comment = "acomment";
76                         ResXDataNode returnedNode = GetNodeFromResXReader (node);
77                         Assert.IsNotNull (returnedNode, "#A1");
78                         Assert.IsNull (returnedNode.GetValue ((AssemblyName []) null), "#A2");
79                         Assert.AreEqual ("acomment", returnedNode.Comment,"#A3");
80                         ResXDataNode finalNode = GetNodeFromResXReader (returnedNode);
81                         Assert.IsNotNull (finalNode, "#A4");
82                         Assert.IsNull (finalNode.GetValue ((AssemblyName []) null), "#A5");
83                         Assert.AreEqual ("acomment", finalNode.Comment,"#A6");
84                 }
85
86                 [Test]
87                 public void InvalidMimeType_WriteBack ()
88                 {
89                         //FIXME: should check the ResX output to ensure mime type / value info still there
90                         ResXDataNode node = GetNodeFromResXReader (serializedResXInvalidMimeType);
91                         Assert.IsNotNull (node, "#A1");
92                         ResXDataNode returnedNode = GetNodeFromResXReader (node);
93                         Assert.IsNotNull (returnedNode, "#A2");
94                         object obj = returnedNode.GetValue ((AssemblyName []) null);
95                         Assert.IsNull (obj, "#A3");
96                 }
97
98                 [Test]
99                 public void InvalidMimeTypeAndType_WriteBack ()
100                 {
101                         ResXDataNode node = GetNodeFromResXReader (typeconResXInvalidMimeTypeAndType);
102                         Assert.IsNotNull (node, "#A1");
103                         ResXDataNode returnedNode = GetNodeFromResXReader (node);
104                         Assert.IsNotNull (returnedNode, "#A2");
105                         string type = returnedNode.GetValueTypeName ((AssemblyName []) null);
106                         Assert.AreEqual ("A.type", type, "#A3");
107                 }
108
109                 [Test]
110                 public void BinTypeConverter_WriteBack ()
111                 {
112                         MyBinType mb = new MyBinType ("contents");
113                         ResXDataNode node = new ResXDataNode ("aname", mb);
114                         node.Comment = "acomment";
115                         ResXDataNode returnedNode = GetNodeFromResXReader (node);
116                         Assert.IsNotNull (returnedNode, "#A1");
117                         MyBinType returnedMB = (MyBinType) returnedNode.GetValue ((AssemblyName []) null);
118                         Assert.AreEqual ("contents", returnedMB.Value, "#A2");
119                         Assert.AreEqual ("acomment", returnedNode.Comment, "#A3");
120                         ResXDataNode finalNode = GetNodeFromResXReader (returnedNode);
121                         Assert.IsNotNull (finalNode, "#A4");
122                         MyBinType finalMB = (MyBinType) finalNode.GetValue ((AssemblyName []) null);
123                         Assert.AreEqual ("contents", finalMB.Value, "#A5");
124                         Assert.AreEqual ("acomment", finalNode.Comment, "#A6");
125                 }
126
127                 [Test]
128                 public void FileRefWithEncoding_WriteBack ()
129                 {
130                         ResXFileRef fileRef = new ResXFileRef ("afilename", "A.Type.Name", Encoding.UTF7);
131                         ResXDataNode node = new ResXDataNode ("aname", fileRef);
132                         node.Comment = "acomment";
133                         ResXDataNode returnedNode = GetNodeFromResXReader (node);
134                         Assert.IsNotNull (returnedNode, "#A1");
135                         Assert.AreEqual ("afilename", returnedNode.FileRef.FileName, "#A2");
136                         Assert.AreEqual ("A.Type.Name", returnedNode.FileRef.TypeName, "#A3");
137                         Assert.AreEqual ("acomment", returnedNode.Comment, "#A4");
138                         Assert.IsInstanceOfType (Encoding.UTF7.GetType (), returnedNode.FileRef.TextFileEncoding, "#A5");
139                         ResXDataNode finalNode = GetNodeFromResXReader (returnedNode);
140                         Assert.IsNotNull (finalNode, "#A6");
141                         Assert.AreEqual ("afilename", finalNode.FileRef.FileName, "#A7");
142                         Assert.AreEqual ("A.Type.Name", finalNode.FileRef.TypeName, "#A8");
143                         Assert.AreEqual ("acomment", finalNode.Comment, "#A9");
144                         Assert.IsInstanceOfType (Encoding.UTF7.GetType (), finalNode.FileRef.TextFileEncoding, "#A10");
145                 }
146
147                 [Test]
148                 public void ByteArray_WriteBack ()
149                 {
150                         byte [] testBytes = new byte [] { 1,2,3,4,5,6,7,8,9,10 };
151                         ResXDataNode node = new ResXDataNode ("aname", testBytes);
152                         node.Comment = "acomment";
153                         ResXDataNode returnedNode = GetNodeFromResXReader (node);
154                         Assert.IsNotNull (returnedNode, "#A1");
155                         Assert.AreEqual (testBytes, returnedNode.GetValue ((AssemblyName []) null), "#A2");
156                         Assert.AreEqual ("acomment", returnedNode.Comment, "#A3");
157                         ResXDataNode finalNode = GetNodeFromResXReader (returnedNode);
158                         Assert.IsNotNull (finalNode,"#A4");
159                         Assert.AreEqual (testBytes, finalNode.GetValue ((AssemblyName []) null), "#A5");
160                         Assert.AreEqual ("acomment", finalNode.Comment, "#A6");
161                 }
162
163                 [Test]
164                 public void BasePathSetOnResXReaderAffectsFileRef_WriteBack ()
165                 {
166                         ResXDataNode returnedNode;
167                         StringWriter sw = new StringWriter ();
168                         sw.Write (fileRefResX);
169
170                         StringReader sr = new StringReader (sw.GetStringBuilder ().ToString ());
171
172                         using (ResXResourceReader reader = new ResXResourceReader (sr)) {
173                                 reader.UseResXDataNodes = true;
174                                 reader.BasePath = "basePath";
175                                 IDictionaryEnumerator enumerator = reader.GetEnumerator ();
176                                 enumerator.MoveNext ();
177
178                                 ResXDataNode node = ((DictionaryEntry) enumerator.Current).Value as ResXDataNode;
179                                 Assert.IsNotNull (node, "#A1");
180                                 Assert.AreEqual (Path.Combine ("basePath","file.name"), node.FileRef.FileName, "#A2");
181                                 returnedNode = GetNodeFromResXReader (node);
182                         }
183
184                         Assert.AreEqual (Path.Combine ("basePath","file.name"), returnedNode.FileRef.FileName, "#A3");
185                 }
186
187                 [Test]
188                 public void Serialized_WriteBack ()
189                 {
190
191                         ResXDataNode node, returnedNode, finalNode;
192                         node = GetNodeEmdeddedSerializable ();
193                         node.Comment = "acomment";
194                         returnedNode = GetNodeFromResXReader (node);
195                         Assert.IsNotNull (returnedNode, "#A1");
196                         Assert.AreEqual ("acomment", returnedNode.Comment, "#A2");
197                         object returnedObj = returnedNode.GetValue ((ITypeResolutionService) null);
198                         Assert.IsInstanceOfType (typeof (serializable), returnedObj, "#A3");
199                         serializable returnedSer = (serializable) returnedObj;
200                         Assert.AreEqual ("testName", returnedSer.name, "A4");
201
202                         finalNode = GetNodeFromResXReader (returnedNode);
203                         Assert.IsNotNull (finalNode, "#A5");
204                         Assert.AreEqual ("acomment", finalNode.Comment, "#A6");
205                         object finalObj = finalNode.GetValue ((ITypeResolutionService) null);
206                         Assert.IsInstanceOfType (typeof (serializable), finalObj, "#A7");
207                         serializable finalSer = (serializable) finalObj;
208                         Assert.AreEqual ("testName", finalSer.name, "A7");
209                 }
210
211                 [Test]
212                 public void ChangesToReturnedByteArrayNotLaterWrittenBack ()
213                 {
214                         ResXDataNode originalNode, returnedNode, finalNode;
215                         originalNode = GetNodeEmdeddedBytes1To10 ();
216                         returnedNode = GetNodeFromResXReader (originalNode);
217
218                         Assert.IsNotNull (returnedNode, "#A1");
219
220                         object val = returnedNode.GetValue ((ITypeResolutionService) null);
221                         Assert.IsInstanceOfType (typeof (byte []), val, "#A2");
222
223                         byte[] newBytes = (byte[]) val;
224                         Assert.AreEqual (1, newBytes [0], "A3");
225                         newBytes [0] = 99;
226
227                         finalNode = GetNodeFromResXReader (returnedNode);
228                         
229                         Assert.IsNotNull (finalNode, "#A4");
230
231                         object finalVal = finalNode.GetValue ((ITypeResolutionService) null);
232                         Assert.IsInstanceOfType (typeof (byte []), finalVal, "#A5");
233                         byte [] finalBytes = (byte []) finalVal;
234                         // would be 99 if written back
235                         Assert.AreEqual (1,finalBytes [0],"A6");
236                 }
237
238                 [Test]
239                 public void OriginalTypeUsedSerializableWhenWritingBackToResX ()
240                 {
241                         // check although calls subsequent to an ITRS being supplied to GetValue return that resolved type
242                         // when the node is written back using ResXResourceWriter it uses the original type
243                         ResXDataNode originalNode, returnedNode, finalNode;
244
245                         originalNode = GetNodeEmdeddedSerializable ();
246                         returnedNode = GetNodeFromResXReader (originalNode);
247                         
248                         Assert.IsNotNull (returnedNode, "#A1");
249                         object val = returnedNode.GetValue (new ReturnSerializableSubClassITRS ());
250                         Assert.IsInstanceOfType (typeof (serializableSubClass), val, "#A2");
251
252                         finalNode = GetNodeFromResXReader (returnedNode);
253                         Assert.IsNotNull (finalNode, "#A3");
254
255                         object finalVal = finalNode.GetValue ((ITypeResolutionService) null);
256                         Assert.IsNotInstanceOfType (typeof (serializableSubClass), finalVal, "#A4");
257                         Assert.IsInstanceOfType (typeof (serializable), finalVal, "#A5");
258                 }
259
260                 static string typeconResXInvalidMimeTypeAndType =
261 @"<?xml version=""1.0"" encoding=""utf-8""?>
262 <root>
263   
264   <resheader name=""resmimetype"">
265         <value>text/microsoft-resx</value>
266   </resheader>
267   <resheader name=""version"">
268         <value>2.0</value>
269   </resheader>
270   <resheader name=""reader"">
271         <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
272   </resheader>
273   <resheader name=""writer"">
274         <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
275   </resheader>
276   <data name=""test"" type=""A.type"" mimetype=""application/xxxx"">
277         <value>42</value>
278   </data>
279 </root>";
280
281                 static string fileRefResX =
282 @"<?xml version=""1.0"" encoding=""utf-8""?>
283 <root>
284   <resheader name=""resmimetype"">
285     <value>text/microsoft-resx</value>
286   </resheader>
287   <resheader name=""version"">
288     <value>2.0</value>
289   </resheader>
290   <resheader name=""reader"">
291     <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
292   </resheader>
293   <resheader name=""writer"">
294     <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
295   </resheader>
296   <assembly alias=""System.Windows.Forms"" name=""System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"" />
297   <data name=""anode"" type=""System.Resources.ResXFileRef, System.Windows.Forms"">
298     <value>file.name;type.name</value>
299   </data>
300 </root>";
301                 
302                 static string fileRefResXCorrupted = 
303 @"<?xml version=""1.0"" encoding=""utf-8""?>
304 <root>
305   
306   <resheader name=""resmimetype"">
307         <value>text/microsoft-resx</value>
308   </resheader>
309   <resheader name=""version"">
310         <value>2.0</value>
311   </resheader>
312   <resheader name=""reader"">
313         <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
314   </resheader>
315   <resheader name=""writer"">
316         <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
317   </resheader>
318   <assembly alias=""System.Windows.Forms"" name=""System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"" />
319   <data name=""test"" type=""System.Resources.ResXFileRef, System.Windows.Forms"">
320         <value>.\somethingthatdoesntexist.txt;System.String, System.Windows.Forms_test_net_2_0, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null;AValidCultureStringThisIsNot</value>
321   </data>
322 </root>";
323
324                 static string serializedResXCorruped =
325 @"<?xml version=""1.0"" encoding=""utf-8""?>
326 <root>
327   
328   <resheader name=""resmimetype"">
329         <value>text/microsoft-resx</value>
330   </resheader>
331   <resheader name=""version"">
332         <value>2.0</value>
333   </resheader>
334   <resheader name=""reader"">
335         <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
336   </resheader>
337   <resheader name=""writer"">
338         <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
339   </resheader>
340   <data name=""test"" mimetype=""application/x-microsoft.net.object.binary.base64"">
341         <value>
342                 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
343                 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
344                 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
345                 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
346 </value>
347   </data>
348 </root>";
349
350                 static string serializedResXInvalidMimeType =
351 @"<?xml version=""1.0"" encoding=""utf-8""?>
352 <root>
353   
354   <resheader name=""resmimetype"">
355         <value>text/microsoft-resx</value>
356   </resheader>
357   <resheader name=""version"">
358         <value>2.0</value>
359   </resheader>
360   <resheader name=""reader"">
361         <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
362   </resheader>
363   <resheader name=""writer"">
364         <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
365   </resheader>
366   <data name=""test"" mimetype=""application/xxxx"">
367         <value>
368                 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
369                 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
370                 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
371                 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
372 </value>
373   </data>
374 </root>";
375
376                 static string convertableResXWithoutAssemblyName =
377 @"<?xml version=""1.0"" encoding=""utf-8""?>
378 <root>
379   
380   <resheader name=""resmimetype"">
381         <value>text/microsoft-resx</value>
382   </resheader>
383   <resheader name=""version"">
384         <value>2.0</value>
385   </resheader>
386   <resheader name=""reader"">
387         <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
388   </resheader>
389   <resheader name=""writer"">
390         <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
391   </resheader>
392   
393   <data name=""test"" type=""DummyAssembly.Convertable"">
394         <value>im a name        im a value</value>
395   </data>
396 </root>";
397
398         }
399 }
400
401 #endif