| // 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. | |
| import 'package:expect/async_helper.dart'; | |
| import 'package:expect/expect.dart'; | |
| import 'dart:async'; | |
| main() { | |
| Completer done = new Completer(); | |
| List events = []; | |
| Expect.identical(Zone.root, Zone.current); | |
| Zone forked; | |
| forked = Zone.current.fork( | |
| specification: new ZoneSpecification( | |
| createPeriodicTimer: | |
| ( | |
| Zone self, | |
| ZoneDelegate parent, | |
| Zone origin, | |
| Duration period, | |
| f(Timer timer), | |
| ) { | |
| events.add("forked.createPeriodicTimer"); | |
| return parent.createPeriodicTimer(origin, period, (Timer timer) { | |
| events.add("wrapped function ${period.inMilliseconds}"); | |
| f(timer); | |
| }); | |
| }, | |
| ), | |
| ); | |
| asyncStart(); | |
| int tickCount = 0; | |
| forked.run(() { | |
| new Timer.periodic(const Duration(milliseconds: 5), (Timer timer) { | |
| events.add("periodic Timer $tickCount"); | |
| Expect.identical(forked, Zone.current); | |
| tickCount++; | |
| if (tickCount == 4) { | |
| timer.cancel(); | |
| // Allow some time in case the cancel didn't work. | |
| new Timer(const Duration(milliseconds: 20), done.complete); | |
| } | |
| }); | |
| }); | |
| Expect.identical(Zone.root, Zone.current); | |
| events.add("after createPeriodicTimer"); | |
| done.future.whenComplete(() { | |
| Expect.listEquals([ | |
| "forked.createPeriodicTimer", | |
| "after createPeriodicTimer", | |
| "wrapped function 5", | |
| "periodic Timer 0", | |
| "wrapped function 5", | |
| "periodic Timer 1", | |
| "wrapped function 5", | |
| "periodic Timer 2", | |
| "wrapped function 5", | |
| "periodic Timer 3", | |
| ], events); | |
| asyncEnd(); | |
| }); | |
| } |