// TODO(multitest): This was automatically migrated from a multitest and may
// contain strange or dead code.

// @dart = 2.9

// 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;

        // There should be no stackTrace in this normal exception object.
        // We should get a NoSuchMethodError.




    }
    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();
}
