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

/// @assertion void Function(T1, T2) bindBinaryCallbackGuarded<T1, T2>(
///                void callback(T1 argument1,T2 argument2)
///            )
/// Registers the provided callback and returns a function that will execute
/// in this zone.
/// Equivalent to:
///    ZoneCallback registered = registerBinaryCallback(callback);
///    return (arg1, arg2) => this.runBinaryGuarded(registered, arg1, arg2);
/// @description Checks that synchronous [callback] errors are caught in zone
/// @author a.semenov@unipro.ru


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

main() {
  int handlerCallCount = 0;
  var caughtError = null;

  void handler(Zone self, ZoneDelegate parent, Zone zone, e, st) {
    handlerCallCount++;
    caughtError = e;
  }

  Zone zone = Zone.current.fork(
      specification: new ZoneSpecification(
          handleUncaughtError: handler
      )
  );

  void callback(int x, int y) {
    Expect.equals(1, x);
    Expect.equals(2, y);
    throw "callback error";
  }

  void Function(int, int) boundCallback =
                          zone.bindBinaryCallbackGuarded<int,int>(callback);
  boundCallback(1,2);
  Expect.equals(1, handlerCallCount);
  Expect.equals("callback error", caughtError);
}
