// (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.

import "package:expect/expect.dart";

void func1() {
  throw new Exception("Test peanut gallery request for Full stacktrace");
}
void func2() {
  func1();
}
void func3() {
  try {
    func2();
  } on Object catch(e, s) {
    print(e);

    var full_trace = s.fullStackTrace;
    Expect.isTrue(full_trace.contains("func1"));
    Expect.isTrue(full_trace.contains("func2"));
    Expect.isTrue(full_trace.contains("func3"));
    Expect.isTrue(full_trace.contains("func4"));
    Expect.isTrue(full_trace.contains("func5"));
    Expect.isTrue(full_trace.contains("func6"));
    Expect.isTrue(full_trace.contains("func7"));
    Expect.isTrue(full_trace.contains("main"));

    var trace = s.stackTrace;
    Expect.isTrue(trace.contains("func1"));
    Expect.isTrue(trace.contains("func2"));
    Expect.isTrue(trace.contains("func3"));

    Expect.isFalse(trace.contains("func4"));
    Expect.isFalse(trace.contains("func5"));
    Expect.isFalse(trace.contains("func6"));
    Expect.isFalse(trace.contains("func7"));
    Expect.isFalse(trace.contains("main"));

    print(s);

    print("Full stack trace");
    print(full_trace);

    print("Stack trace");
    print(trace);

    throw;  // This is a rethrow.
  }
}
int func4() {
  func3();
  return 1;
}
int func5() {
  try {
    func4();
  } on Object catch(e, s) {

    var full_trace = s.fullStackTrace;
    print(full_trace);
    Expect.isTrue(full_trace.contains("func1"));
    Expect.isTrue(full_trace.contains("func2"));
    Expect.isTrue(full_trace.contains("func3"));
    Expect.isTrue(full_trace.contains("func4"));
    Expect.isTrue(full_trace.contains("func5"));
    Expect.isTrue(full_trace.contains("func6"));
    Expect.isTrue(full_trace.contains("func7"));
    Expect.isTrue(full_trace.contains("main"));

    var trace = s.stackTrace;
    Expect.isTrue(trace.contains("func1"));
    Expect.isTrue(trace.contains("func2"));
    Expect.isTrue(trace.contains("func3"));
    Expect.isTrue(trace.contains("func4"));
    Expect.isTrue(trace.contains("func5"));

    Expect.isFalse(trace.contains("func6"));
    Expect.isFalse(trace.contains("func7"));
    Expect.isFalse(trace.contains("main"));

    print(s);

    print("Full stack trace");
    print(full_trace);

    print("Stack trace");
    print(trace);
  }
  return 1;
}
int func6() {
  func5();
  return 1;
}
int func7() {
  func6();
  return 1;
}
main() {
  var i = func7();
  Expect.equals(1, i);
}
