| // Copyright (c) 2013, 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. |
| |
| import "package:expect/expect.dart"; |
| import "dart:async"; |
| import "dart:io"; |
| import "dart:isolate"; |
| |
| class TestConsumer implements StreamConsumer { |
| final List expected; |
| final List received = []; |
| |
| var closePort; |
| |
| int addStreamCount = 0; |
| int expcetedAddStreamCount; |
| |
| TestConsumer(this.expected, |
| {close: true, |
| this.expcetedAddStreamCount: -1}) { |
| if (close) closePort = new ReceivePort(); |
| } |
| |
| Future addStream(Stream stream) { |
| addStreamCount++; |
| return stream.fold( |
| received, |
| (list, value) { |
| list.addAll(value); |
| return list; |
| }) |
| .then((_) {}); |
| } |
| |
| Future close() { |
| return new Future.value() |
| .then((_) { |
| if (closePort != null) closePort.close(); |
| Expect.listEquals(expected, received); |
| if (expcetedAddStreamCount >= 0) { |
| Expect.equals(expcetedAddStreamCount, addStreamCount); |
| } |
| }); |
| } |
| } |
| |
| void testClose() { |
| var sink = new IOSink(new TestConsumer([], expcetedAddStreamCount: 0)); |
| sink.close(); |
| } |
| |
| void testAddClose() { |
| var sink = new IOSink(new TestConsumer([0])); |
| sink.add([0]); |
| sink.close(); |
| |
| sink = new IOSink(new TestConsumer([0, 1, 2])); |
| sink.add([0]); |
| sink.add([1]); |
| sink.add([2]); |
| sink.close(); |
| } |
| |
| void testAddStreamClose() { |
| { |
| var sink = new IOSink(new TestConsumer([0])); |
| var controller = new StreamController(sync: true); |
| sink.addStream(controller.stream) |
| .then((_) { |
| sink.close(); |
| }); |
| controller.add([0]); |
| controller.close(); |
| } |
| { |
| var sink = new IOSink(new TestConsumer([0, 1, 2])); |
| var controller = new StreamController(sync: true); |
| sink.addStream(controller.stream) |
| .then((_) { |
| sink.close(); |
| }); |
| controller.add([0]); |
| controller.add([1]); |
| controller.add([2]); |
| controller.close(); |
| } |
| } |
| |
| void testAddStreamAddClose() { |
| { |
| var sink = new IOSink(new TestConsumer([0, 1])); |
| var controller = new StreamController(sync: true); |
| sink.addStream(controller.stream) |
| .then((_) { |
| sink.add([1]); |
| sink.close(); |
| }); |
| controller.add([0]); |
| controller.close(); |
| } |
| } |
| |
| void main() { |
| testClose(); |
| testAddClose(); |
| testAddStreamClose(); |
| testAddStreamAddClose(); |
| } |