// 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 execution of finally blocks after an exception
// is thrown from inside a local function capturing a variable.

import "package:expect/expect.dart";

class MyException {
  const MyException(String message) : message_ = message;
  final String message_;
}

class Helper {
  static int f1(int k) {
    var b;
    try {
      var a = new List<dynamic>.filled(10, null);
      int i = 0;
      while (i < 10) {
        int j = i;
        a[i] = () {
          if (j == 5) {
            throw new MyException("Test for exception being thrown");
          }
          k += 10;
          return j;
        };
        if (i == 0) {
          b = a[i];
        }
        i++;
      }
      for (int i = 0; i < 10; i++) {
        a[i]();
      }
    } on MyException catch (exception) {
      k += 100;
      print(exception.message_);
      b();
    } finally {
      k += 1000;
      b();
    }
    return k;
  }
}

class ExecuteFinally7Test {
  static testMain() {
    Expect.equals(1171, Helper.f1(1));
  }
}

main() {
  ExecuteFinally7Test.testMain();
}
