| OLD | NEW |
| (Empty) |
| 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | |
| 2 // for details. All rights reserved. Use of this source code is governed by a | |
| 3 // BSD-style license that can be found in the LICENSE file. | |
| 4 | |
| 5 import "dart:io"; | |
| 6 import "dart:isolate"; | |
| 7 | |
| 8 void testUtf8() { | |
| 9 List<int> data = [0x01, | |
| 10 0x7f, | |
| 11 0xc2, 0x80, | |
| 12 0xdf, 0xbf, | |
| 13 0xe0, 0xa0, 0x80, | |
| 14 0xef, 0xbf, 0xbf, | |
| 15 0xf0, 0x9d, 0x84, 0x9e]; | |
| 16 ListInputStream s = new ListInputStream(); | |
| 17 s.write(data); | |
| 18 s.markEndOfStream(); | |
| 19 StringInputStream stream = new StringInputStream(s); | |
| 20 void stringData() { | |
| 21 String s = stream.read(); | |
| 22 Expect.equals(8, s.length); | |
| 23 Expect.equals(new String.fromCharCodes([0x01]), s[0]); | |
| 24 Expect.equals(new String.fromCharCodes([0x7f]), s[1]); | |
| 25 Expect.equals(new String.fromCharCodes([0x80]), s[2]); | |
| 26 Expect.equals(new String.fromCharCodes([0x7ff]), s[3]); | |
| 27 Expect.equals(new String.fromCharCodes([0x800]), s[4]); | |
| 28 Expect.equals(new String.fromCharCodes([0xffff]), s[5]); | |
| 29 Expect.equals(new String.fromCharCodes([0xffff]), s[5]); | |
| 30 | |
| 31 // Surrogate pair for U+1D11E. | |
| 32 Expect.equals(new String.fromCharCodes([0xd834, 0xdd1e]), | |
| 33 s.substring(6, 8)); | |
| 34 } | |
| 35 stream.onData = stringData; | |
| 36 } | |
| 37 | |
| 38 void testLatin1() { | |
| 39 List<int> data = [0x01, | |
| 40 0x7f, | |
| 41 0x44, 0x61, 0x72, 0x74, | |
| 42 0x80, | |
| 43 0xff]; | |
| 44 ListInputStream s = new ListInputStream(); | |
| 45 s.write(data); | |
| 46 s.markEndOfStream(); | |
| 47 StringInputStream stream = new StringInputStream(s, Encoding.ISO_8859_1); | |
| 48 void stringData() { | |
| 49 String s = stream.read(); | |
| 50 Expect.equals(8, s.length); | |
| 51 Expect.equals(new String.fromCharCodes([0x01]), s[0]); | |
| 52 Expect.equals(new String.fromCharCodes([0x7f]), s[1]); | |
| 53 Expect.equals("Dart", s.substring(2, 6)); | |
| 54 Expect.equals(new String.fromCharCodes([0x80]), s[6]); | |
| 55 Expect.equals(new String.fromCharCodes([0xff]), s[7]); | |
| 56 } | |
| 57 stream.onData = stringData; | |
| 58 } | |
| 59 | |
| 60 void testAscii() { | |
| 61 List<int> data = [0x01, | |
| 62 0x44, 0x61, 0x72, 0x74, | |
| 63 0x7f]; | |
| 64 ListInputStream s = new ListInputStream(); | |
| 65 s.write(data); | |
| 66 s.markEndOfStream(); | |
| 67 StringInputStream stream = | |
| 68 new StringInputStream(s, Encoding.ASCII); | |
| 69 void stringData() { | |
| 70 String s = stream.read(); | |
| 71 Expect.equals(6, s.length); | |
| 72 Expect.equals(new String.fromCharCodes([0x01]), s[0]); | |
| 73 Expect.equals("Dart", s.substring(1, 5)); | |
| 74 Expect.equals(new String.fromCharCodes([0x7f]), s[5]); | |
| 75 } | |
| 76 stream.onData = stringData; | |
| 77 } | |
| 78 | |
| 79 void testReadLine1() { | |
| 80 ListInputStream s = new ListInputStream(); | |
| 81 StringInputStream stream = new StringInputStream(s); | |
| 82 var stage = 0; | |
| 83 | |
| 84 void stringData() { | |
| 85 var line; | |
| 86 if (stage == 0) { | |
| 87 line = stream.readLine(); | |
| 88 Expect.equals(null, line); | |
| 89 stage++; | |
| 90 s.markEndOfStream(); | |
| 91 } else if (stage == 1) { | |
| 92 line = stream.readLine(); | |
| 93 Expect.equals("Line", line); | |
| 94 line = stream.readLine(); | |
| 95 Expect.equals(null, line); | |
| 96 stage++; | |
| 97 } | |
| 98 } | |
| 99 | |
| 100 void streamClosed() { | |
| 101 Expect.equals(true, stream.closed); | |
| 102 Expect.equals(2, stage); | |
| 103 } | |
| 104 | |
| 105 stream.onData = stringData; | |
| 106 stream.onClosed = streamClosed; | |
| 107 s.write("Line".charCodes); | |
| 108 } | |
| 109 | |
| 110 void testReadLine2() { | |
| 111 ListInputStream s = new ListInputStream(); | |
| 112 StringInputStream stream = new StringInputStream(s); | |
| 113 var stage = 0; | |
| 114 | |
| 115 void stringData() { | |
| 116 var line; | |
| 117 if (stage == 0) { | |
| 118 Expect.equals(21, stream.available()); | |
| 119 line = stream.readLine(); | |
| 120 Expect.equals("Line1", line); | |
| 121 Expect.equals(15, stream.available()); | |
| 122 line = stream.readLine(); | |
| 123 Expect.equals("Line2", line); | |
| 124 Expect.equals(8, stream.available()); | |
| 125 line = stream.readLine(); | |
| 126 Expect.equals("Line3", line); | |
| 127 line = stream.readLine(); | |
| 128 Expect.equals(2, stream.available()); | |
| 129 Expect.equals(null, line); | |
| 130 stage++; | |
| 131 s.write("ne4\n".charCodes); | |
| 132 } else if (stage == 1) { | |
| 133 Expect.equals(6, stream.available()); | |
| 134 line = stream.readLine(); | |
| 135 Expect.equals("Line4", line); | |
| 136 Expect.equals(0, stream.available()); | |
| 137 line = stream.readLine(); | |
| 138 Expect.equals(null, line); | |
| 139 stage++; | |
| 140 s.write("\n\n\r\n\r\n\r\r".charCodes); | |
| 141 } else if (stage == 2) { | |
| 142 // Expect 5 empty lines. As long as the stream is not closed the | |
| 143 // final \r cannot be interpreted as a end of line. | |
| 144 Expect.equals(8, stream.available()); | |
| 145 for (int i = 0; i < 5; i++) { | |
| 146 line = stream.readLine(); | |
| 147 Expect.equals("", line); | |
| 148 } | |
| 149 Expect.equals(1, stream.available()); | |
| 150 line = stream.readLine(); | |
| 151 Expect.equals(null, line); | |
| 152 stage++; | |
| 153 s.markEndOfStream(); | |
| 154 } else if (stage == 3) { | |
| 155 // The final \r can now be interpreted as an end of line. | |
| 156 Expect.equals(1, stream.available()); | |
| 157 line = stream.readLine(); | |
| 158 Expect.equals("", line); | |
| 159 line = stream.readLine(); | |
| 160 Expect.equals(null, line); | |
| 161 stage++; | |
| 162 } | |
| 163 } | |
| 164 | |
| 165 void streamClosed() { | |
| 166 Expect.equals(4, stage); | |
| 167 Expect.equals(true, stream.closed); | |
| 168 } | |
| 169 | |
| 170 stream.onLine = stringData; | |
| 171 stream.onClosed = streamClosed; | |
| 172 s.write("Line1\nLine2\r\nLine3\rLi".charCodes); | |
| 173 } | |
| 174 | |
| 175 void testReadChunks() { | |
| 176 ListInputStream s = new ListInputStream(); | |
| 177 StringInputStream stream = new StringInputStream(s); | |
| 178 | |
| 179 void stringData() { | |
| 180 var data; | |
| 181 Expect.equals(8, stream.available()); | |
| 182 data = stream.read(1); | |
| 183 Expect.equals("A", data); | |
| 184 Expect.equals(7, stream.available()); | |
| 185 data = stream.read(2); | |
| 186 Expect.equals("BC", data); | |
| 187 Expect.equals(5, stream.available()); | |
| 188 data = stream.read(3); | |
| 189 Expect.equals("D12", data); | |
| 190 Expect.equals(2, stream.available()); | |
| 191 data = stream.read(); | |
| 192 Expect.equals("34", data); | |
| 193 Expect.equals(0, stream.available()); | |
| 194 data = stream.read(1); | |
| 195 Expect.equals(null, data); | |
| 196 Expect.equals(0, stream.available()); | |
| 197 data = stream.read(2); | |
| 198 Expect.equals(null, data); | |
| 199 Expect.equals(0, stream.available()); | |
| 200 data = stream.read(3); | |
| 201 Expect.equals(null, data); | |
| 202 Expect.equals(0, stream.available()); | |
| 203 data = stream.read(); | |
| 204 Expect.equals(null, data); | |
| 205 Expect.equals(0, stream.available()); | |
| 206 } | |
| 207 | |
| 208 s.write("ABCD1234".charCodes); | |
| 209 stream.onData = stringData; | |
| 210 } | |
| 211 | |
| 212 void testReadMixed() { | |
| 213 ListInputStream s = new ListInputStream(); | |
| 214 StringInputStream stream = new StringInputStream(s); | |
| 215 var stage = 0; | |
| 216 | |
| 217 void stringData() { | |
| 218 var data; | |
| 219 if (stage == 0) { | |
| 220 Expect.equals(11, stream.available()); | |
| 221 data = stream.read(2); | |
| 222 Expect.equals("A\r", data); | |
| 223 Expect.equals(9, stream.available()); | |
| 224 data = stream.readLine(); | |
| 225 Expect.equals("", data); | |
| 226 Expect.equals(8, stream.available()); | |
| 227 data = stream.read(4); | |
| 228 Expect.equals("BCD\n", data); | |
| 229 Expect.equals(4, stream.available()); | |
| 230 data = stream.readLine(); | |
| 231 Expect.equals(null, data); | |
| 232 data = stream.read(4); | |
| 233 Expect.equals("1234", data); | |
| 234 s.write("A\r\nBCD\n1234".charCodes); | |
| 235 stage++; | |
| 236 } else if (stage == 1) { | |
| 237 Expect.equals(11, stream.available()); | |
| 238 data = stream.read(1); | |
| 239 Expect.equals("A", data); | |
| 240 Expect.equals(10, stream.available()); | |
| 241 data = stream.read(1); | |
| 242 Expect.equals("\r", data); | |
| 243 Expect.equals(9, stream.available()); | |
| 244 data = stream.read(1); | |
| 245 Expect.equals("\n", data); | |
| 246 Expect.equals(8, stream.available()); | |
| 247 data = stream.readLine(); | |
| 248 Expect.equals("BCD", data); | |
| 249 data = stream.readLine(); | |
| 250 Expect.equals(null, data); | |
| 251 data = stream.read(4); | |
| 252 Expect.equals("1234", data); | |
| 253 s.write("A\r\nBCD\n1234".charCodes); | |
| 254 stage++; | |
| 255 } else if (stage == 2) { | |
| 256 Expect.equals(11, stream.available()); | |
| 257 data = stream.read(7); | |
| 258 Expect.equals("A\r\nBCD\n", data); | |
| 259 Expect.equals(4, stream.available()); | |
| 260 data = stream.readLine(); | |
| 261 Expect.equals(null, data); | |
| 262 data = stream.read(); | |
| 263 Expect.equals("1234", data); | |
| 264 stage++; | |
| 265 s.markEndOfStream(); | |
| 266 } | |
| 267 } | |
| 268 | |
| 269 void streamClosed() { | |
| 270 Expect.equals(3, stage); | |
| 271 Expect.equals(true, stream.closed); | |
| 272 } | |
| 273 | |
| 274 s.write("A\r\nBCD\n1234".charCodes); | |
| 275 stream.onData = stringData; | |
| 276 stream.onClosed = streamClosed; | |
| 277 } | |
| 278 | |
| 279 class TestException implements Exception { | |
| 280 TestException(); | |
| 281 } | |
| 282 | |
| 283 class ErrorInputStream implements InputStream { | |
| 284 ErrorInputStream(); | |
| 285 List<int> read([int len]) => null; | |
| 286 int readInto(List<int> buffer, [int offset, int len]) => 0; | |
| 287 int available() => 0; | |
| 288 void pipe(OutputStream output, {bool close: true}){ } | |
| 289 void close() { } | |
| 290 bool get closed => true; | |
| 291 void set onData(void callback()) { } | |
| 292 void set onClosed(void callback()) { } | |
| 293 void set onError(void callback(Exception e)) { | |
| 294 callback(new TestException()); | |
| 295 } | |
| 296 } | |
| 297 | |
| 298 testErrorHandler() { | |
| 299 var errors = 0; | |
| 300 var stream = new StringInputStream(new ErrorInputStream()); | |
| 301 stream.onError = (e) { | |
| 302 errors++; | |
| 303 Expect.isTrue(e is TestException); | |
| 304 }; | |
| 305 Expect.equals(1, errors); | |
| 306 } | |
| 307 | |
| 308 testEncodingErrorWithHandler() { | |
| 309 var port = new ReceivePort(); | |
| 310 var errors = 0; | |
| 311 var expected = [206, 187, 120, 46, 32, 120, 10]; | |
| 312 ListInputStream input = new ListInputStream(); | |
| 313 input.write(expected); | |
| 314 var stringStream = new StringInputStream(input, Encoding.ASCII); | |
| 315 stringStream.onData = () { | |
| 316 Expect.fail("We should not get any data"); | |
| 317 }; | |
| 318 stringStream.onError = (e) { | |
| 319 port.close(); | |
| 320 Expect.isTrue(e is Exception); | |
| 321 }; | |
| 322 } | |
| 323 | |
| 324 | |
| 325 main() { | |
| 326 testUtf8(); | |
| 327 testLatin1(); | |
| 328 testAscii(); | |
| 329 testReadLine1(); | |
| 330 testReadLine2(); | |
| 331 testReadChunks(); | |
| 332 testReadMixed(); | |
| 333 testErrorHandler(); | |
| 334 testEncodingErrorWithHandler(); | |
| 335 } | |
| OLD | NEW |