blob: c46bd421d41ba2e256a92a940a283d0241b93b4e [file] [log] [blame]
// 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();
}