// 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 test program for testing throw statement

class MyException1 {
  const MyException1([String message = "1"]) : message_ = message;
  final String message_;
}

class MyException2 {
  const MyException2([String message = "2"]) : message_ = message;
  final String message_;
}

class MyException3 {
  const MyException3([String message = "3"]) : message_ = message;
  final String message_;
}

class Helper {
  static int f1(int i) {
    try {
      int j;
      j = func();
    } on MyException3 catch (exception) {
      i = 300;
      print(exception.message_);
    } on MyException2 catch (exception) {
      i = 200;
      print(exception.message_);
    } on MyException1 catch (exception) {
      i = 100;
      print(exception.message_);
    } finally {
      i = i + 800;
    }
    return i;
  }

  // No catch in the same function for the type of exception being thrown
  // in the try block here. We expect the handler if checks to fall thru and
  // implicit rethrow to happen.
  static int func() {
    int i = 0;
    try {
      while (i < 10) {
        i++;
      }
      if (i > 0) {
        throw new MyException1("Test for MyException1 being thrown");
      }
    } on MyException3 catch (exception) {
      i = 300;
      print(exception.message_);
    } on MyException2 catch (exception) {
      i = 200;
      print(exception.message_);
    }
    return i;
  }
}

class Throw5Test {
  static testMain() {
    Expect.equals(900, Helper.f1(1));
  }
}

main() {
  Throw5Test.testMain();
}
