// 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.
// Test correct source positions in stack trace with optimized functions.
import "package:expect/expect.dart";

// (1) Test normal exception.
foo(x) => bar(x);

bar(x) {
  if (x == null) throw 42; // throw at position 11:18
  return x + 1;
}

test1() {
  // First unoptimized.
  try {
    foo(null);
    Expect.fail("Unreachable");
  } catch (e, stacktrace) {
    String s = stacktrace.toString();
    print(s);
    Expect.isFalse(s.contains("-1:-1"), "A");
    Expect.isTrue(s.contains("optimized_stacktrace_line_test.dart:11"), "B");
  }

  // Optimized.
  for (var i = 0; i < 10000; i++) foo(42);
  try {
    foo(null);
    Expect.fail("Unreachable");
  } catch (e, stacktrace) {
    String s = stacktrace.toString();
    print(s);
    Expect.isFalse(s.contains("-1:-1"), "C");
    Expect.isTrue(s.contains("optimized_stacktrace_line_test.dart:11"), "D");
  }
}

// (2) Test checked mode exceptions.
maximus(x) => moritz(x);

moritz(x) {
  if (x == 333) return 42 ? 0 : 1; // Throws in checked mode.
  if (x == 777) {
    bool b = x; // Throws in checked mode.
    return b;
  }

  return x + 1;
}

test2() {
  for (var i = 0; i < 100000; i++) maximus(42);
  try {
    maximus(333);
  } catch (e, stacktrace) {
    String s = stacktrace.toString();
    print(s);
    Expect.isTrue(s.contains("maximus"), "E");
    Expect.isTrue(s.contains("moritz"), "F");
    Expect.isFalse(s.contains("-1:-1"), "G");
  }

  try {
    maximus(777);
  } catch (e, stacktrace) {
    String s = stacktrace.toString();
    print(s);
    Expect.isTrue(s.contains("maximus"), "H");
    Expect.isTrue(s.contains("moritz"), "I");
    Expect.isFalse(s.contains("-1:-1"), "J");
  }
}

main() {
  test1();
  test2();
}
