// 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 abstract bool inSameErrorZone(Zone otherZone)
/// Returns true if this and otherZone are in the same error zone.
/// Two zones are in the same error zone if they share the same
/// handleUncaughtError callback.
/// @description Checks that inSameErrorZone returns true if zones share the
/// same handleUncaughtError callback and false otherwise. Async cases.
/// @author ilya


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

var count=0;

HandleUncaughtErrorHandler newHandler() {
  return (Zone self, ZoneDelegate parent, Zone zone, e, st) {
    Expect.fail('shoud not be called');
  };
}

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

main() {
  var z = Zone.current;

  same ([_]) {
    Expect.isTrue(Zone.current.inSameErrorZone(z));
    asyncEnd();
  }

  diff ([_]) {
    Expect.isFalse(Zone.current.inSameErrorZone(z));
    asyncEnd();
  }

  asyncStart();
  scheduleMicrotask(same); // the same zone

  asyncStart();
  z.fork().scheduleMicrotask(same); // both do not have error callback

  asyncStart();
  new Future.value(1).then(same); // the same zone

  asyncStart();
  new Future.error(1).catchError(same); // the same zone

  asyncStart();
  newErrorZone(z).scheduleMicrotask(diff); // child is new error zone
}

