2 // System.IO.StringWriter
5 // Marcin Szczepanski (marcins@zipworld.com.au)
6 // Gonzalo Paniagua Javier (gonzalo@ximian.com)
8 // (c) 2003 Ximian, Inc. (http://www.ximian.com)
11 using NUnit.Framework;
16 namespace MonoTests.System.IO
19 public class MemoryStreamTest
21 MemoryStream testStream;
22 byte [] testStreamData;
27 testStreamData = new byte [100];
29 for (int i = 0; i < 100; i++)
30 testStreamData[i] = (byte) (100 - i);
32 testStream = new MemoryStream (testStreamData);
36 // Verify that the first count bytes in testBytes are the same as
37 // the count bytes from index start in testStreamData
39 void VerifyTestData (string id, byte [] testBytes, int start, int count)
41 if (testBytes == null)
42 Assertion.Fail (id + "+1 testBytes is null");
46 start + count > testStreamData.Length ||
47 start > testStreamData.Length)
48 throw new ArgumentOutOfRangeException (id + "+2");
50 for (int test = 0; test < count; test++) {
51 if (testBytes [test] == testStreamData [start + test])
54 string failStr = "testByte {0} (testStream {1}) was <{2}>, expecting <{3}>";
55 failStr = String.Format (failStr,
59 testStreamData [start + test]);
60 Assertion.Fail (id + "-3" + failStr);
65 public void ConstructorsOne ()
67 MemoryStream ms = new MemoryStream();
69 Assertion.AssertEquals ("#01", 0L, ms.Length);
70 Assertion.AssertEquals ("#02", 0, ms.Capacity);
71 Assertion.AssertEquals ("#03", true, ms.CanWrite);
75 public void ConstructorsTwo ()
77 MemoryStream ms = new MemoryStream (10);
79 Assertion.AssertEquals ("#01", 0L, ms.Length);
80 Assertion.AssertEquals ("#02", 10, ms.Capacity);
82 byte [] buffer = ms.GetBuffer ();
84 Assertion.AssertEquals ("#03", -1, ms.ReadByte ());
85 Assertion.AssertEquals ("#04", null, buffer); // <--
86 ms.Read (new byte [5], 0, 5);
87 Assertion.AssertEquals ("#05", 0, ms.Position);
88 Assertion.AssertEquals ("#06", 0, ms.Length);
93 public void ConstructorsThree ()
95 MemoryStream ms = new MemoryStream (testStreamData);
96 Assertion.AssertEquals ("#01", 100, ms.Length);
97 Assertion.AssertEquals ("#02", 0, ms.Position);
101 public void ConstructorsFour ()
103 MemoryStream ms = new MemoryStream (testStreamData, true);
104 Assertion.AssertEquals ("#01", 100, ms.Length);
105 Assertion.AssertEquals ("#02", 0, ms.Position);
107 byte saved = testStreamData [50];
110 Assertion.AssertEquals ("#03", testStreamData [50], 23);
112 testStreamData [50] = saved;
117 } catch (Exception) {
120 Assertion.Fail ("#04");
124 public void ConstructorsFive ()
126 MemoryStream ms = new MemoryStream (testStreamData, 50, 50);
127 Assertion.AssertEquals ("#01", 50, ms.Length);
128 Assertion.AssertEquals ("#02", 0, ms.Position);
129 Assertion.AssertEquals ("#03", 50, ms.Capacity);
131 byte saved = testStreamData [51];
134 Assertion.AssertEquals ("#04", testStreamData [51], 23);
136 testStreamData [51] = saved;
139 bool gotException = false;
142 } catch (NotSupportedException) {
147 Assertion.Fail ("#05");
149 gotException = false;
152 } catch (UnauthorizedAccessException) {
157 Assertion.Fail ("#06");
159 ms.Capacity = 100; // Allowed. It's the same as the one in the ms.
160 // This is lame, as the length is 50!!!
162 gotException = false;
165 } catch (NotSupportedException) {
170 Assertion.Fail ("#07");
172 Assertion.AssertEquals ("#08", 50, ms.ToArray ().Length);
176 [ExpectedException (typeof (ArgumentOutOfRangeException))]
177 public void ConstructorsSix ()
179 MemoryStream ms = new MemoryStream (-2);
185 byte [] readBytes = new byte [20];
187 /* Test simple read */
188 testStream.Read (readBytes, 0, 10);
189 VerifyTestData ("R1", readBytes, 0, 10);
191 /* Seek back to beginning */
193 testStream.Seek (0, SeekOrigin.Begin);
195 /* Read again, bit more this time */
196 testStream.Read (readBytes, 0, 20);
197 VerifyTestData ("R2", readBytes, 0, 20);
199 /* Seek to 20 bytes from End */
200 testStream.Seek (-20, SeekOrigin.End);
201 testStream.Read (readBytes, 0, 20);
202 VerifyTestData ("R3", readBytes, 80, 20);
204 int readByte = testStream.ReadByte();
205 Assertion.AssertEquals (-1, readByte);
209 public void WriteBytes ()
211 byte[] readBytes = new byte[100];
213 MemoryStream ms = new MemoryStream (100);
215 for (int i = 0; i < 100; i++)
216 ms.WriteByte (testStreamData [i]);
218 ms.Seek (0, SeekOrigin.Begin);
219 testStream.Read (readBytes, 0, 100);
220 VerifyTestData ("W1", readBytes, 0, 100);
224 public void WriteBlock ()
226 byte[] readBytes = new byte[100];
228 MemoryStream ms = new MemoryStream (100);
230 ms.Write (testStreamData, 0, 100);
231 ms.Seek (0, SeekOrigin.Begin);
232 testStream.Read (readBytes, 0, 100);
233 VerifyTestData ("WB1", readBytes, 0, 100);
234 byte[] arrayBytes = testStream.ToArray();
235 Assertion.AssertEquals ("#01", 100, arrayBytes.Length);
236 VerifyTestData ("WB2", arrayBytes, 0, 100);
240 public void PositionLength ()
242 MemoryStream ms = new MemoryStream ();
244 ms.WriteByte ((byte) 'M');
245 ms.WriteByte ((byte) 'O');
246 Assertion.AssertEquals ("#01", 6, ms.Length);
247 Assertion.AssertEquals ("#02", 6, ms.Position);
249 Assertion.AssertEquals ("#03", 0, ms.Position);
253 [ExpectedException (typeof (NotSupportedException))]
254 public void MorePositionLength ()
256 MemoryStream ms = new MemoryStream (testStreamData);
258 Assertion.AssertEquals ("#01", 101, ms.Position);
259 Assertion.AssertEquals ("#02", 100, ms.Length);
260 ms.WriteByte (1); // This should throw the exception
264 public void GetBufferOne ()
266 MemoryStream ms = new MemoryStream ();
267 byte [] buffer = ms.GetBuffer ();
268 Assertion.AssertEquals ("#01", 0, buffer.Length);
272 public void GetBufferTwo ()
274 MemoryStream ms = new MemoryStream (100);
275 byte [] buffer = ms.GetBuffer ();
276 Assertion.AssertEquals ("#01", 100, buffer.Length);
278 ms.Write (testStreamData, 0, 100);
279 ms.Write (testStreamData, 0, 100);
280 Assertion.AssertEquals ("#02", 200, ms.Length);
281 buffer = ms.GetBuffer ();
282 Assertion.AssertEquals ("#03", 256, buffer.Length); // Minimun size after writing
286 public void Closed ()
288 MemoryStream ms = new MemoryStream (100);
293 } catch (ObjectDisposedException) {
298 Assertion.Fail ("#01");
303 } catch (ObjectDisposedException) {
308 Assertion.Fail ("#02");
310 // The first exception thrown is ObjectDisposed, not ArgumentNull
313 ms.Read (null, 0, 1);
314 } catch (ObjectDisposedException) {
319 Assertion.Fail ("#03");
323 ms.Write (null, 0, 1);
324 } catch (ObjectDisposedException) {
329 Assertion.Fail ("#03");
335 MemoryStream ms = new MemoryStream (100);
336 ms.Write (testStreamData, 0, 100);
337 ms.Seek (0, SeekOrigin.Begin);
339 ms.Seek (-50, SeekOrigin.Current);
340 ms.Seek (-50, SeekOrigin.End);
345 ms.Seek (-50, SeekOrigin.Current);
346 } catch (IOException) {
350 Assertion.Fail ("#01");
354 ms.Seek (Int64.MaxValue, SeekOrigin.Begin);
355 } catch (ArgumentOutOfRangeException) {
360 Assertion.Fail ("#02");
364 // Oh, yes. They throw IOException for this one, but ArgumentOutOfRange for the previous one
365 ms.Seek (Int64.MinValue, SeekOrigin.Begin);
366 } catch (IOException) {
371 Assertion.Fail ("#03");
373 ms=new MemoryStream (256);
375 ms.Write (testStreamData, 0, 100);
377 Assertion.AssertEquals ("#01", 100, ms.Length);
378 Assertion.AssertEquals ("#02", 0, ms.Position);
381 Assertion.AssertEquals ("#03", 100, ms.Length);
382 Assertion.AssertEquals ("#04", 128, ms.Position);
385 Assertion.AssertEquals ("#05", 100, ms.Length);
386 Assertion.AssertEquals ("#06", 768, ms.Position);
389 Assertion.AssertEquals ("#07", 769, ms.Length);
390 Assertion.AssertEquals ("#08", 769, ms.Position);
394 public void SetLength ()
396 MemoryStream ms = new MemoryStream ();
397 ms.Write (testStreamData, 0, 100);
400 Assertion.AssertEquals ("#01", 150, ms.Length);
401 Assertion.AssertEquals ("#02", 100, ms.Position);
403 Assertion.AssertEquals ("#03", 80, ms.Length);
404 Assertion.AssertEquals ("#04", 80, ms.Position);
408 [ExpectedException (typeof (NotSupportedException))]
409 public void WriteNonWritable ()
411 MemoryStream ms = new MemoryStream (testStreamData, false);
412 ms.Write (testStreamData, 0, 100);
416 [ExpectedException (typeof (NotSupportedException))]
417 public void WriteExpand ()
419 MemoryStream ms = new MemoryStream (testStreamData);
420 ms.Write (testStreamData, 0, 100);
421 ms.Write (testStreamData, 0, 100); // This one throws the exception
425 public void WriteByte ()
427 MemoryStream ms = new MemoryStream (100);
428 ms.Write (testStreamData, 0, 100);
431 Assertion.AssertEquals ("#01", 101, ms.Position);
432 Assertion.AssertEquals ("#02", 101, ms.Length);
433 Assertion.AssertEquals ("#03", 256, ms.Capacity);
434 ms.Write (testStreamData, 0, 100);
435 ms.Write (testStreamData, 0, 100);
437 Assertion.AssertEquals ("#04", 301, ms.Position);
438 Assertion.AssertEquals ("#05", 301, ms.Length);
439 Assertion.AssertEquals ("#06", 512, ms.Capacity);
443 public void WriteLengths () {
444 MemoryStream ms=new MemoryStream (256);
445 BinaryWriter writer=new BinaryWriter (ms);
447 writer.Write ((byte)'1');
448 Assertion.AssertEquals ("#01", 1, ms.Length);
449 Assertion.AssertEquals ("#02", 256, ms.Capacity);
451 writer.Write ((ushort)0);
452 Assertion.AssertEquals ("#03", 3, ms.Length);
453 Assertion.AssertEquals ("#04", 256, ms.Capacity);
455 writer.Write (testStreamData, 0, 23);
456 Assertion.AssertEquals ("#05", 26, ms.Length);
457 Assertion.AssertEquals ("#06", 256, ms.Capacity);
459 writer.Write (testStreamData);
460 writer.Write (testStreamData);
461 writer.Write (testStreamData);
462 Assertion.AssertEquals ("#07", 326, ms.Length);