// 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_test;

import 'dart:mirrors';

import 'package:expect/expect.dart';
import "package:async_helper/async_helper.dart";

import 'invoke_private_test.dart' show C;

main() {
  var result;

  C c = new C();
  InstanceMirror im = reflect(c);
  Expect.throwsNoSuchMethodError(() => im.invoke(#_method, [2, 4, 8]));
  Expect.throwsNoSuchMethodError(() => im.getField(#_getter));
  Expect.throwsNoSuchMethodError(() => im.getField(#_field));
  Expect.throwsNoSuchMethodError(() => im.setField(#_setter, 'foo'));
  Expect.throwsNoSuchMethodError(() => im.setField(#_field, 'bar'));

  ClassMirror cm = reflectClass(C);
  Expect.throwsNoSuchMethodError(() => cm.invoke(#_staticFunction, [3, 4]));
  Expect.throwsNoSuchMethodError(() => cm.getField(#_staticGetter));
  Expect.throwsNoSuchMethodError(() => cm.getField(#_staticField));
  Expect.throwsNoSuchMethodError(() => cm.setField(#_staticSetter, 'sfoo'));
  Expect.throwsNoSuchMethodError(() => cm.setField(#_staticField, 'sbar'));
  Expect.throwsNoSuchMethodError(() => cm.newInstance(#_named, ['my value']));

  LibraryMirror lm = cm.owner as LibraryMirror;
  Expect.throwsNoSuchMethodError(
      () => lm.invoke(#_libraryFunction, [':', ')']));
  Expect.throwsNoSuchMethodError(() => lm.getField(#_libraryGetter));
  Expect.throwsNoSuchMethodError(() => lm.getField(#_libraryField));
  Expect.throwsNoSuchMethodError(() => lm.setField(#_librarySetter, 'lfoo'));
  Expect.throwsNoSuchMethodError(() => lm.setField(#_libraryField, 'lbar'));
}
