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(); |
}); |