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

@MirrorsUsed(targets: "test.invoke_named_test")
import 'dart:mirrors';

import 'dart:async' show Future;

import 'package:expect/expect.dart';
import 'invoke_test.dart';

// TODO(ahe): Remove this variable (http://dartbug.com/12863).
bool isDart2js = false;

class C {
  a(a, {b: 'B', c}) => "$a-$b-$c";
  b({a: 'A', b, c}) => "$a-$b-$c";
  c(a, [b, c = 'C']) => "$a-$b-$c";
  d([a, b = 'B', c = 'C']) => "$a-$b-$c";
  e(a, b, c) => "$a-$b-$c";
}

class D {
  static a(a, {b: 'B', c}) => "$a-$b-$c";
  static b({a: 'A', b, c}) => "$a-$b-$c";
  static c(a, [b, c = 'C']) => "$a-$b-$c";
  static d([a, b = 'B', c = 'C']) => "$a-$b-$c";
  static e(a, b, c) => "$a-$b-$c";
}

class E {
  var field;
  E(a, {b: 'B', c}) : this.field = "$a-$b-$c";
  E.b({a: 'A', b, c}) : this.field = "$a-$b-$c";
  E.c(a, [b, c = 'C']) : this.field = "$a-$b-$c";
  E.d([a, b = 'B', c = 'C']) : this.field = "$a-$b-$c";
  E.e(a, b, c) : this.field = "$a-$b-$c";
}

a(a, {b: 'B', c}) => "$a-$b-$c";
b({a: 'A', b, c}) => "$a-$b-$c";
c(a, [b, c = 'C']) => "$a-$b-$c";
d([a, b = 'B', c = 'C']) => "$a-$b-$c";
e(a, b, c) => "$a-$b-$c";

testSyncInvoke(ObjectMirror om) {
  InstanceMirror result;

  result = om.invoke(const Symbol('a'), ['X']);
  Expect.equals('X-B-null', result.reflectee);
  result = om.invoke(const Symbol('a'), ['X'], {const Symbol('b'): 'Y'});
  Expect.equals('X-Y-null', result.reflectee);
  result = om.invoke(const Symbol('a'), ['X'],
      {const Symbol('c'): 'Z', const Symbol('b'): 'Y'});
  Expect.equals('X-Y-Z', result.reflectee);
  Expect.throws(() => om.invoke(const Symbol('a'), []), isNoSuchMethodError,
      'Insufficient positional arguments');
  Expect.throws(() => om.invoke(const Symbol('a'), ['X', 'Y']),
      isNoSuchMethodError, 'Extra positional arguments');
  Expect.throws(
      () => om.invoke(const Symbol('a'), ['X'], {const Symbol('undef'): 'Y'}),
      isNoSuchMethodError,
      'Unmatched named argument');

  result = om.invoke(const Symbol('b'), []);
  Expect.equals('A-null-null', result.reflectee);
  result = om.invoke(const Symbol('b'), [], {const Symbol('a'): 'X'});
  Expect.equals('X-null-null', result.reflectee);
  result = om.invoke(const Symbol('b'), [],
      {const Symbol('b'): 'Y', const Symbol('c'): 'Z', const Symbol('a'): 'X'});
  Expect.equals('X-Y-Z', result.reflectee);
  Expect.throws(() => om.invoke(const Symbol('b'), ['X']), isNoSuchMethodError,
      'Extra positional arguments');
  Expect.throws(
      () => om.invoke(const Symbol('b'), ['X'], {const Symbol('undef'): 'Y'}),
      isNoSuchMethodError,
      'Unmatched named argument');

  result = om.invoke(const Symbol('c'), ['X']);
  Expect.equals('X-null-C', result.reflectee);
  result = om.invoke(const Symbol('c'), ['X', 'Y']);
  Expect.equals('X-Y-C', result.reflectee);
  result = om.invoke(const Symbol('c'), ['X', 'Y', 'Z']);
  Expect.equals('X-Y-Z', result.reflectee);
  Expect.throws(() => om.invoke(const Symbol('c'), []), isNoSuchMethodError,
      'Insufficient positional arguments');
  Expect.throws(() => om.invoke(const Symbol('c'), ['X', 'Y', 'Z', 'W']),
      isNoSuchMethodError, 'Extra positional arguments');
  Expect.throws(
      () => om.invoke(const Symbol('c'), ['X'], {const Symbol('undef'): 'Y'}),
      isNoSuchMethodError,
      'Unmatched named argument');

  result = om.invoke(const Symbol('d'), []);
  Expect.equals('null-B-C', result.reflectee);
  result = om.invoke(const Symbol('d'), ['X']);
  Expect.equals('X-B-C', result.reflectee);
  result = om.invoke(const Symbol('d'), ['X', 'Y']);
  Expect.equals('X-Y-C', result.reflectee);
  result = om.invoke(const Symbol('d'), ['X', 'Y', 'Z']);
  Expect.equals('X-Y-Z', result.reflectee);
  Expect.throws(() => om.invoke(const Symbol('d'), ['X', 'Y', 'Z', 'W']),
      isNoSuchMethodError, 'Extra positional arguments');
  Expect.throws(
      () => om.invoke(const Symbol('d'), ['X'], {const Symbol('undef'): 'Y'}),
      isNoSuchMethodError,
      'Unmatched named argument');

  result = om.invoke(const Symbol('e'), ['X', 'Y', 'Z']);
  Expect.equals('X-Y-Z', result.reflectee);
  Expect.throws(() => om.invoke(const Symbol('e'), ['X']), isNoSuchMethodError,
      'Insufficient positional arguments');
  Expect.throws(() => om.invoke(const Symbol('e'), ['X', 'Y', 'Z', 'W']),
      isNoSuchMethodError, 'Extra positional arguments');
  Expect.throws(
      () => om.invoke(const Symbol('e'), ['X'], {const Symbol('undef'): 'Y'}),
      isNoSuchMethodError,
      'Unmatched named argument');
}

testSyncNewInstance() {
  ClassMirror cm = reflectClass(E);
  InstanceMirror result;

  result = cm.newInstance(const Symbol(''), ['X']);
  Expect.equals('X-B-null', result.reflectee.field);
  result = cm.newInstance(const Symbol(''), ['X'], {const Symbol('b'): 'Y'});
  Expect.equals('X-Y-null', result.reflectee.field);
  result = cm.newInstance(const Symbol(''), ['X'],
      {const Symbol('c'): 'Z', const Symbol('b'): 'Y'});
  Expect.equals('X-Y-Z', result.reflectee.field);
  Expect.throws(() => cm.newInstance(const Symbol(''), []), isNoSuchMethodError,
      'Insufficient positional arguments');
  Expect.throws(() => cm.newInstance(const Symbol(''), ['X', 'Y']),
      isNoSuchMethodError, 'Extra positional arguments');
  Expect.throws(
      () =>
          cm.newInstance(const Symbol(''), ['X'], {const Symbol('undef'): 'Y'}),
      isNoSuchMethodError,
      'Unmatched named argument');

  result = cm.newInstance(const Symbol('b'), []);
  Expect.equals('A-null-null', result.reflectee.field);
  result = cm.newInstance(const Symbol('b'), [], {const Symbol('a'): 'X'});
  Expect.equals('X-null-null', result.reflectee.field);
  result = cm.newInstance(const Symbol('b'), [],
      {const Symbol('b'): 'Y', const Symbol('c'): 'Z', const Symbol('a'): 'X'});
  Expect.equals('X-Y-Z', result.reflectee.field);
  Expect.throws(() => cm.newInstance(const Symbol('b'), ['X']),
      isNoSuchMethodError, 'Extra positional arguments');
  Expect.throws(
      () => cm
          .newInstance(const Symbol('b'), ['X'], {const Symbol('undef'): 'Y'}),
      isNoSuchMethodError,
      'Unmatched named argument');

  result = cm.newInstance(const Symbol('c'), ['X']);
  Expect.equals('X-null-C', result.reflectee.field);
  result = cm.newInstance(const Symbol('c'), ['X', 'Y']);
  Expect.equals('X-Y-C', result.reflectee.field);
  result = cm.newInstance(const Symbol('c'), ['X', 'Y', 'Z']);
  Expect.equals('X-Y-Z', result.reflectee.field);
  Expect.throws(() => cm.newInstance(const Symbol('c'), []),
      isNoSuchMethodError, 'Insufficient positional arguments');
  Expect.throws(() => cm.newInstance(const Symbol('c'), ['X', 'Y', 'Z', 'W']),
      isNoSuchMethodError, 'Extra positional arguments');
  Expect.throws(
      () => cm
          .newInstance(const Symbol('c'), ['X'], {const Symbol('undef'): 'Y'}),
      isNoSuchMethodError,
      'Unmatched named argument');

  result = cm.newInstance(const Symbol('d'), []);
  Expect.equals('null-B-C', result.reflectee.field);
  result = cm.newInstance(const Symbol('d'), ['X']);
  Expect.equals('X-B-C', result.reflectee.field);
  result = cm.newInstance(const Symbol('d'), ['X', 'Y']);
  Expect.equals('X-Y-C', result.reflectee.field);
  result = cm.newInstance(const Symbol('d'), ['X', 'Y', 'Z']);
  Expect.equals('X-Y-Z', result.reflectee.field);
  Expect.throws(() => cm.newInstance(const Symbol('d'), ['X', 'Y', 'Z', 'W']),
      isNoSuchMethodError, 'Extra positional arguments');
  Expect.throws(
      () => cm
          .newInstance(const Symbol('d'), ['X'], {const Symbol('undef'): 'Y'}),
      isNoSuchMethodError,
      'Unmatched named argument');

  result = cm.newInstance(const Symbol('e'), ['X', 'Y', 'Z']);
  Expect.equals('X-Y-Z', result.reflectee.field);
  Expect.throws(() => cm.newInstance(const Symbol('e'), ['X']),
      isNoSuchMethodError, 'Insufficient positional arguments');
  Expect.throws(() => cm.newInstance(const Symbol('e'), ['X', 'Y', 'Z', 'W']),
      isNoSuchMethodError, 'Extra positional arguments');
  Expect.throws(
      () => cm
          .newInstance(const Symbol('e'), ['X'], {const Symbol('undef'): 'Y'}),
      isNoSuchMethodError,
      'Unmatched named argument');
}

testSyncApply() {
  ClosureMirror cm;
  InstanceMirror result;

  cm = reflect(a);
  result = cm.apply(['X']);
  Expect.equals('X-B-null', result.reflectee);
  result = cm.apply(['X'], {const Symbol('b'): 'Y'});
  Expect.equals('X-Y-null', result.reflectee);
  result = cm.apply(['X'], {const Symbol('c'): 'Z', const Symbol('b'): 'Y'});
  Expect.equals('X-Y-Z', result.reflectee);
  Expect.throws(() => cm.apply([]), isNoSuchMethodError,
      'Insufficient positional arguments');
  Expect.throws(() => cm.apply(['X', 'Y']), isNoSuchMethodError,
      'Extra positional arguments');
  Expect.throws(() => cm.apply(['X'], {const Symbol('undef'): 'Y'}),
      isNoSuchMethodError, 'Unmatched named argument');

  cm = reflect(b);
  result = cm.apply([]);
  Expect.equals('A-null-null', result.reflectee);
  result = cm.apply([], {const Symbol('a'): 'X'});
  Expect.equals('X-null-null', result.reflectee);
  result = cm.apply([],
      {const Symbol('b'): 'Y', const Symbol('c'): 'Z', const Symbol('a'): 'X'});
  Expect.equals('X-Y-Z', result.reflectee);
  Expect.throws(
      () => cm.apply(['X']), isNoSuchMethodError, 'Extra positional arguments');
  Expect.throws(() => cm.apply(['X'], {const Symbol('undef'): 'Y'}),
      isNoSuchMethodError, 'Unmatched named argument');

  cm = reflect(c);
  result = cm.apply(['X']);
  Expect.equals('X-null-C', result.reflectee);
  result = cm.apply(['X', 'Y']);
  Expect.equals('X-Y-C', result.reflectee);
  result = cm.apply(['X', 'Y', 'Z']);
  Expect.equals('X-Y-Z', result.reflectee);
  Expect.throws(() => cm.apply([]), isNoSuchMethodError,
      'Insufficient positional arguments');
  Expect.throws(() => cm.apply(['X', 'Y', 'Z', 'W']), isNoSuchMethodError,
      'Extra positional arguments');
  Expect.throws(() => cm.apply(['X'], {const Symbol('undef'): 'Y'}),
      isNoSuchMethodError, 'Unmatched named argument');

  cm = reflect(d);
  result = cm.apply([]);
  Expect.equals('null-B-C', result.reflectee);
  result = cm.apply(['X']);
  Expect.equals('X-B-C', result.reflectee);
  result = cm.apply(['X', 'Y']);
  Expect.equals('X-Y-C', result.reflectee);
  result = cm.apply(['X', 'Y', 'Z']);
  Expect.equals('X-Y-Z', result.reflectee);
  Expect.throws(() => cm.apply(['X', 'Y', 'Z', 'W']), isNoSuchMethodError,
      'Extra positional arguments');
  Expect.throws(() => cm.apply(['X'], {const Symbol('undef'): 'Y'}),
      isNoSuchMethodError, 'Unmatched named argument');

  cm = reflect(e);
  result = cm.apply(['X', 'Y', 'Z']);
  Expect.equals('X-Y-Z', result.reflectee);
  Expect.throws(() => cm.apply(['X']), isNoSuchMethodError,
      'Insufficient positional arguments');
  Expect.throws(() => cm.apply(['X', 'Y', 'Z', 'W']), isNoSuchMethodError,
      'Extra positional arguments');
  Expect.throws(() => cm.apply(['X'], {const Symbol('undef'): 'Y'}),
      isNoSuchMethodError, 'Unmatched named argument');
}

main() {
  isDart2js = true; //# 01: ok

  testSyncInvoke(reflect(new C())); // InstanceMirror

  if (isDart2js) return;

  testSyncInvoke(reflectClass(D)); // ClassMirror
  LibraryMirror lib = reflectClass(D).owner;
  testSyncInvoke(lib); // LibraryMirror

  testSyncNewInstance();

  testSyncApply();
}
