// // ResXResourceReaderTest.cs: Unit Tests for ResXResourceReader. // // Authors: // Gert Driesen // Olivier Dufour // Gary Barnett using System; using System.Collections; using System.Drawing; using System.Globalization; using System.IO; using System.Resources; using System.Text; using System.Windows.Forms; using System.Xml; using System.Runtime.Serialization; using NUnit.Framework; using System.Reflection; namespace MonoTests.System.Resources { [TestFixture] public class ResXResourceReaderTest : MonoTests.System.Windows.Forms.TestHelper { private string _tempDirectory; private string _otherTempDirectory; [SetUp] protected override void SetUp () { _tempDirectory = Path.Combine (Path.GetTempPath (), "ResXResourceReaderTest"); _otherTempDirectory = Path.Combine (_tempDirectory, "in"); if (!Directory.Exists (_otherTempDirectory)) { Directory.CreateDirectory (_otherTempDirectory); } base.SetUp (); } [TearDown] protected override void TearDown () { if (Directory.Exists (_tempDirectory)) Directory.Delete (_tempDirectory, true); base.TearDown (); } [Test] // ctor (Stream) public void Constructor1_Stream_InvalidContent () { MemoryStream ms = new MemoryStream (); ms.WriteByte (byte.MaxValue); ms.Position = 0; ResXResourceReader r = new ResXResourceReader (ms); try { r.GetEnumerator (); Assert.Fail ("#1"); } catch (ArgumentException ex) { // Invalid ResX input Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#2"); Assert.IsNotNull (ex.Message, "#3"); Assert.IsNull (ex.ParamName, "#4"); Assert.IsNotNull (ex.InnerException, "#5"); } } [Test] // ctor (Stream) [Category ("NotDotNet")] // MS throws a NullReferenceException in GetEnumerator () public void Constructor1_Stream_Null () { try { new ResXResourceReader ((Stream) null); Assert.Fail ("#1"); } catch (ArgumentNullException ex) { Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2"); Assert.IsNull (ex.InnerException, "#3"); Assert.IsNotNull (ex.Message, "#4"); Assert.AreEqual ("stream", ex.ParamName, "#5"); } } [Test] // ctor (String) public void Constructor2_FileName_DoesNotExist () { ResXResourceReader r = new ResXResourceReader ((string) "definitelydoesnotexist.zzz"); try { r.GetEnumerator (); Assert.Fail ("#1"); } catch (FileNotFoundException ex) { Assert.AreEqual (typeof (FileNotFoundException), ex.GetType (), "#2"); Assert.IsNotNull (ex.FileName, "#3"); Assert.IsNotNull (ex.Message, "#4"); Assert.IsNull (ex.InnerException, "#5"); } } [Test] // ctor (TextReader) public void Constructor3_Reader_InvalidContent () { StringReader sr = new StringReader ("\in\string.txt". // Line 1, position 821 XmlException inner = ex.InnerException as XmlException; Assert.IsNotNull (inner, "#A6"); Assert.AreEqual (typeof (XmlException), inner.GetType (), "#A7"); Assert.IsNotNull (inner.InnerException, "#A8"); Assert.AreEqual (1, inner.LineNumber, "#A9"); // Assert.AreEqual (821, inner.LinePosition, "#A10"); Assert.IsNotNull (inner.Message, "#A11"); Assert.IsTrue (inner.Message.IndexOf (Path.Combine ( Directory.GetCurrentDirectory (), relRefFile)) != -1, "#A12"); // Could not find a part of the path "\in\string.txt" Exception inner2 = inner.InnerException; Assert.AreEqual (typeof (DirectoryNotFoundException), inner2.GetType (), "#A13"); Assert.IsNull (inner2.InnerException, "#A14"); Assert.IsNotNull (inner2.Message, "#A15"); Assert.IsTrue (inner2.Message.IndexOf (Path.Combine ( Directory.GetCurrentDirectory (), relRefFile)) != -1, "#A16"); } Assert.IsNull (r.BasePath, "#A17"); } string originalCurrentDir = Directory.GetCurrentDirectory (); Directory.SetCurrentDirectory (_tempDirectory); try { using (ResXResourceReader r = new ResXResourceReader (resxFile)) { IDictionaryEnumerator enumerator = r.GetEnumerator (); enumerator.MoveNext (); Assert.IsNotNull (enumerator.Current, "#B1"); Assert.AreEqual ("foo", enumerator.Key, "#B2"); using (StreamReader sr = enumerator.Value as StreamReader) { Assert.IsNotNull (sr, "#B3"); Assert.AreEqual ("hello", sr.ReadToEnd (), "#B4"); } Assert.IsNull (r.BasePath, "#B5"); } } finally { // restore original current directory Directory.SetCurrentDirectory (originalCurrentDir); } using (ResXResourceReader r = new ResXResourceReader (resxFile)) { r.BasePath = _tempDirectory; IDictionaryEnumerator enumerator = r.GetEnumerator (); enumerator.MoveNext (); Assert.IsNotNull (enumerator.Current, "#C1"); Assert.AreEqual ("foo", enumerator.Key, "#C2"); using (StreamReader sr = enumerator.Value as StreamReader) { Assert.IsNotNull (sr, "#C3"); Assert.AreEqual ("hello", sr.ReadToEnd (), "#C4"); } Assert.AreEqual (_tempDirectory, r.BasePath, "#C5"); } using (ResXResourceReader r = new ResXResourceReader (resxFile)) { r.BasePath = Path.GetTempPath (); try { r.GetEnumerator (); Assert.Fail ("#D1"); } catch (ArgumentException ex) { // Invalid ResX input Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#D2"); Assert.IsNotNull (ex.InnerException, "#D3"); Assert.IsNotNull (ex.Message, "#D4"); Assert.IsNull (ex.ParamName, "#D5"); // Could not find a part of the path "\in\string.txt". // Line 1, position 821 XmlException inner = ex.InnerException as XmlException; Assert.IsNotNull (inner, "#D6"); Assert.AreEqual (typeof (XmlException), inner.GetType (), "#D7"); Assert.IsNotNull (inner.InnerException, "#D8"); Assert.AreEqual (1, inner.LineNumber, "#D9"); // Assert.AreEqual (821, inner.LinePosition, "#D10"); Assert.IsNotNull (inner.Message, "#D11"); Assert.IsTrue (inner.Message.IndexOf (Path.Combine ( Path.GetTempPath (), relRefFile)) != -1, "#D12"); // Could not find a part of the path "\in\string.txt" Exception inner2 = inner.InnerException as Exception; Assert.AreEqual (typeof (DirectoryNotFoundException), inner2.GetType (), "#D13"); Assert.IsNull (inner2.InnerException, "#D14"); Assert.IsNotNull (inner2.Message, "#D15"); Assert.IsTrue (inner2.Message.IndexOf (Path.Combine ( Path.GetTempPath (), relRefFile)) != -1, "#D16"); } Assert.AreEqual (Path.GetTempPath (), r.BasePath, "#D17"); } } [Test] public void FileRef_String_UTF7 () { string refFile = Path.Combine (_otherTempDirectory, "string.txt"); using (StreamWriter sw = new StreamWriter (refFile, false, Encoding.UTF7)) { sw.Write ("\u0021\u0026\u002A\u003B"); } string resxFile = Path.Combine (_tempDirectory, "resources.resx"); using (StreamWriter sw = new StreamWriter (resxFile, false, Encoding.UTF8)) { sw.Write (string.Format (CultureInfo.InvariantCulture, _resXFileRefTemplate, ResXResourceWriter.ResMimeType, "1.0", Consts.AssemblySystem_Windows_Forms, refFile, typeof (string).AssemblyQualifiedName, string.Empty, Consts.AssemblyCorlib)); } using (ResXResourceReader r = new ResXResourceReader (resxFile)) { IDictionaryEnumerator enumerator = r.GetEnumerator (); enumerator.MoveNext (); Assert.IsNotNull (enumerator.Current, "#A1"); Assert.AreEqual ("foo", enumerator.Key, "#A2"); Assert.IsFalse ("\u0021\u0026\u002A\u003B" == (string) enumerator.Value, "#A3"); } resxFile = Path.Combine (_tempDirectory, "resources.resx"); using (StreamWriter sw = new StreamWriter (resxFile, false, Encoding.UTF8)) { sw.Write (string.Format (CultureInfo.InvariantCulture, _resXFileRefTemplate, ResXResourceWriter.ResMimeType, "1.0", Consts.AssemblySystem_Windows_Forms, refFile, typeof (string).AssemblyQualifiedName, ";utf-7", Consts.AssemblyCorlib)); } using (ResXResourceReader r = new ResXResourceReader (resxFile)) { IDictionaryEnumerator enumerator = r.GetEnumerator (); enumerator.MoveNext (); Assert.IsNotNull (enumerator.Current, "#B1"); Assert.AreEqual ("foo", enumerator.Key, "#B2"); Assert.AreEqual ("\u0021\u0026\u002A\u003B", (string) enumerator.Value, "#B3"); } } [Test] public void FileRef_String_UTF8 () { string refFile = Path.Combine (_otherTempDirectory, "string.txt"); using (StreamWriter sw = new StreamWriter (refFile, false, Encoding.UTF8)) { sw.Write ("\u0041\u2262\u0391\u002E"); } string resxFile = Path.Combine (_tempDirectory, "resources.resx"); using (StreamWriter sw = new StreamWriter (resxFile, false, Encoding.UTF8)) { sw.Write (string.Format (CultureInfo.InvariantCulture, _resXFileRefTemplate, ResXResourceWriter.ResMimeType, "1.0", Consts.AssemblySystem_Windows_Forms, refFile, typeof (string).AssemblyQualifiedName, string.Empty, Consts.AssemblyCorlib)); } using (ResXResourceReader r = new ResXResourceReader (resxFile)) { IDictionaryEnumerator enumerator = r.GetEnumerator (); enumerator.MoveNext (); Assert.IsNotNull (enumerator.Current, "#A1"); Assert.AreEqual ("foo", enumerator.Key, "#A2"); Assert.AreEqual ("\u0041\u2262\u0391\u002E", (string) enumerator.Value, "#A3"); } resxFile = Path.Combine (_tempDirectory, "resources.resx"); using (StreamWriter sw = new StreamWriter (resxFile, false, Encoding.UTF8)) { sw.Write (string.Format (CultureInfo.InvariantCulture, _resXFileRefTemplate, ResXResourceWriter.ResMimeType, "1.0", Consts.AssemblySystem_Windows_Forms, refFile, typeof (string).AssemblyQualifiedName, ";utf-8", Consts.AssemblyCorlib)); } using (ResXResourceReader r = new ResXResourceReader (resxFile)) { IDictionaryEnumerator enumerator = r.GetEnumerator (); enumerator.MoveNext (); Assert.IsNotNull (enumerator.Current, "#B1"); Assert.AreEqual ("foo", enumerator.Key, "#B2"); Assert.AreEqual ("\u0041\u2262\u0391\u002E", (string) enumerator.Value, "#B3"); } } [Test] public void Namespaces () { const string resXTemplate = "" + "" + " " + " " + " de Icaza" + " " + " " + " " + " " + " " + " " + " Boston " + " " + " " + " United States " + " " + " " + " BO " + " " + " " + " Belgium" + " " + " " + " ]]>" + " " + " " + " " + " " + " {0}" + " " + " " + " {1}" + " " + " " + " " + " " + " System.Resources.ResXResourceReader, {2}" + " " + " " + " System.Resources.ResXResourceWriter, {2}" + " " + " " + ""; string resxFile = Path.Combine (_tempDirectory, "resources.resx"); using (StreamWriter sw = new StreamWriter (resxFile, false, Encoding.UTF8)) { sw.Write (string.Format (CultureInfo.InvariantCulture, resXTemplate, ResXResourceWriter.ResMimeType, "1.0", Consts.AssemblySystem_Windows_Forms)); } // Stream using (FileStream fs = new FileStream (resxFile, FileMode.Open, FileAccess.Read, FileShare.Read)) { using (ResXResourceReader r = new ResXResourceReader (fs)) { IDictionaryEnumerator enumerator = r.GetEnumerator (); int entries = 0; while (enumerator.MoveNext ()) { entries++; switch ((string) enumerator.Key) { case "": Assert.IsNotNull (enumerator.Value, "#A1"); Assert.AreEqual ("BO", enumerator.Value, "#A2"); break; case "Address": Assert.IsNotNull (enumerator.Value, "#B1"); Assert.AreEqual (string.Empty, enumerator.Value, "#B2"); break; case "country": Assert.IsNotNull (enumerator.Value, "#C1"); Assert.AreEqual (string.Empty, enumerator.Value, "#C2"); break; case "firstName": Assert.IsNull (enumerator.Value, "#D"); break; case "zip": Assert.IsNotNull (enumerator.Value, "#E1"); Assert.AreEqual (" <3510> ", enumerator.Value, "#E2"); break; default: Assert.Fail ("#F:" + enumerator.Key); break; } } Assert.AreEqual (5, entries, "#G"); } } } [Test] public void ResHeader_Missing () { const string resXTemplate = "" + "" + " " + " de Icaza" + " " + " " + " " + " " + " " + ""; string resxFile = Path.Combine (_tempDirectory, "resources.resx"); using (StreamWriter sw = new StreamWriter (resxFile, false, Encoding.UTF8)) { sw.Write (resXTemplate); } // Stream using (FileStream fs = new FileStream (resxFile, FileMode.Open, FileAccess.Read, FileShare.Read)) { using (ResXResourceReader r = new ResXResourceReader (fs)) { try { r.GetEnumerator (); Assert.Fail ("#A1"); } catch (ArgumentException ex) { //Invalid ResX input. Could not find valid \"resheader\" // tags for the ResX reader & writer type names Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#A2"); Assert.IsNull (ex.InnerException, "#A3"); Assert.IsNotNull (ex.Message, "#A4"); Assert.IsTrue (ex.Message.IndexOf ("\"resheader\"") != -1, "#A5"); Assert.IsNull (ex.ParamName, "#A6"); } } } // File using (ResXResourceReader r = new ResXResourceReader (resxFile)) { try { r.GetEnumerator (); Assert.Fail ("#B1"); } catch (ArgumentException ex) { //Invalid ResX input. Could not find valid \"resheader\" // tags for the ResX reader & writer type names Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#B2"); Assert.IsNull (ex.InnerException, "#B3"); Assert.IsNotNull (ex.Message, "#B4"); Assert.IsTrue (ex.Message.IndexOf ("\"resheader\"") != -1, "#B5"); Assert.IsNull (ex.ParamName, "#B6"); } } // TextReader using (StreamReader sr = new StreamReader (resxFile, Encoding.UTF8)) { using (ResXResourceReader r = new ResXResourceReader (sr)) { try { r.GetEnumerator (); Assert.Fail ("#C1"); } catch (ArgumentException ex) { //Invalid ResX input. Could not find valid \"resheader\" // tags for the ResX reader & writer type names Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#C2"); Assert.IsNull (ex.InnerException, "#C3"); Assert.IsNotNull (ex.Message, "#C4"); Assert.IsTrue (ex.Message.IndexOf ("\"resheader\"") != -1, "#C5"); Assert.IsNull (ex.ParamName, "#C6"); } } } } [Test] public void ResHeader_ResMimeType () { const string resXTemplate = "" + "" + " " + " {0}" + " " + " " + " {1}" + " " + " " + " System.Resources.ResXResourceReader, {2}" + " " + " " + " System.Resources.ResXResourceWriter, {2}" + " " + ""; string resXContent = null; // element, exact case resXContent = string.Format (CultureInfo.InvariantCulture, resXTemplate, ResXResourceWriter.ResMimeType, "1.0", Consts.AssemblySystem_Windows_Forms); using (ResXResourceReader r = new ResXResourceReader (new StringReader (resXContent))) { r.GetEnumerator (); } // element, uppercase resXContent = string.Format (CultureInfo.InvariantCulture, resXTemplate, ResXResourceWriter.ResMimeType.ToUpper (), "1.0", Consts.AssemblySystem_Windows_Forms); using (ResXResourceReader r = new ResXResourceReader (new StringReader (resXContent))) { try { r.GetEnumerator (); Assert.Fail ("#A1"); } catch (ArgumentException ex) { //Invalid ResX input. Could not find valid \"resheader\" // tags for the ResX reader & writer type names Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#A2"); Assert.IsNull (ex.InnerException, "#A3"); Assert.IsNotNull (ex.Message, "#A4"); Assert.IsTrue (ex.Message.IndexOf ("\"resheader\"") != -1, "#A5"); Assert.IsNull (ex.ParamName, "#A6"); } } // text, exact case resXContent = string.Format (CultureInfo.InvariantCulture, resXTemplate, ResXResourceWriter.ResMimeType, "1.0", Consts.AssemblySystem_Windows_Forms); using (ResXResourceReader r = new ResXResourceReader (new StringReader (resXContent))) { r.GetEnumerator (); } // text, uppercase resXContent = string.Format (CultureInfo.InvariantCulture, resXTemplate, ResXResourceWriter.ResMimeType.ToUpper (), "1.0", Consts.AssemblySystem_Windows_Forms); using (ResXResourceReader r = new ResXResourceReader (new StringReader (resXContent))) { try { r.GetEnumerator (); Assert.Fail ("#B1"); } catch (ArgumentException ex) { //Invalid ResX input. Could not find valid \"resheader\" // tags for the ResX reader & writer type names Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#B2"); Assert.IsNull (ex.InnerException, "#B3"); Assert.IsNotNull (ex.Message, "#B4"); Assert.IsTrue (ex.Message.IndexOf ("\"resheader\"") != -1, "#B5"); Assert.IsNull (ex.ParamName, "#B6"); } } // CDATA, exact case resXContent = string.Format (CultureInfo.InvariantCulture, resXTemplate, "", "1.0", Consts.AssemblySystem_Windows_Forms); using (ResXResourceReader r = new ResXResourceReader (new StringReader (resXContent))) { r.GetEnumerator (); } // CDATA, uppercase resXContent = string.Format (CultureInfo.InvariantCulture, resXTemplate, "", "1.0", Consts.AssemblySystem_Windows_Forms); using (ResXResourceReader r = new ResXResourceReader (new StringReader (resXContent))) { try { r.GetEnumerator (); Assert.Fail ("#C1"); } catch (ArgumentException ex) { //Invalid ResX input. Could not find valid \"resheader\" // tags for the ResX reader & writer type names Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#C2"); Assert.IsNull (ex.InnerException, "#C3"); Assert.IsNotNull (ex.Message, "#C4"); Assert.IsTrue (ex.Message.IndexOf ("\"resheader\"") != -1, "#C5"); Assert.IsNull (ex.ParamName, "#C6"); } } // element, exact case resXContent = string.Format (CultureInfo.InvariantCulture, resXTemplate, "" + ResXResourceWriter.ResMimeType + "", "1.0", Consts.AssemblySystem_Windows_Forms); using (ResXResourceReader r = new ResXResourceReader (new StringReader (resXContent))) { r.GetEnumerator (); } // element, uppercase resXContent = string.Format (CultureInfo.InvariantCulture, resXTemplate, "" + ResXResourceWriter.ResMimeType.ToUpper () + "", "1.0", Consts.AssemblySystem_Windows_Forms); using (ResXResourceReader r = new ResXResourceReader (new StringReader (resXContent))) { try { r.GetEnumerator (); Assert.Fail ("#D1"); } catch (ArgumentException ex) { //Invalid ResX input. Could not find valid \"resheader\" // tags for the ResX reader & writer type names Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#D2"); Assert.IsNull (ex.InnerException, "#D3"); Assert.IsNotNull (ex.Message, "#D4"); Assert.IsTrue (ex.Message.IndexOf ("\"resheader\"") != -1, "#D5"); Assert.IsNull (ex.ParamName, "#D6"); } } } [Test] public void ResHeader_ResMimeType_Empty () { const string resXTemplate = "" + "" + " " + ""; using (ResXResourceReader r = new ResXResourceReader (new StringReader (resXTemplate))) { try { r.GetEnumerator (); Assert.Fail ("#1"); } catch (ArgumentException ex) { //Invalid ResX input. Could not find valid \"resheader\" // tags for the ResX reader & writer type names Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#2"); Assert.IsNull (ex.InnerException, "#3"); Assert.IsNotNull (ex.Message, "#4"); Assert.IsTrue (ex.Message.IndexOf ("\"resheader\"") != -1, "#5"); Assert.IsNull (ex.ParamName, "#6"); } } } [Test] public void ResHeader_ResMimeType_Invalid () { const string resXTemplate = "" + "" + " " + " {0}" + " " + " " + " {1}" + " " + " " + " System.Resources.ResXResourceReader, {2}" + " " + " " + " System.Resources.ResXResourceWriter, {2}" + " " + " " + " de Icaza" + " " + " " + " " + " " + " " + ""; string resxFile = Path.Combine (_tempDirectory, "resources.resx"); using (StreamWriter sw = new StreamWriter (resxFile, false, Encoding.UTF8)) { sw.Write (string.Format (CultureInfo.InvariantCulture, resXTemplate, "notvalid", "1.0", Consts.AssemblySystem_Windows_Forms )); } // Stream using (FileStream fs = new FileStream (resxFile, FileMode.Open, FileAccess.Read, FileShare.Read)) { using (ResXResourceReader r = new ResXResourceReader (fs)) { try { r.GetEnumerator (); Assert.Fail ("#A1"); } catch (ArgumentException ex) { //Invalid ResX input. Could not find valid \"resheader\" // tags for the ResX reader & writer type names Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#A2"); Assert.IsNull (ex.InnerException, "#A3"); Assert.IsNotNull (ex.Message, "#A4"); Assert.IsTrue (ex.Message.IndexOf ("\"resheader\"") != -1, "#A5"); Assert.IsNull (ex.ParamName, "#A6"); } } } // File using (ResXResourceReader r = new ResXResourceReader (resxFile)) { try { r.GetEnumerator (); Assert.Fail ("#B1"); } catch (ArgumentException ex) { //Invalid ResX input. Could not find valid \"resheader\" // tags for the ResX reader & writer type names Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#B2"); Assert.IsNull (ex.InnerException, "#B3"); Assert.IsNotNull (ex.Message, "#B4"); Assert.IsTrue (ex.Message.IndexOf ("\"resheader\"") != -1, "#B5"); Assert.IsNull (ex.ParamName, "#B6"); } } // TextReader using (StreamReader sr = new StreamReader (resxFile, Encoding.UTF8)) { using (ResXResourceReader r = new ResXResourceReader (sr)) { try { r.GetEnumerator (); Assert.Fail ("#C1"); } catch (ArgumentException ex) { //Invalid ResX input. Could not find valid \"resheader\" // tags for the ResX reader & writer type names Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#C2"); Assert.IsNull (ex.InnerException, "#C3"); Assert.IsNotNull (ex.Message, "#C4"); Assert.IsTrue (ex.Message.IndexOf ("\"resheader\"") != -1, "#C5"); Assert.IsNull (ex.ParamName, "#C6"); } } } } [Test] public void ResHeader_ResMimeType_Null () { const string resXTemplate = "" + "" + " " + ""; using (ResXResourceReader r = new ResXResourceReader (new StringReader (resXTemplate))) { try { r.GetEnumerator (); Assert.Fail ("#1"); } catch (ArgumentException ex) { //Invalid ResX input. Could not find valid \"resheader\" // tags for the ResX reader & writer type names Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#2"); Assert.IsNull (ex.InnerException, "#3"); Assert.IsNotNull (ex.Message, "#4"); Assert.IsTrue (ex.Message.IndexOf ("\"resheader\"") != -1, "#5"); Assert.IsNull (ex.ParamName, "#6"); } } } [Test] public void ResHeader_Reader_Invalid () { const string resXTemplate = "" + "" + " " + " {0}" + " " + " " + " {1}" + " " + " " + " System.Resources.InvalidResXResourceReader, {2}" + " " + " " + " System.Resources.ResXResourceWriter, {2}" + " " + ""; string resXContent = string.Format (CultureInfo.InvariantCulture, resXTemplate, ResXResourceWriter.ResMimeType, "1.0", Consts.AssemblySystem_Windows_Forms); using (ResXResourceReader r = new ResXResourceReader (new StringReader (resXContent))) { try { r.GetEnumerator (); Assert.Fail ("#1"); } catch (ArgumentException ex) { //Invalid ResX input. Could not find valid \"resheader\" // tags for the ResX reader & writer type names Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#2"); Assert.IsNull (ex.InnerException, "#3"); Assert.IsNotNull (ex.Message, "#4"); Assert.IsTrue (ex.Message.IndexOf ("\"resheader\"") != -1, "#5"); Assert.IsNull (ex.ParamName, "#6"); } } } [Test] public void ResHeader_Reader_Missing () { const string resXTemplate = "" + "" + " " + " {0}" + " " + " " + " {1}" + " " + " " + " System.Resources.ResXResourceWriter, {2}" + " " + ""; string resXContent = string.Format (CultureInfo.InvariantCulture, resXTemplate, ResXResourceWriter.ResMimeType, "1.0", Consts.AssemblySystem_Windows_Forms); using (ResXResourceReader r = new ResXResourceReader (new StringReader (resXContent))) { try { r.GetEnumerator (); Assert.Fail ("#1"); } catch (ArgumentException ex) { //Invalid ResX input. Could not find valid \"resheader\" // tags for the ResX reader & writer type names Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#2"); Assert.IsNull (ex.InnerException, "#3"); Assert.IsNotNull (ex.Message, "#4"); Assert.IsTrue (ex.Message.IndexOf ("\"resheader\"") != -1, "#5"); Assert.IsNull (ex.ParamName, "#6"); } } } [Test] public void ResHeader_Reader_Null () { const string resXTemplate = "" + "" + " " + " {0}" + " " + " " + " {1}" + " " + " " + " " + " System.Resources.ResXResourceWriter, {2}" + " " + ""; string resXContent = string.Format (CultureInfo.InvariantCulture, resXTemplate, ResXResourceWriter.ResMimeType, "1.0", Consts.AssemblySystem_Windows_Forms); using (ResXResourceReader r = new ResXResourceReader (new StringReader (resXContent))) { try { r.GetEnumerator (); Assert.Fail ("#1"); } catch (ArgumentException ex) { //Invalid ResX input. Could not find valid \"resheader\" // tags for the ResX reader & writer type names Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#2"); Assert.IsNull (ex.InnerException, "#3"); Assert.IsNotNull (ex.Message, "#4"); Assert.IsTrue (ex.Message.IndexOf ("\"resheader\"") != -1, "#5"); Assert.IsNull (ex.ParamName, "#6"); } } } [Test] public void ResHeader_Writer_Invalid () { const string resXTemplate = "" + "" + " " + " {0}" + " " + " " + " {1}" + " " + " " + " System.Resources.ResXResourceReader, {2}" + " " + " " + " System.Resources.InvalidResXResourceWriter, {2}" + " " + ""; string resXContent = string.Format (CultureInfo.InvariantCulture, resXTemplate, ResXResourceWriter.ResMimeType, "1.0", Consts.AssemblySystem_Windows_Forms); using (ResXResourceReader r = new ResXResourceReader (new StringReader (resXContent))) { try { r.GetEnumerator (); Assert.Fail ("#1"); } catch (ArgumentException ex) { //Invalid ResX input. Could not find valid \"resheader\" // tags for the ResX reader & writer type names Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#2"); Assert.IsNull (ex.InnerException, "#3"); Assert.IsNotNull (ex.Message, "#4"); Assert.IsTrue (ex.Message.IndexOf ("\"resheader\"") != -1, "#5"); Assert.IsNull (ex.ParamName, "#6"); } } } [Test] public void ResHeader_Writer_Missing () { const string resXTemplate = "" + "" + " " + " {0}" + " " + " " + " {1}" + " " + " " + " System.Resources.ResXResourceReader, {2}" + " " + ""; string resXContent = string.Format (CultureInfo.InvariantCulture, resXTemplate, ResXResourceWriter.ResMimeType, "1.0", Consts.AssemblySystem_Windows_Forms); using (ResXResourceReader r = new ResXResourceReader (new StringReader (resXContent))) { try { r.GetEnumerator (); Assert.Fail ("#1"); } catch (ArgumentException ex) { //Invalid ResX input. Could not find valid \"resheader\" // tags for the ResX reader & writer type names Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#2"); Assert.IsNull (ex.InnerException, "#3"); Assert.IsNotNull (ex.Message, "#4"); Assert.IsTrue (ex.Message.IndexOf ("\"resheader\"") != -1, "#5"); Assert.IsNull (ex.ParamName, "#6"); } } } [Test] public void ResHeader_Writer_Null () { const string resXTemplate = "" + "" + " " + " {0}" + " " + " " + " {1}" + " " + " " + " System.Resources.ResXResourceReader, {2}" + " " + " " + ""; string resXContent = string.Format (CultureInfo.InvariantCulture, resXTemplate, ResXResourceWriter.ResMimeType, "1.0", Consts.AssemblySystem_Windows_Forms); using (ResXResourceReader r = new ResXResourceReader (new StringReader (resXContent))) { try { r.GetEnumerator (); Assert.Fail ("#1"); } catch (ArgumentException ex) { //Invalid ResX input. Could not find valid \"resheader\" // tags for the ResX reader & writer type names Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#2"); Assert.IsNull (ex.InnerException, "#3"); Assert.IsNotNull (ex.Message, "#4"); Assert.IsTrue (ex.Message.IndexOf ("\"resheader\"") != -1, "#5"); Assert.IsNull (ex.ParamName, "#6"); } } } [Test] public void ResHeader_Unknown () { const string resXTemplate = "" + "" + " " + " {0}" + " " + " " + " {1}" + " " + " " + " System.Resources.ResXResourceReader , {2}" + " " + " " + " System.Resources.ResXResourceWriter , {2}" + " " + " " + " whatever" + " " + ""; string resXContent = string.Format (CultureInfo.InvariantCulture, resXTemplate, ResXResourceWriter.ResMimeType, "1.0", Consts.AssemblySystem_Windows_Forms); using (ResXResourceReader r = new ResXResourceReader (new StringReader (resXContent))) { r.GetEnumerator (); } } [Test] public void ResName_Null () { const string resXContent = "" + "" + " " + " invalid" + " " + " " + " de Icaza" + " " + " " + " whatever" + " " + ""; using (StringReader sr = new StringReader (resXContent)) { using (ResXResourceReader r = new ResXResourceReader (sr)) { try { r.GetEnumerator (); Assert.Fail ("#1"); } catch (ArgumentException ex) { // Invalid ResX input. Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#2"); Assert.IsNotNull (ex.InnerException, "#3"); Assert.IsNotNull (ex.Message, "#4"); Assert.IsNull (ex.ParamName, "#5"); // Could not find a name for a resource. The resource // value was 'whatever'. Line 1, position 200 XmlException inner = ex.InnerException as XmlException; Assert.IsNotNull (inner, "#6"); Assert.AreEqual (typeof (XmlException), inner.GetType (), "#7"); Assert.IsNotNull (inner.InnerException, "#8"); Assert.AreEqual (1, inner.LineNumber, "#9"); // Assert.AreEqual (200, inner.LinePosition, "#10"); Assert.IsNotNull (inner.Message, "#11"); Assert.IsTrue (inner.Message.IndexOf ("'whatever'") != -1, "#12"); Assert.IsTrue (inner.Message.IndexOf (" 1") != -1, "#13"); //Assert.IsTrue (inner.Message.IndexOf ("200") != -1, "#14"); // Could not find a name for a resource. The resource // value was 'whatever' ArgumentException inner2 = inner.InnerException as ArgumentException; Assert.IsNotNull (inner2, "#15"); Assert.AreEqual (typeof (ArgumentException), inner2.GetType (), "#16"); Assert.IsNull (inner2.InnerException, "#17"); Assert.IsNotNull (inner2.Message, "#18"); Assert.IsTrue (inner2.Message.IndexOf ("'whatever'") != -1, "#19"); Assert.IsNull (inner2.ParamName, "#20"); } } } } static string resXWithEmptyName = @" text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 a resource with no name "; static string resxWithNullRef = @" text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 "; [Test] public void ResName_Empty () { using (StringReader sr = new StringReader (resXWithEmptyName)) { using (ResXResourceReader r = new ResXResourceReader (sr)) { IDictionaryEnumerator enumerator = r.GetEnumerator (); enumerator.MoveNext (); Assert.AreEqual ("", enumerator.Key, "#A1"); Assert.AreEqual ("a resource with no name", (string) enumerator.Value, "#A2"); } } } [Test] public void ResXNullRef () { using (StringReader sr = new StringReader (resxWithNullRef)) { using (ResXResourceReader r = new ResXResourceReader (sr)) { IDictionaryEnumerator enumerator = r.GetEnumerator (); enumerator.MoveNext (); Assert.AreEqual ("NullRef", enumerator.Key, "#A1"); Assert.IsNull (enumerator.Value, "#A2"); } } } [Test] public void ResValue () { string resXContent = string.Format (CultureInfo.CurrentCulture, "" + "" + " " + " {0}" + " " + " " + " System.Resources.ResXResourceReader, {1}" + " " + " " + " System.Resources.ResXResourceWriter, {1}" + " " + " " + " ]]>" + " " + " " + " ]]> " + " " + " " + " ]]> " + " " + " " + " value4 " + " " + " " + " testvalue5" + " " + " " + " test1value6test2" + " " + " " + " value7a" + " value7b" + " " + " " + " value8" + " " + " " + " value9a" + " value9b" + " " + " " + " testvalue10" + " " + " " + " test1value11test2" + " " + " " + " test ]]> " + " " + " " + " test ]]> " + " " + " " + " " + " value16" + " value17" + " " + " value18" + " " + " value18" + " " + " " + "", ResXResourceWriter.ResMimeType, Consts.AssemblySystem_Windows_Forms); using (StringReader sr = new StringReader (resXContent)) { using (ResXResourceReader r = new ResXResourceReader (sr)) { IDictionaryEnumerator enumerator = r.GetEnumerator (); int entries = 0; while (enumerator.MoveNext ()) { entries++; switch ((string) enumerator.Key) { case "name1": Assert.IsNotNull (enumerator.Value, "#A1"); Assert.AreEqual (" ", enumerator.Value, "#A2"); break; case "name2": Assert.IsNotNull (enumerator.Value, "#B1"); Assert.AreEqual ("", enumerator.Value, "#B2"); break; case "name3": Assert.IsNotNull (enumerator.Value, "#C1"); Assert.AreEqual ("", enumerator.Value, "#C2"); break; case "name4": Assert.IsNotNull (enumerator.Value, "#D1"); Assert.AreEqual (" value4 ", enumerator.Value, "#D2"); break; case "name5": Assert.IsNotNull (enumerator.Value, "#E1"); Assert.AreEqual ("value5", enumerator.Value, "#E2"); break; case "name6": Assert.IsNotNull (enumerator.Value, "#F1"); Assert.AreEqual ("test2", enumerator.Value, "#F2"); break; case "name7": Assert.IsNotNull (enumerator.Value, "#G1"); Assert.AreEqual (string.Empty, enumerator.Value, "#G2"); break; case "name8": Assert.IsNotNull (enumerator.Value, "#H1"); Assert.AreEqual (string.Empty, enumerator.Value, "#H2"); break; case "name9": Assert.IsNotNull (enumerator.Value, "#I1"); Assert.AreEqual (string.Empty, enumerator.Value, "#I2"); break; case "name10": Assert.IsNotNull (enumerator.Value, "#J1"); Assert.AreEqual (string.Empty, enumerator.Value, "#J2"); break; case "name11": Assert.IsNotNull (enumerator.Value, "#K1"); Assert.AreEqual ("test2", enumerator.Value, "#K2"); break; case "name12": Assert.IsNotNull (enumerator.Value, "#L1"); Assert.AreEqual (" test ", enumerator.Value, "#L2"); break; case "name13": Assert.IsNotNull (enumerator.Value, "#M1"); Assert.AreEqual ("", enumerator.Value, "#M2"); break; case "name14": Assert.IsNull (enumerator.Value, "#N1"); break; case "name16": Assert.IsNotNull (enumerator.Value, "#O1"); Assert.AreEqual ("value16", enumerator.Value, "#O2"); break; case "name17": Assert.IsNotNull (enumerator.Value, "#P1"); Assert.AreEqual ("value17", enumerator.Value, "#P2"); break; case "name18": Assert.IsNotNull (enumerator.Value, "#Q1"); Assert.AreEqual ("value18", enumerator.Value, "#Q2"); break; default: Assert.Fail ("#Q:" + enumerator.Key); break; } } Assert.AreEqual (17, entries, "#Q"); } } } [Test] public void EnumeratorOrderSameAsResx () { string resXContent = string.Format (CultureInfo.CurrentCulture, "" + "" + " " + " {0}" + " " + " " + " System.Resources.ResXResourceReader, {1}" + " " + " " + " System.Resources.ResXResourceWriter, {1}" + " " + " " + " value5 " + " " + " " + " value4 " + " " + " " + " value3 " + " " + " " + " value2 " + " " + " " + " value1 " + " " + "", ResXResourceWriter.ResMimeType, Consts.AssemblySystem_Windows_Forms); using (StringReader sr = new StringReader (resXContent)) { using (ResXResourceReader r = new ResXResourceReader (sr)) { IDictionaryEnumerator enumerator = r.GetEnumerator (); enumerator.MoveNext (); Assert.AreEqual ("name2", enumerator.Key, "#1"); enumerator.MoveNext (); Assert.AreEqual ("name1", enumerator.Key, "#2"); enumerator.MoveNext (); Assert.AreEqual ("aaa", enumerator.Key, "#3"); enumerator.MoveNext (); Assert.AreEqual ("zzzz", enumerator.Key, "#4"); enumerator.MoveNext (); Assert.AreEqual ("bbbbbb", enumerator.Key, "#5"); } } } [Test] public void UseResXDataNodes () { string refFile = Path.Combine (_tempDirectory, "32x32.ico"); WriteEmbeddedResource ("32x32.ico", refFile); string resxFile = Path.Combine (_tempDirectory, "resources.resx"); using (StreamWriter sw = new StreamWriter (resxFile, false, Encoding.UTF8)) { sw.Write (string.Format (CultureInfo.InvariantCulture, _resXFileRefTemplate, ResXResourceWriter.ResMimeType, "1.0", Consts.AssemblySystem_Windows_Forms, refFile, typeof (Bitmap).AssemblyQualifiedName, string.Empty, Consts.AssemblyCorlib)); } using (ResXResourceReader r = new ResXResourceReader (resxFile)) { r.UseResXDataNodes = true; IDictionaryEnumerator enumerator = r.GetEnumerator (); int entries = 0; while (enumerator.MoveNext ()) { entries++; ResXDataNode node = enumerator.Value as ResXDataNode; switch ((string) enumerator.Key) { case "foo": Assert.AreEqual ("foo", node.Name, "#A1"); Bitmap bitmap = node.GetValue (new AssemblyName[] {typeof (Bitmap).Assembly.GetName ()}) as Bitmap; Assert.IsNotNull (bitmap, "#A2"); break; case "panel_label.Locked": Assert.AreEqual ("panel_label.Locked", node.Name, "#B1"); Assert.AreEqual (true, node.GetValue (new AssemblyName[] {typeof (int).Assembly.GetName ()}), "#B2"); break; default: Assert.Fail ("#C:" + enumerator.Key); break; } } Assert.AreEqual (2, entries, "#D"); } } [Test] [Category ("NotWorking")] public void ResXDataNode_GetNodePosition () { // This test relies on a hashtable's enumerator being ordered, // when the ordering is not guaranteed. string refFile = Path.Combine (_tempDirectory, "32x32.ico"); WriteEmbeddedResource ("32x32.ico", refFile); string resxFile = Path.Combine (_tempDirectory, "resources.resx"); using (StreamWriter sw = new StreamWriter (resxFile, false, Encoding.UTF8)) { sw.Write (string.Format (CultureInfo.InvariantCulture, _resXFileRefTemplate, ResXResourceWriter.ResMimeType, "1.0", Consts.AssemblySystem_Windows_Forms, refFile, typeof (Bitmap).AssemblyQualifiedName, string.Empty, Consts.AssemblyCorlib)); } using (ResXResourceReader r = new ResXResourceReader (resxFile)) { r.UseResXDataNodes = true; IDictionaryEnumerator enumerator = r.GetEnumerator (); enumerator.MoveNext (); ResXDataNode node = enumerator.Value as ResXDataNode; Assert.IsNotNull (node, "#A1"); Assert.AreEqual(new Point(1, 717), node.GetNodePosition (), "#A2"); } } [Test] public void GetMetadataEnumerator () { string refFile = Path.Combine (_tempDirectory, "32x32.ico"); WriteEmbeddedResource ("32x32.ico", refFile); string resxFile = Path.Combine (_tempDirectory, "resources.resx"); using (StreamWriter sw = new StreamWriter (resxFile, false, Encoding.UTF8)) { sw.Write (string.Format (CultureInfo.InvariantCulture, _resXFileRefTemplate, ResXResourceWriter.ResMimeType, "1.0", Consts.AssemblySystem_Windows_Forms, refFile, typeof (Bitmap).AssemblyQualifiedName, string.Empty, Consts.AssemblyCorlib)); } using (ResXResourceReader r = new ResXResourceReader (resxFile)) { IDictionaryEnumerator enumerator = r.GetMetadataEnumerator (); Assert.IsTrue (enumerator.MoveNext (), "#A1"); Assert.IsNotNull (enumerator.Current, "#A2"); Assert.AreEqual ("panel_label.Locked", enumerator.Key, "#A3"); Assert.AreEqual(typeof(bool), enumerator.Value.GetType(), "#A4"); Assert.IsTrue ((bool) enumerator.Value, "#A5"); Assert.IsFalse (enumerator.MoveNext (), "#A6"); } using (ResXResourceReader r = new ResXResourceReader (resxFile)) { r.UseResXDataNodes = true; IDictionaryEnumerator enumerator = r.GetMetadataEnumerator (); Assert.IsFalse (enumerator.MoveNext (), "#B1"); } } [Test] public void TypeConversion () { string resXContent = string.Format (CultureInfo.CurrentCulture, "" + "" + " " + " {0}" + " " + " " + " System.Resources.ResXResourceReader, {1}" + " " + " " + " System.Resources.ResXResourceWriter, {1}" + " " + " " + " Bottom, Left" + " " + " " + " " + " Qk12BQAAAAAAADYEAAAoAAAAEgAAABAAAAABAAgAAAAAAAAAAAAgHAAAIBwAAAABAAAAAQAAAAAA/wAA" + " M/8AAGb/AACZ/wAAzP8AAP//ADMA/wAzM/8AM2b/ADOZ/wAzzP8AM///AGYA/wBmM/8AZmb/AGaZ/wBm" + " zP8AZv//AJkA/wCZM/8AmWb/AJmZ/wCZzP8Amf//AMwA/wDMM/8AzGb/AMyZ/wDMzP8AzP//AP8A/wD/" + " M/8A/2b/AP+Z/wD/zP8A////MwAA/zMAM/8zAGb/MwCZ/zMAzP8zAP//MzMA/zMzM/8zM2b/MzOZ/zMz" + " zP8zM///M2YA/zNmM/8zZmb/M2aZ/zNmzP8zZv//M5kA/zOZM/8zmWb/M5mZ/zOZzP8zmf//M8wA/zPM" + " M/8zzGb/M8yZ/zPMzP8zzP//M/8A/zP/M/8z/2b/M/+Z/zP/zP8z////ZgAA/2YAM/9mAGb/ZgCZ/2YA" + " zP9mAP//ZjMA/2YzM/9mM2b/ZjOZ/2YzzP9mM///ZmYA/2ZmM/9mZmb/ZmaZ/2ZmzP9mZv//ZpkA/2aZ" + " M/9mmWb/ZpmZ/2aZzP9mmf//ZswA/2bMM/9mzGb/ZsyZ/2bMzP9mzP//Zv8A/2b/M/9m/2b/Zv+Z/2b/" + " zP9m////mQAA/5kAM/+ZAGb/mQCZ/5kAzP+ZAP//mTMA/5kzM/+ZM2b/mTOZ/5kzzP+ZM///mWYA/5lm" + " M/+ZZmb/mWaZ/5lmzP+ZZv//mZkA/5mZM/+ZmWb/mZmZ/5mZzP+Zmf//mcwA/5nMM/+ZzGb/mcyZ/5nM" + " zP+ZzP//mf8A/5n/M/+Z/2b/mf+Z/5n/zP+Z////zAAA/8wAM//MAGb/zACZ/8wAzP/MAP//zDMA/8wz" + " M//MM2b/zDOZ/8wzzP/MM///zGYA/8xmM//MZmb/zGaZ/8xmzP/MZv//zJkA/8yZM//MmWb/zJmZ/8yZ" + " zP/Mmf//zMwA/8zMM//MzGb/zMyZ/8zMzP/MzP//zP8A/8z/M//M/2b/zP+Z/8z/zP/M/////wAA//8A" + " M///AGb//wCZ//8AzP//AP///zMA//8zM///M2b//zOZ//8zzP//M////2YA//9mM///Zmb//2aZ//9m" + " zP//Zv///5kA//+ZM///mWb//5mZ//+ZzP//mf///8wA///MM///zGb//8yZ///MzP//zP////8A////" + " M////2b///+Z////zP//////AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA" + " AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA" + " AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA" + " AAAAAAAAAAwMDAwAAAAAAAAAAAAAAAAAAAAAAAwMDAwAAAAAAAAAAAAAAAAAAAAAAAwMDAAAAAAAAAAA" + " AAAAAAAAAAAAAAwMDAAAAAAAAAAAAAAAAAAAAAAADAwMAAAAAAAAAAAADAAAAAAAAAAMDA0AAAAAAAAA" + " AAwMDQAAABMTExMTExMTNwAAAAAMDAwMDQAAABMTExMTExMAAAAANzc3Nzc3NwAAAD4+Pj4+AAAAAD4+" + " Pj4+Pj4+PgAAAGJiYgAAAAAAAAAAYmJiAAAAAAAAAGIAAAAAAAAAAABiYmIAAAAAAAAAAAAAAAAAAAAA" + " AGJiYgAAAAAAAAAAAAAAAAAAAAAAAGJiYgAAAAAAAAAAAAAAAAAAAAAAAGJiYgAAAAAAAAAAAAAAAAAA" + " AAAAAGJiYgAAAAAAAAAAAAAA" + " " + " " + " " + " BQIH" + " " + " " + " Random Thoughts" + " " + /*s*/" " + " A B C" + " " + " " + " Summer.jpg" + " " + /*e*/" " + " OK" + " " + " " + " MIA" + " " + " " + " SuperUnknown" + " " + /*s*/" " + " LeftRight" + " " + /*e*/"", ResXResourceWriter.ResMimeType, Consts.AssemblySystem_Windows_Forms, typeof (Bitmap).AssemblyQualifiedName, typeof (byte []).AssemblyQualifiedName); using (StringReader sr = new StringReader (resXContent)) { using (ResXResourceReader r = new ResXResourceReader (sr)) { IDictionaryEnumerator enumerator = r.GetEnumerator (); int entries = 0; while (enumerator.MoveNext ()) { entries++; switch ((string) enumerator.Key) { case "AnchorStyle": Assert.IsNotNull (enumerator.Value, "#A1"); Assert.AreEqual (AnchorStyles.Bottom | AnchorStyles.Left, enumerator.Value, "#A2"); break; case "BackgroundImage": Assert.IsNotNull (enumerator.Value, "#B1"); Assert.AreEqual (typeof (Bitmap), enumerator.Value.GetType (), "#B2"); break; case "Buffer": Assert.IsNotNull (enumerator.Value, "#C1"); Assert.AreEqual (new byte [] { 5, 2, 7 }, enumerator.Value, "#C2"); break; case "Data": Assert.IsNull (enumerator.Value, "#D1"); break; case "Foo": Assert.IsNull (enumerator.Value, "#E1"); break; case "Image": Assert.IsNull (enumerator.Value, "#F1"); break; case "Text": Assert.IsNotNull (enumerator.Value, "#G1"); Assert.AreEqual ("OK", enumerator.Value, "#G2"); break; case "Unknown": Assert.IsNull (enumerator.Value, "#H1"); break; case "Wrong": Assert.IsNull (enumerator.Value, "#I1"); break; case "Xtra": Assert.IsNull (enumerator.Value, "#J1"); break; default: Assert.Fail ("#J:" + enumerator.Key); break; } } Assert.AreEqual (10, entries, "#G"); } } } [Test, ExpectedException (typeof (SerializationException))] public void DeSerializationErrorBubbles () { using (StringReader sr = new StringReader (serializedResXCorruped)) { using (ResXResourceReader r = new ResXResourceReader (sr)) { IDictionaryEnumerator enumerator = r.GetEnumerator (); // should throw exception } } } [Test, ExpectedException (typeof (TargetInvocationException))] public void FileRef_DeserializationFails () { string corruptFile = Path.GetTempFileName (); ResXFileRef fileRef = new ResXFileRef (corruptFile, typeof (serializable).AssemblyQualifiedName); File.AppendAllText (corruptFile,"corrupt"); StringBuilder sb = new StringBuilder(); using (StringWriter sw = new StringWriter (sb)) { using (ResXResourceWriter writer = new ResXResourceWriter (sw)) { writer.AddResource ("test", fileRef); } } using (StringReader sr = new StringReader (sb.ToString ())) { using (ResXResourceReader reader = new ResXResourceReader (sr)) { reader.GetEnumerator (); } } } [Test, ExpectedException (typeof (ArgumentException))] public void FileRef_TypeCantBeResolved () { string aFile = Path.GetTempFileName (); ResXFileRef fileRef = new ResXFileRef (aFile, "a.type.doesnt.exist"); StringBuilder sb = new StringBuilder (); using (StringWriter sw = new StringWriter (sb)) { using (ResXResourceWriter writer = new ResXResourceWriter (sw)) { writer.AddResource ("test", fileRef); } } using (StringReader sr = new StringReader (sb.ToString ())) { using (ResXResourceReader reader = new ResXResourceReader (sr)) { reader.GetEnumerator (); } } } [Test] public void TypeConverter_AssemblyNamesUsed () { string aName = "DummyAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"; AssemblyName [] assemblyNames = new AssemblyName [] { new AssemblyName (aName) }; StringReader sr = new StringReader (convertableResXWithoutAssemblyName); using (ResXResourceReader rr = new ResXResourceReader (sr, assemblyNames)) { IDictionaryEnumerator en = rr.GetEnumerator (); en.MoveNext (); object obj = ((DictionaryEntry) en.Current).Value; Assert.IsNotNull (obj, "#A1"); Assert.AreEqual ("DummyAssembly.Convertable, " + aName, obj.GetType ().AssemblyQualifiedName, "#A2"); } } [Test] public void TypeConverter_ITRSUsed () { ResXDataNode dn = new ResXDataNode ("test", 34L); StringBuilder sb = new StringBuilder (); using (StringWriter sw = new StringWriter (sb)) { using (ResXResourceWriter writer = new ResXResourceWriter (sw)) { writer.AddResource (dn); } } using (StringReader sr = new StringReader (sb.ToString ())) { ResXResourceReader rr = new ResXResourceReader (sr, new ReturnIntITRS ()); IDictionaryEnumerator en = rr.GetEnumerator (); en.MoveNext (); object o = ((DictionaryEntry) en.Current).Value; Assert.IsNotNull (o, "#A1"); Assert.IsInstanceOfType (typeof (int), o,"#A2"); Assert.AreEqual (34, o,"#A3"); rr.Close (); } } [Test] public void Serializable_ITRSUsed () { serializable ser = new serializable ("aaaaa", "bbbbb"); ResXDataNode dn = new ResXDataNode ("test", ser); StringBuilder sb = new StringBuilder (); using (StringWriter sw = new StringWriter (sb)) { using (ResXResourceWriter writer = new ResXResourceWriter (sw)) { writer.AddResource (dn); } } using (StringReader sr = new StringReader (sb.ToString ())) { ResXResourceReader rr = new ResXResourceReader (sr, new ReturnSerializableSubClassITRS ()); IDictionaryEnumerator en = rr.GetEnumerator (); en.MoveNext (); object o = ((DictionaryEntry) en.Current).Value; Assert.IsNotNull (o, "#A1"); Assert.IsInstanceOfType (typeof (serializableSubClass), o,"#A2"); rr.Close (); } } static string convertableResXWithoutAssemblyName = @" text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 im a name im a value "; static string serializedResXCorruped = @" text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA "; private static void WriteEmbeddedResource (string name, string filename) { const int size = 512; byte [] buffer = new byte [size]; int count = 0; Stream input = typeof (ResXResourceReaderTest).Assembly. GetManifestResourceStream (name); Stream output = File.Open (filename, FileMode.Create); try { while ((count = input.Read (buffer, 0, size)) > 0) { output.Write (buffer, 0, count); } } finally { output.Close (); } } private const string _resXFileRefTemplate = "" + "" + " " + " {0}" + " " + " " + " {1}" + " " + " " + " System.Resources.ResXResourceReader, {2}" + " " + " " + " System.Resources.ResXResourceWriter, {2}" + " " + " " + " True" + " " + " " + " {3};{4}{5}" + " " + ""; } }