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

  var valueToCapture;
  var restoredValue;

  Expect.identical(Zone.root, Zone.current);
  Zone forked = Zone.current.fork(specification: new ZoneSpecification(
      registerUnaryCallback:
          <R, T>(Zone self, ZoneDelegate parent, Zone origin, R f(T arg)) {
    // 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.current, Zone.root);
    // Note that not forwarding is completely legal, though not encouraged.
    var capturedValue = valueToCapture;
    return parent.registerUnaryCallback(origin, (arg) {
      restoredValue = capturedValue;
      return f(arg);
    });
  }));

  valueToCapture = 499;
  var fun = (x) {
    Expect.identical(forked, Zone.current);
    return x + 99;
  };
  var bound = forked.bindUnaryCallback(fun);
  Expect.isFalse(identical(fun, bound));

  // It is legal to invoke the callback in a different zone. This is, of course,
  // extremely discouraged.
  var result = bound(399);
  Expect.equals(498, result);
  Expect.equals(499, restoredValue);
}
