// 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.

// @dart = 2.9

import 'package:expect/expect.dart';
import 'package:async_helper/async_helper.dart';
import 'dart:async';

main() {
  Completer done = new Completer();
  List events = [];

  bool shouldForward = true;
  Expect.identical(Zone.root, Zone.current);
  Zone forked = Zone.current.fork(specification: new ZoneSpecification(
      run: <R>(Zone self, ZoneDelegate parent, Zone origin, R f()) {
    // The zone is still the same as when origin.run was invoked, which
    // is the root zone. (The origin zone hasn't been set yet).
    Expect.identical(Zone.root, Zone.current);
    events.add("forked.run");
    if (shouldForward) return parent.run(origin, f);
    return 42 as R;
  }));

  events.add("zone forked");
  Zone expectedZone = forked;
  var result = forked.run(() {
    Expect.identical(expectedZone, Zone.current);
    events.add("run closure");
    return 499;
  });
  Expect.equals(499, result);
  events.add("executed run");

  shouldForward = false;
  result = forked.run(() {
    Expect.fail("should not be invoked");
  });
  Expect.equals(42, result);
  events.add("executed run2");

  asyncStart();
  shouldForward = true;
  result = forked.run(() {
    Expect.identical(forked, Zone.current);
    events.add("run closure 2");
    forked.scheduleMicrotask(() {
      events.add("run closure 3");
      Expect.identical(forked, Zone.current);
      done.complete(true);
    });
    return 1234;
  });
  events.add("after nested scheduleMicrotask");
  Expect.equals(1234, result);

  done.future.whenComplete(() {
    Expect.listEquals([
      "zone forked",
      "forked.run",
      "run closure",
      "executed run",
      "forked.run",
      "executed run2",
      "forked.run",
      "run closure 2",
      "after nested scheduleMicrotask",
      "forked.run",
      "run closure 3"
    ], events);
    asyncEnd();
  });

  var zone1 = Zone.root.fork();
  var zone2 = Zone.root.fork();
  var zone3 = Zone.root.fork();
  asyncStart();
  asyncStart();
  zone1.run(() {
    var future = new Future.value();
    zone2.run(() {
      future.then((_) {
        Expect.identical(zone2, Zone.current);
        asyncEnd();
      });
    });
    zone3.run(() {
      future.then((_) {
        Expect.identical(zone3, Zone.current);
        asyncEnd();
      });
    });
  });
}
