2 // System.IO.StringWriter
5 // Ville Palo (vi64pa@kolumbus.fi)
10 using NUnit.Framework;
15 namespace MonoTests.System.IO {
18 public class BinaryWriterTest {
19 sealed class MyBinaryWriter : BinaryWriter
21 public MyBinaryWriter (Stream stream)
25 public void WriteLeb128 (int value)
27 base.Write7BitEncodedInt (value);
31 string TempFolder = Path.Combine (Path.GetTempPath (), "MonoTests.System.IO.Tests");
34 protected void SetUp() {
35 if (Directory.Exists (TempFolder))
36 Directory.Delete (TempFolder, true);
37 Directory.CreateDirectory (TempFolder);
41 public void TearDown()
43 if (Directory.Exists (TempFolder))
44 Directory.Delete (TempFolder, true);
50 MemoryStream stream = new MemoryStream ();
51 BinaryWriter writer = new BinaryWriter (stream);
52 Assert.AreEqual (true, writer.BaseStream.CanRead, "test#01");
53 Assert.AreEqual (true, writer.BaseStream.CanSeek, "test#02");
54 Assert.AreEqual (true, writer.BaseStream.CanWrite, "test#03");
56 writer = new BinaryWriter (stream, new ASCIIEncoding ());
57 Assert.AreEqual (true, writer.BaseStream.CanRead, "test#04");
58 Assert.AreEqual (true, writer.BaseStream.CanSeek, "test#05");
59 Assert.AreEqual (true, writer.BaseStream.CanWrite, "test#06");
64 /// Throws an exception if stream is null
67 [ExpectedException(typeof(ArgumentNullException))]
68 public void CtorNullExceptionStream ()
70 BinaryWriter reader = new BinaryWriter (null);
74 /// Throws an exception if encoding is null
77 [ExpectedException(typeof(ArgumentNullException))]
78 public void CtorNullExceptionStreamEncoding ()
80 MemoryStream stream = new MemoryStream ();
81 BinaryWriter reader = new BinaryWriter (stream, null);
85 /// Throws an exception if stream is closed
88 [ExpectedException(typeof(ArgumentException))]
89 public void CtorExceptionStreamClosed ()
91 MemoryStream stream = new MemoryStream ();
93 BinaryWriter writer = new BinaryWriter (stream);
97 /// Throws an exception if stream does not support writing
100 [ExpectedException(typeof(ArgumentException))]
101 public void CtorArgumentExceptionStreamCannotWrite ()
103 string path = TempFolder + "/BinaryWriterTest.1";
105 FileStream stream = null;
106 BinaryWriter reader = null;
109 stream = new FileStream (path, FileMode.OpenOrCreate, FileAccess.Read);
110 reader = new BinaryWriter (stream);
121 public void Encoding ()
123 MemoryStream stream = new MemoryStream ();
124 BinaryWriter writer = new BinaryWriter (stream);
125 writer.Write ("t*st");
127 byte [] bytes = stream.GetBuffer ();
128 Assert.AreEqual (4, bytes [0], "test#01");
129 Assert.AreEqual (116, bytes [1], "test#02");
130 Assert.AreEqual (42, bytes [2], "test#03");
131 Assert.AreEqual (115, bytes [3], "test#04");
132 Assert.AreEqual (116, bytes [4], "test#05");
133 Assert.AreEqual (0, bytes [5], "test#06");
135 stream = new MemoryStream ();
136 writer = new BinaryWriter (stream, new UnicodeEncoding ());
137 writer.Write ("t*st");
139 bytes = stream.GetBuffer ();
140 Assert.AreEqual (8, bytes [0], "test#07");
141 Assert.AreEqual (116, bytes [1], "test#08");
142 Assert.AreEqual (0, bytes [2], "test#09");
143 Assert.AreEqual (42, bytes [3], "test#10");
144 Assert.AreEqual (0, bytes [4], "test#11");
145 Assert.AreEqual (115, bytes [5], "test#12");
146 Assert.AreEqual (0, bytes [6], "test#13");
147 Assert.AreEqual (116, bytes [7], "test#14");
148 Assert.AreEqual (0, bytes [8], "test#15");
150 stream = new MemoryStream ();
151 writer = new BinaryWriter (stream, new UTF7Encoding ());
152 writer.Write ("t*st");
154 bytes = stream.GetBuffer ();
155 Assert.AreEqual (8, bytes [0], "test#16");
156 Assert.AreEqual (116, bytes [1], "test#17");
157 Assert.AreEqual (43, bytes [2], "test#18");
158 Assert.AreEqual (65, bytes [3], "test#19");
159 Assert.AreEqual (67, bytes [4], "test#21");
160 Assert.AreEqual (111, bytes [5], "test#22");
161 Assert.AreEqual (45, bytes [6], "test#23");
162 Assert.AreEqual (115, bytes [7], "test#24");
163 Assert.AreEqual (116, bytes [8], "test#25");
164 Assert.AreEqual (0, bytes [9], "test#26");
165 Assert.AreEqual (0, bytes [10], "test#27");
167 stream = new MemoryStream ();
168 writer = new BinaryWriter (stream, new ASCIIEncoding ());
169 writer.Write ("t*st");
170 bytes = stream.GetBuffer ();
171 Assert.AreEqual (4, bytes [0], "test#28");
172 Assert.AreEqual (116, bytes [1], "test#29");
173 Assert.AreEqual (42, bytes [2], "test#30");
174 Assert.AreEqual (115, bytes [3], "test#31");
175 Assert.AreEqual (116, bytes [4], "test#32");
176 Assert.AreEqual (0, bytes [5], "test#33");
180 [ExpectedException(typeof(ObjectDisposedException))]
181 public void Close1 ()
183 MemoryStream stream = new MemoryStream ();
184 BinaryWriter writer = new BinaryWriter (stream, new ASCIIEncoding ());
186 writer.Write ("Test");
190 public void Close2 ()
192 MemoryStream stream = new MemoryStream ();
193 BinaryWriter writer = new BinaryWriter (stream, new ASCIIEncoding ());
200 [ExpectedException(typeof(ObjectDisposedException))]
201 public void Close3 ()
203 MemoryStream stream = new MemoryStream ();
204 BinaryWriter writer = new BinaryWriter (stream, new ASCIIEncoding ());
206 writer.Seek (1, SeekOrigin.Begin);
210 public void Close4 ()
212 MemoryStream stream = new MemoryStream ();
213 BinaryWriter writer = new BinaryWriter (stream, new ASCIIEncoding ());
215 Assert.AreEqual (false, writer.BaseStream.CanRead, "test#01");
216 Assert.AreEqual (false, writer.BaseStream.CanWrite, "test#01");
217 Assert.AreEqual (false, writer.BaseStream.CanSeek, "test#01");
223 MemoryStream stream = new MemoryStream ();
224 BinaryWriter writer = new BinaryWriter (stream, new ASCIIEncoding ());
226 writer.Write ("Test");
227 writer.Seek (2, SeekOrigin.Begin);
229 writer.Seek (400, SeekOrigin.Begin);
231 writer.Seek (-394, SeekOrigin.End);
233 writer.Seek (-2, SeekOrigin.Current);
236 byte [] bytes = stream.GetBuffer ();
237 Assert.AreEqual (512, bytes.Length, "test#01");
238 Assert.AreEqual (4, bytes [0], "test#02");
239 Assert.AreEqual (84, bytes [1], "test#03");
240 Assert.AreEqual (1, bytes [2], "test#04");
241 Assert.AreEqual (45, bytes [3], "test#05");
242 Assert.AreEqual (116, bytes [4], "test#06");
243 Assert.AreEqual (0, bytes [5], "test#07");
244 Assert.AreEqual (0, bytes [6], "test#08");
245 Assert.AreEqual (0, bytes [7], "test#09");
246 Assert.AreEqual (1, bytes [8], "test#10");
247 Assert.AreEqual (45, bytes [9], "test#11");
248 Assert.AreEqual (0, bytes [10], "test#12");
249 Assert.AreEqual (0, bytes [11], "test#13");
250 Assert.AreEqual (0, bytes [12], "test#14");
251 Assert.AreEqual (1, bytes [400], "test#15");
255 [ExpectedException(typeof(IOException))]
256 public void SeekException ()
258 MemoryStream stream = new MemoryStream ();
259 BinaryWriter writer = new BinaryWriter (stream);
261 writer.Write ("Test");
262 writer.Seek (-12, SeekOrigin.Begin);
266 public void WriteCharArray ()
268 MemoryStream stream = new MemoryStream ();
269 BinaryWriter writer = new BinaryWriter (stream);
271 writer.Write (new char [] {'m', 'o', 'n', 'o', ':', ':'});
272 writer.Write (new char [] {':', ':', 'O', 'N', 'O', 'M'});
274 byte [] bytes = stream.GetBuffer ();
276 Assert.AreEqual (256, bytes.Length, "test#01");
277 Assert.AreEqual (109, bytes [0], "test#02");
278 Assert.AreEqual (111, bytes [1], "test#03");
279 Assert.AreEqual (110, bytes [2], "test#04");
280 Assert.AreEqual (111, bytes [3], "test#05");
281 Assert.AreEqual (58, bytes [4], "test#06");
282 Assert.AreEqual (58, bytes [5], "test#07");
283 Assert.AreEqual (58, bytes [6], "test#08");
284 Assert.AreEqual (58, bytes [7], "test#09");
285 Assert.AreEqual (79, bytes [8], "test#10");
286 Assert.AreEqual (78, bytes [9], "test#11");
287 Assert.AreEqual (79, bytes [10], "test#12");
288 Assert.AreEqual (77, bytes [11], "test#13");
289 Assert.AreEqual (0, bytes [12], "test#14");
290 Assert.AreEqual (0, bytes [13], "test#15");
294 public void WriteByteArray ()
296 MemoryStream stream = new MemoryStream ();
297 BinaryWriter writer = new BinaryWriter (stream);
299 writer.Write (new byte [] {1, 2, 3, 4, 5, 6});
300 writer.Write (new byte [] {6, 5, 4, 3, 2, 1});
302 byte [] bytes = stream.GetBuffer ();
303 Assert.AreEqual (256, bytes.Length, "test#01");
304 Assert.AreEqual (1, bytes [0], "test#02");
305 Assert.AreEqual (2, bytes [1], "test#03");
306 Assert.AreEqual (3, bytes [2], "test#04");
307 Assert.AreEqual (4, bytes [3], "test#05");
308 Assert.AreEqual (5, bytes [4], "test#06");
309 Assert.AreEqual (6, bytes [5], "test#07");
310 Assert.AreEqual (6, bytes [6], "test#08");
311 Assert.AreEqual (5, bytes [7], "test#09");
312 Assert.AreEqual (4, bytes [8], "test#10");
313 Assert.AreEqual (3, bytes [9], "test#11");
314 Assert.AreEqual (2, bytes [10], "test#12");
315 Assert.AreEqual (1, bytes [11], "test#13");
316 Assert.AreEqual (0, bytes [12], "test#14");
317 Assert.AreEqual (0, bytes [13], "test#15");
322 public void WriteInt ()
326 long l = 9999999999999;
328 MemoryStream stream = new MemoryStream ();
329 BinaryWriter writer = new BinaryWriter (stream);
332 bytes = stream.GetBuffer ();
333 Assert.AreEqual (256, bytes.Length, "test#01");
334 Assert.AreEqual (64, bytes [0], "test#02");
335 Assert.AreEqual (0, bytes [1], "test#03");
338 bytes = stream.GetBuffer ();
339 Assert.AreEqual (256, bytes.Length, "test#04");
340 Assert.AreEqual (64, bytes [0], "test#05");
341 Assert.AreEqual (0, bytes [1], "test#06");
342 Assert.AreEqual (64, bytes [2], "test#07");
343 Assert.AreEqual (109, bytes [3], "test#08");
344 Assert.AreEqual (218, bytes [4], "test#09");
345 Assert.AreEqual (3, bytes [5], "test#10");
346 Assert.AreEqual (0, bytes [6], "test#11");
349 bytes = stream.GetBuffer ();
350 Assert.AreEqual (256, bytes.Length, "test#12");
351 Assert.AreEqual (255, bytes [6], "test#13");
352 Assert.AreEqual (159, bytes [7], "test#14");
353 Assert.AreEqual (114, bytes [8], "test#15");
354 Assert.AreEqual (78, bytes [9], "test#16");
355 Assert.AreEqual (24, bytes [10], "test#17");
356 Assert.AreEqual (9, bytes [11], "test#18");
357 Assert.AreEqual (0, bytes [12], "test#19");
361 public void WriteDecimal ()
363 MemoryStream stream = new MemoryStream ();
364 BinaryWriter writer = new BinaryWriter (stream);
366 decimal d1 = 19932143214312.32M;
367 decimal d2 = -8995034512332157M;
371 byte [] bytes = stream.GetBuffer ();
373 Assert.AreEqual (256, bytes.Length, "test#01");
374 Assert.AreEqual (192, bytes [0], "test#02");
375 Assert.AreEqual (18, bytes [1], "test#03");
376 Assert.AreEqual (151, bytes [2], "test#04");
377 Assert.AreEqual (95, bytes [3], "test#05");
378 Assert.AreEqual (209, bytes [4], "test#06");
379 Assert.AreEqual (20, bytes [5], "test#07");
380 Assert.AreEqual (7, bytes [6], "test#08");
381 Assert.AreEqual (0, bytes [7], "test#09");
382 Assert.AreEqual (0, bytes [8], "test#10");
383 Assert.AreEqual (0, bytes [9], "test#11");
384 Assert.AreEqual (0, bytes [10], "test#12");
385 Assert.AreEqual (0, bytes [11], "test#13");
386 Assert.AreEqual (0, bytes [12], "test#14");
387 Assert.AreEqual (0, bytes [13], "test#15");
388 Assert.AreEqual (2, bytes [14], "test#16");
389 Assert.AreEqual (0, bytes [15], "test#17");
390 Assert.AreEqual (125, bytes [16], "test#18");
391 Assert.AreEqual (149, bytes [17], "test#19");
392 Assert.AreEqual (217, bytes [18], "test#20");
393 Assert.AreEqual (172, bytes [19], "test#21");
394 Assert.AreEqual (239, bytes [20], "test#22");
395 Assert.AreEqual (244, bytes [21], "test#23");
396 Assert.AreEqual (31, bytes [22], "test#24");
397 Assert.AreEqual (0, bytes [23], "test#25");
398 Assert.AreEqual (0, bytes [24], "test#26");
399 Assert.AreEqual (0, bytes [25], "test#27");
400 Assert.AreEqual (0, bytes [26], "test#28");
401 Assert.AreEqual (0, bytes [27], "test#29");
402 Assert.AreEqual (0, bytes [28], "test#30");
403 Assert.AreEqual (0, bytes [29], "test#31");
404 Assert.AreEqual (0, bytes [30], "test#32");
405 Assert.AreEqual (128, bytes [31], "test#33");
406 Assert.AreEqual (0, bytes [32], "test#34");
407 Assert.AreEqual (0, bytes [33], "test#35");
408 Assert.AreEqual (0, bytes [34], "test#36");
409 Assert.AreEqual (0, bytes [35], "test#37");
410 Assert.AreEqual (0, bytes [36], "test#38");
411 Assert.AreEqual (0, bytes [37], "test#39");
412 Assert.AreEqual (0, bytes [38], "test#40");
413 Assert.AreEqual (0, bytes [39], "test#41");
414 Assert.AreEqual (0, bytes [40], "test#42");
415 Assert.AreEqual (0, bytes [41], "test#43");
416 Assert.AreEqual (0, bytes [42], "test#44");
417 Assert.AreEqual (0, bytes [43], "test#45");
418 Assert.AreEqual (0, bytes [44], "test#46");
419 Assert.AreEqual (0, bytes [45], "test#47");
420 Assert.AreEqual (0, bytes [46], "test#48");
424 public void WriteFloat ()
426 MemoryStream stream = new MemoryStream ();
427 BinaryWriter writer = new BinaryWriter (stream);
428 float f1 = 1.543E+10F;
429 float f2 = -9.6534E-6f;
433 byte [] bytes = stream.GetBuffer ();
434 Assert.AreEqual (256, bytes.Length, "test#01");
435 Assert.AreEqual (199, bytes [0], "test#02");
436 Assert.AreEqual (236, bytes [1], "test#03");
437 Assert.AreEqual (101, bytes [2], "test#04");
438 Assert.AreEqual (80, bytes [3], "test#05");
439 Assert.AreEqual (10, bytes [4], "test#06");
440 Assert.AreEqual (245, bytes [5], "test#07");
441 Assert.AreEqual (33, bytes [6], "test#08");
442 Assert.AreEqual (183, bytes [7], "test#09");
443 Assert.AreEqual (0, bytes [8], "test#10");
444 Assert.AreEqual (0, bytes [9], "test#11");
448 public void WriteDouble ()
450 MemoryStream stream = new MemoryStream ();
451 BinaryWriter writer = new BinaryWriter (stream);
452 double d1 = 1.543E+100;
453 double d2 = -9.6534E-129;
457 byte [] bytes = stream.GetBuffer ();
458 Assert.AreEqual (256, bytes.Length, "test#01");
459 Assert.AreEqual (49, bytes [0], "test#02");
460 Assert.AreEqual (69, bytes [1], "test#03");
461 Assert.AreEqual (15, bytes [2], "test#04");
462 Assert.AreEqual (157, bytes [3], "test#05");
463 Assert.AreEqual (211, bytes [4], "test#06");
464 Assert.AreEqual (55, bytes [5], "test#07");
465 Assert.AreEqual (188, bytes [6], "test#08");
466 Assert.AreEqual (84, bytes [7], "test#09");
467 Assert.AreEqual (76, bytes [8], "test#10");
468 Assert.AreEqual (59, bytes [9], "test#11");
469 Assert.AreEqual (59, bytes [10], "test#12");
470 Assert.AreEqual (60, bytes [11], "test#13");
471 Assert.AreEqual (4, bytes [12], "test#14");
472 Assert.AreEqual (196, bytes [13], "test#15");
473 Assert.AreEqual (90, bytes [14], "test#16");
474 Assert.AreEqual (165, bytes [15], "test#17");
475 Assert.AreEqual (0, bytes [16], "test#18");
479 public void WriteByteAndChar ()
485 MemoryStream stream = new MemoryStream ();
486 BinaryWriter writer = new BinaryWriter (stream);
492 byte [] bytes = stream.GetBuffer ();
493 Assert.AreEqual (256, bytes.Length, "test#01");
494 Assert.AreEqual (12, bytes [0], "test#02");
495 Assert.AreEqual (45, bytes [1], "test#03");
496 Assert.AreEqual (64, bytes [2], "test#04");
497 Assert.AreEqual (77, bytes [3], "test#05");
498 Assert.AreEqual (0, bytes [4], "test#06");
502 public void WriteString ()
504 MemoryStream stream = new MemoryStream ();
505 BinaryWriter writer = new BinaryWriter (stream);
511 byte [] bytes = stream.GetBuffer ();
512 Assert.AreEqual (256, bytes.Length, "test#01");
513 Assert.AreEqual (3, bytes [0], "test#02");
514 Assert.AreEqual (97, bytes [1], "test#03");
515 Assert.AreEqual (98, bytes [2], "test#04");
516 Assert.AreEqual (99, bytes [3], "test#05");
517 Assert.AreEqual (4, bytes [4], "test#06");
518 Assert.AreEqual (68, bytes [5], "test#07");
519 Assert.AreEqual (101, bytes [6], "test#08");
520 Assert.AreEqual (70, bytes [7], "test#09");
521 Assert.AreEqual (10, bytes [8], "test#10");
522 Assert.AreEqual (0, bytes [9], "test#11");
526 public void Write7BitEncodedIntTest ()
528 MemoryStream stream = new MemoryStream ();
529 var writer = new MyBinaryWriter (stream);
530 writer.WriteLeb128 (5);
532 Assert.AreEqual (new byte[] { 5 }, stream.ToArray (), "#1");
534 stream = new MemoryStream ();
535 writer = new MyBinaryWriter (stream);
536 writer.WriteLeb128 (int.MaxValue);
538 Assert.AreEqual (new byte[] { 255, 255, 255, 255, 7 }, stream.ToArray (), "#2");
540 stream = new MemoryStream ();
541 writer = new MyBinaryWriter (stream);
542 writer.WriteLeb128 (128);
544 Assert.AreEqual (new byte[] { 128, 1 }, stream.ToArray (), "#3");
546 stream = new MemoryStream ();
547 writer = new MyBinaryWriter (stream);
548 writer.WriteLeb128 (-1025);
550 Assert.AreEqual (new byte[] { 255, 247, 255, 255, 15 }, stream.ToArray (), "#4");
552 stream = new MemoryStream ();
553 writer = new MyBinaryWriter (stream);
554 writer.WriteLeb128 (int.MinValue);
556 Assert.AreEqual (new byte[] { 128, 128, 128, 128, 8 }, stream.ToArray (), "#5");
558 stream = new MemoryStream ();
559 writer = new MyBinaryWriter (stream);
560 writer.WriteLeb128 (-1);
562 Assert.AreEqual (new byte[] { 255, 255, 255, 255, 15 }, stream.ToArray (), "#6");
564 stream = new MemoryStream ();
565 writer = new MyBinaryWriter (stream);
566 writer.WriteLeb128 (0);
568 Assert.AreEqual (new byte[] { 0 }, stream.ToArray (), "#7");
572 public void BaseStreamCallsFlush ()
574 FlushStream stream = new FlushStream ();
575 BinaryWriter writer = new BinaryWriter (stream);
576 Stream s = writer.BaseStream;
577 Assert.IsTrue (stream.FlushCalled);
580 private void DeleteFile (string path)
582 if (File.Exists (path))
586 class FlushStream : Stream
588 public bool FlushCalled;
590 public override bool CanRead {
594 public override bool CanSeek {
598 public override bool CanWrite {
602 public override long Length {
606 public override long Position {
611 public override void Flush ()
616 public override int Read (byte[] buffer, int offset, int count)
621 public override int ReadByte ()
626 public override long Seek (long offset, SeekOrigin origin)
631 public override void SetLength (long value)
635 public override void Write (byte[] buffer, int offset, int count)
639 public override void WriteByte (byte value)