// 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 runGuarded(void action())
 *    Executes the given action in this zone and catches synchronous errors.
 *    This function is equivalent to:
 * try {
 *    this.run(action);
 * } catch (e, s) {
 *    this.handleUncaughtError(e, s);
 * }
 *    See run.
 * @description Checks that [action] is run in this zone
 * @author ilya
 * @author a.semenov@unipro.ru
 */
import "dart:async";
import "../../../Utils/expect.dart";

void test(Zone zone) {
  Zone? actionZone = null;

  void action() {
    actionZone = Zone.current;
  }

  zone.runGuarded(action);
  Expect.equals(zone, actionZone);
}

main() {
  test(Zone.current);
  test(Zone.current.fork());
}
