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