From d5dc02f0268565d0594045097f7df84a689c3bb8 Mon Sep 17 00:00:00 2001 From: Gert Driesen Date: Sat, 10 Nov 2007 19:10:06 +0000 Subject: [PATCH] * ResourceWriterTest.cs: Added ctor tests. Added tests for AddResource overloads. Added test for argument null checks. Added test for bug #339074. Added test for invoking Generate () multiple times. * ResourceWriter.cs: On 2.0 profile, use case-insensitive SortedList. Changed exception messages and params to match MS. Allow null values in AddResource overloads. In Dispose (bool), also generate resources (header) if no resources were added. Fixes bug #339074. When Generate is done, reset resources to null to prevent further editing. This also avoids the need for a separate bool to indicate whether generate was already invoked. Code formatting. svn path=/trunk/mcs/; revision=89412 --- mcs/class/corlib/System.Resources/ChangeLog | 10 + .../corlib/System.Resources/ResourceWriter.cs | 400 ++++++++--------- .../corlib/Test/System.Resources/ChangeLog | 8 +- .../System.Resources/ResourceWriterTest.cs | 401 ++++++++++++++++++ 4 files changed, 605 insertions(+), 214 deletions(-) diff --git a/mcs/class/corlib/System.Resources/ChangeLog b/mcs/class/corlib/System.Resources/ChangeLog index 75e3b0e1b3c..e5881a5253c 100644 --- a/mcs/class/corlib/System.Resources/ChangeLog +++ b/mcs/class/corlib/System.Resources/ChangeLog @@ -1,3 +1,13 @@ +2007-11-10 Gert Driesen + + * ResourceWriter.cs: On 2.0 profile, use case-insensitive SortedList. + Changed exception messages and params to match MS. Allow null values + in AddResource overloads. In Dispose (bool), also generate resources + (header) if no resources were added. Fixes bug #339074. When Generate + is done, reset resources to null to prevent further editing. This + also avoids the need for a separate bool to indicate whether generate + was already invoked. Code formatting. + 2007-10-27 Gert Driesen * ResourceManager.cs: Removed temporary workaround for bug #43567. diff --git a/mcs/class/corlib/System.Resources/ResourceWriter.cs b/mcs/class/corlib/System.Resources/ResourceWriter.cs index 50afc5a626c..7df5fce2795 100644 --- a/mcs/class/corlib/System.Resources/ResourceWriter.cs +++ b/mcs/class/corlib/System.Resources/ResourceWriter.cs @@ -4,6 +4,7 @@ // Authors: // Duncan Mak // Dick Porter +// Gert Driesen // // (C) 2001, 2002 Ximian, Inc. http://www.ximian.com // @@ -57,104 +58,88 @@ namespace System.Resources } #if NET_2_0 - SortedList resources = new SortedList (StringComparer.Ordinal); + SortedList resources = new SortedList (StringComparer.OrdinalIgnoreCase); #else - Hashtable resources = new Hashtable(CaseInsensitiveHashCodeProvider.Default, CaseInsensitiveComparer.Default); + Hashtable resources = new Hashtable (CaseInsensitiveHashCodeProvider.Default, CaseInsensitiveComparer.Default); #endif Stream stream; public ResourceWriter (Stream stream) { if (stream == null) - throw new ArgumentNullException ("stream is null"); - if (stream.CanWrite == false) - throw new ArgumentException ("stream is not writable."); + throw new ArgumentNullException ("stream"); + if (!stream.CanWrite) + throw new ArgumentException ("Stream was not writable."); - this.stream=stream; + this.stream = stream; } public ResourceWriter (String fileName) { if (fileName == null) - throw new ArgumentNullException ("fileName is null."); + throw new ArgumentNullException ("fileName"); - stream=new FileStream(fileName, FileMode.Create, FileAccess.Write); + stream = new FileStream(fileName, FileMode.Create, + FileAccess.Write); } public void AddResource (string name, byte[] value) { - if (name == null) { - throw new ArgumentNullException ("name is null"); - } - if (value == null) { - throw new ArgumentNullException ("value is null"); - } - if(resources==null) { - throw new InvalidOperationException ("ResourceWriter has been closed"); - } - if(resources[name]!=null) { + if (name == null) + throw new ArgumentNullException ("name"); + if (resources == null) + throw new InvalidOperationException ("The resource writer has already been closed and cannot be edited"); + if (resources [name] != null) throw new ArgumentException ("Resource already present: " + name); - } resources.Add(name, value); } public void AddResource (string name, object value) - { - if (name == null) { - throw new ArgumentNullException ("name is null"); - } - if(resources==null) { - throw new InvalidOperationException ("ResourceWriter has been closed"); - } - if(resources[name]!=null) { + { + if (name == null) + throw new ArgumentNullException ("name"); + if (resources == null) + throw new InvalidOperationException ("The resource writer has already been closed and cannot be edited"); + if (resources[name] != null) throw new ArgumentException ("Resource already present: " + name); - } resources.Add(name, value); } public void AddResource (string name, string value) { - if (name == null) { - throw new ArgumentNullException ("name is null"); - } - if (value == null) { - throw new ArgumentNullException ("value is null"); - } - if(resources==null) { - throw new InvalidOperationException ("ResourceWriter has been closed"); - } - if(resources[name]!=null) { + if (name == null) + throw new ArgumentNullException ("name"); + if (resources == null) + throw new InvalidOperationException ("The resource writer has already been closed and cannot be edited"); + if (resources [name] != null) throw new ArgumentException ("Resource already present: " + name); - } resources.Add(name, value); } - public void Close () { - Dispose(true); + public void Close () + { + Dispose (true); } public void Dispose () { - Dispose(true); + Dispose (true); } private void Dispose (bool disposing) { - if(disposing) { - if(resources.Count>0 && generated==false) { + if (disposing) { + if (resources != null) Generate(); - } - if(stream!=null) { + if (stream != null) stream.Close(); - } - // If we are explicitly disposed, we can avoid finalization. GC.SuppressFinalize (this); } - resources=null; - stream=null; + resources = null; + stream = null; } #if NET_2_0 @@ -172,59 +157,52 @@ namespace System.Resources } #endif - private bool generated=false; - - public void Generate () { + public void Generate () + { BinaryWriter writer; IFormatter formatter; - if(resources==null) { - throw new InvalidOperationException ("ResourceWriter has been closed"); - } + if (resources == null) + throw new InvalidOperationException ("The resource writer has already been closed and cannot be edited"); - if(generated) { - throw new InvalidOperationException ("ResourceWriter can only Generate() once"); - } - generated=true; - - writer=new BinaryWriter(stream, Encoding.UTF8); - formatter=new BinaryFormatter(null, new StreamingContext(StreamingContextStates.File|StreamingContextStates.Persistence)); + writer = new BinaryWriter (stream, Encoding.UTF8); + formatter = new BinaryFormatter (null, new StreamingContext (StreamingContextStates.File | StreamingContextStates.Persistence)); /* The ResourceManager header */ - writer.Write(ResourceManager.MagicNumber); - writer.Write(ResourceManager.HeaderVersionNumber); + writer.Write (ResourceManager.MagicNumber); + writer.Write (ResourceManager.HeaderVersionNumber); /* Build the rest of the ResourceManager * header in memory, because we need to know * how long it is in advance */ - MemoryStream resman_stream=new MemoryStream(); - BinaryWriter resman=new BinaryWriter(resman_stream, + MemoryStream resman_stream = new MemoryStream (); + BinaryWriter resman = new BinaryWriter (resman_stream, Encoding.UTF8); - resman.Write(typeof(ResourceReader).AssemblyQualifiedName); + resman.Write (typeof (ResourceReader).AssemblyQualifiedName); #if NET_2_0 - resman.Write(typeof(ResourceSet).FullName); + resman.Write (typeof (ResourceSet).FullName); #else - resman.Write(typeof(ResourceSet).AssemblyQualifiedName); + resman.Write (typeof (ResourceSet).AssemblyQualifiedName); #endif /* Only space for 32 bits of header len in the * resource file format */ - int resman_len=(int)resman_stream.Length; - writer.Write(resman_len); - writer.Write(resman_stream.GetBuffer(), 0, resman_len); + int resman_len = (int) resman_stream.Length; + writer.Write (resman_len); + writer.Write (resman_stream.GetBuffer (), 0, resman_len); /* We need to build the ResourceReader name * and data sections simultaneously */ - MemoryStream res_name_stream=new MemoryStream(); - BinaryWriter res_name=new BinaryWriter(res_name_stream, Encoding.Unicode); + MemoryStream res_name_stream = new MemoryStream (); + BinaryWriter res_name = new BinaryWriter (res_name_stream, Encoding.Unicode); - MemoryStream res_data_stream=new MemoryStream(); - BinaryWriter res_data=new BinaryWriter(res_data_stream, + MemoryStream res_data_stream = new MemoryStream (); + BinaryWriter res_data = new BinaryWriter (res_data_stream, Encoding.UTF8); /* Not sure if this is the best collection to @@ -234,22 +212,22 @@ namespace System.Resources * key==value would work, but I need to find * the index of each item later) */ - ArrayList types=new ArrayList(); - int[] hashes=new int[resources.Count]; - int[] name_offsets=new int[resources.Count]; - int count=0; + ArrayList types = new ArrayList (); + int [] hashes = new int [resources.Count]; + int [] name_offsets = new int [resources.Count]; + int count = 0; - IDictionaryEnumerator res_enum=resources.GetEnumerator(); - while(res_enum.MoveNext()) { + IDictionaryEnumerator res_enum = resources.GetEnumerator (); + while (res_enum.MoveNext()) { /* Hash the name */ - hashes[count]=GetHash((string)res_enum.Key); + hashes [count] = GetHash ((string) res_enum.Key); /* Record the offsets */ - name_offsets[count]=(int)res_name.BaseStream.Position; + name_offsets [count] = (int) res_name.BaseStream.Position; /* Write the name section */ - res_name.Write((string)res_enum.Key); - res_name.Write((int)res_data.BaseStream.Position); + res_name.Write ((string) res_enum.Key); + res_name.Write ((int) res_data.BaseStream.Position); if (res_enum.Value == null) { Write7BitEncodedInt (res_data, -1); @@ -307,98 +285,98 @@ namespace System.Resources #if NET_2_0 if (tbn != null) res_data.Write((byte []) tbn.Value); - else if (type==typeof(Byte)) { - res_data.Write((byte) PredefinedResourceType.Byte); - res_data.Write((Byte)res_enum.Value); - } else if (type==typeof(Decimal)) { - res_data.Write((byte) PredefinedResourceType.Decimal); - res_data.Write((Decimal)res_enum.Value); - } else if (type==typeof(DateTime)) { - res_data.Write((byte) PredefinedResourceType.DateTime); - res_data.Write(((DateTime)res_enum.Value).Ticks); - } else if (type==typeof(Double)) { - res_data.Write((byte) PredefinedResourceType.Double); - res_data.Write((Double)res_enum.Value); - } else if (type==typeof(Int16)) { - res_data.Write((byte) PredefinedResourceType.Int16); - res_data.Write((Int16)res_enum.Value); - } else if (type==typeof(Int32)) { - res_data.Write((byte) PredefinedResourceType.Int32); - res_data.Write((Int32)res_enum.Value); - } else if (type==typeof(Int64)) { - res_data.Write((byte) PredefinedResourceType.Int64); - res_data.Write((Int64)res_enum.Value); - } else if (type==typeof(SByte)) { - res_data.Write((byte) PredefinedResourceType.SByte); - res_data.Write((SByte)res_enum.Value); - } else if (type==typeof(Single)) { - res_data.Write((byte) PredefinedResourceType.Single); - res_data.Write((Single)res_enum.Value); - } else if (type==typeof(String)) { - res_data.Write((byte) PredefinedResourceType.String); - res_data.Write((String)res_enum.Value); - } else if (type==typeof(TimeSpan)) { - res_data.Write((byte) PredefinedResourceType.TimeSpan); - res_data.Write(((TimeSpan)res_enum.Value).Ticks); - } else if (type==typeof(UInt16)) { - res_data.Write((byte) PredefinedResourceType.UInt16); - res_data.Write((UInt16)res_enum.Value); - } else if (type==typeof(UInt32)) { - res_data.Write((byte) PredefinedResourceType.UInt32); - res_data.Write((UInt32)res_enum.Value); - } else if (type==typeof(UInt64)) { - res_data.Write((byte) PredefinedResourceType.UInt64); - res_data.Write((UInt64)res_enum.Value); - } else if (type==typeof(byte[])) { - res_data.Write((byte) PredefinedResourceType.ByteArray); - byte [] data = (byte[])res_enum.Value; - res_data.Write((uint) data.Length); - res_data.Write(data, 0, data.Length); - } else if (type==typeof(MemoryStream)) { - res_data.Write((byte) PredefinedResourceType.Stream); - byte [] data = ((MemoryStream)res_enum.Value).ToArray (); - res_data.Write((uint) data.Length); - res_data.Write(data, 0, data.Length); + else if (type == typeof (Byte)) { + res_data.Write ((byte) PredefinedResourceType.Byte); + res_data.Write ((Byte) res_enum.Value); + } else if (type == typeof (Decimal)) { + res_data.Write ((byte) PredefinedResourceType.Decimal); + res_data.Write ((Decimal) res_enum.Value); + } else if (type == typeof (DateTime)) { + res_data.Write ((byte) PredefinedResourceType.DateTime); + res_data.Write (((DateTime) res_enum.Value).Ticks); + } else if (type == typeof (Double)) { + res_data.Write ((byte) PredefinedResourceType.Double); + res_data.Write ((Double) res_enum.Value); + } else if (type == typeof (Int16)) { + res_data.Write ((byte) PredefinedResourceType.Int16); + res_data.Write ((Int16) res_enum.Value); + } else if (type == typeof (Int32)) { + res_data.Write ((byte) PredefinedResourceType.Int32); + res_data.Write ((Int32) res_enum.Value); + } else if (type == typeof (Int64)) { + res_data.Write ((byte) PredefinedResourceType.Int64); + res_data.Write ((Int64) res_enum.Value); + } else if (type == typeof (SByte)) { + res_data.Write ((byte) PredefinedResourceType.SByte); + res_data.Write ((SByte) res_enum.Value); + } else if (type == typeof (Single)) { + res_data.Write ((byte) PredefinedResourceType.Single); + res_data.Write ((Single) res_enum.Value); + } else if (type == typeof (String)) { + res_data.Write ((byte) PredefinedResourceType.String); + res_data.Write ((String) res_enum.Value); + } else if (type == typeof (TimeSpan)) { + res_data.Write ((byte) PredefinedResourceType.TimeSpan); + res_data.Write (((TimeSpan) res_enum.Value).Ticks); + } else if (type == typeof (UInt16)) { + res_data.Write ((byte) PredefinedResourceType.UInt16); + res_data.Write ((UInt16) res_enum.Value); + } else if (type == typeof (UInt32)) { + res_data.Write ((byte) PredefinedResourceType.UInt32); + res_data.Write ((UInt32) res_enum.Value); + } else if (type == typeof (UInt64)) { + res_data.Write ((byte) PredefinedResourceType.UInt64); + res_data.Write ((UInt64) res_enum.Value); + } else if (type == typeof (byte[])) { + res_data.Write ((byte) PredefinedResourceType.ByteArray); + byte [] data = (byte[]) res_enum.Value; + res_data.Write ((uint) data.Length); + res_data.Write (data, 0, data.Length); + } else if (type == typeof (MemoryStream)) { + res_data.Write ((byte) PredefinedResourceType.Stream); + byte [] data = ((MemoryStream) res_enum.Value).ToArray (); + res_data.Write ((uint) data.Length); + res_data.Write (data, 0, data.Length); } else { /* non-intrinsic types are * serialized */ - formatter.Serialize(res_data.BaseStream, res_enum.Value); + formatter.Serialize (res_data.BaseStream, res_enum.Value); } #else - if(type==typeof(Byte)) { - res_data.Write((Byte)res_enum.Value); - } else if (type==typeof(Decimal)) { - res_data.Write((Decimal)res_enum.Value); - } else if (type==typeof(DateTime)) { - res_data.Write(((DateTime)res_enum.Value).Ticks); - } else if (type==typeof(Double)) { - res_data.Write((Double)res_enum.Value); - } else if (type==typeof(Int16)) { - res_data.Write((Int16)res_enum.Value); - } else if (type==typeof(Int32)) { - res_data.Write((Int32)res_enum.Value); - } else if (type==typeof(Int64)) { - res_data.Write((Int64)res_enum.Value); - } else if (type==typeof(SByte)) { - res_data.Write((SByte)res_enum.Value); - } else if (type==typeof(Single)) { - res_data.Write((Single)res_enum.Value); - } else if (type==typeof(String)) { - res_data.Write((String)res_enum.Value); - } else if (type==typeof(TimeSpan)) { - res_data.Write(((TimeSpan)res_enum.Value).Ticks); - } else if (type==typeof(UInt16)) { - res_data.Write((UInt16)res_enum.Value); - } else if (type==typeof(UInt32)) { - res_data.Write((UInt32)res_enum.Value); - } else if (type==typeof(UInt64)) { - res_data.Write((UInt64)res_enum.Value); + if (type == typeof (Byte)) { + res_data.Write ((Byte) res_enum.Value); + } else if (type == typeof (Decimal)) { + res_data.Write ((Decimal) res_enum.Value); + } else if (type == typeof (DateTime)) { + res_data.Write (((DateTime) res_enum.Value).Ticks); + } else if (type == typeof (Double)) { + res_data.Write ((Double) res_enum.Value); + } else if (type == typeof (Int16)) { + res_data.Write ((Int16) res_enum.Value); + } else if (type == typeof (Int32)) { + res_data.Write ((Int32) res_enum.Value); + } else if (type == typeof (Int64)) { + res_data.Write ((Int64) res_enum.Value); + } else if (type == typeof (SByte)) { + res_data.Write ((SByte) res_enum.Value); + } else if (type == typeof (Single)) { + res_data.Write ((Single) res_enum.Value); + } else if (type == typeof (String)) { + res_data.Write ((String) res_enum.Value); + } else if (type == typeof (TimeSpan)) { + res_data.Write (((TimeSpan) res_enum.Value).Ticks); + } else if (type == typeof (UInt16)) { + res_data.Write ((UInt16) res_enum.Value); + } else if (type == typeof (UInt32)) { + res_data.Write ((UInt32) res_enum.Value); + } else if (type == typeof (UInt64)) { + res_data.Write ((UInt64) res_enum.Value); } else { /* non-intrinsic types are * serialized */ - formatter.Serialize(res_data.BaseStream, res_enum.Value); + formatter.Serialize (res_data.BaseStream, res_enum.Value); } #endif @@ -408,20 +386,20 @@ namespace System.Resources /* Sort the hashes, keep the name offsets * matching up */ - Array.Sort(hashes, name_offsets); + Array.Sort (hashes, name_offsets); /* now do the ResourceReader header */ #if NET_2_0 - writer.Write(2); + writer.Write (2); #else - writer.Write(1); + writer.Write (1); #endif - writer.Write(resources.Count); - writer.Write(types.Count); + writer.Write (resources.Count); + writer.Write (types.Count); /* Write all of the unique types */ - foreach(object type in types) { + foreach (object type in types) { if (type is Type) writer.Write(((Type) type).AssemblyQualifiedName); else @@ -431,75 +409,71 @@ namespace System.Resources /* Pad the next fields (hash values) on an 8 * byte boundary, using the letters "PAD" */ - int pad_align=(int)(writer.BaseStream.Position & 7); - int pad_chars=0; + int pad_align = (int) (writer.BaseStream.Position & 7); + int pad_chars = 0; - if(pad_align!=0) { - pad_chars=8-pad_align; - } + if (pad_align != 0) + pad_chars = 8 - pad_align; - for(int i=0; i> 7) & 0x01ffffff; - byte b = (byte)(value & 0x7f); + byte b = (byte) (value & 0x7f); - if (high != 0) { - b = (byte)(b | 0x80); - } + if (high != 0) + b = (byte) (b | 0x80); - writer.Write(b); + writer.Write (b); value = high; - } while(value != 0); + } while (value != 0); } internal Stream Stream { diff --git a/mcs/class/corlib/Test/System.Resources/ChangeLog b/mcs/class/corlib/Test/System.Resources/ChangeLog index 1c5fa42edb1..6dec0ae2490 100644 --- a/mcs/class/corlib/Test/System.Resources/ChangeLog +++ b/mcs/class/corlib/Test/System.Resources/ChangeLog @@ -1,6 +1,12 @@ +2007-11-10 Gert Driesen + + * ResourceWriterTest.cs: Added ctor tests. Added tests for AddResource + overloads. Added test for argument null checks. Added test for bug + #339074. Added test for invoking Generate () multiple times. + 2007-10-27 Gert Driesen - * ResourceManager.cs: Added tests for null argument checks. Added test + * ResourceManagerTest.cs: Added tests for null argument checks. Added test for GetStream with resource file that does not exist. 2007-09-17 Gert Driesen diff --git a/mcs/class/corlib/Test/System.Resources/ResourceWriterTest.cs b/mcs/class/corlib/Test/System.Resources/ResourceWriterTest.cs index b2d69ffad69..59104aeb881 100644 --- a/mcs/class/corlib/Test/System.Resources/ResourceWriterTest.cs +++ b/mcs/class/corlib/Test/System.Resources/ResourceWriterTest.cs @@ -20,6 +20,329 @@ namespace MonoTests.System.Resources [TestFixture] public class ResourceWriterTest { + private string tempFolder = null; + + [SetUp] + public void SetUp () + { + tempFolder = Path.Combine (Path.GetTempPath (), + "MonoTests.System.Resources.ResourceWriterTest"); + if (!Directory.Exists (tempFolder)) + Directory.CreateDirectory (tempFolder); + } + + [TearDown] + public void TearDown () + { + if (Directory.Exists (tempFolder)) + Directory.Delete (tempFolder, true); + } + + [Test] // ctor (Stream) + public void Constructor0_Stream_NotWritable () + { + MemoryStream ms = new MemoryStream (new byte [0], false); + + try { + new ResourceWriter (ms); + Assert.Fail ("#1"); + } catch (ArgumentException ex) { + // Stream was not writable + Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.IsNull (ex.ParamName, "#5"); + } + } + + [Test] // ctor (Stream) + public void Constructor0_Stream_Null () + { + try { + new ResourceWriter ((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.IsNotNull (ex.ParamName, "#5"); + Assert.AreEqual ("stream", ex.ParamName, "#6"); + } + } + + [Test] // ctor (string) + public void Constructor1_FileName_Null () + { + try { + new ResourceWriter ((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.IsNotNull (ex.ParamName, "#5"); + Assert.AreEqual ("fileName", ex.ParamName, "#6"); + } + } + + [Test] // AddResource (string, byte []) + public void AddResource0 () + { + byte [] value = new byte [] { 5, 7 }; + + MemoryStream ms = new MemoryStream (); + ResourceWriter writer = new ResourceWriter (ms); + writer.AddResource ("Name", value); + writer.Generate (); + + try { + writer.AddResource ("Address", new byte [] { 8, 12 }); + Assert.Fail ("#A1"); + } catch (InvalidOperationException ex) { + // The resource writer has already been closed + // and cannot be edited + Assert.AreEqual (typeof (InvalidOperationException), ex.GetType (), "#A2"); + Assert.IsNull (ex.InnerException, "#A3"); + Assert.IsNotNull (ex.Message, "#A4"); + } + + ms.Position = 0; + ResourceReader rr = new ResourceReader (ms); + IDictionaryEnumerator enumerator = rr.GetEnumerator (); + Assert.IsTrue (enumerator.MoveNext (), "#B1"); + Assert.AreEqual ("Name", enumerator.Key, "#B3"); + Assert.AreEqual (value, enumerator.Value, "#B4"); + Assert.IsFalse (enumerator.MoveNext (), "#B5"); + + writer.Close (); + } + + [Test] // AddResource (string, byte []) + public void AddResource0_Name_Null () + { + byte [] value = new byte [] { 5, 7 }; + + MemoryStream ms = new MemoryStream (); + ResourceWriter writer = new ResourceWriter (ms); + + try { + writer.AddResource ((string) null, value); + Assert.Fail ("#1"); + } catch (ArgumentNullException ex) { + Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.IsNotNull (ex.ParamName, "#5"); + Assert.AreEqual ("name", ex.ParamName, "#6"); + } + + writer.Close (); + } + + [Test] // AddResource (string, byte []) + public void AddResource0_Value_Null () + { + MemoryStream ms = new MemoryStream (); + ResourceWriter writer = new ResourceWriter (ms); + writer.AddResource ("Name", (byte []) null); + writer.Generate (); + + ms.Position = 0; + ResourceReader rr = new ResourceReader (ms); + IDictionaryEnumerator enumerator = rr.GetEnumerator (); + Assert.IsTrue (enumerator.MoveNext (), "#1"); + Assert.AreEqual ("Name", enumerator.Key, "#2"); + Assert.IsNull (enumerator.Value, "#3"); + Assert.IsFalse (enumerator.MoveNext (), "#4"); + + writer.Close (); + } + + [Test] // AddResource (string, object) + public void AddResource1 () + { + TimeSpan value = new TimeSpan (2, 5, 8); + + MemoryStream ms = new MemoryStream (); + ResourceWriter writer = new ResourceWriter (ms); + writer.AddResource ("Interval", value); + writer.Generate (); + + try { + writer.AddResource ("Start", value); + Assert.Fail ("#A1"); + } catch (InvalidOperationException ex) { + // The resource writer has already been closed + // and cannot be edited + Assert.AreEqual (typeof (InvalidOperationException), ex.GetType (), "#A2"); + Assert.IsNull (ex.InnerException, "#A3"); + Assert.IsNotNull (ex.Message, "#A4"); + } + + ms.Position = 0; + ResourceReader rr = new ResourceReader (ms); + IDictionaryEnumerator enumerator = rr.GetEnumerator (); + Assert.IsTrue (enumerator.MoveNext (), "#B1"); + Assert.AreEqual ("Interval", enumerator.Key, "#B3"); + Assert.AreEqual (value, enumerator.Value, "#B4"); + Assert.IsFalse (enumerator.MoveNext (), "#B5"); + + writer.Close (); + } + + [Test] // AddResource (string, object) + public void AddResource1_Name_Null () + { + MemoryStream ms = new MemoryStream (); + ResourceWriter writer = new ResourceWriter (ms); + + try { + writer.AddResource ((string) null, new object ()); + Assert.Fail ("#1"); + } catch (ArgumentNullException ex) { + Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.IsNotNull (ex.ParamName, "#5"); + Assert.AreEqual ("name", ex.ParamName, "#6"); + } + + writer.Close (); + } + + [Test] // AddResource (string, object) + public void AddResource1_Value_Null () + { + MemoryStream ms = new MemoryStream (); + ResourceWriter writer = new ResourceWriter (ms); + writer.AddResource ("Name", (object) null); + writer.Generate (); + + ms.Position = 0; + ResourceReader rr = new ResourceReader (ms); + IDictionaryEnumerator enumerator = rr.GetEnumerator (); + Assert.IsTrue (enumerator.MoveNext (), "#1"); + Assert.AreEqual ("Name", enumerator.Key, "#2"); + Assert.IsNull (enumerator.Value, "#3"); + Assert.IsFalse (enumerator.MoveNext (), "#4"); + + writer.Close (); + } + + [Test] // AddResource (string, string) + public void AddResource2 () + { + String value = "Some\0Value\tOr\rAnother"; + + MemoryStream ms = new MemoryStream (); + ResourceWriter writer = new ResourceWriter (ms); + writer.AddResource ("Text", value); + writer.Generate (); + + try { + writer.AddResource ("Description", value); + Assert.Fail ("#A1"); + } catch (InvalidOperationException ex) { + // The resource writer has already been closed + // and cannot be edited + Assert.AreEqual (typeof (InvalidOperationException), ex.GetType (), "#A2"); + Assert.IsNull (ex.InnerException, "#A3"); + Assert.IsNotNull (ex.Message, "#A4"); + } + + ms.Position = 0; + ResourceReader rr = new ResourceReader (ms); + IDictionaryEnumerator enumerator = rr.GetEnumerator (); + Assert.IsTrue (enumerator.MoveNext (), "#B1"); + Assert.AreEqual ("Text", enumerator.Key, "#B3"); + Assert.AreEqual (value, enumerator.Value, "#B4"); + Assert.IsFalse (enumerator.MoveNext (), "#B5"); + + writer.Close (); + } + + [Test] // AddResource (string, string) + public void AddResource2_Name_Null () + { + MemoryStream ms = new MemoryStream (); + ResourceWriter writer = new ResourceWriter (ms); + + try { + writer.AddResource ((string) null, "abc"); + Assert.Fail ("#1"); + } catch (ArgumentNullException ex) { + Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.IsNotNull (ex.ParamName, "#5"); + Assert.AreEqual ("name", ex.ParamName, "#6"); + } + + writer.Close (); + } + + [Test] // AddResource (string, string) + public void AddResource2_Value_Null () + { + MemoryStream ms = new MemoryStream (); + ResourceWriter writer = new ResourceWriter (ms); + writer.AddResource ("Name", (string) null); + writer.Generate (); + + ms.Position = 0; + ResourceReader rr = new ResourceReader (ms); + IDictionaryEnumerator enumerator = rr.GetEnumerator (); + Assert.IsTrue (enumerator.MoveNext (), "#1"); + Assert.AreEqual ("Name", enumerator.Key, "#2"); + Assert.IsNull (enumerator.Value, "#3"); + Assert.IsFalse (enumerator.MoveNext (), "#4"); + + writer.Close (); + } + + [Test] + public void AddResource_Closed () + { + MemoryStream ms = new MemoryStream (); + ResourceWriter writer = new ResourceWriter (ms); + writer.AddResource ("Name", "Miguel"); + writer.Close (); + + try { + writer.AddResource ("Address", "US"); + Assert.Fail ("#1"); + } catch (InvalidOperationException ex) { + // The resource writer has already been closed + // and cannot be edited + Assert.AreEqual (typeof (InvalidOperationException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + } + } + + [Test] + public void AddResource_Name_Duplicate () + { + MemoryStream ms = new MemoryStream (); + ResourceWriter writer = new ResourceWriter (ms); + writer.AddResource ("FirstName", "Miguel"); + + try { + writer.AddResource ("FirstNaMe", "Chris"); + Assert.Fail ("#1"); + } catch (ArgumentException ex) { + // Item has already been added. Key is dictionary: + // 'FirstName' Key being added: 'FirstNaMe' + Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.IsNull (ex.ParamName, "#5"); + } + + writer.AddResource ("Name", "Miguel"); + writer.Close (); + } + #if NET_2_0 [Test] public void Bug81759 () @@ -40,6 +363,84 @@ namespace MonoTests.System.Resources } #endif + [Test] + public void Close () + { + MemoryStream ms = new MemoryStream (); + ResourceWriter writer = new ResourceWriter (ms); + writer.AddResource ("Name", "Miguel"); + Assert.IsTrue (ms.CanWrite, "#A1"); + Assert.IsTrue (ms.GetBuffer ().Length == 0, "#A2"); + writer.Close (); + Assert.IsFalse (ms.CanWrite, "#B1"); + Assert.IsFalse (ms.GetBuffer ().Length == 0, "#B2"); + writer.Close (); + } + + [Test] // bug #339074 + public void Close_NoResources () + { + string tempFile = Path.Combine (AppDomain.CurrentDomain.BaseDirectory, + "test.resources"); + + ResourceWriter writer = new ResourceWriter (tempFile); + writer.Close (); + + using (FileStream fs = File.OpenRead (tempFile)) { + Assert.IsFalse (fs.Length == 0, "#1"); + + using (ResourceReader reader = new ResourceReader (fs)) { + Assert.IsFalse (reader.GetEnumerator ().MoveNext (), "#2"); + } + } + } + + [Test] + public void Generate () + { + MemoryStream ms = new MemoryStream (); + ResourceWriter writer = new ResourceWriter (ms); + writer.AddResource ("Name", "Miguel"); + Assert.IsTrue (ms.Length == 0, "#A1"); + Assert.IsTrue (ms.CanWrite, "#A2"); + writer.Generate (); + Assert.IsFalse (ms.Length == 0, "#B2"); + Assert.IsTrue (ms.CanWrite, "#B2"); + + try { + writer.Generate (); + Assert.Fail ("#C1"); + } catch (InvalidOperationException ex) { + // The resource writer has already been closed + // and cannot be edited + Assert.AreEqual (typeof (InvalidOperationException), ex.GetType (), "#C2"); + Assert.IsNull (ex.InnerException, "#C3"); + Assert.IsNotNull (ex.Message, "#C4"); + } + + writer.Close (); + } + + [Test] + public void Generate_Closed () + { + MemoryStream ms = new MemoryStream (); + ResourceWriter writer = new ResourceWriter (ms); + writer.AddResource ("Name", "Miguel"); + writer.Close (); + + try { + writer.Generate (); + Assert.Fail ("#B1"); + } catch (InvalidOperationException ex) { + // The resource writer has already been closed + // and cannot be edited + Assert.AreEqual (typeof (InvalidOperationException), ex.GetType (), "#B2"); + Assert.IsNull (ex.InnerException, "#B3"); + Assert.IsNotNull (ex.Message, "#B4"); + } + } + [Test] // bug #82566 #if NET_2_0 [Category ("NotWorking")] -- 2.25.1