2 // ResourceWriterTest.cs
5 // Atsushi Enomoto <atsushi@ximian.com>
7 // Copyright (C) 2007 Novell, Inc. (http://www.novell.com)
11 using System.Collections;
13 using System.Reflection;
14 using System.Resources;
17 using NUnit.Framework;
19 namespace MonoTests.System.Resources
22 public class ResourceWriterTest
24 private string tempFolder = null;
29 tempFolder = Path.Combine (Path.GetTempPath (),
30 "MonoTests.System.Resources.ResourceWriterTest");
31 if (!Directory.Exists (tempFolder))
32 Directory.CreateDirectory (tempFolder);
36 public void TearDown ()
38 if (Directory.Exists (tempFolder))
39 Directory.Delete (tempFolder, true);
42 [Test] // ctor (Stream)
43 public void Constructor0_Stream_NotWritable ()
45 MemoryStream ms = new MemoryStream (new byte [0], false);
48 new ResourceWriter (ms);
50 } catch (ArgumentException ex) {
51 // Stream was not writable
52 Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#2");
53 Assert.IsNull (ex.InnerException, "#3");
54 Assert.IsNotNull (ex.Message, "#4");
55 Assert.IsNull (ex.ParamName, "#5");
59 [Test] // ctor (Stream)
60 public void Constructor0_Stream_Null ()
63 new ResourceWriter ((Stream) null);
65 } catch (ArgumentNullException ex) {
66 Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
67 Assert.IsNull (ex.InnerException, "#3");
68 Assert.IsNotNull (ex.Message, "#4");
69 Assert.IsNotNull (ex.ParamName, "#5");
70 Assert.AreEqual ("stream", ex.ParamName, "#6");
74 [Test] // ctor (string)
75 public void Constructor1_FileName_Null ()
78 new ResourceWriter ((string) null);
80 } catch (ArgumentNullException ex) {
81 Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
82 Assert.IsNull (ex.InnerException, "#3");
83 Assert.IsNotNull (ex.Message, "#4");
84 Assert.IsNotNull (ex.ParamName, "#5");
85 Assert.AreEqual ("fileName", ex.ParamName, "#6");
89 [Test] // AddResource (string, byte [])
90 public void AddResource0 ()
92 byte [] value = new byte [] { 5, 7 };
94 MemoryStream ms = new MemoryStream ();
95 ResourceWriter writer = new ResourceWriter (ms);
96 writer.AddResource ("Name", value);
100 writer.AddResource ("Address", new byte [] { 8, 12 });
102 } catch (InvalidOperationException ex) {
103 // The resource writer has already been closed
104 // and cannot be edited
105 Assert.AreEqual (typeof (InvalidOperationException), ex.GetType (), "#A2");
106 Assert.IsNull (ex.InnerException, "#A3");
107 Assert.IsNotNull (ex.Message, "#A4");
111 ResourceReader rr = new ResourceReader (ms);
112 IDictionaryEnumerator enumerator = rr.GetEnumerator ();
113 Assert.IsTrue (enumerator.MoveNext (), "#B1");
114 Assert.AreEqual ("Name", enumerator.Key, "#B3");
115 Assert.AreEqual (value, enumerator.Value, "#B4");
116 Assert.IsFalse (enumerator.MoveNext (), "#B5");
121 [Test] // AddResource (string, byte [])
122 public void AddResource0_Name_Null ()
124 byte [] value = new byte [] { 5, 7 };
126 MemoryStream ms = new MemoryStream ();
127 ResourceWriter writer = new ResourceWriter (ms);
130 writer.AddResource ((string) null, value);
132 } catch (ArgumentNullException ex) {
133 Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
134 Assert.IsNull (ex.InnerException, "#3");
135 Assert.IsNotNull (ex.Message, "#4");
136 Assert.IsNotNull (ex.ParamName, "#5");
137 Assert.AreEqual ("name", ex.ParamName, "#6");
143 [Test] // AddResource (string, byte [])
144 public void AddResource0_Value_Null ()
146 MemoryStream ms = new MemoryStream ();
147 ResourceWriter writer = new ResourceWriter (ms);
148 writer.AddResource ("Name", (byte []) null);
152 ResourceReader rr = new ResourceReader (ms);
153 IDictionaryEnumerator enumerator = rr.GetEnumerator ();
154 Assert.IsTrue (enumerator.MoveNext (), "#1");
155 Assert.AreEqual ("Name", enumerator.Key, "#2");
156 Assert.IsNull (enumerator.Value, "#3");
157 Assert.IsFalse (enumerator.MoveNext (), "#4");
162 [Test] // AddResource (string, object)
163 public void AddResource1 ()
165 TimeSpan value = new TimeSpan (2, 5, 8);
167 MemoryStream ms = new MemoryStream ();
168 ResourceWriter writer = new ResourceWriter (ms);
169 writer.AddResource ("Interval", value);
173 writer.AddResource ("Start", value);
175 } catch (InvalidOperationException ex) {
176 // The resource writer has already been closed
177 // and cannot be edited
178 Assert.AreEqual (typeof (InvalidOperationException), ex.GetType (), "#A2");
179 Assert.IsNull (ex.InnerException, "#A3");
180 Assert.IsNotNull (ex.Message, "#A4");
184 ResourceReader rr = new ResourceReader (ms);
185 IDictionaryEnumerator enumerator = rr.GetEnumerator ();
186 Assert.IsTrue (enumerator.MoveNext (), "#B1");
187 Assert.AreEqual ("Interval", enumerator.Key, "#B3");
188 Assert.AreEqual (value, enumerator.Value, "#B4");
189 Assert.IsFalse (enumerator.MoveNext (), "#B5");
194 [Test] // AddResource (string, object)
195 public void AddResource1_Name_Null ()
197 MemoryStream ms = new MemoryStream ();
198 ResourceWriter writer = new ResourceWriter (ms);
201 writer.AddResource ((string) null, new object ());
203 } catch (ArgumentNullException ex) {
204 Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
205 Assert.IsNull (ex.InnerException, "#3");
206 Assert.IsNotNull (ex.Message, "#4");
207 Assert.IsNotNull (ex.ParamName, "#5");
208 Assert.AreEqual ("name", ex.ParamName, "#6");
214 [Test] // AddResource (string, object)
215 public void AddResource1_Value_Null ()
217 MemoryStream ms = new MemoryStream ();
218 ResourceWriter writer = new ResourceWriter (ms);
219 writer.AddResource ("Name", (object) null);
223 ResourceReader rr = new ResourceReader (ms);
224 IDictionaryEnumerator enumerator = rr.GetEnumerator ();
225 Assert.IsTrue (enumerator.MoveNext (), "#1");
226 Assert.AreEqual ("Name", enumerator.Key, "#2");
227 Assert.IsNull (enumerator.Value, "#3");
228 Assert.IsFalse (enumerator.MoveNext (), "#4");
233 [Test] // AddResource (string, string)
234 public void AddResource2 ()
236 String value = "Some\0Value\tOr\rAnother";
238 MemoryStream ms = new MemoryStream ();
239 ResourceWriter writer = new ResourceWriter (ms);
240 writer.AddResource ("Text", value);
244 writer.AddResource ("Description", value);
246 } catch (InvalidOperationException ex) {
247 // The resource writer has already been closed
248 // and cannot be edited
249 Assert.AreEqual (typeof (InvalidOperationException), ex.GetType (), "#A2");
250 Assert.IsNull (ex.InnerException, "#A3");
251 Assert.IsNotNull (ex.Message, "#A4");
255 ResourceReader rr = new ResourceReader (ms);
256 IDictionaryEnumerator enumerator = rr.GetEnumerator ();
257 Assert.IsTrue (enumerator.MoveNext (), "#B1");
258 Assert.AreEqual ("Text", enumerator.Key, "#B3");
259 Assert.AreEqual (value, enumerator.Value, "#B4");
260 Assert.IsFalse (enumerator.MoveNext (), "#B5");
265 [Test] // AddResource (string, string)
266 public void AddResource2_Name_Null ()
268 MemoryStream ms = new MemoryStream ();
269 ResourceWriter writer = new ResourceWriter (ms);
272 writer.AddResource ((string) null, "abc");
274 } catch (ArgumentNullException ex) {
275 Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
276 Assert.IsNull (ex.InnerException, "#3");
277 Assert.IsNotNull (ex.Message, "#4");
278 Assert.IsNotNull (ex.ParamName, "#5");
279 Assert.AreEqual ("name", ex.ParamName, "#6");
285 [Test] // AddResource (string, string)
286 public void AddResource2_Value_Null ()
288 MemoryStream ms = new MemoryStream ();
289 ResourceWriter writer = new ResourceWriter (ms);
290 writer.AddResource ("Name", (string) null);
294 ResourceReader rr = new ResourceReader (ms);
295 IDictionaryEnumerator enumerator = rr.GetEnumerator ();
296 Assert.IsTrue (enumerator.MoveNext (), "#1");
297 Assert.AreEqual ("Name", enumerator.Key, "#2");
298 Assert.IsNull (enumerator.Value, "#3");
299 Assert.IsFalse (enumerator.MoveNext (), "#4");
305 public void AddResource_Closed ()
307 MemoryStream ms = new MemoryStream ();
308 ResourceWriter writer = new ResourceWriter (ms);
309 writer.AddResource ("Name", "Miguel");
313 writer.AddResource ("Address", "US");
315 } catch (InvalidOperationException ex) {
316 // The resource writer has already been closed
317 // and cannot be edited
318 Assert.AreEqual (typeof (InvalidOperationException), ex.GetType (), "#2");
319 Assert.IsNull (ex.InnerException, "#3");
320 Assert.IsNotNull (ex.Message, "#4");
325 public void AddResource_Name_Duplicate ()
327 MemoryStream ms = new MemoryStream ();
328 ResourceWriter writer = new ResourceWriter (ms);
329 writer.AddResource ("FirstName", "Miguel");
332 writer.AddResource ("FirstNaMe", "Chris");
334 } catch (ArgumentException ex) {
335 // Item has already been added. Key is dictionary:
336 // 'FirstName' Key being added: 'FirstNaMe'
337 Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#2");
338 Assert.IsNull (ex.InnerException, "#3");
339 Assert.IsNotNull (ex.Message, "#4");
340 Assert.IsNull (ex.ParamName, "#5");
343 writer.AddResource ("Name", "Miguel");
347 // We are using a FileStream instead of a MemoryStream
348 // to test that we support all kind of Stream instances,
349 // and not only MemoryStream, as it used to be before 4.0.
351 [Category ("MobileNotWorking")]
352 public void AddResource_Stream_Default ()
354 MemoryStream stream = new MemoryStream ();
355 byte [] buff = Encoding.Unicode.GetBytes ("Miguel");
356 stream.Write (buff, 0, buff.Length);
359 ResourceWriter rw = new ResourceWriter ("Test/resources/AddResource_Stream.resources");
360 rw.AddResource ("Name", (object)stream);
363 ResourceReader rr = new ResourceReader ("Test/resources/AddResource_Stream.resources");
364 IDictionaryEnumerator enumerator = rr.GetEnumerator ();
366 // Get the first element
367 Assert.AreEqual (true, enumerator.MoveNext (), "#A0");
369 DictionaryEntry de = enumerator.Entry;
370 Assert.AreEqual ("Name", enumerator.Key, "#A1");
371 Stream result_stream = de.Value as Stream;
372 Assert.AreEqual (true, result_stream != null, "#A2");
374 // Get the data and compare
375 byte [] result_buff = new byte [result_stream.Length];
376 result_stream.Read (result_buff, 0, result_buff.Length);
377 string string_res = Encoding.Unicode.GetString (result_buff);
378 Assert.AreEqual ("Miguel", string_res, "#A3");
385 public void AddResource_Stream_Errors ()
387 MemoryStream ms = new MemoryStream ();
388 ResourceWriter rw = new ResourceWriter (ms);
390 ResourceStream stream = new ResourceStream ("Test");
391 stream.SetCanSeek (false);
394 // Seek not supported.
397 rw.AddResource ("Name", stream);
398 Assert.Fail ("#Exc1");
399 } catch (ArgumentException) {
403 // Even using the overload taking an object
404 // seems to check for that
407 rw.AddResource ("Name", (object)stream);
408 Assert.Fail ("#Exc2");
409 } catch (ArgumentException) {
416 public void AddResource_Stream_Details ()
418 MemoryStream ms = new MemoryStream ();
419 ResourceWriter rw = new ResourceWriter (ms);
421 ResourceStream stream = new ResourceStream ("MonoTest");
423 // Set Position so we can test the ResourceWriter is resetting
424 // it to 0 when generating.
426 rw.AddResource ("Name", stream);
430 ResourceReader rr = new ResourceReader (ms);
431 string value = GetStringFromResource (rr, "Name");
432 Assert.AreEqual ("MonoTest", value, "#A1");
433 Assert.AreEqual (false, stream.IsDiposed, "#A2");
435 // Test the second overload
437 ms = new MemoryStream ();
438 rw = new ResourceWriter (ms);
439 rw.AddResource ("Name", stream, true);
443 rr = new ResourceReader (ms);
444 value = GetStringFromResource (rr, "Name");
445 Assert.AreEqual ("MonoTest", value, "#B1");
446 Assert.AreEqual (true, stream.IsDiposed, "#B2");
453 string GetStringFromResource (ResourceReader reader, string name)
457 foreach (DictionaryEntry de in reader)
458 if ((string)de.Key == name)
459 s = (Stream)de.Value;
464 byte [] buff = new byte [s.Length];
465 s.Read (buff, 0, buff.Length);
466 return Encoding.Unicode.GetString (buff, 0, buff.Length);
469 class ResourceStream : Stream
476 public ResourceStream (string src)
478 buff = Encoding.Unicode.GetBytes (src);
488 public override bool CanRead
495 public override bool CanWrite
498 throw new NotSupportedException ();
502 public override bool CanSeek
509 public void SetCanSeek (bool value)
514 public override long Position
524 public override long Length {
530 public override void SetLength (long value)
532 throw new NotSupportedException ();
535 public override void Flush ()
540 protected override void Dispose (bool disposing)
542 base.Dispose (disposing);
546 public bool IsDiposed {
552 // We are going to be returning bytes in blocks of three
553 // Just to show a slightly anormal but correct behaviour.
554 public override int Read (byte [] buffer, int offset, int count)
557 throw new ObjectDisposedException ("ResourcesStream");
559 // Check if we are done.
560 if (pos == buff.Length)
563 if (buff.Length - pos < 3)
564 count = buff.Length - pos;
568 Buffer.BlockCopy (buff, pos, buffer, offset, count);
573 public override void Write (byte [] buffer, int offset, int count)
575 throw new NotSupportedException ();
578 public override long Seek (long offset, SeekOrigin origin)
580 throw new NotSupportedException ();
585 [Category ("MobileNotWorking")]
586 public void Bug81759 ()
588 MemoryStream ms = new MemoryStream ();
589 using (ResourceReader xr = new ResourceReader (
590 "Test/resources/bug81759.resources")) {
591 ResourceWriter rw = new ResourceWriter (ms);
592 foreach (DictionaryEntry de in xr)
593 rw.AddResource ((string) de.Key, de.Value);
596 ResourceReader rr = new ResourceReader (new MemoryStream (ms.ToArray ()));
597 foreach (DictionaryEntry de in rr) {
598 Assert.AreEqual ("imageList.ImageSize", de.Key as string, "#1");
599 Assert.AreEqual ("Size", de.Value.GetType ().Name, "#2");
606 MemoryStream ms = new MemoryStream ();
607 ResourceWriter writer = new ResourceWriter (ms);
608 writer.AddResource ("Name", "Miguel");
609 Assert.IsTrue (ms.CanWrite, "#A1");
610 Assert.IsTrue (ms.GetBuffer ().Length == 0, "#A2");
612 Assert.IsFalse (ms.CanWrite, "#B1");
613 Assert.IsFalse (ms.GetBuffer ().Length == 0, "#B2");
617 [Test] // bug #339074
618 public void Close_NoResources ()
620 string tempFile = Path.Combine (Path.GetTempPath (), "test.resources");
622 ResourceWriter writer = new ResourceWriter (tempFile);
625 using (FileStream fs = File.OpenRead (tempFile)) {
626 Assert.IsFalse (fs.Length == 0, "#1");
628 using (ResourceReader reader = new ResourceReader (fs)) {
629 Assert.IsFalse (reader.GetEnumerator ().MoveNext (), "#2");
633 File.Delete (tempFile);
637 public void Generate ()
639 MemoryStream ms = new MemoryStream ();
640 ResourceWriter writer = new ResourceWriter (ms);
641 writer.AddResource ("Name", "Miguel");
642 Assert.IsTrue (ms.Length == 0, "#A1");
643 Assert.IsTrue (ms.CanWrite, "#A2");
645 Assert.IsFalse (ms.Length == 0, "#B2");
646 Assert.IsTrue (ms.CanWrite, "#B2");
651 } catch (InvalidOperationException ex) {
652 // The resource writer has already been closed
653 // and cannot be edited
654 Assert.AreEqual (typeof (InvalidOperationException), ex.GetType (), "#C2");
655 Assert.IsNull (ex.InnerException, "#C3");
656 Assert.IsNotNull (ex.Message, "#C4");
663 public void Generate_Closed ()
665 MemoryStream ms = new MemoryStream ();
666 ResourceWriter writer = new ResourceWriter (ms);
667 writer.AddResource ("Name", "Miguel");
673 } catch (InvalidOperationException ex) {
674 // The resource writer has already been closed
675 // and cannot be edited
676 Assert.AreEqual (typeof (InvalidOperationException), ex.GetType (), "#B2");
677 Assert.IsNull (ex.InnerException, "#B3");
678 Assert.IsNotNull (ex.Message, "#B4");
683 public void WriteEnum ()
685 MemoryStream ms = new MemoryStream ();
687 ResourceWriter writer = new ResourceWriter (ms);
688 writer.AddResource ("Targets", AttributeTargets.Assembly);
695 ResourceReader reader = new ResourceReader (ms);
696 foreach (DictionaryEntry de in reader) {
697 string name = de.Key as string;
698 Assert.IsNotNull (name, "#1");
699 Assert.AreEqual ("Targets", name, "#2");
700 Assert.IsNotNull (de.Value, "#3");
701 Assert.AreEqual (AttributeTargets.Assembly, de.Value, "#4");
705 Assert.IsTrue (found, "#5");