// Copyright (c) 2012, 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

// @dart = 2.9

import "package:expect/expect.dart";

abstract class TestException {
  String getMessage();
}

class MyException implements TestException {
  const MyException([String message = ""]) : message_ = message;
  String getMessage() {
    return message_;
  }

  final String message_;
}

class MyException2 implements TestException {
  const MyException2([String message = ""]) : message_ = message;
  String getMessage() {
    return message_;
  }

  final String message_;
}

class MyException3 implements TestException {
  const MyException3([String message = ""]) : message_ = message;
  String getMessage() {
    return message_;
  }

  final String message_;
}

class Helper {
  static int f1(int i) {
    try {
      int j;
      j = func();
    } on MyException3 catch (exception) {
      i = 100;
      print(exception.getMessage());
    } on MyException2 catch (exception) {
      try {
        i = func2();
        i = 200;
      } on TestException catch (exception) {
        i = 50;
      }
      print(exception.getMessage());
    } on MyException catch (exception) {
      i = func2();
      print(exception.getMessage());
    } finally {
      i = i + 800;
    }
    return i;
  }

  static int func() {
    int i = 0;
    while (i < 10) {
      i++;
    }
    if (i > 0) {
      throw new MyException2("Test for exception being thrown");
    }
    return i;
  }

  static int func2() {
    int i = 0;
    while (i < 10) {
      i++;
    }
    if (i > 0) {
      throw new MyException2("Test for exception being thrown");
    }
    return i;
  }
}

class Throw2Test {
  static testMain() {
    Expect.equals(850, Helper.f1(1));
  }
}

main() {
  Throw2Test.testMain();
}
