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(ArgumentOutOfRangeException))]
247 public void Read_OffsetNegative ()
249 BufferedStream stream = new BufferedStream (mem);
250 stream.Read (new byte [1], -1, 1);
254 [ExpectedException(typeof(ArgumentException))]
255 public void Read_OffsetOverflow ()
257 BufferedStream stream = new BufferedStream (mem);
258 stream.Read (new byte [1], Int32.MaxValue, 1);
262 [ExpectedException(typeof(ArgumentOutOfRangeException))]
263 public void Read_CountNegative ()
265 BufferedStream stream = new BufferedStream (mem);
266 stream.Read (new byte [1], 1, -1);
270 [ExpectedException(typeof(ArgumentException))]
271 public void Read_CountOverflow ()
273 BufferedStream stream = new BufferedStream (mem);
274 stream.Read (new byte [1], 1, Int32.MaxValue);
278 public void ReadByte ()
280 mem.Write (new byte [] {0, 1, 2, 3, 4, 5, 6, 7}, 0, 8);
281 BufferedStream stream = new BufferedStream (mem);
283 Assert.AreEqual (-1, stream.ReadByte (), "test#01");
284 Assert.AreEqual (-1, stream.ReadByte (), "test#02");
285 Assert.AreEqual (-1, stream.ReadByte (), "test#03");
287 stream.Seek (0, SeekOrigin.Begin);
288 Assert.AreEqual (0, stream.ReadByte (), "test#04");
289 Assert.AreEqual (1, stream.ReadByte (), "test#05");
290 Assert.AreEqual (2, stream.ReadByte (), "test#06");
291 Assert.AreEqual (3, stream.ReadByte (), "test#07");
297 BufferedStream stream = new BufferedStream (mem);
299 stream.Write (new byte [] {0, 1, 2, 3, 4}, 0, 4);
300 Assert.AreEqual (4, stream.Length, "test#01");
301 byte [] bytes = mem.GetBuffer ();
302 Assert.AreEqual (0, bytes [0], "test#02");
303 Assert.AreEqual (1, bytes [1], "test#03");
304 Assert.AreEqual (2, bytes [2], "test#04");
305 Assert.AreEqual (3, bytes [3], "test#05");
307 bytes = new byte [] {1, 4, 3};
308 stream.Write (bytes, 0, 3);
310 bytes = mem.GetBuffer ();
311 Assert.AreEqual (0, bytes [0], "test#06");
312 Assert.AreEqual (1, bytes [1], "test#07");
313 Assert.AreEqual (2, bytes [2], "test#08");
314 Assert.AreEqual (3, bytes [3], "test#09");
315 Assert.AreEqual (1, bytes [4], "test#10");
316 Assert.AreEqual (4, bytes [5], "test#11");
317 Assert.AreEqual (3, bytes [6], "test#10");
318 Assert.AreEqual (0, bytes [7], "test#11");
319 Assert.AreEqual (7, stream.Length, "test#12");
323 [ExpectedException(typeof (ArgumentException))]
324 public void WriteException ()
326 BufferedStream stream = new BufferedStream (mem);
327 stream.Write (new byte [] {0,1,2,3}, 0, 10);
331 [ExpectedException(typeof(ArgumentNullException))]
332 public void Write_Null ()
334 BufferedStream stream = new BufferedStream (mem);
335 stream.Write (null, 0, 0);
339 [ExpectedException(typeof(NotSupportedException))]
340 public void Write_CantWrite ()
342 ReadOnlyStream ro = new ReadOnlyStream ();
343 BufferedStream stream = new BufferedStream (ro);
344 stream.Write (new byte [1], 0, 1);
348 [ExpectedException(typeof(ArgumentOutOfRangeException))]
349 public void Write_OffsetNegative ()
351 BufferedStream stream = new BufferedStream (mem);
352 stream.Write (new byte [1], -1, 1);
356 [ExpectedException(typeof(ArgumentException))]
357 public void Write_OffsetOverflow ()
359 BufferedStream stream = new BufferedStream (mem);
360 stream.Write (new byte [1], Int32.MaxValue, 1);
364 [ExpectedException(typeof(ArgumentOutOfRangeException))]
365 public void Write_CountNegative ()
367 BufferedStream stream = new BufferedStream (mem);
368 stream.Write (new byte [1], 1, -1);
372 [ExpectedException(typeof(ArgumentException))]
373 public void Write_CountOverflow ()
375 BufferedStream stream = new BufferedStream (mem);
376 stream.Write (new byte [1], 1, Int32.MaxValue);
380 public void WriteByte ()
382 BufferedStream stream = new BufferedStream (mem);
383 stream.WriteByte (1);
384 stream.WriteByte (2);
385 stream.WriteByte (3);
387 Assert.AreEqual (256, mem.GetBuffer ().Length, "test#01");
388 Assert.AreEqual (3, stream.Length, "test#02");
389 Assert.AreEqual (1, mem.GetBuffer () [0], "test#03");
390 Assert.AreEqual (2, mem.GetBuffer () [1], "test#04");
391 Assert.AreEqual (3, mem.GetBuffer () [2], "test#05");
397 BufferedStream stream = new BufferedStream (mem);
398 stream.WriteByte (1);
399 stream.WriteByte (2);
401 byte [] bytes = mem.GetBuffer ();
402 Assert.AreEqual (0, bytes.Length, "test#01");
405 bytes = mem.GetBuffer ();
406 Assert.AreEqual (256, bytes.Length, "test#02");
407 Assert.AreEqual (1, bytes [0], "test#03");
408 Assert.AreEqual (2, bytes [1], "test#04");
410 mem = new MemoryStream ();
411 bytes = new byte [] {0, 1, 2, 3, 4, 5};
412 stream = new BufferedStream (mem);
413 stream.Write (bytes, 0, 2);
414 Assert.AreEqual (2, stream.Length, "test#05");
415 bytes = mem.GetBuffer ();
416 Assert.AreEqual (256, bytes.Length, "test#06");
418 Assert.AreEqual (0, bytes [0], "test#07");
419 Assert.AreEqual (1, bytes [1], "test#08");
421 stream.Write (bytes, 0, 2);
423 bytes = mem.GetBuffer ();
424 Assert.AreEqual (0, bytes [0], "test#09");
425 Assert.AreEqual (1, bytes [1], "test#10");
426 Assert.AreEqual (0, bytes [2], "test#11");
427 Assert.AreEqual (0, bytes [3], "test#12");
429 bytes = mem.GetBuffer ();
430 Assert.AreEqual (0, bytes [2], "test#13");
431 Assert.AreEqual (1, bytes [3], "test#14");
437 BufferedStream stream = new BufferedStream (mem);
438 stream.Write (new byte [] {0, 1, 2, 3, 4, 5}, 0, 6);
440 Assert.AreEqual (6, stream.Position, "test#01");
442 stream.Seek (-5, SeekOrigin.End);
443 Assert.AreEqual (1, stream.Position, "test#02");
445 stream.Seek (3, SeekOrigin.Current);
446 Assert.AreEqual (4, stream.Position, "test#03");
448 stream.Seek (300, SeekOrigin.Current);
449 Assert.AreEqual (304, stream.Position, "test#04");
453 [ExpectedException(typeof (IOException))]
454 public void SeekException ()
456 BufferedStream stream = new BufferedStream (mem);
457 stream.Seek (-1, SeekOrigin.Begin);
461 public void SetLength ()
463 BufferedStream stream = new BufferedStream (mem);
464 stream.Write (new byte [] {0,1,2,3,4,5}, 0, 6);
466 Assert.AreEqual (6, stream.Length, "test#01");
467 stream.SetLength (60);
468 Assert.AreEqual (60, stream.Length, "test#02");
470 stream.SetLength (2);
471 Assert.AreEqual (2, stream.Length, "test#03");
475 [ExpectedException(typeof(ArgumentOutOfRangeException))]
476 public void SetLengthException ()
478 BufferedStream stream = new BufferedStream (mem);
479 stream.SetLength (-1);
483 [ExpectedException(typeof(NotSupportedException))]
484 public void SetLengthException2 ()
486 BufferedStream stream = new BufferedStream (mem);
488 stream.SetLength (1);
492 public void SetLengthException3 ()
494 BufferedStream stream = new BufferedStream (mem);
496 // Strangely, this does not throw an exception on .NET 1.1
497 stream.SetLength (1);
501 public void Position ()
503 mem = new MemoryStream ();
504 BufferedStream stream = new BufferedStream (mem,5);
505 stream.Write (new byte [] {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}, 0, 16);
508 Assert.AreEqual (0, stream.Position, "test#01");
509 Assert.AreEqual (0, stream.ReadByte (), "test#02");
512 Assert.AreEqual (5, stream.Position, "test#01");
513 Assert.AreEqual (5, stream.ReadByte (), "test#02");
515 // Should not need to read from the underlying stream:
517 Assert.AreEqual (7, stream.Position, "test#01");
518 Assert.AreEqual (7, stream.ReadByte (), "test#02");
520 // Should not need to read from the underlying stream:
522 Assert.AreEqual (5, stream.Position, "test#01");
523 Assert.AreEqual (5, stream.ReadByte (), "test#02");
525 // Should not need to read from the underlying stream:
527 Assert.AreEqual (9, stream.Position, "test#01");
528 Assert.AreEqual (9, stream.ReadByte (), "test#02");
530 stream.Position = 10;
531 Assert.AreEqual (10, stream.Position, "test#01");
532 Assert.AreEqual (10, stream.ReadByte (), "test#02");
535 Assert.AreEqual (9, stream.Position, "test#01");
536 Assert.AreEqual (9, stream.ReadByte (), "test#02");
540 public void PositionAfterSetLength ()
542 BufferedStream stream = new BufferedStream (new MemoryStream ());
543 stream.SetLength (32);
544 stream.Position = 32;
545 stream.SetLength (16);
546 Assert.AreEqual (16, stream.Position, "Position==16");
550 [ExpectedException (typeof (ObjectDisposedException))]
551 public void SetLength_Disposed ()
553 BufferedStream stream = new BufferedStream (new MemoryStream ());
555 stream.SetLength (16);
559 [ExpectedException (typeof (NotSupportedException))]
560 public void Seek_ClosedMemoryStream ()
562 MemoryStream ms = new MemoryStream ();
563 BufferedStream stream = new BufferedStream (ms);
565 stream.Seek (0, SeekOrigin.Begin);
569 [ExpectedException (typeof (ObjectDisposedException))]
570 public void Seek_ClosedBufferedStream ()
572 BufferedStream stream = new BufferedStream (new MemoryStream ());
574 stream.Seek (0, SeekOrigin.Begin);