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

library test.invoke_throws_test;

import 'dart:mirrors';

import 'package:expect/expect.dart';

class MyException {}

class Class {
  Class.noException();
  Class.generative() {
    throw new MyException();
  }
  Class.redirecting() : this.generative();
  factory Class.faktory() {
    throw new MyException();
  }
  factory Class.redirectingFactory() = Class.faktory;

  get getter {
    throw new MyException();
  }

  set setter(v) {
    throw new MyException();
  }

  method() {
    throw new MyException();
  }

  noSuchMethod(invocation) {
    throw new MyException();
  }

  static get staticGetter {
    throw new MyException();
  }

  static set staticSetter(v) {
    throw new MyException();
  }

  static staticFunction() {
    throw new MyException();
  }
}

get libraryGetter {
  throw new MyException();
}

set librarySetter(v) {
  throw new MyException();
}

libraryFunction() {
  throw new MyException();
}

bool isMyException(e) => e is MyException;

main() {
  InstanceMirror im = reflect(new Class.noException());
  Expect.throws(() => im.getField(#getter), isMyException);
  Expect.throws(() => im.setField(#setter, ['arg']), isMyException);
  Expect.throws(() => im.invoke(#method, []), isMyException);
  Expect.throws(() => im.invoke(#triggerNoSuchMethod, []), isMyException);

  ClassMirror cm = reflectClass(Class);
  Expect.throws(() => cm.getField(#staticGetter), isMyException);
  Expect.throws(() => cm.setField(#staticSetter, ['arg']), isMyException);
  Expect.throws(() => cm.invoke(#staticFunction, []), isMyException);
  Expect.throws(() => cm.newInstance(#generative, []), isMyException);
  Expect.throws(() => cm.newInstance(#redirecting, []), isMyException);
  Expect.throws(() => cm.newInstance(#faktory, []), isMyException);
  Expect.throws(() => cm.newInstance(#redirectingFactory, []), isMyException);

  LibraryMirror lm = reflectClass(Class).owner as LibraryMirror;
  Expect.throws(() => lm.getField(#libraryGetter), isMyException);
  Expect.throws(() => lm.setField(#librarySetter, ['arg']), isMyException);
  Expect.throws(() => lm.invoke(#libraryFunction, []), isMyException);
}
