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

// @dart = 2.9

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);
}
