// 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 'dart:async' show Future;

import 'package:expect/expect.dart';

class C {
  var field;
  C() : this.field = 'default';
  C.named(this.field);

  get getter => 'get $field';
  set setter(v) => field = 'set $v';
  method(x, y, z) => '$x+$y+$z';
  toString() => 'a C';

  noSuchMethod(invocation) => 'DNU';

  static var staticField = 'initial';
  static get staticGetter => 'sget $staticField';
  static set staticSetter(v) => staticField = 'sset $v';
  static staticFunction(x, y) => "($x,$y)";
}

var libraryField = 'a priori';
get libraryGetter => 'lget $libraryField';
set librarySetter(v) => libraryField = 'lset $v';
libraryFunction(x, y) => '$x$y';

testSync() {
  var result;

  // InstanceMirror invoke
  C c = new C();
  InstanceMirror im = reflect(c);
  result = im.invoke(const Symbol('method'), [2, 4, 8]);
  Expect.equals('2+4+8', result.reflectee);
  result = im.invoke(const Symbol('doesntExist'), [2, 4, 8]);
  Expect.equals('DNU', result.reflectee);
  result = im.invoke(const Symbol('method'), [2, 4]); // Wrong arity.
  Expect.equals('DNU', result.reflectee);

  // InstanceMirror invokeGetter
  result = im.getField(const Symbol('getter'));
  Expect.equals('get default', result.reflectee);
  result = im.getField(const Symbol('field'));
  Expect.equals('default', result.reflectee);
  result = im.getField(const Symbol('doesntExist'));
  Expect.equals('DNU', result.reflectee);

  // InstanceMirror invokeSetter
  result = im.setField(const Symbol('setter'), 'foo');
  Expect.equals('foo', result.reflectee);
  Expect.equals('set foo', c.field);
  Expect.equals('set foo', im.getField(const Symbol('field')).reflectee);
  result = im.setField(const Symbol('field'), 'bar');
  Expect.equals('bar', result.reflectee);
  Expect.equals('bar', c.field);
  Expect.equals('bar', im.getField(const Symbol('field')).reflectee);
  result = im.setField(const Symbol('doesntExist'), 'bar');
  Expect.equals('bar', result.reflectee);

  // ClassMirror invoke
  ClassMirror cm = reflectClass(C);
  result = cm.invoke(const Symbol('staticFunction'), [3, 4]);
  Expect.equals('(3,4)', result.reflectee);
  Expect.throwsNoSuchMethodError(
      () => cm.invoke(const Symbol('doesntExist'), [3, 4]), 'Not defined');
  Expect.throwsNoSuchMethodError(
      () => cm.invoke(const Symbol('staticFunction'), [3]), 'Wrong arity');

  // ClassMirror invokeGetter
  result = cm.getField(const Symbol('staticGetter'));
  Expect.equals('sget initial', result.reflectee);
  result = cm.getField(const Symbol('staticField'));
  Expect.equals('initial', result.reflectee);
  Expect.throwsNoSuchMethodError(
      () => cm.getField(const Symbol('doesntExist')), 'Not defined');

  // ClassMirror invokeSetter
  result = cm.setField(const Symbol('staticSetter'), 'sfoo');
  Expect.equals('sfoo', result.reflectee);
  Expect.equals('sset sfoo', C.staticField);
  Expect.equals(
      'sset sfoo', cm.getField(const Symbol('staticField')).reflectee);
  result = cm.setField(const Symbol('staticField'), 'sbar');
  Expect.equals('sbar', result.reflectee);
  Expect.equals('sbar', C.staticField);
  Expect.equals('sbar', cm.getField(const Symbol('staticField')).reflectee);
  Expect.throwsNoSuchMethodError(
      () => cm.setField(const Symbol('doesntExist'), 'sbar'), 'Not defined');

  // ClassMirror invokeConstructor
  result = cm.newInstance(Symbol.empty, []);
  Expect.isTrue(result.reflectee is C);
  Expect.equals('default', result.reflectee.field);
  result = cm.newInstance(const Symbol('named'), ['my value']);
  Expect.isTrue(result.reflectee is C);
  Expect.equals('my value', result.reflectee.field);
  Expect.throwsNoSuchMethodError(
      () => cm.newInstance(const Symbol('doesntExist'), ['my value']),
      'Not defined');
  Expect.throwsNoSuchMethodError(
      () => cm.newInstance(const Symbol('named'), []), 'Wrong arity');

  // LibraryMirror invoke
  LibraryMirror lm = cm.owner as LibraryMirror;
  result = lm.invoke(const Symbol('libraryFunction'), [':', ')']);
  Expect.equals(':)', result.reflectee);
  Expect.throwsNoSuchMethodError(
      () => lm.invoke(const Symbol('doesntExist'), [':', ')']), 'Not defined');
  Expect.throwsNoSuchMethodError(
      () => lm.invoke(const Symbol('libraryFunction'), [':']), 'Wrong arity');

  // LibraryMirror invokeGetter
  result = lm.getField(const Symbol('libraryGetter'));
  Expect.equals('lget a priori', result.reflectee);
  result = lm.getField(const Symbol('libraryField'));
  Expect.equals('a priori', result.reflectee);
  Expect.throwsNoSuchMethodError(
      () => lm.getField(const Symbol('doesntExist')), 'Not defined');

  // LibraryMirror invokeSetter
  result = lm.setField(const Symbol('librarySetter'), 'lfoo');
  Expect.equals('lfoo', result.reflectee);
  Expect.equals('lset lfoo', libraryField);
  Expect.equals(
      'lset lfoo', lm.getField(const Symbol('libraryField')).reflectee);
  result = lm.setField(const Symbol('libraryField'), 'lbar');
  Expect.equals('lbar', result.reflectee);
  Expect.equals('lbar', libraryField);
  Expect.equals('lbar', lm.getField(const Symbol('libraryField')).reflectee);
  Expect.throwsNoSuchMethodError(
      () => lm.setField(const Symbol('doesntExist'), 'lbar'), 'Not defined');
}

main() {
  testSync();
}
