// 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 Execution of a try statement of the form try s1 on−catch1 ...
 * on−catchn finally sf; proceeds as follows:
 *   The statement s1 is executed in the dynamic scope of the exception handler
 * defined by the try statement. Then, the finally clause is executed.
 *   Whether any of the on-catch clauses is executed depends on whether a
 * matching exception has been raised by s1 (see the specification of the throw
 * statement).
 *   If s1 has raised an exception, it will transfer control to the try statements
 * handler, which will examine the catch clauses in order for a match as
 * specified above. If no matches are found, the handler will execute the
 * finally clause.
 *   If a matching on-catch was found, it will execute first, and then the
 * finally clause will be executed.
 * @description Checks the execution order of the various parts of a try
 * statement.
 * @author kaigorodov
 */
import '../../../Utils/expect.dart';

class E0 implements Exception {}
class E1 implements Exception {}
class E2 extends E1 {}
class E3 extends E1 {}

void test(void f(), int expected) {
  int log = 0;
  void append(int digit) {log = log * 10 + digit;}

  try {
    append(1);
    f();
    append(2);
  } on E2 catch (e) {
    append(3);
  } on E1 catch (e) {
    append(4);
  } catch (e) {
    append(5);
  } finally {
    append(6);
  }

  Expect.equals(expected, log);
}

void main() {
  test(() {}, 126);
  test(() {throw new E0();}, 156);
  test(() {throw new E1();}, 146);
  test(() {throw new E2();}, 136);
  test(() {throw new E3();}, 146);
  test(() {throw 1;}, 156);
}
