// Copyright (c) 2011, 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

/// @assertion ZoneUnaryCallback<R, T> bindUnaryCallback<R, T>(
///                                      R callback(T argument)
///                                    )
///    Registers the provided callback and returns a function that will
/// execute in this zone.
///    Equivalent to:
/// ZoneCallback registered = this.registerUnaryCallback(callback);
/// return (arg) => thin.runUnary(registered, arg);
/// @description Checks that [callback] is run in the zone it was bound to.
/// @author ilya
/// @author a.semenov@unipro.ru


import "dart:async";
import "../../../Utils/expect.dart";

main() {
  Zone zone = Zone.current;
  Zone callbackZone = null;

  int callback(int x) {
    callbackZone = Zone.current;
    return x * 2;
  }

  ZoneUnaryCallback<int, int> boundCallback =
                                    zone.bindUnaryCallback<int, int>(callback);

  int result = null;
  runZoned(() {
    result = boundCallback(3);
  });
  Expect.equals(6, result);
  Expect.equals(zone, callbackZone);
}
