//
// Authors:
// Robert Jordan <robertj@gmx.net>
-//
+// Gary Barnett <gary.barnett.mono@gmail.com>
using System;
using System.Collections;
using System.ComponentModel;
+using System.ComponentModel.Design;
using System.Drawing;
using System.Globalization;
using System.IO;
using System.Resources;
using System.Text;
+using System.Windows.Forms;
using NUnit.Framework;
namespace MonoTests.System.Resources
{
[TestFixture]
- public class WriterTest
+ public class WriterTest : MonoTests.System.Windows.Forms.TestHelper
{
string fileName;
[SetUp]
- public void SetUp ()
+ protected override void SetUp ()
{
fileName = Path.GetTempFileName ();
+ base.SetUp ();
}
[TearDown]
- public void TearDown ()
+ protected override void TearDown ()
+ {
+ File.Delete (fileName);
+ base.TearDown ();
+ }
+
+ [Test] // ctor (Stream)
+ [NUnit.Framework.Category ("NotDotNet")]
+ public void Constructor1_Stream_Null ()
+ {
+ try {
+ new ResXResourceWriter ((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 (Stream)
+ [NUnit.Framework.Category ("NotDotNet")]
+ public void Constructor1_Stream_NotWritable ()
+ {
+ MemoryStream ms = new MemoryStream (new byte [0], false);
+
+ try {
+ new ResXResourceWriter (ms);
+ Assert.Fail ("#1");
+ } catch (ArgumentException ex) {
+ Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#2");
+ Assert.IsNull (ex.InnerException, "#3");
+ Assert.IsNotNull (ex.Message, "#4");
+ Assert.AreEqual ("stream", ex.ParamName, "#5");
+ }
+ }
+
+ [Test] // ctor (TextWriter)
+ [NUnit.Framework.Category ("NotDotNet")]
+ public void Constructor2_TextWriter_Null ()
+ {
+ try {
+ new ResXResourceWriter ((TextWriter) 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 ("textWriter", ex.ParamName, "#5");
+ }
+ }
+
+ [Test] // ctor (String)
+ [NUnit.Framework.Category ("NotDotNet")]
+ public void Constructor3_FileName_Null ()
+ {
+ try {
+ new ResXResourceWriter ((string) 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 ("fileName", ex.ParamName, "#5");
+ }
+ }
+
+ [Test]
+ public void AddResource_WithComment ()
{
+ ResXResourceWriter w = new ResXResourceWriter (fileName);
+ ResXDataNode node = new ResXDataNode ("key", "value");
+ node.Comment = "comment is preserved";
+ w.AddResource (node);
+ w.Generate ();
+ w.Close ();
+
+ ResXResourceReader r = new ResXResourceReader (fileName);
+ ITypeResolutionService typeres = null;
+ r.UseResXDataNodes = true;
+
+ int count = 0;
+ foreach (DictionaryEntry o in r)
+ {
+ string key = o.Key.ToString();
+ node = (ResXDataNode)o.Value;
+ string value = node.GetValue (typeres).ToString ();
+ string comment = node.Comment;
+
+ Assert.AreEqual ("key", key, "key");
+ Assert.AreEqual ("value", value, "value");
+ Assert.AreEqual ("comment is preserved", comment, "comment");
+ Assert.AreEqual (0, count, "too many nodes");
+ count++;
+ }
+ r.Close ();
+
File.Delete (fileName);
}
File.Delete (fileName);
}
+
+ ResXDataNode GetNodeFromResXWithBasePath (ResXDataNode node, string basePath)
+ {
+ StringWriter sw = new StringWriter ();
+ using (ResXResourceWriter writer = new ResXResourceWriter (sw)) {
+ writer.BasePath = basePath;
+ writer.AddResource (node);
+ }
+
+ StringReader sr = new StringReader (sw.ToString ());
+
+ using (ResXResourceReader reader = new ResXResourceReader (sr)) {
+ reader.UseResXDataNodes = true;
+ IDictionaryEnumerator enumerator = reader.GetEnumerator ();
+ enumerator.MoveNext ();
+ return ((DictionaryEntry) enumerator.Current).Value as ResXDataNode;
+ }
+ }
+
+ [Test]
+ public void BasePath_ChangesAbsoluteFileRef_Node ()
+ {
+ var node = new ResXDataNode ("name", new ResXFileRef (@"/dir/dir/filename.ext", "System.String"));
+ var returnedNode = GetNodeFromResXWithBasePath (node, @"/dir");
+ Assert.IsNotNull (returnedNode, "#A1");
+ Assert.AreEqual (@"dir/filename.ext", returnedNode.FileRef.FileName, "#A2");
+ }
+
+ [Test]
+ public void BasePath_ChangesAbsoluteFileRef_Object ()
+ {
+ var fileref = new ResXFileRef (@"/dir/dir/filename.ext", "System.String");
+
+ string basePath = @"/dir";
+
+ StringWriter sw = new StringWriter ();
+ using (ResXResourceWriter writer = new ResXResourceWriter (sw)) {
+ writer.BasePath = basePath;
+ writer.AddResource ("name", fileref);
+ }
+
+ StringReader sr = new StringReader (sw.ToString ());
+
+ using (ResXResourceReader reader = new ResXResourceReader (sr)) {
+ reader.UseResXDataNodes = true;
+ IDictionaryEnumerator enumerator = reader.GetEnumerator ();
+ enumerator.MoveNext ();
+ var returnedNode = ((DictionaryEntry) enumerator.Current).Value as ResXDataNode;
+ Assert.AreEqual (@"dir/filename.ext", returnedNode.FileRef.FileName);
+ }
+ }
+
+ [Test]
+ public void BasePath_ChangesAbsoluteFileRef_Deeper ()
+ {
+ var node = new ResXDataNode ("name", new ResXFileRef (@"/adir/filename.ext", "System.String"));
+ var returnedNode = GetNodeFromResXWithBasePath (node, @"/dir1/dir2");
+ Assert.IsNotNull (returnedNode, "#A1");
+ Assert.AreEqual (@"../../adir/filename.ext", returnedNode.FileRef.FileName, "#A2");
+ }
+
+ [Test]
+ public void BasePath_ComplexPath ()
+ {
+ var node = new ResXDataNode ("name", new ResXFileRef (@"/dir/dir/../filename.ext", "System.String"));
+ var returnedNode = GetNodeFromResXWithBasePath (node, @"/dir");
+ Assert.IsNotNull (returnedNode, "#A1");
+ Assert.AreEqual (@"dir/../filename.ext", returnedNode.FileRef.FileName, "#A2");
+ }
+
+ [Test]
+ public void BasePath_IgnoresTrailingSeparator ()
+ {
+ var node = new ResXDataNode ("name", new ResXFileRef (@"/dir/filename.ext", "System.String"));
+ var nonTrailNode = GetNodeFromResXWithBasePath (node, @"/dir");
+ Assert.IsNotNull (nonTrailNode, "#A1");
+ Assert.AreEqual (@"filename.ext", nonTrailNode.FileRef.FileName, "#A2");
+
+ var trailingNode = GetNodeFromResXWithBasePath (node, @"/dir/");
+ Assert.IsNotNull (trailingNode, "#A3");
+ Assert.AreEqual (@"filename.ext", trailingNode.FileRef.FileName, "#A4");
+ }
+
+ [Test]
+ public void BasePath_IgnoredIfNotPartOfPath () // not really a valid test on linux systems
+ {
+ var node = new ResXDataNode ("name", new ResXFileRef (@"/dir/filename.ext", "System.String"));
+ var returnedNode = GetNodeFromResXWithBasePath (node, @"D/");
+ Assert.IsNotNull (returnedNode, "#A1");
+ Assert.AreEqual (@"/dir/filename.ext", returnedNode.FileRef.FileName, "#A2");
+ }
+
+ [Test] // FIXME: this fails on mono ("/dir/filename.ext" is returned) but passes on .net
+ [NUnit.Framework.Category ("NotWorking")]
+ public void BasePath_Root ()
+ {
+ var node = new ResXDataNode ("name", new ResXFileRef (@"/dir/filename.ext", "System.String"));
+ var returnedNode = GetNodeFromResXWithBasePath (node, @"/");
+ Assert.IsNotNull (returnedNode, "#A1");
+ Assert.AreEqual (@"dir/filename.ext", returnedNode.FileRef.FileName, "#A2");
+ }
+
+ [Test]
+ public void BasePath_RelativeFileRef ()
+ {
+ var node = new ResXDataNode ("name", new ResXFileRef (@"../../filename.ext", "System.String"));
+ var returnedNode = GetNodeFromResXWithBasePath (node, @"../");
+ Assert.IsNotNull (returnedNode, "#A1");
+ Assert.AreEqual (@"../filename.ext", returnedNode.FileRef.FileName, "#A2");
+ }
+
+ [Test]
+ public void BasePath_DoesntAffectOriginalNode ()
+ {
+ var node = new ResXDataNode ("name", new ResXFileRef (@"/dir/dir/filename.ext", "System.String"));
+ var returnedNode = GetNodeFromResXWithBasePath (node, @"/dir");
+ Assert.IsNotNull (returnedNode, "#A1");
+ Assert.AreEqual (@"dir/filename.ext", returnedNode.FileRef.FileName, "#A2");
+ Assert.AreEqual (@"/dir/dir/filename.ext", node.FileRef.FileName, "#A3");
+ }
}
[Serializable]