Chromium Code Reviews| Index: pkg/scheduled_test/lib/src/mock_clock.dart |
| diff --git a/pkg/scheduled_test/lib/src/mock_clock.dart b/pkg/scheduled_test/lib/src/mock_clock.dart |
| index 6abe81f155031ca75d4c4b68114b4b9eb725c2d1..caae4a324c7dd6d9e81014df93ebb3cbbba9db13 100644 |
| --- a/pkg/scheduled_test/lib/src/mock_clock.dart |
| +++ b/pkg/scheduled_test/lib/src/mock_clock.dart |
| @@ -44,27 +44,40 @@ class Clock { |
| int get time => _time; |
| int _time = 0; |
| + /// Collection of controllers of all subscribed listeners. |
| + Set<StreamController> _subscriptions = new Set<StreamController>(); |
| + |
| + Clock._(); |
| + |
| /// The stream of millisecond ticks of the clock. |
| Stream<int> get onTick { |
| - if (_onTickControllerStream == null) { |
| - _onTickControllerStream = _onTickController.stream.asBroadcastStream(); |
| - } |
| - return _onTickControllerStream; |
| + StreamController<int> controller; |
|
floitsch
2013/05/23 18:38:23
We should really provide a StreamController that d
|
| + controller = new StreamController<int>( |
| + onListen: () { |
| + _subscriptions.add(controller); |
| + }, |
| + onCancel: () { |
| + _subscriptions.remove(controller); |
| + }); |
| + return controller.stream; |
| } |
| - final _onTickController = new StreamController<int>(); |
| - Stream<int> _onTickControllerStream; |
| - |
| - Clock._(); |
| /// Advances the clock forward by [milliseconds]. This works like synchronous |
| /// code that takes [milliseconds] to execute; any [Timer]s that are scheduled |
| /// to fire during the interval will do so asynchronously once control returns |
| /// to the event loop. |
| - void tick([int milliseconds=1]) { |
| + void tick([int milliseconds = 1]) { |
| for (var i = 0; i < milliseconds; i++) { |
| var tickTime = ++_time; |
| - new Future.value().then((_) => _onTickController.add(tickTime)); |
| + runAsync(() { |
| + List<StreamController> controllers = _subscriptions.toList(); |
| + for (StreamController controller in controllers) { |
| + if (controller in _subscriptions) { |
| + controller.add(tickTime); |
| + } |
| + } |
| + }); |
| } |
| } |
| @@ -74,7 +87,7 @@ class Clock { |
| /// code runs before the next tick. |
| void run() { |
| pumpEventQueue().then((_) { |
| - if (!_onTickController.hasListener) return; |
| + if (_subscriptions.isEmpty) return; |
| tick(); |
| return run(); |
| }); |