|  | // 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/expect.dart'; | 
|  | import 'package:async_helper/async_helper.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(createTimer: | 
|  | (Zone self, ZoneDelegate parent, Zone origin, Duration duration, f()) { | 
|  | events.add("forked.createTimer"); | 
|  | return parent.createTimer(origin, duration, () { | 
|  | events.add("wrapped function ${duration.inMilliseconds}"); | 
|  | f(); | 
|  | }); | 
|  | })); | 
|  |  | 
|  | asyncStart(); | 
|  | forked.run(() { | 
|  | Timer timer = new Timer(const Duration(milliseconds: 20), () { | 
|  | events.add("createTimer"); | 
|  | Expect.identical(forked, Zone.current); | 
|  | done.complete(true); | 
|  | }); | 
|  | }); | 
|  |  | 
|  | Expect.identical(Zone.root, Zone.current); | 
|  | events.add("after createTimer"); | 
|  |  | 
|  | done.future.whenComplete(() { | 
|  | Expect.listEquals([ | 
|  | "forked.createTimer", | 
|  | "after createTimer", | 
|  | "wrapped function 20", | 
|  | "createTimer" | 
|  | ], events); | 
|  | asyncEnd(); | 
|  | }); | 
|  | } |