2009-07-11 Michael Barker <mike@middlesoft.co.uk>
[mono.git] / mcs / class / corlib / Test / System.IO / StringReaderTest.cs
1 //
2 // System.IO.StringWriter
3 //
4 // Author: Marcin Szczepanski (marcins@zipworld.com.au)
5 //
6 // TODO: Add some testing for exceptions
7 //
8 // TODO: Some of the tests could be a bit more thorough
9 //
10
11 using NUnit.Framework;
12 using System.IO;
13 using System;
14
15 namespace MonoTests.System.IO {
16
17 [TestFixture]
18 public class StringReaderTest {
19         [Test]
20         public  void TestReadLine() {
21                 string testme = "a\nb\nc\n";
22                 StringReader sr = new StringReader (testme);
23                 string inputLine;
24                 int lines = 0;
25                 while ((inputLine = sr.ReadLine ()) != null)
26                         lines++;
27                 
28                 Assert.AreEqual (3, lines, "Incorrect number of lines");
29         }
30
31         [Test]
32         public void TestPeekRead() {
33                 StringReader reader = new StringReader( "Test String" );
34
35                 char c = (char)reader.Peek();
36                 Assert.AreEqual ('T', c, "A1");
37
38                 char read = (char)reader.Read();
39
40                 Assert.AreEqual ('T', read, "A2");
41
42                 c = (char)reader.Peek();
43
44                 Assert.AreEqual ('e', c, "A3");
45         }
46
47         [Test]
48         public void TestPeekAndReadAtEndOfString() {
49                 StringReader reader = new StringReader("x");
50
51                 char c = (char)reader.Peek();
52                 Assert.AreEqual ('x', c, "A1");
53
54                 c = (char)reader.Read();
55                 Assert.AreEqual ('x', c, "A2");
56
57                 int i = reader.Peek();
58                 Assert.AreEqual (-1, i, "A3");
59
60                 i = reader.Read();
61                 Assert.AreEqual (-1, i, "A4");
62
63                 i = reader.Peek();
64                 Assert.AreEqual (-1, i, "A5");
65         }
66
67         [Test]
68         public void TestPeekAndReadEmptyString() {
69                 StringReader reader = new StringReader("");
70
71                 int i = reader.Peek();
72                 Assert.AreEqual (-1, i, "A1");
73
74                 i = reader.Read();
75                 Assert.AreEqual (-1, i, "A2");
76         }
77
78         [Test]
79         public void TestRead() {
80                 StringReader reader = new StringReader( "Test String" );
81
82                 /* Read from start of string */
83                 char[] test = new char[5];
84
85                 int charsRead = reader.Read( test, 0, 5 );
86
87                 Assert.AreEqual (5, charsRead);
88                 Assert.AreEqual ("Test ", new String(test));
89
90                 /* Read to end of string */
91                 //reader = new StringReader( "Test String" );
92
93                 test = new char[6];
94                 charsRead = reader.Read( test, 0, 6 );
95                 Assert.AreEqual (6, charsRead);
96                 Assert.AreEqual ("String", new String( test ));
97
98                 /* Read past end of string */
99
100                 test = new char[6];
101                 reader = new StringReader( "Foo" );
102                 charsRead = reader.Read( test, 0, 6 );
103                 Assert.AreEqual (3, charsRead);
104                 Assert.AreEqual ("Foo\0\0\0", new String( test ));
105
106                 /* Check that a new invocation on the empty reader will return 0 */
107                 charsRead = reader.Read (test, 0, 6);
108                 Assert.AreEqual (0, charsRead);
109                 
110         }
111
112         [Test]
113         public void TestReadEOL() {
114                 StringReader reader = new StringReader( "Line1\rLine2\r\nLine3\nLine4" );
115
116                 string test = reader.ReadLine();
117
118                 Assert.AreEqual ("Line1", test);
119
120                 test = reader.ReadLine();
121
122                 Assert.AreEqual ("Line2", test);
123
124                 test = reader.ReadLine();
125
126                 Assert.AreEqual ("Line3", test);
127
128                 test = reader.ReadLine();
129
130                 Assert.AreEqual ("Line4", test);
131         }
132
133         [Test]
134         public void TestClose() {
135                 
136                 StringReader reader = new StringReader("reader");
137                 reader.Close ();
138                 
139                 try {
140                         reader.Read ();
141                         Assert.Fail ();
142                 } catch (Exception e) {
143                         Assert.AreEqual (typeof (ObjectDisposedException), e.GetType (), "Close 1");
144                 }
145                 
146                 try {
147                         reader.Peek ();
148                         Assert.Fail ();
149                 } catch (Exception e) {
150                         Assert.AreEqual (typeof (ObjectDisposedException), e.GetType (), "Close 2");                                 
151                 }               
152         }
153         
154         [Test]
155         public void TestExceptions() {
156                 
157                 StringReader reader;
158                 
159                 try {
160                         reader = new StringReader(null);
161                         Assert.Fail ();
162                 } catch (Exception e) {
163                         Assert.AreEqual (typeof (ArgumentNullException), e.GetType (), "Exception 1");
164                 }
165                 
166                 reader = new StringReader ("this is a test\nAnd nothing else");
167                 
168                 try {
169                         reader.Read (null, 0, 12);
170                         Assert.Fail ();
171                 } catch (Exception e) {
172                         Assert.AreEqual (typeof (ArgumentNullException), e.GetType (), "Exception 2");
173                 }                       
174         }
175
176         [Test]
177         public void MoreEOL ()
178         {
179                 TextReader tr = new StringReader ("There she was just a walking\n" +
180                                                   "Down the street singin'\r" +
181                                                   "Do wah diddy diddy dum diddy do");
182
183                 int i = 0;
184                 while (tr.ReadLine () != null)
185                         i++;
186
187                 Assert.AreEqual (3, i, "#01");
188         }
189
190         [Test]
191         [ExpectedException (typeof (ArgumentException))]
192         public void Read_IndexOverflow () 
193         {
194                 StringReader sr = new StringReader ("Mono");
195                 sr.Read (new char [4], Int32.MaxValue, 1);
196         }
197
198         [Test]
199         [ExpectedException (typeof (ArgumentException))]
200         public void Read_CountOverflow () 
201         {
202                 StringReader sr = new StringReader ("Mono");
203                 sr.Read (new char [4], 1, Int32.MaxValue);
204         }
205
206         [Test]
207         public void Read_DoesntStopAtLineEndings ()
208         {
209                 StringReader reader = new StringReader ("Line1\rLine2\r\nLine3\nLine4");
210                 Assert.AreEqual (reader.Read (new char[24], 0, 24), 24);
211         }       
212
213         [Test]
214         public void MixedLineEnding ()
215         {
216                 string foobar = "Foo\n\r\n\rBar";
217                 StringReader reader = new StringReader (foobar);
218                 int count = 0;
219                 while (reader.ReadLine () != null)
220                         count++;
221                 Assert.AreEqual (4, count);
222
223         }
224 }
225
226 }