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

import "package:expect/expect.dart";

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

class Helper1 {
  static int func1() {
    return func2();
  }

  static int func2() {
    return func3();
  }

  static int func3() {
    return func4();
  }

  static int func4() {
    var i = 0;
    try {
      i = 10;
      func5();
    } on ArgumentError catch (e) {
      i = 100;
      Expect.isNotNull(e.stackTrace, "Errors need a stackTrace on throw");
    }
    return i;
  }

  static void func5() {
    // Throw an Error.
    throw new ArgumentError("ArgumentError in func5");
  }
}

class Helper2 {
  static int func1() {
    return func2();
  }

  static int func2() {
    return func3();
  }

  static int func3() {
    return func4();
  }

  static int func4() {
    var i = 0;
    try {
      i = 10;
      func5();
    } on ArgumentError catch (e, s) {
      i = 200;
      Expect.isNotNull(e.stackTrace, "Errors need a stackTrace on throw");
      Expect.equals(e.stackTrace.toString(), s.toString());
    }
    return i;
  }

  static List func5() {
    // Throw an Error.
    throw new ArgumentError("ArgumentError in func5");
  }
}

class Helper3 {
  static int func1() {
    return func2();
  }

  static int func2() {
    return func3();
  }

  static int func3() {
    return func4();
  }

  static int func4() {
    var i = 0;
    try {
      i = 10;
      func5();
    } on MyException catch (e) {
      i = 300;
      try {
        // There should be no stackTrace in this normal exception object.
        // We should get a NoSuchMethodError.
        var trace = e.stackTrace; //# static type warning
      } on NoSuchMethodError catch (e) {
        Expect.isNotNull(e.stackTrace, "Error needs a stackTrace on throw");
      }
    }
    return i;
  }

  static List func5() {
    // Throw an Exception (any random object).
    throw new MyException("MyException in func5");
  }
}

class ErrorStackTraceTest {
  static testMain() {
    Expect.equals(100, Helper1.func1());
    Expect.equals(200, Helper2.func1());
    Expect.equals(300, Helper3.func1());
  }
}

main() {
  ErrorStackTraceTest.testMain();
}
