2 // ResXDataNodeWriteBehavior.cs : Tests how ResXDataNode's are written to
6 // Gary Barnett (gary.barnett.mono@gmail.com)
8 // Copyright (C) Gary Barnett (2012)
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:
18 // The above copyright notice and this permission notice shall be
19 // included in all copies or substantial portions of the Software.
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.
32 using System.Reflection;
33 using System.Resources;
34 using System.Collections;
35 using NUnit.Framework;
37 using System.ComponentModel.Design;
39 namespace MonoTests.System.Resources {
41 public class ResXDataNodeWriteBehavior : ResourcesTestHelper {
44 public void TypeConverterObjectNotLoaded ()
46 ResXDataNode node = GetNodeFromResXReader (convertableResXWithoutAssemblyName);
47 Assert.IsNotNull (node, "#A1");
48 // would cause error if object loaded
49 GetNodeFromResXReader (node);
53 public void SerializedObjectNotLoaded ()
55 ResXDataNode node = GetNodeFromResXReader (serializedResXCorruped);
56 Assert.IsNotNull (node, "#A1");
57 // would cause error if object loaded
58 GetNodeFromResXReader (node);
61 [Test, ExpectedException (typeof (ArgumentException))]
62 public void FileRefIsLoaded ()
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);
72 public void ResXNullRef_WriteBack ()
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");
87 public void InvalidMimeType_WriteBack ()
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");
99 public void InvalidMimeTypeAndType_WriteBack ()
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");
110 public void BinTypeConverter_WriteBack ()
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");
128 public void FileRefWithEncoding_WriteBack ()
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");
148 public void ByteArray_WriteBack ()
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");
164 public void BasePathSetOnResXReaderAffectsFileRef_WriteBack ()
166 ResXDataNode returnedNode;
167 StringWriter sw = new StringWriter ();
168 sw.Write (fileRefResX);
170 StringReader sr = new StringReader (sw.GetStringBuilder ().ToString ());
172 using (ResXResourceReader reader = new ResXResourceReader (sr)) {
173 reader.UseResXDataNodes = true;
174 reader.BasePath = "basePath";
175 IDictionaryEnumerator enumerator = reader.GetEnumerator ();
176 enumerator.MoveNext ();
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);
184 Assert.AreEqual (Path.Combine ("basePath","file.name"), returnedNode.FileRef.FileName, "#A3");
188 public void Serialized_WriteBack ()
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");
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");
212 public void ChangesToReturnedByteArrayNotLaterWrittenBack ()
214 ResXDataNode originalNode, returnedNode, finalNode;
215 originalNode = GetNodeEmdeddedBytes1To10 ();
216 returnedNode = GetNodeFromResXReader (originalNode);
218 Assert.IsNotNull (returnedNode, "#A1");
220 object val = returnedNode.GetValue ((ITypeResolutionService) null);
221 Assert.IsInstanceOfType (typeof (byte []), val, "#A2");
223 byte[] newBytes = (byte[]) val;
224 Assert.AreEqual (1, newBytes [0], "A3");
227 finalNode = GetNodeFromResXReader (returnedNode);
229 Assert.IsNotNull (finalNode, "#A4");
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");
239 public void OriginalTypeUsedSerializableWhenWritingBackToResX ()
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;
245 originalNode = GetNodeEmdeddedSerializable ();
246 returnedNode = GetNodeFromResXReader (originalNode);
248 Assert.IsNotNull (returnedNode, "#A1");
249 object val = returnedNode.GetValue (new ReturnSerializableSubClassITRS ());
250 Assert.IsInstanceOfType (typeof (serializableSubClass), val, "#A2");
252 finalNode = GetNodeFromResXReader (returnedNode);
253 Assert.IsNotNull (finalNode, "#A3");
255 object finalVal = finalNode.GetValue ((ITypeResolutionService) null);
256 Assert.IsNotInstanceOfType (typeof (serializableSubClass), finalVal, "#A4");
257 Assert.IsInstanceOfType (typeof (serializable), finalVal, "#A5");
260 static string typeconResXInvalidMimeTypeAndType =
261 @"<?xml version=""1.0"" encoding=""utf-8""?>
264 <resheader name=""resmimetype"">
265 <value>text/microsoft-resx</value>
267 <resheader name=""version"">
270 <resheader name=""reader"">
271 <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
273 <resheader name=""writer"">
274 <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
276 <data name=""test"" type=""A.type"" mimetype=""application/xxxx"">
281 static string fileRefResX =
282 @"<?xml version=""1.0"" encoding=""utf-8""?>
284 <resheader name=""resmimetype"">
285 <value>text/microsoft-resx</value>
287 <resheader name=""version"">
290 <resheader name=""reader"">
291 <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
293 <resheader name=""writer"">
294 <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
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>
302 static string fileRefResXCorrupted =
303 @"<?xml version=""1.0"" encoding=""utf-8""?>
306 <resheader name=""resmimetype"">
307 <value>text/microsoft-resx</value>
309 <resheader name=""version"">
312 <resheader name=""reader"">
313 <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
315 <resheader name=""writer"">
316 <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
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>
324 static string serializedResXCorruped =
325 @"<?xml version=""1.0"" encoding=""utf-8""?>
328 <resheader name=""resmimetype"">
329 <value>text/microsoft-resx</value>
331 <resheader name=""version"">
334 <resheader name=""reader"">
335 <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
337 <resheader name=""writer"">
338 <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
340 <data name=""test"" mimetype=""application/x-microsoft.net.object.binary.base64"">
342 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
343 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
344 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
345 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
350 static string serializedResXInvalidMimeType =
351 @"<?xml version=""1.0"" encoding=""utf-8""?>
354 <resheader name=""resmimetype"">
355 <value>text/microsoft-resx</value>
357 <resheader name=""version"">
360 <resheader name=""reader"">
361 <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
363 <resheader name=""writer"">
364 <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
366 <data name=""test"" mimetype=""application/xxxx"">
368 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
369 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
370 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
371 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
376 static string convertableResXWithoutAssemblyName =
377 @"<?xml version=""1.0"" encoding=""utf-8""?>
380 <resheader name=""resmimetype"">
381 <value>text/microsoft-resx</value>
383 <resheader name=""version"">
386 <resheader name=""reader"">
387 <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
389 <resheader name=""writer"">
390 <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
393 <data name=""test"" type=""DummyAssembly.Convertable"">
394 <value>im a name im a value</value>