/*
 * 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 handleUncaughtError(error, StackTrace stackTrace)
 *  Handles uncaught asynchronous errors.
 * @description Checks that handleUncaughtError callback can be set via
 * ZoneSpecification and that correct callback is invoked. 
 * @author ilya
 */
import "dart:async";
import "../../../Utils/expect.dart";

int count = 0;
var stackTraces={};

HandleUncaughtErrorHandler newHandler() {
  int id = ++count;
  return (Zone self, ZoneDelegate parent, Zone zone, e, st) {
    Expect.identical(id, e);
    Expect.identical(stackTraces[id], st);
  };
}

Zone newErrorZone (Zone z) =>
  z.fork(specification: new ZoneSpecification(handleUncaughtError: newHandler()));

void test() {
  try {
    throw count; // i-th error should be caught by i-th handler
  } catch (e, st) {
    stackTraces[count] = st;
    Zone.current.handleUncaughtError(e, st);
  }

  if (count < 10) {
    newErrorZone(Zone.current).run(test);
  }
}

main() {
  newErrorZone(Zone.current).run(test);
}
