Index: packages/quiver/test/streams/concat_test.dart |
diff --git a/packages/quiver/test/streams/concat_test.dart b/packages/quiver/test/streams/concat_test.dart |
new file mode 100644 |
index 0000000000000000000000000000000000000000..7c05b0cee791ceeb47e1309ab976bbe3f9b147fb |
--- /dev/null |
+++ b/packages/quiver/test/streams/concat_test.dart |
@@ -0,0 +1,112 @@ |
+// Copyright 2014 Google Inc. All Rights Reserved. |
+// |
+// Licensed under the Apache License, Version 2.0 (the "License"); |
+// you may not use this file except in compliance with the License. |
+// You may obtain a copy of the License at |
+// |
+// http://www.apache.org/licenses/LICENSE-2.0 |
+// |
+// Unless required by applicable law or agreed to in writing, software |
+// distributed under the License is distributed on an "AS IS" BASIS, |
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
+// See the License for the specific language governing permissions and |
+// limitations under the License. |
+ |
+library quiver.streams.concat_test; |
+ |
+import 'dart:async'; |
+ |
+import 'package:test/test.dart'; |
+import 'package:quiver/streams.dart'; |
+ |
+main() { |
+ group('concat', () { |
+ test('should produce no events for no streams', |
+ () => concat([]).toList().then((events) => expect(events, isEmpty))); |
+ |
+ test('should echo events of a single stream', () { |
+ var controller = new StreamController<String>(); |
+ var concatenated = concat([controller.stream]); |
+ var expectation = concatenated.toList().then((e) { |
+ expect(e, ['a', 'b', 'c']); |
+ }); |
+ ['a', 'b', 'c'].forEach(controller.add); |
+ return Future.wait([controller.close(), expectation]); |
+ }); |
+ |
+ test('should handle empty streams', () { |
+ var concatenated = concat([new Stream.fromIterable([])]); |
+ return concatenated.toList().then((e) { |
+ expect(e, []); |
+ }); |
+ }); |
+ |
+ test('should concatenate stream data events', () { |
+ var controller1 = new StreamController<String>(); |
+ var controller2 = new StreamController<String>(); |
+ var concatenated = concat([controller1.stream, controller2.stream]); |
+ var expectation = concatenated.toList().then((e) { |
+ expect(e, ['a', 'b', 'c', 'd', 'e', 'f']); |
+ }); |
+ ['a', 'b', 'c'].forEach(controller1.add); |
+ ['d', 'e', 'f'].forEach(controller2.add); |
+ return Future |
+ .wait([controller1.close(), controller2.close(), expectation]); |
+ }); |
+ |
+ test('should concatenate stream error events', () { |
+ var controller1 = new StreamController<String>(); |
+ var controller2 = new StreamController<String>(); |
+ var concatenated = concat([controller1.stream, controller2.stream]); |
+ var errors = []; |
+ concatenated.listen(null, onError: errors.add); |
+ ['e1', 'e2'].forEach(controller1.addError); |
+ ['e3', 'e4'].forEach(controller2.addError); |
+ return Future.wait([controller1.close(), controller2.close()]).then((_) { |
+ expect(errors, ['e1', 'e2', 'e3', 'e4']); |
+ }); |
+ }); |
+ |
+ test('should forward pause, resume, and cancel to current stream', () { |
+ var wasPaused = false, |
+ wasResumed = false, |
+ wasCanceled = false; |
+ var controller = new StreamController<String>( |
+ onPause: () => wasPaused = true, |
+ onResume: () => wasResumed = true, |
+ onCancel: () { |
+ wasCanceled = true; |
+ }); |
+ var concatenated = concat([controller.stream]); |
+ var subscription = concatenated.listen(null); |
+ controller.add('a'); |
+ return new Future.value() |
+ .then((_) => subscription.pause()) |
+ .then((_) => subscription.resume()) |
+ |
+ // Give resume a chance to take effect. |
+ .then((_) => controller.add('b')) |
+ .then((_) => new Future(subscription.cancel)) |
+ .then((_) { |
+ expect(wasPaused, isTrue, reason: 'was not paused'); |
+ expect(wasResumed, isTrue, reason: 'was not resumed'); |
+ expect(wasCanceled, isTrue, reason: 'was not canceled'); |
+ }).then((_) => controller.close()); |
+ }); |
+ |
+ test('should forward iteration error and stop', () { |
+ var data = [], |
+ errors = []; |
+ var badIteration = |
+ ['e', 'this should not get thrown'].map((message) => throw message); |
+ var concatenated = concat(badIteration); |
+ var completer = new Completer(); |
+ concatenated |
+ .listen(data.add, onError: errors.add, onDone: completer.complete); |
+ return completer.future.then((_) { |
+ expect(data, []); |
+ expect(errors, ['e']); |
+ }); |
+ }); |
+ }); |
+} |