| Index: tests/lib_strong/async/stream_listen_zone_test.dart
|
| diff --git a/tests/lib_strong/async/stream_listen_zone_test.dart b/tests/lib_strong/async/stream_listen_zone_test.dart
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..3ac944b0992ce48dc77172668c9a0b60c88de1ff
|
| --- /dev/null
|
| +++ b/tests/lib_strong/async/stream_listen_zone_test.dart
|
| @@ -0,0 +1,148 @@
|
| +// 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.
|
| +
|
| +library stream_listen_zeno_test;
|
| +
|
| +import "dart:async";
|
| +import "package:expect/expect.dart";
|
| +import "package:async_helper/async_helper.dart";
|
| +
|
| +main() {
|
| + asyncStart();
|
| + var controller;
|
| + for (bool overrideDone in [false, true]) {
|
| + for (bool sync in [false, true]) {
|
| + var mode = "${sync ? "-sync" : ""}${overrideDone ? "-od": ""}";
|
| + controller = new StreamController(sync: sync);
|
| + testStream("SC$mode", controller, controller.stream, overrideDone);
|
| + controller = new StreamController.broadcast(sync: sync);
|
| + testStream("BSC$mode", controller, controller.stream, overrideDone);
|
| + controller = new StreamController(sync: sync);
|
| + testStream("SCAB$mode", controller, controller.stream.asBroadcastStream(),
|
| + overrideDone, 3);
|
| + controller = new StreamController(sync: sync);
|
| + testStream("SCMap$mode", controller, controller.stream.map((x) => x),
|
| + overrideDone, 3);
|
| + }
|
| + }
|
| + asyncEnd();
|
| +}
|
| +
|
| +void testStream(String name, StreamController controller, Stream stream,
|
| + bool overrideDone, [int registerExpect = 0]) {
|
| + asyncStart();
|
| + StreamSubscription sub;
|
| + Zone zone;
|
| + int registerCount = 0;
|
| + int callbackBits = 0;
|
| + int stepCount = 0;
|
| + Function step;
|
| + void nextStep() { Zone.ROOT.scheduleMicrotask(step); }
|
| + runZoned(() {
|
| + zone = Zone.current;
|
| + sub = stream.listen((v) {
|
| + Expect.identical(zone, Zone.current, name);
|
| + Expect.equals(42, v, name);
|
| + callbackBits |= 1;
|
| + nextStep();
|
| + }, onError: (e, s) {
|
| + Expect.identical(zone, Zone.current, name);
|
| + Expect.equals("ERROR", e, name);
|
| + callbackBits |= 2;
|
| + nextStep();
|
| + }, onDone: () {
|
| + Expect.identical(zone, Zone.current, name);
|
| + if (overrideDone) throw "RUNNING WRONG ONDONE";
|
| + callbackBits |= 4;
|
| + nextStep();
|
| + });
|
| + registerExpect += 3;
|
| + Expect.equals(registerExpect, registerCount, name);
|
| + }, zoneSpecification: new ZoneSpecification(
|
| + registerCallback: (self, p, z, callback()) {
|
| + Expect.identical(zone, self, name);
|
| + registerCount++;
|
| + return () {
|
| + Expect.identical(zone, Zone.current, name);
|
| + callback();
|
| + };
|
| + },
|
| + registerUnaryCallback: (self, p, z, callback(a)) {
|
| + Expect.identical(zone, self, name);
|
| + registerCount++;
|
| + return (a) {
|
| + Expect.identical(zone, Zone.current, name);
|
| + callback(a);
|
| + };
|
| + },
|
| + registerBinaryCallback: (self, package, z, callback(a, b)) {
|
| + Expect.identical(zone, self, name);
|
| + registerCount++;
|
| + return (a, b) {
|
| + Expect.identical(zone, Zone.current, name);
|
| + callback(a, b);
|
| + };
|
| + }
|
| + ));
|
| +
|
| + int expectedBits = 0;
|
| + step = () {
|
| + var stepName = "$name-$stepCount";
|
| + Expect.identical(Zone.ROOT, Zone.current, stepName);
|
| + Expect.equals(expectedBits, callbackBits, stepName);
|
| + switch (stepCount++) {
|
| + case 0:
|
| + expectedBits |= 1;
|
| + controller.add(42);
|
| + break;
|
| + case 1:
|
| + expectedBits |= 2;
|
| + controller.addError("ERROR", null);
|
| + break;
|
| + case 2:
|
| + Expect.equals(registerExpect, registerCount, stepName);
|
| + sub.onData((v) {
|
| + Expect.identical(zone, Zone.current, stepName);
|
| + Expect.equals(37, v);
|
| + callbackBits |= 8;
|
| + nextStep();
|
| + });
|
| + Expect.equals(++registerExpect, registerCount, stepName);
|
| + expectedBits |= 8;
|
| + controller.add(37);
|
| + break;
|
| + case 3:
|
| + Expect.equals(registerExpect, registerCount, stepName);
|
| + sub.onError((e, s) {
|
| + Expect.identical(zone, Zone.current);
|
| + Expect.equals("BAD", e);
|
| + callbackBits |= 16;
|
| + nextStep();
|
| + });
|
| + Expect.equals(++registerExpect, registerCount, stepName);
|
| + expectedBits |= 16;
|
| + controller.addError("BAD", null);
|
| + break;
|
| + case 4:
|
| + Expect.equals(registerExpect, registerCount, stepName);
|
| + if (overrideDone) {
|
| + sub.onDone(() {
|
| + Expect.identical(zone, Zone.current);
|
| + callbackBits |= 32;
|
| + nextStep();
|
| + });
|
| + registerExpect++;
|
| + expectedBits |= 32;
|
| + } else {
|
| + expectedBits |= 4;
|
| + }
|
| + Expect.equals(registerExpect, registerCount, stepName);
|
| + controller.close();
|
| + break;
|
| + case 5:
|
| + asyncEnd();
|
| + }
|
| + };
|
| + step();
|
| +}
|
|
|