| // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
| // for details. All rights reserved. Use of this source code is governed by a |
| // BSD-style license that can be found in the LICENSE file. |
| // Testing file input stream, VM-only, standalone test. |
| |
| import "dart:io"; |
| import "dart:isolate"; |
| |
| // Helper method to be able to run the test from the runtime |
| // directory, or the top directory. |
| String getFilename(String path) => |
| new File(path).existsSync() ? path : '../$path'; |
| |
| void testStringInputStreamSync() { |
| String fileName = getFilename("tests/standalone/io/readuntil_test.dat"); |
| // File contains "Hello Dart\nwassup!\n" |
| File file = new File(fileName); |
| int linesRead = 0; |
| StringInputStream x = new StringInputStream(file.openInputStream()); |
| x.onLine = () { |
| String line = x.readLine(); |
| linesRead++; |
| if (linesRead == 1) { |
| Expect.equals("Hello Dart", line); |
| } else if (linesRead == 2) { |
| Expect.equals("wassup!", line); |
| } else { |
| Expect.fail("More or less than 2 lines read ($linesRead lines read)."); |
| } |
| }; |
| } |
| |
| void testInputStreamAsync() { |
| String fileName = getFilename("tests/standalone/io/readuntil_test.dat"); |
| // File contains "Hello Dart\nwassup!\n" |
| var expected = "Hello Dart\nwassup!\n".charCodes; |
| InputStream x = (new File(fileName)).openInputStream(); |
| var byteCount = 0; |
| x.onData = () { |
| Expect.equals(expected[byteCount], x.read(1)[0]); |
| byteCount++; |
| }; |
| x.onClosed = () { |
| Expect.equals(expected.length, byteCount); |
| }; |
| } |
| |
| void testStringInputStreamAsync(String name, int length) { |
| String fileName = getFilename("tests/standalone/io/$name"); |
| // File contains 10 lines. |
| File file = new File(fileName); |
| Expect.equals(length, file.openSync().lengthSync()); |
| StringInputStream x = new StringInputStream(file.openInputStream()); |
| int lineCount = 0; |
| x.onLine = () { |
| var line = x.readLine(); |
| lineCount++; |
| Expect.isTrue(lineCount <= 10); |
| if (line[0] != "#") { |
| Expect.equals("Line $lineCount", line); |
| } |
| }; |
| x.onClosed = () { |
| Expect.equals(10, lineCount); |
| }; |
| } |
| |
| void testChunkedInputStream() { |
| // Force the test to timeout if it does not finish. |
| ReceivePort done = new ReceivePort(); |
| done.receive((message, replyTo) { done.close(); }); |
| |
| String fileName = getFilename("tests/standalone/io/readuntil_test.dat"); |
| // File contains 19 bytes ("Hello Dart\nwassup!") |
| File file = new File(fileName); |
| ChunkedInputStream x = new ChunkedInputStream(file.openInputStream()); |
| x.chunkSize = 9; |
| x.onData = () { |
| List<int> chunk = x.read(); |
| Expect.equals(9, chunk.length); |
| x.chunkSize = 5; |
| x.onData = () { |
| chunk = x.read(); |
| Expect.equals(5, chunk.length); |
| x.onData = () { |
| chunk = x.read(); |
| Expect.equals(5, chunk.length); |
| chunk = x.read(); |
| Expect.equals(null, chunk); |
| done.toSendPort().send(null); |
| }; |
| }; |
| }; |
| } |
| |
| void testUnreadyInputStream() { |
| String fileName = getFilename("tests/standalone/io/readuntil_test.dat"); |
| var expected = "Hello Dart\nwassup!\n".charCodes; |
| InputStream x = (new File(fileName)).openInputStream(); |
| List<int> buffer = new List<int>.fixedLength(100); |
| |
| x.onData = () { |
| Expect.fail("Input stream closed before opening called onData handler."); |
| }; |
| |
| x.onClosed = () { }; |
| |
| // Called before stream is ready. |
| int read = x.readInto(buffer); |
| Expect.equals(0, read); |
| |
| // Called before stream is ready. |
| x.close(); |
| } |
| |
| |
| main() { |
| testStringInputStreamSync(); |
| testInputStreamAsync(); |
| // Check the length of these files as both are text files where one |
| // is without a terminating line separator which can easily be added |
| // back if accidentally opened in a text editor. |
| testStringInputStreamAsync("readline_test1.dat", 111); |
| testStringInputStreamAsync("readline_test2.dat", 114); |
| testChunkedInputStream(); |
| testUnreadyInputStream(); |
| } |