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

class SubclassOfError extends Error {}

fail() => throw "Fail";

// == Rethrow, skipping through typed handlers. ==

aa1() {
  try {
    bb1();
    fail();
  } catch (error
          , stacktrace // //# withtraceparameter: ok
  ) {
    expectTrace(
        ['gg1', 'ff1', 'ee1', 'dd1', 'cc1', 'bb1', 'aa1'], error.stackTrace);
    expectTrace(['gg1', 'ff1', 'ee1', 'dd1', 'cc1', 'bb1', 'aa1'], stacktrace); // //# withtraceparameter: continued
  }
}

bb1() => cc1();

cc1() {
  try {
    dd1();
  } on String catch (e) {
    fail();
  } on int catch (e) {
    fail();
  }
}

dd1() => ee1();

ee1() {
  try {
    ff1();
  } catch (e) {
    rethrow;
  }
}

ff1() => gg1();

gg1() => throw new SubclassOfError();

// == Rethrow, rethrow again in typed handler. ==

aa2() {
  try {
    bb2();
    fail();
  } catch (error
          , stacktrace // //# withtraceparameter: continued
  ) {
    expectTrace(
        ['gg2', 'ff2', 'ee2', 'dd2', 'cc2', 'bb2', 'aa2'], error.stackTrace);
    expectTrace(['gg2', 'ff2', 'ee2', 'dd2', 'cc2', 'bb2', 'aa2'], stacktrace); // //# withtraceparameter: continued
  }
}

bb2() => cc2();

cc2() {
  try {
    dd2();
  } on SubclassOfError catch (e) {
    rethrow;
  } on int catch (e) {
    fail();
  }
}

dd2() => ee2();

ee2() {
  try {
    ff2();
  } catch (e) {
    rethrow;
  }
}

ff2() => gg2();

gg2() => throw new SubclassOfError();

// == Rethrow, with intervening catch without a trace parameter.

aa3() {
  try {
    bb3();
    fail();
  } catch (error
          , stacktrace // //# withtraceparameter: continued
  ) {
    expectTrace(
        ['gg3', 'ff3', 'ee3', 'dd3', 'cc3', 'bb3', 'aa3'], error.stackTrace);
    expectTrace(['cc3', 'bb3', 'aa3'], stacktrace); // //# withtraceparameter: continued
  }
}

bb3() => cc3();

cc3() {
  try {
    dd3();
  } catch (e) {
    throw e;
  }
}

dd3() => ee3();

ee3() {
  try {
    ff3();
  } catch (e) {
    rethrow;
  }
}

ff3() => gg3();

gg3() => throw new SubclassOfError();

expectTrace(functionNames, stacktrace) {
  // Note we don't expect functionNames to cover the whole trace, only the
  // top portion, because the frames below main are an implementation detail.
  var traceLines = stacktrace.toString().split('\n');
  var expectedIndex = 0;
  var actualIndex = 0;
  print(stacktrace);
  print(functionNames);
  while (expectedIndex < functionNames.length) {
    var expected = functionNames[expectedIndex];
    var actual = traceLines[actualIndex];
    if (actual.indexOf(expected) == -1) {
      if (expectedIndex == 0) {
        actualIndex++; // Skip over some helper frames at the top
      } else {
        throw "Expected: $expected actual: $actual";
      }
    } else {
      actualIndex++;
      expectedIndex++;
    }
  }
}

main() {
  aa1();
  aa2();
  aa3();
}
