2
0

ResXResourceReaderTest.cs 67 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915
  1. //
  2. // ResXResourceReaderTest.cs: Unit Tests for ResXResourceReader.
  3. //
  4. // Authors:
  5. // Gert Driesen <[email protected]>
  6. // Olivier Dufour <[email protected]>
  7. // Gary Barnett <[email protected]>
  8. using System;
  9. using System.Collections;
  10. using System.Drawing;
  11. using System.Globalization;
  12. using System.IO;
  13. using System.Resources;
  14. using System.Text;
  15. using System.Windows.Forms;
  16. using System.Xml;
  17. using System.Runtime.Serialization;
  18. using NUnit.Framework;
  19. using System.Reflection;
  20. namespace MonoTests.System.Resources {
  21. [TestFixture]
  22. public class ResXResourceReaderTest : MonoTests.System.Windows.Forms.TestHelper
  23. {
  24. private string _tempDirectory;
  25. private string _otherTempDirectory;
  26. [SetUp]
  27. protected override void SetUp ()
  28. {
  29. _tempDirectory = Path.Combine (Path.GetTempPath (), "ResXResourceReaderTest");
  30. _otherTempDirectory = Path.Combine (_tempDirectory, "in");
  31. if (!Directory.Exists (_otherTempDirectory)) {
  32. Directory.CreateDirectory (_otherTempDirectory);
  33. }
  34. base.SetUp ();
  35. }
  36. [TearDown]
  37. protected override void TearDown ()
  38. {
  39. if (Directory.Exists (_tempDirectory))
  40. Directory.Delete (_tempDirectory, true);
  41. base.TearDown ();
  42. }
  43. [Test] // ctor (Stream)
  44. public void Constructor1_Stream_InvalidContent ()
  45. {
  46. MemoryStream ms = new MemoryStream ();
  47. ms.WriteByte (byte.MaxValue);
  48. ms.Position = 0;
  49. ResXResourceReader r = new ResXResourceReader (ms);
  50. try {
  51. r.GetEnumerator ();
  52. Assert.Fail ("#1");
  53. } catch (ArgumentException ex) {
  54. // Invalid ResX input
  55. Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#2");
  56. Assert.IsNotNull (ex.Message, "#3");
  57. Assert.IsNull (ex.ParamName, "#4");
  58. Assert.IsNotNull (ex.InnerException, "#5");
  59. }
  60. }
  61. [Test] // ctor (Stream)
  62. [Category ("NotDotNet")] // MS throws a NullReferenceException in GetEnumerator ()
  63. public void Constructor1_Stream_Null ()
  64. {
  65. try {
  66. new ResXResourceReader ((Stream) null);
  67. Assert.Fail ("#1");
  68. } catch (ArgumentNullException ex) {
  69. Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
  70. Assert.IsNull (ex.InnerException, "#3");
  71. Assert.IsNotNull (ex.Message, "#4");
  72. Assert.AreEqual ("stream", ex.ParamName, "#5");
  73. }
  74. }
  75. [Test] // ctor (String)
  76. public void Constructor2_FileName_DoesNotExist ()
  77. {
  78. ResXResourceReader r = new ResXResourceReader ((string) "definitelydoesnotexist.zzz");
  79. try {
  80. r.GetEnumerator ();
  81. Assert.Fail ("#1");
  82. } catch (FileNotFoundException ex) {
  83. Assert.AreEqual (typeof (FileNotFoundException), ex.GetType (), "#2");
  84. Assert.IsNotNull (ex.FileName, "#3");
  85. Assert.IsNotNull (ex.Message, "#4");
  86. Assert.IsNull (ex.InnerException, "#5");
  87. }
  88. }
  89. [Test] // ctor (TextReader)
  90. public void Constructor3_Reader_InvalidContent ()
  91. {
  92. StringReader sr = new StringReader ("</definitelyinvalid<");
  93. ResXResourceReader r = new ResXResourceReader (sr);
  94. try {
  95. r.GetEnumerator ();
  96. Assert.Fail ("#1");
  97. } catch (ArgumentException ex) {
  98. // Invalid ResX input
  99. Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#2");
  100. Assert.IsNotNull (ex.Message, "#3");
  101. Assert.IsNull (ex.ParamName, "#4");
  102. Assert.IsNotNull (ex.InnerException, "#5");
  103. Assert.AreEqual (typeof (XmlException), ex.InnerException.GetType (), "#6");
  104. }
  105. }
  106. [Test]
  107. public void Close_FileName ()
  108. {
  109. string fileName = Path.Combine (Path.Combine ("Test", "System.Resources"), "compat_1_1.resx");
  110. if (!File.Exists (fileName))
  111. fileName = String.Format ("..{0}System.Resources{0}compat_1_1.resx", Path.DirectorySeparatorChar);
  112. ResXResourceReader r1 = new ResXResourceReader (fileName);
  113. r1.GetEnumerator ();
  114. r1.Close ();
  115. r1.GetEnumerator ();
  116. ResXResourceReader r2 = new ResXResourceReader (fileName);
  117. r2.Close ();
  118. r2.GetEnumerator ();
  119. r2.Close ();
  120. }
  121. [Test]
  122. public void Close_Reader ()
  123. {
  124. string fileName = Path.Combine (Path.Combine ("Test", "System.Resources"), "compat_1_1.resx");
  125. if (!File.Exists (fileName))
  126. fileName = String.Format ("..{0}System.Resources{0}compat_1_1.resx", Path.DirectorySeparatorChar);
  127. using (StreamReader sr = new StreamReader (fileName)) {
  128. ResXResourceReader r = new ResXResourceReader (sr);
  129. Assert.IsFalse (sr.Peek () == -1, "#A1");
  130. r.GetEnumerator ();
  131. Assert.IsTrue (sr.Peek () == -1, "#A2");
  132. r.Close ();
  133. try {
  134. sr.Peek ();
  135. Assert.Fail ("#A3");
  136. } catch (ObjectDisposedException) {
  137. }
  138. r.GetEnumerator ();
  139. }
  140. using (StreamReader sr = new StreamReader (fileName)) {
  141. ResXResourceReader r = new ResXResourceReader (sr);
  142. r.Close ();
  143. try {
  144. sr.Peek ();
  145. Assert.Fail ("#B1");
  146. } catch (ObjectDisposedException) {
  147. }
  148. try {
  149. r.GetEnumerator ();
  150. Assert.Fail ("#B2");
  151. } catch (NullReferenceException) { // MS
  152. } catch (InvalidOperationException) { // Mono
  153. }
  154. }
  155. }
  156. [Test]
  157. public void Close_Stream ()
  158. {
  159. string fileName = Path.Combine (Path.Combine ("Test", "System.Resources"), "compat_1_1.resx");
  160. if (!File.Exists (fileName))
  161. fileName = String.Format ("..{0}System.Resources{0}compat_1_1.resx", Path.DirectorySeparatorChar);
  162. using (FileStream fs = File.OpenRead (fileName)) {
  163. ResXResourceReader r = new ResXResourceReader (fs);
  164. Assert.AreEqual (0, fs.Position, "#A1");
  165. r.GetEnumerator ();
  166. Assert.IsFalse (fs.Position == 0, "#A2");
  167. Assert.IsTrue (fs.CanRead, "#A3");
  168. r.Close ();
  169. Assert.IsTrue (fs.CanRead, "#A4");
  170. r.GetEnumerator ().MoveNext ();
  171. }
  172. using (FileStream fs = File.OpenRead (fileName)) {
  173. ResXResourceReader r = new ResXResourceReader (fs);
  174. r.Close ();
  175. Assert.AreEqual (0, fs.Position, "#B1");
  176. r.GetEnumerator ();
  177. Assert.IsFalse (fs.Position == 0, "#B2");
  178. }
  179. }
  180. [Test]
  181. public void ExternalFileReference_Icon ()
  182. {
  183. string refFile = Path.Combine (_tempDirectory, "32x32.ico");
  184. WriteEmbeddedResource ("32x32.ico", refFile);
  185. string resxFile = Path.Combine (_tempDirectory, "resources.resx");
  186. using (StreamWriter sw = new StreamWriter (resxFile, false, Encoding.UTF8)) {
  187. sw.Write (string.Format (CultureInfo.InvariantCulture,
  188. _resXFileRefTemplate, ResXResourceWriter.ResMimeType, "1.0",
  189. Consts.AssemblySystem_Windows_Forms, refFile,
  190. typeof (Bitmap).AssemblyQualifiedName, string.Empty,
  191. Consts.AssemblyCorlib));
  192. }
  193. using (ResXResourceReader r = new ResXResourceReader (resxFile)) {
  194. IDictionaryEnumerator enumerator = r.GetEnumerator ();
  195. enumerator.MoveNext ();
  196. Assert.IsNotNull (enumerator.Current, "#A1");
  197. Assert.AreEqual ("foo", enumerator.Key, "#A2");
  198. Bitmap bitmap = enumerator.Value as Bitmap;
  199. Assert.IsNotNull (bitmap, "#A3");
  200. Assert.AreEqual (32, bitmap.Height, "#A4");
  201. Assert.AreEqual (32, bitmap.Width, "#A5");
  202. }
  203. File.Delete (refFile);
  204. File.Delete (resxFile);
  205. refFile = Path.Combine (_tempDirectory, "32x32.ICO");
  206. WriteEmbeddedResource ("32x32.ico", refFile);
  207. using (StreamWriter sw = new StreamWriter (resxFile, false, Encoding.UTF8)) {
  208. sw.Write (string.Format (CultureInfo.InvariantCulture,
  209. _resXFileRefTemplate, ResXResourceWriter.ResMimeType, "1.0",
  210. Consts.AssemblySystem_Windows_Forms, refFile,
  211. typeof (Bitmap).AssemblyQualifiedName, string.Empty,
  212. Consts.AssemblyCorlib));
  213. }
  214. using (ResXResourceReader r = new ResXResourceReader (resxFile)) {
  215. IDictionaryEnumerator enumerator = r.GetEnumerator ();
  216. enumerator.MoveNext ();
  217. Assert.IsNotNull (enumerator.Current, "#B1");
  218. Assert.AreEqual ("foo", enumerator.Key, "#B2");
  219. Bitmap bitmap = enumerator.Value as Bitmap;
  220. Assert.IsNotNull (bitmap, "#B3");
  221. Assert.AreEqual (96, bitmap.Height, "#B4");
  222. Assert.AreEqual (96, bitmap.Width, "#B5");
  223. }
  224. }
  225. [Test]
  226. public void ExternalFileReference_RelativePath ()
  227. {
  228. string refFile = Path.Combine (_otherTempDirectory, "string.txt");
  229. string relRefFile = Path.Combine ("in", "string.txt");
  230. using (StreamWriter sw = new StreamWriter (refFile, false, Encoding.UTF8)) {
  231. sw.Write ("hello");
  232. }
  233. string resxFile = Path.Combine (_tempDirectory, "resources.resx");
  234. using (StreamWriter sw = new StreamWriter (resxFile, false, Encoding.UTF8)) {
  235. sw.Write (string.Format (CultureInfo.InvariantCulture,
  236. _resXFileRefTemplate, ResXResourceWriter.ResMimeType, "1.0",
  237. Consts.AssemblySystem_Windows_Forms,
  238. "in" + Path.DirectorySeparatorChar + "string.txt",
  239. typeof (StreamReader).AssemblyQualifiedName, string.Empty,
  240. Consts.AssemblyCorlib));
  241. }
  242. using (ResXResourceReader r = new ResXResourceReader (resxFile)) {
  243. try {
  244. r.GetEnumerator ();
  245. Assert.Fail ("#A1");
  246. } catch (ArgumentException ex) {
  247. // Invalid ResX input
  248. Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#A2");
  249. Assert.IsNotNull (ex.InnerException, "#A3");
  250. Assert.IsNotNull (ex.Message, "#A4");
  251. Assert.IsNull (ex.ParamName, "#A5");
  252. // Could not find a part of the path "<current dir>\in\string.txt".
  253. // Line 1, position 821
  254. XmlException inner = ex.InnerException as XmlException;
  255. Assert.IsNotNull (inner, "#A6");
  256. Assert.AreEqual (typeof (XmlException), inner.GetType (), "#A7");
  257. Assert.IsNotNull (inner.InnerException, "#A8");
  258. Assert.AreEqual (1, inner.LineNumber, "#A9");
  259. // Assert.AreEqual (821, inner.LinePosition, "#A10");
  260. Assert.IsNotNull (inner.Message, "#A11");
  261. Assert.IsTrue (inner.Message.IndexOf (Path.Combine (
  262. Directory.GetCurrentDirectory (), relRefFile)) != -1, "#A12");
  263. // Could not find a part of the path "<current dir>\in\string.txt"
  264. Exception inner2 = inner.InnerException;
  265. Assert.AreEqual (typeof (DirectoryNotFoundException), inner2.GetType (), "#A13");
  266. Assert.IsNull (inner2.InnerException, "#A14");
  267. Assert.IsNotNull (inner2.Message, "#A15");
  268. Assert.IsTrue (inner2.Message.IndexOf (Path.Combine (
  269. Directory.GetCurrentDirectory (), relRefFile)) != -1, "#A16");
  270. }
  271. Assert.IsNull (r.BasePath, "#A17");
  272. }
  273. string originalCurrentDir = Directory.GetCurrentDirectory ();
  274. Directory.SetCurrentDirectory (_tempDirectory);
  275. try {
  276. using (ResXResourceReader r = new ResXResourceReader (resxFile)) {
  277. IDictionaryEnumerator enumerator = r.GetEnumerator ();
  278. enumerator.MoveNext ();
  279. Assert.IsNotNull (enumerator.Current, "#B1");
  280. Assert.AreEqual ("foo", enumerator.Key, "#B2");
  281. using (StreamReader sr = enumerator.Value as StreamReader) {
  282. Assert.IsNotNull (sr, "#B3");
  283. Assert.AreEqual ("hello", sr.ReadToEnd (), "#B4");
  284. }
  285. Assert.IsNull (r.BasePath, "#B5");
  286. }
  287. } finally {
  288. // restore original current directory
  289. Directory.SetCurrentDirectory (originalCurrentDir);
  290. }
  291. using (ResXResourceReader r = new ResXResourceReader (resxFile)) {
  292. r.BasePath = _tempDirectory;
  293. IDictionaryEnumerator enumerator = r.GetEnumerator ();
  294. enumerator.MoveNext ();
  295. Assert.IsNotNull (enumerator.Current, "#C1");
  296. Assert.AreEqual ("foo", enumerator.Key, "#C2");
  297. using (StreamReader sr = enumerator.Value as StreamReader) {
  298. Assert.IsNotNull (sr, "#C3");
  299. Assert.AreEqual ("hello", sr.ReadToEnd (), "#C4");
  300. }
  301. Assert.AreEqual (_tempDirectory, r.BasePath, "#C5");
  302. }
  303. using (ResXResourceReader r = new ResXResourceReader (resxFile)) {
  304. r.BasePath = Path.GetTempPath ();
  305. try {
  306. r.GetEnumerator ();
  307. Assert.Fail ("#D1");
  308. } catch (ArgumentException ex) {
  309. // Invalid ResX input
  310. Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#D2");
  311. Assert.IsNotNull (ex.InnerException, "#D3");
  312. Assert.IsNotNull (ex.Message, "#D4");
  313. Assert.IsNull (ex.ParamName, "#D5");
  314. // Could not find a part of the path "<temp path>\in\string.txt".
  315. // Line 1, position 821
  316. XmlException inner = ex.InnerException as XmlException;
  317. Assert.IsNotNull (inner, "#D6");
  318. Assert.AreEqual (typeof (XmlException), inner.GetType (), "#D7");
  319. Assert.IsNotNull (inner.InnerException, "#D8");
  320. Assert.AreEqual (1, inner.LineNumber, "#D9");
  321. // Assert.AreEqual (821, inner.LinePosition, "#D10");
  322. Assert.IsNotNull (inner.Message, "#D11");
  323. Assert.IsTrue (inner.Message.IndexOf (Path.Combine (
  324. Path.GetTempPath (), relRefFile)) != -1, "#D12");
  325. // Could not find a part of the path "<temp path>\in\string.txt"
  326. Exception inner2 = inner.InnerException as Exception;
  327. Assert.AreEqual (typeof (DirectoryNotFoundException), inner2.GetType (), "#D13");
  328. Assert.IsNull (inner2.InnerException, "#D14");
  329. Assert.IsNotNull (inner2.Message, "#D15");
  330. Assert.IsTrue (inner2.Message.IndexOf (Path.Combine (
  331. Path.GetTempPath (), relRefFile)) != -1, "#D16");
  332. }
  333. Assert.AreEqual (Path.GetTempPath (), r.BasePath, "#D17");
  334. }
  335. }
  336. [Test]
  337. public void FileRef_String_UTF7 ()
  338. {
  339. string refFile = Path.Combine (_otherTempDirectory, "string.txt");
  340. using (StreamWriter sw = new StreamWriter (refFile, false, Encoding.UTF7)) {
  341. sw.Write ("\u0021\u0026\u002A\u003B");
  342. }
  343. string resxFile = Path.Combine (_tempDirectory, "resources.resx");
  344. using (StreamWriter sw = new StreamWriter (resxFile, false, Encoding.UTF8)) {
  345. sw.Write (string.Format (CultureInfo.InvariantCulture,
  346. _resXFileRefTemplate, ResXResourceWriter.ResMimeType, "1.0",
  347. Consts.AssemblySystem_Windows_Forms, refFile,
  348. typeof (string).AssemblyQualifiedName, string.Empty,
  349. Consts.AssemblyCorlib));
  350. }
  351. using (ResXResourceReader r = new ResXResourceReader (resxFile)) {
  352. IDictionaryEnumerator enumerator = r.GetEnumerator ();
  353. enumerator.MoveNext ();
  354. Assert.IsNotNull (enumerator.Current, "#A1");
  355. Assert.AreEqual ("foo", enumerator.Key, "#A2");
  356. Assert.IsFalse ("\u0021\u0026\u002A\u003B" == (string) enumerator.Value, "#A3");
  357. }
  358. resxFile = Path.Combine (_tempDirectory, "resources.resx");
  359. using (StreamWriter sw = new StreamWriter (resxFile, false, Encoding.UTF8)) {
  360. sw.Write (string.Format (CultureInfo.InvariantCulture,
  361. _resXFileRefTemplate, ResXResourceWriter.ResMimeType, "1.0",
  362. Consts.AssemblySystem_Windows_Forms, refFile,
  363. typeof (string).AssemblyQualifiedName, ";utf-7",
  364. Consts.AssemblyCorlib));
  365. }
  366. using (ResXResourceReader r = new ResXResourceReader (resxFile)) {
  367. IDictionaryEnumerator enumerator = r.GetEnumerator ();
  368. enumerator.MoveNext ();
  369. Assert.IsNotNull (enumerator.Current, "#B1");
  370. Assert.AreEqual ("foo", enumerator.Key, "#B2");
  371. Assert.AreEqual ("\u0021\u0026\u002A\u003B", (string) enumerator.Value, "#B3");
  372. }
  373. }
  374. [Test]
  375. public void FileRef_String_UTF8 ()
  376. {
  377. string refFile = Path.Combine (_otherTempDirectory, "string.txt");
  378. using (StreamWriter sw = new StreamWriter (refFile, false, Encoding.UTF8)) {
  379. sw.Write ("\u0041\u2262\u0391\u002E");
  380. }
  381. string resxFile = Path.Combine (_tempDirectory, "resources.resx");
  382. using (StreamWriter sw = new StreamWriter (resxFile, false, Encoding.UTF8)) {
  383. sw.Write (string.Format (CultureInfo.InvariantCulture,
  384. _resXFileRefTemplate, ResXResourceWriter.ResMimeType, "1.0",
  385. Consts.AssemblySystem_Windows_Forms, refFile,
  386. typeof (string).AssemblyQualifiedName, string.Empty,
  387. Consts.AssemblyCorlib));
  388. }
  389. using (ResXResourceReader r = new ResXResourceReader (resxFile)) {
  390. IDictionaryEnumerator enumerator = r.GetEnumerator ();
  391. enumerator.MoveNext ();
  392. Assert.IsNotNull (enumerator.Current, "#A1");
  393. Assert.AreEqual ("foo", enumerator.Key, "#A2");
  394. Assert.AreEqual ("\u0041\u2262\u0391\u002E", (string) enumerator.Value, "#A3");
  395. }
  396. resxFile = Path.Combine (_tempDirectory, "resources.resx");
  397. using (StreamWriter sw = new StreamWriter (resxFile, false, Encoding.UTF8)) {
  398. sw.Write (string.Format (CultureInfo.InvariantCulture,
  399. _resXFileRefTemplate, ResXResourceWriter.ResMimeType, "1.0",
  400. Consts.AssemblySystem_Windows_Forms, refFile,
  401. typeof (string).AssemblyQualifiedName, ";utf-8",
  402. Consts.AssemblyCorlib));
  403. }
  404. using (ResXResourceReader r = new ResXResourceReader (resxFile)) {
  405. IDictionaryEnumerator enumerator = r.GetEnumerator ();
  406. enumerator.MoveNext ();
  407. Assert.IsNotNull (enumerator.Current, "#B1");
  408. Assert.AreEqual ("foo", enumerator.Key, "#B2");
  409. Assert.AreEqual ("\u0041\u2262\u0391\u002E", (string) enumerator.Value, "#B3");
  410. }
  411. }
  412. [Test]
  413. public void Namespaces ()
  414. {
  415. const string resXTemplate =
  416. "<?xml version=\"1.0\" encoding=\"utf-8\"?>" +
  417. "<o:Document xmlns:x=\"http://www.mono-project.com\" xmlns:o=\"http://tempuri.org\">" +
  418. " <o:Content>" +
  419. " <x:DaTa name=\"name\">" +
  420. " <o:value>de Icaza</o:value>" +
  421. " </x:DaTa>" +
  422. " <x:data name=\"firstName\">" +
  423. " <x:value />" +
  424. " </x:data>" +
  425. " <o:data name=\"Address\" />" +
  426. " <o:data name=\"city\">" +
  427. " <x:value>Boston </x:value>" +
  428. " </o:data>" +
  429. " <o:data name=\"country\">" +
  430. " United States " +
  431. " </o:data>" +
  432. " <o:data name=\"\">" +
  433. " BO " +
  434. " </o:data>" +
  435. " <o:data name=\"country\">" +
  436. " <x:value>Belgium</x:value>" +
  437. " </o:data>" +
  438. " <data name=\"zip\">" +
  439. " <value><![CDATA[ <3510> ]]></value>" +
  440. " </data>" +
  441. " </o:Content>" +
  442. " <o:Paragraph>" +
  443. " <o:resheader name=\"resmimetype\">" +
  444. " <o:value>{0}</o:value>" +
  445. " </o:resheader>" +
  446. " <x:resheader name=\"version\">" +
  447. " <o:value>{1}</o:value>" +
  448. " </x:resheader>" +
  449. " </o:Paragraph>" +
  450. " <x:Section>" +
  451. " <o:resheader name=\"reader\">" +
  452. " <x:value>System.Resources.ResXResourceReader, {2}</x:value>" +
  453. " </o:resheader>" +
  454. " <x:resheader name=\"writer\">" +
  455. " <x:value>System.Resources.ResXResourceWriter, {2}</x:value>" +
  456. " </x:resheader>" +
  457. " </x:Section>" +
  458. "</o:Document>";
  459. string resxFile = Path.Combine (_tempDirectory, "resources.resx");
  460. using (StreamWriter sw = new StreamWriter (resxFile, false, Encoding.UTF8)) {
  461. sw.Write (string.Format (CultureInfo.InvariantCulture,
  462. resXTemplate, ResXResourceWriter.ResMimeType, "1.0",
  463. Consts.AssemblySystem_Windows_Forms));
  464. }
  465. // Stream
  466. using (FileStream fs = new FileStream (resxFile, FileMode.Open, FileAccess.Read, FileShare.Read)) {
  467. using (ResXResourceReader r = new ResXResourceReader (fs)) {
  468. IDictionaryEnumerator enumerator = r.GetEnumerator ();
  469. int entries = 0;
  470. while (enumerator.MoveNext ()) {
  471. entries++;
  472. switch ((string) enumerator.Key) {
  473. case "":
  474. Assert.IsNotNull (enumerator.Value, "#A1");
  475. Assert.AreEqual ("BO", enumerator.Value, "#A2");
  476. break;
  477. case "Address":
  478. Assert.IsNotNull (enumerator.Value, "#B1");
  479. Assert.AreEqual (string.Empty, enumerator.Value, "#B2");
  480. break;
  481. case "country":
  482. Assert.IsNotNull (enumerator.Value, "#C1");
  483. Assert.AreEqual (string.Empty, enumerator.Value, "#C2");
  484. break;
  485. case "firstName":
  486. Assert.IsNull (enumerator.Value, "#D");
  487. break;
  488. case "zip":
  489. Assert.IsNotNull (enumerator.Value, "#E1");
  490. Assert.AreEqual (" <3510> ", enumerator.Value, "#E2");
  491. break;
  492. default:
  493. Assert.Fail ("#F:" + enumerator.Key);
  494. break;
  495. }
  496. }
  497. Assert.AreEqual (5, entries, "#G");
  498. }
  499. }
  500. }
  501. [Test]
  502. public void ResHeader_Missing ()
  503. {
  504. const string resXTemplate =
  505. "<?xml version=\"1.0\" encoding=\"utf-8\"?>" +
  506. "<root>" +
  507. " <data name=\"name\">" +
  508. " <value>de Icaza</value>" +
  509. " </data>" +
  510. " <data name=\"firstName\">" +
  511. " <value />" +
  512. " </data>" +
  513. " <data name=\"address\" />" +
  514. "</root>";
  515. string resxFile = Path.Combine (_tempDirectory, "resources.resx");
  516. using (StreamWriter sw = new StreamWriter (resxFile, false, Encoding.UTF8)) {
  517. sw.Write (resXTemplate);
  518. }
  519. // Stream
  520. using (FileStream fs = new FileStream (resxFile, FileMode.Open, FileAccess.Read, FileShare.Read)) {
  521. using (ResXResourceReader r = new ResXResourceReader (fs)) {
  522. try {
  523. r.GetEnumerator ();
  524. Assert.Fail ("#A1");
  525. } catch (ArgumentException ex) {
  526. //Invalid ResX input. Could not find valid \"resheader\"
  527. // tags for the ResX reader & writer type names
  528. Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#A2");
  529. Assert.IsNull (ex.InnerException, "#A3");
  530. Assert.IsNotNull (ex.Message, "#A4");
  531. Assert.IsTrue (ex.Message.IndexOf ("\"resheader\"") != -1, "#A5");
  532. Assert.IsNull (ex.ParamName, "#A6");
  533. }
  534. }
  535. }
  536. // File
  537. using (ResXResourceReader r = new ResXResourceReader (resxFile)) {
  538. try {
  539. r.GetEnumerator ();
  540. Assert.Fail ("#B1");
  541. } catch (ArgumentException ex) {
  542. //Invalid ResX input. Could not find valid \"resheader\"
  543. // tags for the ResX reader & writer type names
  544. Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#B2");
  545. Assert.IsNull (ex.InnerException, "#B3");
  546. Assert.IsNotNull (ex.Message, "#B4");
  547. Assert.IsTrue (ex.Message.IndexOf ("\"resheader\"") != -1, "#B5");
  548. Assert.IsNull (ex.ParamName, "#B6");
  549. }
  550. }
  551. // TextReader
  552. using (StreamReader sr = new StreamReader (resxFile, Encoding.UTF8)) {
  553. using (ResXResourceReader r = new ResXResourceReader (sr)) {
  554. try {
  555. r.GetEnumerator ();
  556. Assert.Fail ("#C1");
  557. } catch (ArgumentException ex) {
  558. //Invalid ResX input. Could not find valid \"resheader\"
  559. // tags for the ResX reader & writer type names
  560. Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#C2");
  561. Assert.IsNull (ex.InnerException, "#C3");
  562. Assert.IsNotNull (ex.Message, "#C4");
  563. Assert.IsTrue (ex.Message.IndexOf ("\"resheader\"") != -1, "#C5");
  564. Assert.IsNull (ex.ParamName, "#C6");
  565. }
  566. }
  567. }
  568. }
  569. [Test]
  570. public void ResHeader_ResMimeType ()
  571. {
  572. const string resXTemplate =
  573. "<?xml version=\"1.0\" encoding=\"utf-8\"?>" +
  574. "<root>" +
  575. " <resheader name=\"resMIMEtype\">" +
  576. " {0}" +
  577. " </resheader>" +
  578. " <resheader name=\"version\">" +
  579. " <value>{1}</value>" +
  580. " </resheader>" +
  581. " <resheader name=\"reAder\">" +
  582. " <value>System.Resources.ResXResourceReader, {2}</value>" +
  583. " </resheader>" +
  584. " <resheader name=\"wriTer\">" +
  585. " <value>System.Resources.ResXResourceWriter, {2}</value>" +
  586. " </resheader>" +
  587. "</root>";
  588. string resXContent = null;
  589. // <value> element, exact case
  590. resXContent = string.Format (CultureInfo.InvariantCulture,
  591. resXTemplate, ResXResourceWriter.ResMimeType, "1.0",
  592. Consts.AssemblySystem_Windows_Forms);
  593. using (ResXResourceReader r = new ResXResourceReader (new StringReader (resXContent))) {
  594. r.GetEnumerator ();
  595. }
  596. // <value> element, uppercase
  597. resXContent = string.Format (CultureInfo.InvariantCulture,
  598. resXTemplate, ResXResourceWriter.ResMimeType.ToUpper (), "1.0",
  599. Consts.AssemblySystem_Windows_Forms);
  600. using (ResXResourceReader r = new ResXResourceReader (new StringReader (resXContent))) {
  601. try {
  602. r.GetEnumerator ();
  603. Assert.Fail ("#A1");
  604. } catch (ArgumentException ex) {
  605. //Invalid ResX input. Could not find valid \"resheader\"
  606. // tags for the ResX reader & writer type names
  607. Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#A2");
  608. Assert.IsNull (ex.InnerException, "#A3");
  609. Assert.IsNotNull (ex.Message, "#A4");
  610. Assert.IsTrue (ex.Message.IndexOf ("\"resheader\"") != -1, "#A5");
  611. Assert.IsNull (ex.ParamName, "#A6");
  612. }
  613. }
  614. // text, exact case
  615. resXContent = string.Format (CultureInfo.InvariantCulture,
  616. resXTemplate, ResXResourceWriter.ResMimeType, "1.0",
  617. Consts.AssemblySystem_Windows_Forms);
  618. using (ResXResourceReader r = new ResXResourceReader (new StringReader (resXContent))) {
  619. r.GetEnumerator ();
  620. }
  621. // text, uppercase
  622. resXContent = string.Format (CultureInfo.InvariantCulture,
  623. resXTemplate, ResXResourceWriter.ResMimeType.ToUpper (), "1.0",
  624. Consts.AssemblySystem_Windows_Forms);
  625. using (ResXResourceReader r = new ResXResourceReader (new StringReader (resXContent))) {
  626. try {
  627. r.GetEnumerator ();
  628. Assert.Fail ("#B1");
  629. } catch (ArgumentException ex) {
  630. //Invalid ResX input. Could not find valid \"resheader\"
  631. // tags for the ResX reader & writer type names
  632. Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#B2");
  633. Assert.IsNull (ex.InnerException, "#B3");
  634. Assert.IsNotNull (ex.Message, "#B4");
  635. Assert.IsTrue (ex.Message.IndexOf ("\"resheader\"") != -1, "#B5");
  636. Assert.IsNull (ex.ParamName, "#B6");
  637. }
  638. }
  639. // CDATA, exact case
  640. resXContent = string.Format (CultureInfo.InvariantCulture,
  641. resXTemplate, "<![CDATA[" +ResXResourceWriter.ResMimeType + "]]>",
  642. "1.0", Consts.AssemblySystem_Windows_Forms);
  643. using (ResXResourceReader r = new ResXResourceReader (new StringReader (resXContent))) {
  644. r.GetEnumerator ();
  645. }
  646. // CDATA, uppercase
  647. resXContent = string.Format (CultureInfo.InvariantCulture,
  648. resXTemplate, "<![CDATA[" + ResXResourceWriter.ResMimeType.ToUpper () + "]]>",
  649. "1.0", Consts.AssemblySystem_Windows_Forms);
  650. using (ResXResourceReader r = new ResXResourceReader (new StringReader (resXContent))) {
  651. try {
  652. r.GetEnumerator ();
  653. Assert.Fail ("#C1");
  654. } catch (ArgumentException ex) {
  655. //Invalid ResX input. Could not find valid \"resheader\"
  656. // tags for the ResX reader & writer type names
  657. Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#C2");
  658. Assert.IsNull (ex.InnerException, "#C3");
  659. Assert.IsNotNull (ex.Message, "#C4");
  660. Assert.IsTrue (ex.Message.IndexOf ("\"resheader\"") != -1, "#C5");
  661. Assert.IsNull (ex.ParamName, "#C6");
  662. }
  663. }
  664. // <whatever> element, exact case
  665. resXContent = string.Format (CultureInfo.InvariantCulture,
  666. resXTemplate, "<whatever>" + ResXResourceWriter.ResMimeType + "</whatever>",
  667. "1.0", Consts.AssemblySystem_Windows_Forms);
  668. using (ResXResourceReader r = new ResXResourceReader (new StringReader (resXContent))) {
  669. r.GetEnumerator ();
  670. }
  671. // <whatever> element, uppercase
  672. resXContent = string.Format (CultureInfo.InvariantCulture,
  673. resXTemplate, "<whatever>" + ResXResourceWriter.ResMimeType.ToUpper () + "</whatever>",
  674. "1.0", Consts.AssemblySystem_Windows_Forms);
  675. using (ResXResourceReader r = new ResXResourceReader (new StringReader (resXContent))) {
  676. try {
  677. r.GetEnumerator ();
  678. Assert.Fail ("#D1");
  679. } catch (ArgumentException ex) {
  680. //Invalid ResX input. Could not find valid \"resheader\"
  681. // tags for the ResX reader & writer type names
  682. Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#D2");
  683. Assert.IsNull (ex.InnerException, "#D3");
  684. Assert.IsNotNull (ex.Message, "#D4");
  685. Assert.IsTrue (ex.Message.IndexOf ("\"resheader\"") != -1, "#D5");
  686. Assert.IsNull (ex.ParamName, "#D6");
  687. }
  688. }
  689. }
  690. [Test]
  691. public void ResHeader_ResMimeType_Empty ()
  692. {
  693. const string resXTemplate =
  694. "<?xml version=\"1.0\" encoding=\"utf-8\"?>" +
  695. "<root>" +
  696. " <resheader name=\"resmimetype\"></resheader>" +
  697. "</root>";
  698. using (ResXResourceReader r = new ResXResourceReader (new StringReader (resXTemplate))) {
  699. try {
  700. r.GetEnumerator ();
  701. Assert.Fail ("#1");
  702. } catch (ArgumentException ex) {
  703. //Invalid ResX input. Could not find valid \"resheader\"
  704. // tags for the ResX reader & writer type names
  705. Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#2");
  706. Assert.IsNull (ex.InnerException, "#3");
  707. Assert.IsNotNull (ex.Message, "#4");
  708. Assert.IsTrue (ex.Message.IndexOf ("\"resheader\"") != -1, "#5");
  709. Assert.IsNull (ex.ParamName, "#6");
  710. }
  711. }
  712. }
  713. [Test]
  714. public void ResHeader_ResMimeType_Invalid ()
  715. {
  716. const string resXTemplate =
  717. "<?xml version=\"1.0\" encoding=\"utf-8\"?>" +
  718. "<root>" +
  719. " <resheader name=\"resmimetype\">" +
  720. " <value>{0}</value>" +
  721. " </resheader>" +
  722. " <resheader name=\"version\">" +
  723. " <value>{1}</value>" +
  724. " </resheader>" +
  725. " <resheader name=\"reader\">" +
  726. " <value>System.Resources.ResXResourceReader, {2}</value>" +
  727. " </resheader>" +
  728. " <resheader name=\"writer\">" +
  729. " <value>System.Resources.ResXResourceWriter, {2}</value>" +
  730. " </resheader>" +
  731. " <data name=\"name\">" +
  732. " <value>de Icaza</value>" +
  733. " </data>" +
  734. " <data name=\"firstName\">" +
  735. " <value />" +
  736. " </data>" +
  737. " <data name=\"Address\" />" +
  738. "</root>";
  739. string resxFile = Path.Combine (_tempDirectory, "resources.resx");
  740. using (StreamWriter sw = new StreamWriter (resxFile, false, Encoding.UTF8)) {
  741. sw.Write (string.Format (CultureInfo.InvariantCulture,
  742. resXTemplate, "notvalid", "1.0", Consts.AssemblySystem_Windows_Forms
  743. ));
  744. }
  745. // Stream
  746. using (FileStream fs = new FileStream (resxFile, FileMode.Open, FileAccess.Read, FileShare.Read)) {
  747. using (ResXResourceReader r = new ResXResourceReader (fs)) {
  748. try {
  749. r.GetEnumerator ();
  750. Assert.Fail ("#A1");
  751. } catch (ArgumentException ex) {
  752. //Invalid ResX input. Could not find valid \"resheader\"
  753. // tags for the ResX reader & writer type names
  754. Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#A2");
  755. Assert.IsNull (ex.InnerException, "#A3");
  756. Assert.IsNotNull (ex.Message, "#A4");
  757. Assert.IsTrue (ex.Message.IndexOf ("\"resheader\"") != -1, "#A5");
  758. Assert.IsNull (ex.ParamName, "#A6");
  759. }
  760. }
  761. }
  762. // File
  763. using (ResXResourceReader r = new ResXResourceReader (resxFile)) {
  764. try {
  765. r.GetEnumerator ();
  766. Assert.Fail ("#B1");
  767. } catch (ArgumentException ex) {
  768. //Invalid ResX input. Could not find valid \"resheader\"
  769. // tags for the ResX reader & writer type names
  770. Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#B2");
  771. Assert.IsNull (ex.InnerException, "#B3");
  772. Assert.IsNotNull (ex.Message, "#B4");
  773. Assert.IsTrue (ex.Message.IndexOf ("\"resheader\"") != -1, "#B5");
  774. Assert.IsNull (ex.ParamName, "#B6");
  775. }
  776. }
  777. // TextReader
  778. using (StreamReader sr = new StreamReader (resxFile, Encoding.UTF8)) {
  779. using (ResXResourceReader r = new ResXResourceReader (sr)) {
  780. try {
  781. r.GetEnumerator ();
  782. Assert.Fail ("#C1");
  783. } catch (ArgumentException ex) {
  784. //Invalid ResX input. Could not find valid \"resheader\"
  785. // tags for the ResX reader & writer type names
  786. Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#C2");
  787. Assert.IsNull (ex.InnerException, "#C3");
  788. Assert.IsNotNull (ex.Message, "#C4");
  789. Assert.IsTrue (ex.Message.IndexOf ("\"resheader\"") != -1, "#C5");
  790. Assert.IsNull (ex.ParamName, "#C6");
  791. }
  792. }
  793. }
  794. }
  795. [Test]
  796. public void ResHeader_ResMimeType_Null ()
  797. {
  798. const string resXTemplate =
  799. "<?xml version=\"1.0\" encoding=\"utf-8\"?>" +
  800. "<root>" +
  801. " <resheader name=\"resmimetype\" />" +
  802. "</root>";
  803. using (ResXResourceReader r = new ResXResourceReader (new StringReader (resXTemplate))) {
  804. try {
  805. r.GetEnumerator ();
  806. Assert.Fail ("#1");
  807. } catch (ArgumentException ex) {
  808. //Invalid ResX input. Could not find valid \"resheader\"
  809. // tags for the ResX reader & writer type names
  810. Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#2");
  811. Assert.IsNull (ex.InnerException, "#3");
  812. Assert.IsNotNull (ex.Message, "#4");
  813. Assert.IsTrue (ex.Message.IndexOf ("\"resheader\"") != -1, "#5");
  814. Assert.IsNull (ex.ParamName, "#6");
  815. }
  816. }
  817. }
  818. [Test]
  819. public void ResHeader_Reader_Invalid ()
  820. {
  821. const string resXTemplate =
  822. "<?xml version=\"1.0\" encoding=\"utf-8\"?>" +
  823. "<root>" +
  824. " <resheader name=\"resmimetype\">" +
  825. " {0}" +
  826. " </resheader>" +
  827. " <resheader name=\"version\">" +
  828. " <value>{1}</value>" +
  829. " </resheader>" +
  830. " <resheader name=\"reader\">" +
  831. " <value>System.Resources.InvalidResXResourceReader, {2}</value>" +
  832. " </resheader>" +
  833. " <resheader name=\"writer\">" +
  834. " <value>System.Resources.ResXResourceWriter, {2}</value>" +
  835. " </resheader>" +
  836. "</root>";
  837. string resXContent = string.Format (CultureInfo.InvariantCulture,
  838. resXTemplate, ResXResourceWriter.ResMimeType, "1.0",
  839. Consts.AssemblySystem_Windows_Forms);
  840. using (ResXResourceReader r = new ResXResourceReader (new StringReader (resXContent))) {
  841. try {
  842. r.GetEnumerator ();
  843. Assert.Fail ("#1");
  844. } catch (ArgumentException ex) {
  845. //Invalid ResX input. Could not find valid \"resheader\"
  846. // tags for the ResX reader & writer type names
  847. Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#2");
  848. Assert.IsNull (ex.InnerException, "#3");
  849. Assert.IsNotNull (ex.Message, "#4");
  850. Assert.IsTrue (ex.Message.IndexOf ("\"resheader\"") != -1, "#5");
  851. Assert.IsNull (ex.ParamName, "#6");
  852. }
  853. }
  854. }
  855. [Test]
  856. public void ResHeader_Reader_Missing ()
  857. {
  858. const string resXTemplate =
  859. "<?xml version=\"1.0\" encoding=\"utf-8\"?>" +
  860. "<root>" +
  861. " <resheader name=\"resmimetype\">" +
  862. " {0}" +
  863. " </resheader>" +
  864. " <resheader name=\"version\">" +
  865. " <value>{1}</value>" +
  866. " </resheader>" +
  867. " <resheader name=\"writer\">" +
  868. " <value>System.Resources.ResXResourceWriter, {2}</value>" +
  869. " </resheader>" +
  870. "</root>";
  871. string resXContent = string.Format (CultureInfo.InvariantCulture,
  872. resXTemplate, ResXResourceWriter.ResMimeType, "1.0",
  873. Consts.AssemblySystem_Windows_Forms);
  874. using (ResXResourceReader r = new ResXResourceReader (new StringReader (resXContent))) {
  875. try {
  876. r.GetEnumerator ();
  877. Assert.Fail ("#1");
  878. } catch (ArgumentException ex) {
  879. //Invalid ResX input. Could not find valid \"resheader\"
  880. // tags for the ResX reader & writer type names
  881. Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#2");
  882. Assert.IsNull (ex.InnerException, "#3");
  883. Assert.IsNotNull (ex.Message, "#4");
  884. Assert.IsTrue (ex.Message.IndexOf ("\"resheader\"") != -1, "#5");
  885. Assert.IsNull (ex.ParamName, "#6");
  886. }
  887. }
  888. }
  889. [Test]
  890. public void ResHeader_Reader_Null ()
  891. {
  892. const string resXTemplate =
  893. "<?xml version=\"1.0\" encoding=\"utf-8\"?>" +
  894. "<root>" +
  895. " <resheader name=\"resmimetype\">" +
  896. " {0}" +
  897. " </resheader>" +
  898. " <resheader name=\"version\">" +
  899. " <value>{1}</value>" +
  900. " </resheader>" +
  901. " <resheader name=\"reader\" />" +
  902. " <resheader name=\"writer\">" +
  903. " <value>System.Resources.ResXResourceWriter, {2}</value>" +
  904. " </resheader>" +
  905. "</root>";
  906. string resXContent = string.Format (CultureInfo.InvariantCulture,
  907. resXTemplate, ResXResourceWriter.ResMimeType, "1.0",
  908. Consts.AssemblySystem_Windows_Forms);
  909. using (ResXResourceReader r = new ResXResourceReader (new StringReader (resXContent))) {
  910. try {
  911. r.GetEnumerator ();
  912. Assert.Fail ("#1");
  913. } catch (ArgumentException ex) {
  914. //Invalid ResX input. Could not find valid \"resheader\"
  915. // tags for the ResX reader & writer type names
  916. Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#2");
  917. Assert.IsNull (ex.InnerException, "#3");
  918. Assert.IsNotNull (ex.Message, "#4");
  919. Assert.IsTrue (ex.Message.IndexOf ("\"resheader\"") != -1, "#5");
  920. Assert.IsNull (ex.ParamName, "#6");
  921. }
  922. }
  923. }
  924. [Test]
  925. public void ResHeader_Writer_Invalid ()
  926. {
  927. const string resXTemplate =
  928. "<?xml version=\"1.0\" encoding=\"utf-8\"?>" +
  929. "<root>" +
  930. " <resheader name=\"resmimetype\">" +
  931. " {0}" +
  932. " </resheader>" +
  933. " <resheader name=\"version\">" +
  934. " <value>{1}</value>" +
  935. " </resheader>" +
  936. " <resheader name=\"reader\">" +
  937. " <value>System.Resources.ResXResourceReader, {2}</value>" +
  938. " </resheader>" +
  939. " <resheader name=\"writer\">" +
  940. " <value>System.Resources.InvalidResXResourceWriter, {2}</value>" +
  941. " </resheader>" +
  942. "</root>";
  943. string resXContent = string.Format (CultureInfo.InvariantCulture,
  944. resXTemplate, ResXResourceWriter.ResMimeType, "1.0",
  945. Consts.AssemblySystem_Windows_Forms);
  946. using (ResXResourceReader r = new ResXResourceReader (new StringReader (resXContent))) {
  947. try {
  948. r.GetEnumerator ();
  949. Assert.Fail ("#1");
  950. } catch (ArgumentException ex) {
  951. //Invalid ResX input. Could not find valid \"resheader\"
  952. // tags for the ResX reader & writer type names
  953. Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#2");
  954. Assert.IsNull (ex.InnerException, "#3");
  955. Assert.IsNotNull (ex.Message, "#4");
  956. Assert.IsTrue (ex.Message.IndexOf ("\"resheader\"") != -1, "#5");
  957. Assert.IsNull (ex.ParamName, "#6");
  958. }
  959. }
  960. }
  961. [Test]
  962. public void ResHeader_Writer_Missing ()
  963. {
  964. const string resXTemplate =
  965. "<?xml version=\"1.0\" encoding=\"utf-8\"?>" +
  966. "<root>" +
  967. " <resheader name=\"resmimetype\">" +
  968. " {0}" +
  969. " </resheader>" +
  970. " <resheader name=\"version\">" +
  971. " <value>{1}</value>" +
  972. " </resheader>" +
  973. " <resheader name=\"reader\">" +
  974. " <value>System.Resources.ResXResourceReader, {2}</value>" +
  975. " </resheader>" +
  976. "</root>";
  977. string resXContent = string.Format (CultureInfo.InvariantCulture,
  978. resXTemplate, ResXResourceWriter.ResMimeType, "1.0",
  979. Consts.AssemblySystem_Windows_Forms);
  980. using (ResXResourceReader r = new ResXResourceReader (new StringReader (resXContent))) {
  981. try {
  982. r.GetEnumerator ();
  983. Assert.Fail ("#1");
  984. } catch (ArgumentException ex) {
  985. //Invalid ResX input. Could not find valid \"resheader\"
  986. // tags for the ResX reader & writer type names
  987. Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#2");
  988. Assert.IsNull (ex.InnerException, "#3");
  989. Assert.IsNotNull (ex.Message, "#4");
  990. Assert.IsTrue (ex.Message.IndexOf ("\"resheader\"") != -1, "#5");
  991. Assert.IsNull (ex.ParamName, "#6");
  992. }
  993. }
  994. }
  995. [Test]
  996. public void ResHeader_Writer_Null ()
  997. {
  998. const string resXTemplate =
  999. "<?xml version=\"1.0\" encoding=\"utf-8\"?>" +
  1000. "<root>" +
  1001. " <resheader name=\"resmimetype\">" +
  1002. " {0}" +
  1003. " </resheader>" +
  1004. " <resheader name=\"version\">" +
  1005. " <value>{1}</value>" +
  1006. " </resheader>" +
  1007. " <resheader name=\"reader\">" +
  1008. " <value>System.Resources.ResXResourceReader, {2}</value>" +
  1009. " </resheader>" +
  1010. " <resheader name=\"writer\" />" +
  1011. "</root>";
  1012. string resXContent = string.Format (CultureInfo.InvariantCulture,
  1013. resXTemplate, ResXResourceWriter.ResMimeType, "1.0",
  1014. Consts.AssemblySystem_Windows_Forms);
  1015. using (ResXResourceReader r = new ResXResourceReader (new StringReader (resXContent))) {
  1016. try {
  1017. r.GetEnumerator ();
  1018. Assert.Fail ("#1");
  1019. } catch (ArgumentException ex) {
  1020. //Invalid ResX input. Could not find valid \"resheader\"
  1021. // tags for the ResX reader & writer type names
  1022. Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#2");
  1023. Assert.IsNull (ex.InnerException, "#3");
  1024. Assert.IsNotNull (ex.Message, "#4");
  1025. Assert.IsTrue (ex.Message.IndexOf ("\"resheader\"") != -1, "#5");
  1026. Assert.IsNull (ex.ParamName, "#6");
  1027. }
  1028. }
  1029. }
  1030. [Test]
  1031. public void ResHeader_Unknown ()
  1032. {
  1033. const string resXTemplate =
  1034. "<?xml version=\"1.0\" encoding=\"utf-8\"?>" +
  1035. "<root>" +
  1036. " <resheader name=\"resmimetype\">" +
  1037. " {0}" +
  1038. " </resheader>" +
  1039. " <resheader name=\"version\">" +
  1040. " <value>{1}</value>" +
  1041. " </resheader>" +
  1042. " <resheader name=\"reader\">" +
  1043. " <value> System.Resources.ResXResourceReader , {2}</value>" +
  1044. " </resheader>" +
  1045. " <resheader name=\"writer\">" +
  1046. " <value> System.Resources.ResXResourceWriter , {2}</value>" +
  1047. " </resheader>" +
  1048. " <resheader name=\"UNKNOWN\">" +
  1049. " <value>whatever</value>" +
  1050. " </resheader>" +
  1051. "</root>";
  1052. string resXContent = string.Format (CultureInfo.InvariantCulture,
  1053. resXTemplate, ResXResourceWriter.ResMimeType, "1.0",
  1054. Consts.AssemblySystem_Windows_Forms);
  1055. using (ResXResourceReader r = new ResXResourceReader (new StringReader (resXContent))) {
  1056. r.GetEnumerator ();
  1057. }
  1058. }
  1059. [Test]
  1060. public void ResName_Null ()
  1061. {
  1062. const string resXContent =
  1063. "<?xml version=\"1.0\" encoding=\"utf-8\"?>" +
  1064. "<root>" +
  1065. " <resheader name=\"resmimetype\">" +
  1066. " <value>invalid</value>" +
  1067. " </resheader>" +
  1068. " <data name=\"name\">" +
  1069. " <value>de Icaza</value>" +
  1070. " </data>" +
  1071. " <data>" +
  1072. " <value>whatever</value>" +
  1073. " </data>" +
  1074. "</root>";
  1075. using (StringReader sr = new StringReader (resXContent)) {
  1076. using (ResXResourceReader r = new ResXResourceReader (sr)) {
  1077. try {
  1078. r.GetEnumerator ();
  1079. Assert.Fail ("#1");
  1080. } catch (ArgumentException ex) {
  1081. // Invalid ResX input.
  1082. Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#2");
  1083. Assert.IsNotNull (ex.InnerException, "#3");
  1084. Assert.IsNotNull (ex.Message, "#4");
  1085. Assert.IsNull (ex.ParamName, "#5");
  1086. // Could not find a name for a resource. The resource
  1087. // value was 'whatever'. Line 1, position 200
  1088. XmlException inner = ex.InnerException as XmlException;
  1089. Assert.IsNotNull (inner, "#6");
  1090. Assert.AreEqual (typeof (XmlException), inner.GetType (), "#7");
  1091. Assert.IsNotNull (inner.InnerException, "#8");
  1092. Assert.AreEqual (1, inner.LineNumber, "#9");
  1093. // Assert.AreEqual (200, inner.LinePosition, "#10");
  1094. Assert.IsNotNull (inner.Message, "#11");
  1095. Assert.IsTrue (inner.Message.IndexOf ("'whatever'") != -1, "#12");
  1096. Assert.IsTrue (inner.Message.IndexOf (" 1") != -1, "#13");
  1097. //Assert.IsTrue (inner.Message.IndexOf ("200") != -1, "#14");
  1098. // Could not find a name for a resource. The resource
  1099. // value was 'whatever'
  1100. ArgumentException inner2 = inner.InnerException as ArgumentException;
  1101. Assert.IsNotNull (inner2, "#15");
  1102. Assert.AreEqual (typeof (ArgumentException), inner2.GetType (), "#16");
  1103. Assert.IsNull (inner2.InnerException, "#17");
  1104. Assert.IsNotNull (inner2.Message, "#18");
  1105. Assert.IsTrue (inner2.Message.IndexOf ("'whatever'") != -1, "#19");
  1106. Assert.IsNull (inner2.ParamName, "#20");
  1107. }
  1108. }
  1109. }
  1110. }
  1111. static string resXWithEmptyName =
  1112. @"<?xml version=""1.0"" encoding=""utf-8""?>
  1113. <root>
  1114. <resheader name=""resmimetype"">
  1115. <value>text/microsoft-resx</value>
  1116. </resheader>
  1117. <resheader name=""version"">
  1118. <value>2.0</value>
  1119. </resheader>
  1120. <resheader name=""reader"">
  1121. <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
  1122. </resheader>
  1123. <resheader name=""writer"">
  1124. <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
  1125. </resheader>
  1126. <data name="""">
  1127. <value>a resource with no name</value>
  1128. </data>
  1129. </root>";
  1130. static string resxWithNullRef =
  1131. @"<?xml version=""1.0"" encoding=""utf-8""?>
  1132. <root>
  1133. <resheader name=""resmimetype"">
  1134. <value>text/microsoft-resx</value>
  1135. </resheader>
  1136. <resheader name=""version"">
  1137. <value>2.0</value>
  1138. </resheader>
  1139. <resheader name=""reader"">
  1140. <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
  1141. </resheader>
  1142. <resheader name=""writer"">
  1143. <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
  1144. </resheader>
  1145. <data name=""NullRef"" type=""System.Resources.ResXNullRef, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"">
  1146. <value></value>
  1147. </data>
  1148. </root>";
  1149. [Test]
  1150. public void ResName_Empty ()
  1151. {
  1152. using (StringReader sr = new StringReader (resXWithEmptyName)) {
  1153. using (ResXResourceReader r = new ResXResourceReader (sr)) {
  1154. IDictionaryEnumerator enumerator = r.GetEnumerator ();
  1155. enumerator.MoveNext ();
  1156. Assert.AreEqual ("", enumerator.Key, "#A1");
  1157. Assert.AreEqual ("a resource with no name", (string) enumerator.Value, "#A2");
  1158. }
  1159. }
  1160. }
  1161. [Test]
  1162. public void ResXNullRef ()
  1163. {
  1164. using (StringReader sr = new StringReader (resxWithNullRef)) {
  1165. using (ResXResourceReader r = new ResXResourceReader (sr)) {
  1166. IDictionaryEnumerator enumerator = r.GetEnumerator ();
  1167. enumerator.MoveNext ();
  1168. Assert.AreEqual ("NullRef", enumerator.Key, "#A1");
  1169. Assert.IsNull (enumerator.Value, "#A2");
  1170. }
  1171. }
  1172. }
  1173. [Test]
  1174. public void ResValue ()
  1175. {
  1176. string resXContent = string.Format (CultureInfo.CurrentCulture,
  1177. "<?xml version=\"1.0\" encoding=\"utf-8\"?>" +
  1178. "<root>" +
  1179. " <resheader name=\"resmimetype\">" +
  1180. " <value>{0}</value>" +
  1181. " </resheader>" +
  1182. " <resheader name=\"reader\">" +
  1183. " <value>System.Resources.ResXResourceReader, {1}</value>" +
  1184. " </resheader>" +
  1185. " <resheader name=\"writer\">" +
  1186. " <value>System.Resources.ResXResourceWriter, {1}</value>" +
  1187. " </resheader>" +
  1188. " <data name=\"name1\">" +
  1189. " <value><![CDATA[ <value1> ]]></value>" +
  1190. " </data>" +
  1191. " <data name=\"name2\">" +
  1192. " <value> <![CDATA[<value2>]]> </value>" +
  1193. " </data>" +
  1194. " <data name=\"name3\">" +
  1195. " <![CDATA[<value3>]]> " +
  1196. " </data>" +
  1197. " <data name=\"name4\">" +
  1198. " <value> value4 </value>" +
  1199. " </data>" +
  1200. " <data name=\"name5\">" +
  1201. " test<value>value5</value>" +
  1202. " </data>" +
  1203. " <data name=\"name6\">" +
  1204. " test1<value>value6</value>test2" +
  1205. " </data>" +
  1206. " <data name=\"name7\">" +
  1207. " <value>value7a</value>" +
  1208. " <whatever>value7b</whatever>" +
  1209. " </data>" +
  1210. " <data name=\"name8\">" +
  1211. " <whatever>value8</whatever>" +
  1212. " </data>" +
  1213. " <data name=\"name9\">" +
  1214. " <whatever>value9a</whatever>" +
  1215. " <whatever>value9b</whatever>" +
  1216. " </data>" +
  1217. " <data name=\"name10\">" +
  1218. " test<whatever>value10</whatever>" +
  1219. " </data>" +
  1220. " <data name=\"name11\">" +
  1221. " test1<whatever>value11</whatever>test2" +
  1222. " </data>" +
  1223. " <data name=\"name12\">" +
  1224. " <value> test <![CDATA[<value12>]]> </value>" +
  1225. " </data>" +
  1226. " <data name=\"name13\">" +
  1227. " test <![CDATA[<value13>]]> " +
  1228. " </data>" +
  1229. " <data name=\"name14\" />" +
  1230. " <data name=\"name15\"></data>" +
  1231. " <data name=\"name16\">value16</data>" +
  1232. " <data name=\"name17\">value17</data>" +
  1233. " <data name=\"name18\">" +
  1234. " <value>value18</value>" +
  1235. " <data name=\"name19\">" +
  1236. " <value>value18</value>" +
  1237. " </data>" +
  1238. " </data>" +
  1239. "</root>",
  1240. ResXResourceWriter.ResMimeType, Consts.AssemblySystem_Windows_Forms);
  1241. using (StringReader sr = new StringReader (resXContent)) {
  1242. using (ResXResourceReader r = new ResXResourceReader (sr)) {
  1243. IDictionaryEnumerator enumerator = r.GetEnumerator ();
  1244. int entries = 0;
  1245. while (enumerator.MoveNext ()) {
  1246. entries++;
  1247. switch ((string) enumerator.Key) {
  1248. case "name1":
  1249. Assert.IsNotNull (enumerator.Value, "#A1");
  1250. Assert.AreEqual (" <value1> ", enumerator.Value, "#A2");
  1251. break;
  1252. case "name2":
  1253. Assert.IsNotNull (enumerator.Value, "#B1");
  1254. Assert.AreEqual ("<value2>", enumerator.Value, "#B2");
  1255. break;
  1256. case "name3":
  1257. Assert.IsNotNull (enumerator.Value, "#C1");
  1258. Assert.AreEqual ("<value3>", enumerator.Value, "#C2");
  1259. break;
  1260. case "name4":
  1261. Assert.IsNotNull (enumerator.Value, "#D1");
  1262. Assert.AreEqual (" value4 ", enumerator.Value, "#D2");
  1263. break;
  1264. case "name5":
  1265. Assert.IsNotNull (enumerator.Value, "#E1");
  1266. Assert.AreEqual ("value5", enumerator.Value, "#E2");
  1267. break;
  1268. case "name6":
  1269. Assert.IsNotNull (enumerator.Value, "#F1");
  1270. Assert.AreEqual ("test2", enumerator.Value, "#F2");
  1271. break;
  1272. case "name7":
  1273. Assert.IsNotNull (enumerator.Value, "#G1");
  1274. Assert.AreEqual (string.Empty, enumerator.Value, "#G2");
  1275. break;
  1276. case "name8":
  1277. Assert.IsNotNull (enumerator.Value, "#H1");
  1278. Assert.AreEqual (string.Empty, enumerator.Value, "#H2");
  1279. break;
  1280. case "name9":
  1281. Assert.IsNotNull (enumerator.Value, "#I1");
  1282. Assert.AreEqual (string.Empty, enumerator.Value, "#I2");
  1283. break;
  1284. case "name10":
  1285. Assert.IsNotNull (enumerator.Value, "#J1");
  1286. Assert.AreEqual (string.Empty, enumerator.Value, "#J2");
  1287. break;
  1288. case "name11":
  1289. Assert.IsNotNull (enumerator.Value, "#K1");
  1290. Assert.AreEqual ("test2", enumerator.Value, "#K2");
  1291. break;
  1292. case "name12":
  1293. Assert.IsNotNull (enumerator.Value, "#L1");
  1294. Assert.AreEqual (" test <value12>", enumerator.Value, "#L2");
  1295. break;
  1296. case "name13":
  1297. Assert.IsNotNull (enumerator.Value, "#M1");
  1298. Assert.AreEqual ("<value13>", enumerator.Value, "#M2");
  1299. break;
  1300. case "name14":
  1301. Assert.IsNull (enumerator.Value, "#N1");
  1302. break;
  1303. case "name16":
  1304. Assert.IsNotNull (enumerator.Value, "#O1");
  1305. Assert.AreEqual ("value16", enumerator.Value, "#O2");
  1306. break;
  1307. case "name17":
  1308. Assert.IsNotNull (enumerator.Value, "#P1");
  1309. Assert.AreEqual ("value17", enumerator.Value, "#P2");
  1310. break;
  1311. case "name18":
  1312. Assert.IsNotNull (enumerator.Value, "#Q1");
  1313. Assert.AreEqual ("value18", enumerator.Value, "#Q2");
  1314. break;
  1315. default:
  1316. Assert.Fail ("#Q:" + enumerator.Key);
  1317. break;
  1318. }
  1319. }
  1320. Assert.AreEqual (17, entries, "#Q");
  1321. }
  1322. }
  1323. }
  1324. [Test]
  1325. public void EnumeratorOrderSameAsResx ()
  1326. {
  1327. string resXContent = string.Format (CultureInfo.CurrentCulture,
  1328. "<?xml version=\"1.0\" encoding=\"utf-8\"?>" +
  1329. "<root>" +
  1330. " <resheader name=\"resmimetype\">" +
  1331. " <value>{0}</value>" +
  1332. " </resheader>" +
  1333. " <resheader name=\"reader\">" +
  1334. " <value>System.Resources.ResXResourceReader, {1}</value>" +
  1335. " </resheader>" +
  1336. " <resheader name=\"writer\">" +
  1337. " <value>System.Resources.ResXResourceWriter, {1}</value>" +
  1338. " </resheader>" +
  1339. " <data name=\"name2\">" +
  1340. " <value> value5 </value>" +
  1341. " </data>" +
  1342. " <data name=\"name1\">" +
  1343. " <value> value4 </value>" +
  1344. " </data>" +
  1345. " <data name=\"aaa\">" +
  1346. " <value> value3 </value>" +
  1347. " </data>" +
  1348. " <data name=\"zzzz\">" +
  1349. " <value> value2 </value>" +
  1350. " </data>" +
  1351. " <data name=\"bbbbbb\">" +
  1352. " <value> value1 </value>" +
  1353. " </data>" +
  1354. "</root>",
  1355. ResXResourceWriter.ResMimeType, Consts.AssemblySystem_Windows_Forms);
  1356. using (StringReader sr = new StringReader (resXContent)) {
  1357. using (ResXResourceReader r = new ResXResourceReader (sr)) {
  1358. IDictionaryEnumerator enumerator = r.GetEnumerator ();
  1359. enumerator.MoveNext ();
  1360. Assert.AreEqual ("name2", enumerator.Key, "#1");
  1361. enumerator.MoveNext ();
  1362. Assert.AreEqual ("name1", enumerator.Key, "#2");
  1363. enumerator.MoveNext ();
  1364. Assert.AreEqual ("aaa", enumerator.Key, "#3");
  1365. enumerator.MoveNext ();
  1366. Assert.AreEqual ("zzzz", enumerator.Key, "#4");
  1367. enumerator.MoveNext ();
  1368. Assert.AreEqual ("bbbbbb", enumerator.Key, "#5");
  1369. }
  1370. }
  1371. }
  1372. [Test]
  1373. public void UseResXDataNodes ()
  1374. {
  1375. string refFile = Path.Combine (_tempDirectory, "32x32.ico");
  1376. WriteEmbeddedResource ("32x32.ico", refFile);
  1377. string resxFile = Path.Combine (_tempDirectory, "resources.resx");
  1378. using (StreamWriter sw = new StreamWriter (resxFile, false, Encoding.UTF8)) {
  1379. sw.Write (string.Format (CultureInfo.InvariantCulture,
  1380. _resXFileRefTemplate, ResXResourceWriter.ResMimeType, "1.0",
  1381. Consts.AssemblySystem_Windows_Forms, refFile,
  1382. typeof (Bitmap).AssemblyQualifiedName, string.Empty,
  1383. Consts.AssemblyCorlib));
  1384. }
  1385. using (ResXResourceReader r = new ResXResourceReader (resxFile)) {
  1386. r.UseResXDataNodes = true;
  1387. IDictionaryEnumerator enumerator = r.GetEnumerator ();
  1388. int entries = 0;
  1389. while (enumerator.MoveNext ()) {
  1390. entries++;
  1391. ResXDataNode node = enumerator.Value as ResXDataNode;
  1392. switch ((string) enumerator.Key) {
  1393. case "foo":
  1394. Assert.AreEqual ("foo", node.Name, "#A1");
  1395. Bitmap bitmap = node.GetValue (new AssemblyName[] {typeof (Bitmap).Assembly.GetName ()}) as Bitmap;
  1396. Assert.IsNotNull (bitmap, "#A2");
  1397. break;
  1398. case "panel_label.Locked":
  1399. Assert.AreEqual ("panel_label.Locked", node.Name, "#B1");
  1400. Assert.AreEqual (true, node.GetValue (new AssemblyName[] {typeof (int).Assembly.GetName ()}), "#B2");
  1401. break;
  1402. default:
  1403. Assert.Fail ("#C:" + enumerator.Key);
  1404. break;
  1405. }
  1406. }
  1407. Assert.AreEqual (2, entries, "#D");
  1408. }
  1409. }
  1410. [Test]
  1411. [Category ("NotWorking")]
  1412. public void ResXDataNode_GetNodePosition ()
  1413. {
  1414. // This test relies on a hashtable's enumerator being ordered,
  1415. // when the ordering is not guaranteed.
  1416. string refFile = Path.Combine (_tempDirectory, "32x32.ico");
  1417. WriteEmbeddedResource ("32x32.ico", refFile);
  1418. string resxFile = Path.Combine (_tempDirectory, "resources.resx");
  1419. using (StreamWriter sw = new StreamWriter (resxFile, false, Encoding.UTF8)) {
  1420. sw.Write (string.Format (CultureInfo.InvariantCulture,
  1421. _resXFileRefTemplate, ResXResourceWriter.ResMimeType, "1.0",
  1422. Consts.AssemblySystem_Windows_Forms, refFile,
  1423. typeof (Bitmap).AssemblyQualifiedName, string.Empty,
  1424. Consts.AssemblyCorlib));
  1425. }
  1426. using (ResXResourceReader r = new ResXResourceReader (resxFile)) {
  1427. r.UseResXDataNodes = true;
  1428. IDictionaryEnumerator enumerator = r.GetEnumerator ();
  1429. enumerator.MoveNext ();
  1430. ResXDataNode node = enumerator.Value as ResXDataNode;
  1431. Assert.IsNotNull (node, "#A1");
  1432. Assert.AreEqual(new Point(1, 717), node.GetNodePosition (), "#A2");
  1433. }
  1434. }
  1435. [Test]
  1436. public void GetMetadataEnumerator ()
  1437. {
  1438. string refFile = Path.Combine (_tempDirectory, "32x32.ico");
  1439. WriteEmbeddedResource ("32x32.ico", refFile);
  1440. string resxFile = Path.Combine (_tempDirectory, "resources.resx");
  1441. using (StreamWriter sw = new StreamWriter (resxFile, false, Encoding.UTF8)) {
  1442. sw.Write (string.Format (CultureInfo.InvariantCulture,
  1443. _resXFileRefTemplate, ResXResourceWriter.ResMimeType, "1.0",
  1444. Consts.AssemblySystem_Windows_Forms, refFile,
  1445. typeof (Bitmap).AssemblyQualifiedName, string.Empty,
  1446. Consts.AssemblyCorlib));
  1447. }
  1448. using (ResXResourceReader r = new ResXResourceReader (resxFile)) {
  1449. IDictionaryEnumerator enumerator = r.GetMetadataEnumerator ();
  1450. Assert.IsTrue (enumerator.MoveNext (), "#A1");
  1451. Assert.IsNotNull (enumerator.Current, "#A2");
  1452. Assert.AreEqual ("panel_label.Locked", enumerator.Key, "#A3");
  1453. Assert.AreEqual(typeof(bool), enumerator.Value.GetType(), "#A4");
  1454. Assert.IsTrue ((bool) enumerator.Value, "#A5");
  1455. Assert.IsFalse (enumerator.MoveNext (), "#A6");
  1456. }
  1457. using (ResXResourceReader r = new ResXResourceReader (resxFile)) {
  1458. r.UseResXDataNodes = true;
  1459. IDictionaryEnumerator enumerator = r.GetMetadataEnumerator ();
  1460. Assert.IsFalse (enumerator.MoveNext (), "#B1");
  1461. }
  1462. }
  1463. [Test]
  1464. public void TypeConversion ()
  1465. {
  1466. string resXContent = string.Format (CultureInfo.CurrentCulture,
  1467. "<?xml version=\"1.0\" encoding=\"utf-8\"?>" +
  1468. "<root>" +
  1469. " <resheader name=\"resmimetype\">" +
  1470. " <value>{0}</value>" +
  1471. " </resheader>" +
  1472. " <resheader name=\"reader\">" +
  1473. " <value>System.Resources.ResXResourceReader, {1}</value>" +
  1474. " </resheader>" +
  1475. " <resheader name=\"writer\">" +
  1476. " <value>System.Resources.ResXResourceWriter, {1}</value>" +
  1477. " </resheader>" +
  1478. " <data name=\"AnchorStyle\" type=\"System.Windows.Forms.AnchorStyles, {1}\">" +
  1479. " <value>Bottom, Left</value>" +
  1480. " </data>" +
  1481. " <data name=\"BackgroundImage\" type=\"{2}\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">" +
  1482. " <value>" +
  1483. " Qk12BQAAAAAAADYEAAAoAAAAEgAAABAAAAABAAgAAAAAAAAAAAAgHAAAIBwAAAABAAAAAQAAAAAA/wAA" +
  1484. " M/8AAGb/AACZ/wAAzP8AAP//ADMA/wAzM/8AM2b/ADOZ/wAzzP8AM///AGYA/wBmM/8AZmb/AGaZ/wBm" +
  1485. " zP8AZv//AJkA/wCZM/8AmWb/AJmZ/wCZzP8Amf//AMwA/wDMM/8AzGb/AMyZ/wDMzP8AzP//AP8A/wD/" +
  1486. " M/8A/2b/AP+Z/wD/zP8A////MwAA/zMAM/8zAGb/MwCZ/zMAzP8zAP//MzMA/zMzM/8zM2b/MzOZ/zMz" +
  1487. " zP8zM///M2YA/zNmM/8zZmb/M2aZ/zNmzP8zZv//M5kA/zOZM/8zmWb/M5mZ/zOZzP8zmf//M8wA/zPM" +
  1488. " M/8zzGb/M8yZ/zPMzP8zzP//M/8A/zP/M/8z/2b/M/+Z/zP/zP8z////ZgAA/2YAM/9mAGb/ZgCZ/2YA" +
  1489. " zP9mAP//ZjMA/2YzM/9mM2b/ZjOZ/2YzzP9mM///ZmYA/2ZmM/9mZmb/ZmaZ/2ZmzP9mZv//ZpkA/2aZ" +
  1490. " M/9mmWb/ZpmZ/2aZzP9mmf//ZswA/2bMM/9mzGb/ZsyZ/2bMzP9mzP//Zv8A/2b/M/9m/2b/Zv+Z/2b/" +
  1491. " zP9m////mQAA/5kAM/+ZAGb/mQCZ/5kAzP+ZAP//mTMA/5kzM/+ZM2b/mTOZ/5kzzP+ZM///mWYA/5lm" +
  1492. " M/+ZZmb/mWaZ/5lmzP+ZZv//mZkA/5mZM/+ZmWb/mZmZ/5mZzP+Zmf//mcwA/5nMM/+ZzGb/mcyZ/5nM" +
  1493. " zP+ZzP//mf8A/5n/M/+Z/2b/mf+Z/5n/zP+Z////zAAA/8wAM//MAGb/zACZ/8wAzP/MAP//zDMA/8wz" +
  1494. " M//MM2b/zDOZ/8wzzP/MM///zGYA/8xmM//MZmb/zGaZ/8xmzP/MZv//zJkA/8yZM//MmWb/zJmZ/8yZ" +
  1495. " zP/Mmf//zMwA/8zMM//MzGb/zMyZ/8zMzP/MzP//zP8A/8z/M//M/2b/zP+Z/8z/zP/M/////wAA//8A" +
  1496. " M///AGb//wCZ//8AzP//AP///zMA//8zM///M2b//zOZ//8zzP//M////2YA//9mM///Zmb//2aZ//9m" +
  1497. " zP//Zv///5kA//+ZM///mWb//5mZ//+ZzP//mf///8wA///MM///zGb//8yZ///MzP//zP////8A////" +
  1498. " M////2b///+Z////zP//////AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA" +
  1499. " AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA" +
  1500. " AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA" +
  1501. " AAAAAAAAAAwMDAwAAAAAAAAAAAAAAAAAAAAAAAwMDAwAAAAAAAAAAAAAAAAAAAAAAAwMDAAAAAAAAAAA" +
  1502. " AAAAAAAAAAAAAAwMDAAAAAAAAAAAAAAAAAAAAAAADAwMAAAAAAAAAAAADAAAAAAAAAAMDA0AAAAAAAAA" +
  1503. " AAwMDQAAABMTExMTExMTNwAAAAAMDAwMDQAAABMTExMTExMAAAAANzc3Nzc3NwAAAD4+Pj4+AAAAAD4+" +
  1504. " Pj4+Pj4+PgAAAGJiYgAAAAAAAAAAYmJiAAAAAAAAAGIAAAAAAAAAAABiYmIAAAAAAAAAAAAAAAAAAAAA" +
  1505. " AGJiYgAAAAAAAAAAAAAAAAAAAAAAAGJiYgAAAAAAAAAAAAAAAAAAAAAAAGJiYgAAAAAAAAAAAAAAAAAA" +
  1506. " AAAAAGJiYgAAAAAAAAAAAAAA" +
  1507. " </value>" +
  1508. " </data>" +
  1509. " <data name=\"Buffer\" type=\"{3}\">" +
  1510. " <value>BQIH</value>" +
  1511. " </data>" +
  1512. " <data name=\"Data\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">" +
  1513. " <value>Random Thoughts</value>" +
  1514. " </data>" +
  1515. /*s*/" <data name=\"Foo\" type=\"System.Windows.Forms.Application, {1}\">" +
  1516. " <value>A B C</value>" +
  1517. " </data>" +
  1518. " <data name=\"Image\" type=\"{2}\">" +
  1519. " <value>Summer.jpg</value>" +
  1520. " </data>" +
  1521. /*e*/" <data name=\"Text\">" +
  1522. " <value>OK</value>" +
  1523. " </data>" +
  1524. " <data name=\"Unknown\" mimetype=\"application/xxx\">" +
  1525. " <value>MIA</value>" +
  1526. " </data>" +
  1527. " <data name=\"Wrong\" typeof=\"{2}\" mimetype=\"application/xxx\">" +
  1528. " <value>SuperUnknown</value>" +
  1529. " </data>" +
  1530. /*s*/" <data name=\"Xtra\" type=\"System.Windows.Forms.AnchorStyles, {1}\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">" +
  1531. " <value>LeftRight</value>" +
  1532. " </data>" +
  1533. /*e*/"</root>",
  1534. ResXResourceWriter.ResMimeType, Consts.AssemblySystem_Windows_Forms,
  1535. typeof (Bitmap).AssemblyQualifiedName, typeof (byte []).AssemblyQualifiedName);
  1536. using (StringReader sr = new StringReader (resXContent)) {
  1537. using (ResXResourceReader r = new ResXResourceReader (sr)) {
  1538. IDictionaryEnumerator enumerator = r.GetEnumerator ();
  1539. int entries = 0;
  1540. while (enumerator.MoveNext ()) {
  1541. entries++;
  1542. switch ((string) enumerator.Key) {
  1543. case "AnchorStyle":
  1544. Assert.IsNotNull (enumerator.Value, "#A1");
  1545. Assert.AreEqual (AnchorStyles.Bottom | AnchorStyles.Left, enumerator.Value, "#A2");
  1546. break;
  1547. case "BackgroundImage":
  1548. Assert.IsNotNull (enumerator.Value, "#B1");
  1549. Assert.AreEqual (typeof (Bitmap), enumerator.Value.GetType (), "#B2");
  1550. break;
  1551. case "Buffer":
  1552. Assert.IsNotNull (enumerator.Value, "#C1");
  1553. Assert.AreEqual (new byte [] { 5, 2, 7 }, enumerator.Value, "#C2");
  1554. break;
  1555. case "Data":
  1556. Assert.IsNull (enumerator.Value, "#D1");
  1557. break;
  1558. case "Foo":
  1559. Assert.IsNull (enumerator.Value, "#E1");
  1560. break;
  1561. case "Image":
  1562. Assert.IsNull (enumerator.Value, "#F1");
  1563. break;
  1564. case "Text":
  1565. Assert.IsNotNull (enumerator.Value, "#G1");
  1566. Assert.AreEqual ("OK", enumerator.Value, "#G2");
  1567. break;
  1568. case "Unknown":
  1569. Assert.IsNull (enumerator.Value, "#H1");
  1570. break;
  1571. case "Wrong":
  1572. Assert.IsNull (enumerator.Value, "#I1");
  1573. break;
  1574. case "Xtra":
  1575. Assert.IsNull (enumerator.Value, "#J1");
  1576. break;
  1577. default:
  1578. Assert.Fail ("#J:" + enumerator.Key);
  1579. break;
  1580. }
  1581. }
  1582. Assert.AreEqual (10, entries, "#G");
  1583. }
  1584. }
  1585. }
  1586. [Test, ExpectedException (typeof (SerializationException))]
  1587. public void DeSerializationErrorBubbles ()
  1588. {
  1589. using (StringReader sr = new StringReader (serializedResXCorruped)) {
  1590. using (ResXResourceReader r = new ResXResourceReader (sr)) {
  1591. IDictionaryEnumerator enumerator = r.GetEnumerator ();
  1592. // should throw exception
  1593. }
  1594. }
  1595. }
  1596. [Test, ExpectedException (typeof (TargetInvocationException))]
  1597. public void FileRef_DeserializationFails ()
  1598. {
  1599. string corruptFile = Path.GetTempFileName ();
  1600. ResXFileRef fileRef = new ResXFileRef (corruptFile, typeof (serializable).AssemblyQualifiedName);
  1601. File.AppendAllText (corruptFile,"corrupt");
  1602. StringBuilder sb = new StringBuilder();
  1603. using (StringWriter sw = new StringWriter (sb)) {
  1604. using (ResXResourceWriter writer = new ResXResourceWriter (sw)) {
  1605. writer.AddResource ("test", fileRef);
  1606. }
  1607. }
  1608. using (StringReader sr = new StringReader (sb.ToString ())) {
  1609. using (ResXResourceReader reader = new ResXResourceReader (sr)) {
  1610. reader.GetEnumerator ();
  1611. }
  1612. }
  1613. }
  1614. [Test, ExpectedException (typeof (ArgumentException))]
  1615. public void FileRef_TypeCantBeResolved ()
  1616. {
  1617. string aFile = Path.GetTempFileName ();
  1618. ResXFileRef fileRef = new ResXFileRef (aFile, "a.type.doesnt.exist");
  1619. StringBuilder sb = new StringBuilder ();
  1620. using (StringWriter sw = new StringWriter (sb)) {
  1621. using (ResXResourceWriter writer = new ResXResourceWriter (sw)) {
  1622. writer.AddResource ("test", fileRef);
  1623. }
  1624. }
  1625. using (StringReader sr = new StringReader (sb.ToString ())) {
  1626. using (ResXResourceReader reader = new ResXResourceReader (sr)) {
  1627. reader.GetEnumerator ();
  1628. }
  1629. }
  1630. }
  1631. [Test]
  1632. public void TypeConverter_AssemblyNamesUsed ()
  1633. {
  1634. string aName = "DummyAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null";
  1635. AssemblyName [] assemblyNames = new AssemblyName [] { new AssemblyName (aName) };
  1636. StringReader sr = new StringReader (convertableResXWithoutAssemblyName);
  1637. using (ResXResourceReader rr = new ResXResourceReader (sr, assemblyNames)) {
  1638. IDictionaryEnumerator en = rr.GetEnumerator ();
  1639. en.MoveNext ();
  1640. object obj = ((DictionaryEntry) en.Current).Value;
  1641. Assert.IsNotNull (obj, "#A1");
  1642. Assert.AreEqual ("DummyAssembly.Convertable, " + aName, obj.GetType ().AssemblyQualifiedName, "#A2");
  1643. }
  1644. }
  1645. [Test]
  1646. public void TypeConverter_ITRSUsed ()
  1647. {
  1648. ResXDataNode dn = new ResXDataNode ("test", 34L);
  1649. StringBuilder sb = new StringBuilder ();
  1650. using (StringWriter sw = new StringWriter (sb)) {
  1651. using (ResXResourceWriter writer = new ResXResourceWriter (sw)) {
  1652. writer.AddResource (dn);
  1653. }
  1654. }
  1655. using (StringReader sr = new StringReader (sb.ToString ())) {
  1656. ResXResourceReader rr = new ResXResourceReader (sr, new ReturnIntITRS ());
  1657. IDictionaryEnumerator en = rr.GetEnumerator ();
  1658. en.MoveNext ();
  1659. object o = ((DictionaryEntry) en.Current).Value;
  1660. Assert.IsNotNull (o, "#A1");
  1661. Assert.IsInstanceOfType (typeof (int), o,"#A2");
  1662. Assert.AreEqual (34, o,"#A3");
  1663. rr.Close ();
  1664. }
  1665. }
  1666. [Test]
  1667. public void Serializable_ITRSUsed ()
  1668. {
  1669. serializable ser = new serializable ("aaaaa", "bbbbb");
  1670. ResXDataNode dn = new ResXDataNode ("test", ser);
  1671. StringBuilder sb = new StringBuilder ();
  1672. using (StringWriter sw = new StringWriter (sb)) {
  1673. using (ResXResourceWriter writer = new ResXResourceWriter (sw)) {
  1674. writer.AddResource (dn);
  1675. }
  1676. }
  1677. using (StringReader sr = new StringReader (sb.ToString ())) {
  1678. ResXResourceReader rr = new ResXResourceReader (sr, new ReturnSerializableSubClassITRS ());
  1679. IDictionaryEnumerator en = rr.GetEnumerator ();
  1680. en.MoveNext ();
  1681. object o = ((DictionaryEntry) en.Current).Value;
  1682. Assert.IsNotNull (o, "#A1");
  1683. Assert.IsInstanceOfType (typeof (serializableSubClass), o,"#A2");
  1684. rr.Close ();
  1685. }
  1686. }
  1687. static string convertableResXWithoutAssemblyName =
  1688. @"<?xml version=""1.0"" encoding=""utf-8""?>
  1689. <root>
  1690. <resheader name=""resmimetype"">
  1691. <value>text/microsoft-resx</value>
  1692. </resheader>
  1693. <resheader name=""version"">
  1694. <value>2.0</value>
  1695. </resheader>
  1696. <resheader name=""reader"">
  1697. <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
  1698. </resheader>
  1699. <resheader name=""writer"">
  1700. <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
  1701. </resheader>
  1702. <data name=""test"" type=""DummyAssembly.Convertable"">
  1703. <value>im a name im a value</value>
  1704. </data>
  1705. </root>";
  1706. static string serializedResXCorruped =
  1707. @"<?xml version=""1.0"" encoding=""utf-8""?>
  1708. <root>
  1709. <resheader name=""resmimetype"">
  1710. <value>text/microsoft-resx</value>
  1711. </resheader>
  1712. <resheader name=""version"">
  1713. <value>2.0</value>
  1714. </resheader>
  1715. <resheader name=""reader"">
  1716. <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
  1717. </resheader>
  1718. <resheader name=""writer"">
  1719. <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
  1720. </resheader>
  1721. <data name=""test"" mimetype=""application/x-microsoft.net.object.binary.base64"">
  1722. <value>
  1723. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  1724. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  1725. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  1726. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  1727. </value>
  1728. </data>
  1729. </root>";
  1730. private static void WriteEmbeddedResource (string name, string filename)
  1731. {
  1732. const int size = 512;
  1733. byte [] buffer = new byte [size];
  1734. int count = 0;
  1735. Stream input = typeof (ResXResourceReaderTest).Assembly.
  1736. GetManifestResourceStream (name);
  1737. Stream output = File.Open (filename, FileMode.Create);
  1738. try {
  1739. while ((count = input.Read (buffer, 0, size)) > 0) {
  1740. output.Write (buffer, 0, count);
  1741. }
  1742. } finally {
  1743. output.Close ();
  1744. }
  1745. }
  1746. private const string _resXFileRefTemplate =
  1747. "<?xml version=\"1.0\" encoding=\"utf-8\"?>" +
  1748. "<root>" +
  1749. " <resheader name=\"resmimetype\">" +
  1750. " <value>{0}</value>" +
  1751. " </resheader>" +
  1752. " <resheader name=\"version\">" +
  1753. " <value>{1}</value>" +
  1754. " </resheader>" +
  1755. " <resheader name=\"reader\">" +
  1756. " <value>System.Resources.ResXResourceReader, {2}</value>" +
  1757. " </resheader>" +
  1758. " <resheader name=\"writer\">" +
  1759. " <value>System.Resources.ResXResourceWriter, {2}</value>" +
  1760. " </resheader>" +
  1761. " <metadata name=\"panel_label.Locked\" type=\"System.Boolean, {6}\">" +
  1762. " <value>True</value>" +
  1763. " </metadata>" +
  1764. " <data name=\"foo\" type=\"System.Resources.ResXFileRef, {2}\">" +
  1765. " <value>{3};{4}{5}</value>" +
  1766. " </data>" +
  1767. "</root>";
  1768. }
  1769. }