2 // System.IO.BufferedStream Unit Tests
5 // Ville Palo (vi64pa@kolumbus.fi)
6 // Sebastien Pouliot <sebastien@ximian.com>
9 // Copyright (C) 2004 Novell (http://www.novell.com)
12 using NUnit.Framework;
17 namespace MonoTests.System.IO {
20 public class BufferedStreamTest {
22 private MemoryStream mem;
25 protected void SetUp ()
27 mem = new MemoryStream ();
31 protected void TearDown ()
33 //Some tests might mess with mem, so let's check it first
42 MemoryStream str = new MemoryStream ();
43 str.Write (new byte [] {1, 2, 3, 4, 5, 6}, 0, 6);
44 BufferedStream stream = new BufferedStream (str);
46 Assert.AreEqual (true, stream.CanRead, "test#01");
47 Assert.AreEqual (true, stream.CanSeek, "test#02");
48 Assert.AreEqual (true, stream.CanWrite, "test#03");
49 Assert.AreEqual (6, stream.Length, "test#04");
50 Assert.AreEqual (6, stream.Position, "test#05");
52 string path = Path.GetTempFileName ();
53 if (File.Exists (path))
56 FileStream file = new FileStream (path, FileMode.OpenOrCreate, FileAccess.Write);
57 stream = new BufferedStream (file);
58 Assert.AreEqual (false, stream.CanRead, "test#06");
59 Assert.AreEqual (true, stream.CanSeek, "test#07");
60 Assert.AreEqual (true, stream.CanWrite, "test#08");
61 Assert.AreEqual (0, stream.Length, "test#09");
62 Assert.AreEqual (0, stream.Position, "test#10");
65 if (File.Exists (path))
68 file = new FileStream (path, FileMode.OpenOrCreate, FileAccess.Write);
69 stream = new BufferedStream (file, 12);
70 Assert.AreEqual (false, stream.CanRead, "test#11");
71 Assert.AreEqual (true, stream.CanSeek, "test#12");
72 Assert.AreEqual (true, stream.CanWrite, "test#13");
73 Assert.AreEqual (0, stream.Length, "test#14");
74 Assert.AreEqual (0, stream.Position, "test#15");
77 if (File.Exists (path))
82 /// Throws an exception if stream is null
85 [ExpectedException(typeof(ArgumentNullException))]
86 public void CtorNullExceptionStream ()
88 BufferedStream stream = new BufferedStream (null);
92 /// Throws an exception if stream is null
95 [ExpectedException(typeof(ArgumentNullException))]
96 public void CtorNullExceptionStream1 ()
98 BufferedStream stream = new BufferedStream (null, 12);
102 /// Throws an exception if stream is null
105 [ExpectedException(typeof(ArgumentOutOfRangeException))]
106 public void CtorOutOfRangeExceptionStream1 ()
108 MemoryStream str = new MemoryStream ();
109 BufferedStream stream = new BufferedStream (str, -12);
114 [ExpectedException(typeof(ObjectDisposedException))]
115 public void CtorOutOfRangeException2 ()
117 MemoryStream str = new MemoryStream ();
119 BufferedStream stream = new BufferedStream (str);
123 public void Close1 ()
125 BufferedStream stream = new BufferedStream (mem);
131 public void Close2 ()
133 BufferedStream stream = new BufferedStream (mem);
135 Assert.AreEqual (false, stream.CanRead, "test#01");
136 Assert.AreEqual (false, stream.CanSeek, "test#02");
137 Assert.AreEqual (false, stream.CanWrite, "test#03");
141 [ExpectedException(typeof(ObjectDisposedException))]
142 public void Close3 ()
144 BufferedStream stream = new BufferedStream (mem);
146 long l = stream.Position;
150 [ExpectedException(typeof(ObjectDisposedException))]
151 public void Close4 ()
153 BufferedStream stream = new BufferedStream (mem);
155 long l = stream.Length;
159 [ExpectedException(typeof(ObjectDisposedException))]
160 public void Close5 ()
162 BufferedStream stream = new BufferedStream (mem);
164 stream.WriteByte (1);
168 [ExpectedException(typeof(ObjectDisposedException))]
169 public void Close6 ()
171 BufferedStream stream = new BufferedStream (mem);
177 [ExpectedException(typeof(NotSupportedException))]
178 public void Close7 ()
180 BufferedStream stream = new BufferedStream (mem);
182 stream.WriteByte (1);
188 mem.Write (new byte [] {0, 1, 2, 3, 4, 5, 6, 7}, 0, 8);
189 BufferedStream stream = new BufferedStream (mem);
191 byte [] bytes = new byte [10];
192 stream.Read (bytes, 0, 3);
193 Assert.AreEqual (0, bytes [0], "test#01");
194 Assert.AreEqual (0, bytes [1], "test#02");
195 Assert.AreEqual (0, bytes [2], "test#03");
197 stream.Seek (0, SeekOrigin.Begin);
198 stream.Read (bytes, 0, 3);
199 Assert.AreEqual (0, bytes [0], "test#04");
200 Assert.AreEqual (1, bytes [1], "test#05");
201 Assert.AreEqual (2, bytes [2], "test#06");
202 Assert.AreEqual (0, bytes [0], "test#07");
204 stream.Read (bytes, 5, 3);
205 Assert.AreEqual (3, bytes [5], "test#08");
206 Assert.AreEqual (4, bytes [6], "test#09");
207 Assert.AreEqual (5, bytes [7], "test#10");
208 Assert.AreEqual (0, bytes [8], "test#11");
210 stream.Read (bytes, 0, 10);
211 Assert.AreEqual (3, bytes [5], "test#12");
212 Assert.AreEqual (4, bytes [6], "test#13");
213 Assert.AreEqual (5, bytes [7], "test#14");
214 Assert.AreEqual (0, bytes [9], "test#15");
218 [ExpectedException(typeof(ArgumentException))]
219 public void ReadException ()
221 mem.Write (new byte [] {0, 1, 2, 3, 4, 5, 6, 7}, 0, 8);
222 BufferedStream stream = new BufferedStream (mem);
224 byte [] bytes = new byte [10];
225 stream.Read (bytes, 0, 30);
229 [ExpectedException(typeof(ArgumentNullException))]
230 public void Read_Null ()
232 BufferedStream stream = new BufferedStream (mem);
233 stream.Read (null, 0, 0);
237 [ExpectedException(typeof(NotSupportedException))]
238 public void Read_CantRead ()
240 WriteOnlyStream wo = new WriteOnlyStream ();
241 BufferedStream stream = new BufferedStream (wo);
242 stream.Read (new byte [1], 0, 1);
246 [ExpectedException(typeof(NotSupportedException))]
247 public void ReadByte_CantRead ()
249 WriteOnlyStream wo = new WriteOnlyStream ();
250 BufferedStream stream = new BufferedStream (wo);
255 [ExpectedException(typeof(ArgumentOutOfRangeException))]
256 public void Read_OffsetNegative ()
258 BufferedStream stream = new BufferedStream (mem);
259 stream.Read (new byte [1], -1, 1);
263 [ExpectedException(typeof(ArgumentException))]
264 public void Read_OffsetOverflow ()
266 BufferedStream stream = new BufferedStream (mem);
267 stream.Read (new byte [1], Int32.MaxValue, 1);
271 [ExpectedException(typeof(ArgumentOutOfRangeException))]
272 public void Read_CountNegative ()
274 BufferedStream stream = new BufferedStream (mem);
275 stream.Read (new byte [1], 1, -1);
279 [ExpectedException(typeof(ArgumentException))]
280 public void Read_CountOverflow ()
282 BufferedStream stream = new BufferedStream (mem);
283 stream.Read (new byte [1], 1, Int32.MaxValue);
287 public void ReadByte ()
289 mem.Write (new byte [] {0, 1, 2, 3, 4, 5, 6, 7}, 0, 8);
290 BufferedStream stream = new BufferedStream (mem);
292 Assert.AreEqual (-1, stream.ReadByte (), "test#01");
293 Assert.AreEqual (-1, stream.ReadByte (), "test#02");
294 Assert.AreEqual (-1, stream.ReadByte (), "test#03");
296 stream.Seek (0, SeekOrigin.Begin);
297 Assert.AreEqual (0, stream.ReadByte (), "test#04");
298 Assert.AreEqual (1, stream.ReadByte (), "test#05");
299 Assert.AreEqual (2, stream.ReadByte (), "test#06");
300 Assert.AreEqual (3, stream.ReadByte (), "test#07");
306 BufferedStream stream = new BufferedStream (mem);
308 stream.Write (new byte [] {0, 1, 2, 3, 4}, 0, 4);
309 Assert.AreEqual (4, stream.Length, "test#01");
310 byte [] bytes = mem.GetBuffer ();
311 Assert.AreEqual (0, bytes [0], "test#02");
312 Assert.AreEqual (1, bytes [1], "test#03");
313 Assert.AreEqual (2, bytes [2], "test#04");
314 Assert.AreEqual (3, bytes [3], "test#05");
316 bytes = new byte [] {1, 4, 3};
317 stream.Write (bytes, 0, 3);
319 bytes = mem.GetBuffer ();
320 Assert.AreEqual (0, bytes [0], "test#06");
321 Assert.AreEqual (1, bytes [1], "test#07");
322 Assert.AreEqual (2, bytes [2], "test#08");
323 Assert.AreEqual (3, bytes [3], "test#09");
324 Assert.AreEqual (1, bytes [4], "test#10");
325 Assert.AreEqual (4, bytes [5], "test#11");
326 Assert.AreEqual (3, bytes [6], "test#10");
327 Assert.AreEqual (0, bytes [7], "test#11");
328 Assert.AreEqual (7, stream.Length, "test#12");
332 [ExpectedException(typeof (ArgumentException))]
333 public void WriteException ()
335 BufferedStream stream = new BufferedStream (mem);
336 stream.Write (new byte [] {0,1,2,3}, 0, 10);
340 [ExpectedException(typeof(ArgumentNullException))]
341 public void Write_Null ()
343 BufferedStream stream = new BufferedStream (mem);
344 stream.Write (null, 0, 0);
348 [ExpectedException(typeof(NotSupportedException))]
349 public void Write_CantWrite ()
351 ReadOnlyStream ro = new ReadOnlyStream ();
352 BufferedStream stream = new BufferedStream (ro);
353 stream.Write (new byte [1], 0, 1);
357 [ExpectedException(typeof(NotSupportedException))]
358 public void WriteByte_CantWrite ()
360 ReadOnlyStream ro = new ReadOnlyStream ();
361 BufferedStream stream = new BufferedStream (ro);
362 stream.WriteByte (0);
366 [ExpectedException(typeof(ArgumentOutOfRangeException))]
367 public void Write_OffsetNegative ()
369 BufferedStream stream = new BufferedStream (mem);
370 stream.Write (new byte [1], -1, 1);
374 [ExpectedException(typeof(ArgumentException))]
375 public void Write_OffsetOverflow ()
377 BufferedStream stream = new BufferedStream (mem);
378 stream.Write (new byte [1], Int32.MaxValue, 1);
382 [ExpectedException(typeof(ArgumentOutOfRangeException))]
383 public void Write_CountNegative ()
385 BufferedStream stream = new BufferedStream (mem);
386 stream.Write (new byte [1], 1, -1);
390 [ExpectedException(typeof(ArgumentException))]
391 public void Write_CountOverflow ()
393 BufferedStream stream = new BufferedStream (mem);
394 stream.Write (new byte [1], 1, Int32.MaxValue);
398 public void WriteByte ()
400 BufferedStream stream = new BufferedStream (mem);
401 stream.WriteByte (1);
402 stream.WriteByte (2);
403 stream.WriteByte (3);
405 Assert.AreEqual (256, mem.GetBuffer ().Length, "test#01");
406 Assert.AreEqual (3, stream.Length, "test#02");
407 Assert.AreEqual (1, mem.GetBuffer () [0], "test#03");
408 Assert.AreEqual (2, mem.GetBuffer () [1], "test#04");
409 Assert.AreEqual (3, mem.GetBuffer () [2], "test#05");
415 BufferedStream stream = new BufferedStream (mem);
416 stream.WriteByte (1);
417 stream.WriteByte (2);
419 byte [] bytes = mem.GetBuffer ();
420 Assert.AreEqual (0, bytes.Length, "test#01");
423 bytes = mem.GetBuffer ();
424 Assert.AreEqual (256, bytes.Length, "test#02");
425 Assert.AreEqual (1, bytes [0], "test#03");
426 Assert.AreEqual (2, bytes [1], "test#04");
428 mem = new MemoryStream ();
429 bytes = new byte [] {0, 1, 2, 3, 4, 5};
430 stream = new BufferedStream (mem);
431 stream.Write (bytes, 0, 2);
432 Assert.AreEqual (2, stream.Length, "test#05");
433 bytes = mem.GetBuffer ();
434 Assert.AreEqual (256, bytes.Length, "test#06");
436 Assert.AreEqual (0, bytes [0], "test#07");
437 Assert.AreEqual (1, bytes [1], "test#08");
439 stream.Write (bytes, 0, 2);
441 bytes = mem.GetBuffer ();
442 Assert.AreEqual (0, bytes [0], "test#09");
443 Assert.AreEqual (1, bytes [1], "test#10");
444 Assert.AreEqual (0, bytes [2], "test#11");
445 Assert.AreEqual (0, bytes [3], "test#12");
447 bytes = mem.GetBuffer ();
448 Assert.AreEqual (0, bytes [2], "test#13");
449 Assert.AreEqual (1, bytes [3], "test#14");
455 BufferedStream stream = new BufferedStream (mem);
456 stream.Write (new byte [] {0, 1, 2, 3, 4, 5}, 0, 6);
458 Assert.AreEqual (6, stream.Position, "test#01");
460 stream.Seek (-5, SeekOrigin.End);
461 Assert.AreEqual (1, stream.Position, "test#02");
463 stream.Seek (3, SeekOrigin.Current);
464 Assert.AreEqual (4, stream.Position, "test#03");
466 stream.Seek (300, SeekOrigin.Current);
467 Assert.AreEqual (304, stream.Position, "test#04");
471 [ExpectedException(typeof (IOException))]
472 public void SeekException ()
474 BufferedStream stream = new BufferedStream (mem);
475 stream.Seek (-1, SeekOrigin.Begin);
479 public void SetLength ()
481 BufferedStream stream = new BufferedStream (mem);
482 stream.Write (new byte [] {0,1,2,3,4,5}, 0, 6);
484 Assert.AreEqual (6, stream.Length, "test#01");
485 stream.SetLength (60);
486 Assert.AreEqual (60, stream.Length, "test#02");
488 stream.SetLength (2);
489 Assert.AreEqual (2, stream.Length, "test#03");
493 [ExpectedException(typeof(ArgumentOutOfRangeException))]
494 public void SetLengthException ()
496 BufferedStream stream = new BufferedStream (mem);
497 stream.SetLength (-1);
501 [ExpectedException(typeof(NotSupportedException))]
502 public void SetLengthException2 ()
504 BufferedStream stream = new BufferedStream (mem);
506 stream.SetLength (1);
510 public void SetLengthException3 ()
512 BufferedStream stream = new BufferedStream (mem);
514 // Strangely, this does not throw an exception on .NET 1.1
515 stream.SetLength (1);
519 public void Position ()
521 mem = new MemoryStream ();
522 BufferedStream stream = new BufferedStream (mem,5);
523 stream.Write (new byte [] {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}, 0, 16);
526 Assert.AreEqual (0, stream.Position, "test#01");
527 Assert.AreEqual (0, stream.ReadByte (), "test#02");
530 Assert.AreEqual (5, stream.Position, "test#01");
531 Assert.AreEqual (5, stream.ReadByte (), "test#02");
533 // Should not need to read from the underlying stream:
535 Assert.AreEqual (7, stream.Position, "test#01");
536 Assert.AreEqual (7, stream.ReadByte (), "test#02");
538 // Should not need to read from the underlying stream:
540 Assert.AreEqual (5, stream.Position, "test#01");
541 Assert.AreEqual (5, stream.ReadByte (), "test#02");
543 // Should not need to read from the underlying stream:
545 Assert.AreEqual (9, stream.Position, "test#01");
546 Assert.AreEqual (9, stream.ReadByte (), "test#02");
548 stream.Position = 10;
549 Assert.AreEqual (10, stream.Position, "test#01");
550 Assert.AreEqual (10, stream.ReadByte (), "test#02");
553 Assert.AreEqual (9, stream.Position, "test#01");
554 Assert.AreEqual (9, stream.ReadByte (), "test#02");
558 public void PositionAfterSetLength ()
560 BufferedStream stream = new BufferedStream (new MemoryStream ());
561 stream.SetLength (32);
562 stream.Position = 32;
563 stream.SetLength (16);
564 Assert.AreEqual (16, stream.Position, "Position==16");
568 [ExpectedException (typeof (ObjectDisposedException))]
569 public void SetLength_Disposed ()
571 BufferedStream stream = new BufferedStream (new MemoryStream ());
573 stream.SetLength (16);
577 [ExpectedException (typeof (NotSupportedException))]
578 public void Seek_ClosedMemoryStream ()
580 MemoryStream ms = new MemoryStream ();
581 BufferedStream stream = new BufferedStream (ms);
583 stream.Seek (0, SeekOrigin.Begin);
587 [ExpectedException (typeof (ObjectDisposedException))]
588 public void Seek_ClosedBufferedStream ()
590 BufferedStream stream = new BufferedStream (new MemoryStream ());
592 stream.Seek (0, SeekOrigin.Begin);