ResXDataNodeWriteBehavior.cs 15 KB

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