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.
31 using System.Reflection;
32 using System.Resources;
33 using System.Collections;
34 using NUnit.Framework;
36 using System.ComponentModel.Design;
38 namespace MonoTests.System.Resources {
40 public class ResXDataNodeWriteBehavior : ResourcesTestHelper {
43 public void TypeConverterObjectNotLoaded ()
45 ResXDataNode node = GetNodeFromResXReader (convertableResXWithoutAssemblyName);
46 Assert.IsNotNull (node, "#A1");
47 // would cause error if object loaded
48 GetNodeFromResXReader (node);
52 public void SerializedObjectNotLoaded ()
54 ResXDataNode node = GetNodeFromResXReader (serializedResXCorruped);
55 Assert.IsNotNull (node, "#A1");
56 // would cause error if object loaded
57 GetNodeFromResXReader (node);
60 [Test, ExpectedException (typeof (ArgumentException))]
61 public void FileRefIsLoaded ()
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);
71 public void ResXNullRef_WriteBack ()
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");
86 public void InvalidMimeType_WriteBack ()
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");
98 public void InvalidMimeTypeAndType_WriteBack ()
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");
109 public void BinTypeConverter_WriteBack ()
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");
127 public void FileRefWithEncoding_WriteBack ()
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");
147 public void ByteArray_WriteBack ()
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");
163 public void BasePathSetOnResXReaderAffectsFileRef_WriteBack ()
165 ResXDataNode returnedNode;
166 StringWriter sw = new StringWriter ();
167 sw.Write (fileRefResX);
169 StringReader sr = new StringReader (sw.GetStringBuilder ().ToString ());
171 using (ResXResourceReader reader = new ResXResourceReader (sr)) {
172 reader.UseResXDataNodes = true;
173 reader.BasePath = "basePath";
174 IDictionaryEnumerator enumerator = reader.GetEnumerator ();
175 enumerator.MoveNext ();
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);
183 Assert.AreEqual (Path.Combine ("basePath","file.name"), returnedNode.FileRef.FileName, "#A3");
187 public void Serialized_WriteBack ()
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");
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");
211 public void ChangesToReturnedByteArrayNotLaterWrittenBack ()
213 ResXDataNode originalNode, returnedNode, finalNode;
214 originalNode = GetNodeEmdeddedBytes1To10 ();
215 returnedNode = GetNodeFromResXReader (originalNode);
217 Assert.IsNotNull (returnedNode, "#A1");
219 object val = returnedNode.GetValue ((ITypeResolutionService) null);
220 Assert.IsInstanceOfType (typeof (byte []), val, "#A2");
222 byte[] newBytes = (byte[]) val;
223 Assert.AreEqual (1, newBytes [0], "A3");
226 finalNode = GetNodeFromResXReader (returnedNode);
228 Assert.IsNotNull (finalNode, "#A4");
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");
238 public void OriginalTypeUsedSerializableWhenWritingBackToResX ()
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;
244 originalNode = GetNodeEmdeddedSerializable ();
245 returnedNode = GetNodeFromResXReader (originalNode);
247 Assert.IsNotNull (returnedNode, "#A1");
248 object val = returnedNode.GetValue (new ReturnSerializableSubClassITRS ());
249 Assert.IsInstanceOfType (typeof (serializableSubClass), val, "#A2");
251 finalNode = GetNodeFromResXReader (returnedNode);
252 Assert.IsNotNull (finalNode, "#A3");
254 object finalVal = finalNode.GetValue ((ITypeResolutionService) null);
255 AssertHelper.IsNotInstanceOfType (typeof (serializableSubClass), finalVal, "#A4");
256 Assert.IsInstanceOfType (typeof (serializable), finalVal, "#A5");
259 static string typeconResXInvalidMimeTypeAndType =
260 @"<?xml version=""1.0"" encoding=""utf-8""?>
263 <resheader name=""resmimetype"">
264 <value>text/microsoft-resx</value>
266 <resheader name=""version"">
269 <resheader name=""reader"">
270 <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
272 <resheader name=""writer"">
273 <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
275 <data name=""test"" type=""A.type"" mimetype=""application/xxxx"">
280 static string fileRefResX =
281 @"<?xml version=""1.0"" encoding=""utf-8""?>
283 <resheader name=""resmimetype"">
284 <value>text/microsoft-resx</value>
286 <resheader name=""version"">
289 <resheader name=""reader"">
290 <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
292 <resheader name=""writer"">
293 <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
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>
301 static string fileRefResXCorrupted =
302 @"<?xml version=""1.0"" encoding=""utf-8""?>
305 <resheader name=""resmimetype"">
306 <value>text/microsoft-resx</value>
308 <resheader name=""version"">
311 <resheader name=""reader"">
312 <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
314 <resheader name=""writer"">
315 <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
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>
323 static string serializedResXCorruped =
324 @"<?xml version=""1.0"" encoding=""utf-8""?>
327 <resheader name=""resmimetype"">
328 <value>text/microsoft-resx</value>
330 <resheader name=""version"">
333 <resheader name=""reader"">
334 <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
336 <resheader name=""writer"">
337 <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
339 <data name=""test"" mimetype=""application/x-microsoft.net.object.binary.base64"">
341 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
342 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
343 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
344 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
349 static string serializedResXInvalidMimeType =
350 @"<?xml version=""1.0"" encoding=""utf-8""?>
353 <resheader name=""resmimetype"">
354 <value>text/microsoft-resx</value>
356 <resheader name=""version"">
359 <resheader name=""reader"">
360 <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
362 <resheader name=""writer"">
363 <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
365 <data name=""test"" mimetype=""application/xxxx"">
367 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
368 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
369 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
370 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
375 static string convertableResXWithoutAssemblyName =
376 @"<?xml version=""1.0"" encoding=""utf-8""?>
379 <resheader name=""resmimetype"">
380 <value>text/microsoft-resx</value>
382 <resheader name=""version"">
385 <resheader name=""reader"">
386 <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
388 <resheader name=""writer"">
389 <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
392 <data name=""test"" type=""DummyAssembly.Convertable"">
393 <value>im a name im a value</value>