[jit] Enable partial generic sharing when not using AOT as an experiment.
[mono.git] / mcs / class / Managed.Windows.Forms / Test / System.Resources / WriterTest.cs
index eb0f015c9ddd83d39f79f9152fe90c4b07c03c5f..2543203c69c22c1d1cee12009dbad269b7e56b9c 100644 (file)
 //
 // 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);
                }
 
@@ -85,6 +184,126 @@ namespace MonoTests.System.Resources
 
                        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]