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