| Index: tests/lib/async/stream_controller_async_test.dart | 
| diff --git a/tests/lib/async/stream_controller_async_test.dart b/tests/lib/async/stream_controller_async_test.dart | 
| index e2aab21d6da40b916a4f6d232e33b0ff1c487c7d..53be91005be249e8497bcff6447cc80b59971768 100644 | 
| --- a/tests/lib/async/stream_controller_async_test.dart | 
| +++ b/tests/lib/async/stream_controller_async_test.dart | 
| @@ -53,28 +53,6 @@ testSingleController() { | 
| c.add(42); | 
| }); | 
|  | 
| -  test("Single-subscription StreamController subscription changes", () { | 
| -    StreamController c = new StreamController(); | 
| -    EventSink sink = c.sink; | 
| -    Stream stream = c.stream; | 
| -    int counter = 0; | 
| -    var subscription; | 
| -    subscription = stream.listen((data) { | 
| -      counter += data; | 
| -      Expect.throws(() => stream.listen(null), (e) => e is StateError); | 
| -      subscription.cancel(); | 
| -      stream.listen((data) { | 
| -        counter += data * 10; | 
| -      }, | 
| -      onDone: expectAsync0(() { | 
| -        Expect.equals(1 + 20, counter); | 
| -      })); | 
| -    }); | 
| -    sink.add(1); | 
| -    sink.add(2); | 
| -    sink.close(); | 
| -  }); | 
| - | 
| test("Single-subscription StreamController events are buffered when" | 
| " there is no subscriber", | 
| () { | 
| @@ -93,33 +71,6 @@ testSingleController() { | 
| Expect.equals(3, counter); | 
| })); | 
| }); | 
| - | 
| -  // Test subscription changes while firing. | 
| -  test("Single-subscription StreamController subscription changes while firing", | 
| -       () { | 
| -    StreamController c = new StreamController(); | 
| -    EventSink sink = c.sink; | 
| -    Stream stream = c.stream; | 
| -    int counter = 0; | 
| -    var subscription = stream.listen(null); | 
| -    subscription.onData(expectAsync1((data) { | 
| -      counter += data; | 
| -      subscription.cancel(); | 
| -      stream.listen((data) { | 
| -        counter += 10 * data; | 
| -      }, | 
| -      onDone: expectAsync0(() { | 
| -        Expect.equals(1 + 20 + 30 + 40 + 50, counter); | 
| -      })); | 
| -      Expect.throws(() => stream.listen(null), (e) => e is StateError); | 
| -    })); | 
| -    sink.add(1); // seen by stream 1 | 
| -    sink.add(2); // seen by stream 10 and 100 | 
| -    sink.add(3); // -"- | 
| -    sink.add(4); // -"- | 
| -    sink.add(5); // seen by stream 10 | 
| -    sink.close(); | 
| -  }); | 
| } | 
|  | 
| testExtraMethods() { | 
| @@ -478,10 +429,66 @@ testRethrow() { | 
| testFuture("drain", (s, act) => s.drain().then(act)); | 
| } | 
|  | 
| +void testMultiplex() { | 
| +  test("multiplex-basic", () { | 
| +    StreamController<int> c = new StreamController.multiplex( | 
| +      onListen: expectAsync0(() {}), | 
| +      onCancel: expectAsync0(() {}) | 
| +    ); | 
| +    Stream<int> s = c.stream; | 
| +    s.listen(expectAsync1((x) { expect(x, equals(42)); })); | 
| +    c.add(42); | 
| +    c.close(); | 
| +  }); | 
| + | 
| +  test("multiplex-listen-twice", () { | 
| +    StreamController<int> c = new StreamController.multiplex( | 
| +      onListen: expectAsync0(() {}), | 
| +      onCancel: expectAsync0(() {}) | 
| +    ); | 
| +    c.stream.listen(expectAsync1((x) { expect(x, equals(42)); }, count: 2)); | 
| +    c.add(42); | 
| +    c.stream.listen(expectAsync1((x) { expect(x, equals(42)); })); | 
| +    c.add(42); | 
| +    c.close(); | 
| +  }); | 
| + | 
| +  test("multiplex-listen-twice-non-overlap", () { | 
| +    StreamController<int> c = new StreamController.multiplex( | 
| +      onListen: expectAsync0(() {}, count: 2), | 
| +      onCancel: expectAsync0(() {}, count: 2) | 
| +    ); | 
| +    var sub = c.stream.listen(expectAsync1((x) { expect(x, equals(42)); })); | 
| +    c.add(42); | 
| +    sub.cancel(); | 
| +    c.stream.listen(expectAsync1((x) { expect(x, equals(42)); })); | 
| +    c.add(42); | 
| +    c.close(); | 
| +  }); | 
| + | 
| +  test("multiplex-individual-pause", () { | 
| +    StreamController<int> c = new StreamController.multiplex( | 
| +      onListen: expectAsync0(() {}), | 
| +      onCancel: expectAsync0(() {}) | 
| +    ); | 
| +    var sub1 = c.stream.listen(expectAsync1((x) { expect(x, equals(42)); })); | 
| +    var sub2 = c.stream.listen(expectAsync1((x) { expect(x, equals(42)); }, | 
| +                                            count: 3)); | 
| +    c.add(42); | 
| +    sub1.pause(); | 
| +    c.add(42); | 
| +    sub1.cancel(); | 
| +    var sub3 = c.stream.listen(expectAsync1((x) { expect(x, equals(42)); })); | 
| +    c.add(42); | 
| +    c.close(); | 
| +  }); | 
| +} | 
| + | 
| main() { | 
| testController(); | 
| testSingleController(); | 
| testExtraMethods(); | 
| testPause(); | 
| testRethrow(); | 
| +  testMultiplex(); | 
| } | 
|  |