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

import "package:expect/expect.dart";

void argument() {
  throw new ArgumentError(499);
}

// Verify that
void noSuchMethod() {
  (499 as dynamic).doesNotExist();
}

void nullThrown() {
  throw null as dynamic;
}

void range() {
  throw new RangeError.range(0, 1, 2);
}

abstract class A {
  foo();
}

void unsupported() {
  throw new UnsupportedError("unsupported");
}

void unimplemented() {
  throw new UnimplementedError("unimplemented");
}

void state() {
  [1, 2].single;
}

void cast() {
  dynamic d = 1;
  d as String;
}

main() {
  List<Function> errorFunctions = [
    argument,
    noSuchMethod,
    nullThrown, //# nullThrown: ok
    range,
    unsupported,
    unimplemented,
    state,
    cast,
  ];

  for (var f in errorFunctions) {
    bool hasThrown = false;
    try {
      f();
    } on Error catch (e) {
      hasThrown = true;
      Expect.isTrue(
          e.stackTrace is StackTrace, "$e doesn't have a non-null stack trace");
    }
    Expect.isTrue(hasThrown);
  }
}
