// Copyright (c) 2014, 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_call_through_implicit_getter;

import 'dart:mirrors';

import 'package:expect/expect.dart';

class FakeFunctionCall {
  call(x, y) => '1 $x $y';
}

class FakeFunctionNSM {
  noSuchMethod(msg) => msg.positionalArguments.join(', ');
}

class C {
  var fakeFunctionCall = new FakeFunctionCall();
  var fakeFunctionNSM = new FakeFunctionNSM();
  var closure; // = (x, y) => '2 $this $x $y';
  var closureOpt; // = (x, y, [z, w]) => '3 $this $x $y $z $w';
  var closureNamed; // = (x, y, {z, w}) => '4 $this $x $y $z $w';
  var notAClosure = 'Not a closure';
  noSuchMethod(msg) => 'DNU';

  C() {
    closure = (x, y) => '2 $this $x $y';
    closureOpt = (x, y, [z, w]) => '3 $this $x $y $z $w';
    closureNamed = (x, y, {z, w}) => '4 $this $x $y $z $w';
  }

  toString() => 'C';
}

testInstanceBase() {
  dynamic c = new C();

  Expect.equals('1 5 6', c.fakeFunctionCall(5, 6));
  Expect.equals('7, 8', c.fakeFunctionNSM(7, 8));
  Expect.equals('2 C 9 10', c.closure(9, 10));
  Expect.equals('3 C 11 12 13 null', c.closureOpt(11, 12, 13));
  Expect.equals('4 C 14 15 null 16', c.closureNamed(14, 15, w: 16));
  Expect.equals('DNU', c.doesNotExist(17, 18));
  Expect.throwsNoSuchMethodError(() => c.closure('wrong arity'));
  Expect.throwsNoSuchMethodError(() => c.notAClosure());
}

testInstanceReflective() {
  InstanceMirror im = reflect(new C());

  Expect.equals('1 5 6', im.invoke(#fakeFunctionCall, [5, 6]).reflectee);
  Expect.equals('7, 8', im.invoke(#fakeFunctionNSM, [7, 8]).reflectee);
  Expect.equals('2 C 9 10', im.invoke(#closure, [9, 10]).reflectee);
  Expect.equals(
      '3 C 11 12 13 null', im.invoke(#closureOpt, [11, 12, 13]).reflectee);
  Expect.equals('4 C 14 15 null 16', //                                       //# named: ok
                im.invoke(#closureNamed, [14, 15], {#w: 16}).reflectee); //   //# named: continued
  Expect.equals('DNU', im.invoke(#doesNotExist, [17, 18]).reflectee);
  Expect.throwsNoSuchMethodError(() => im.invoke(#closure, ['wrong arity']));
  Expect.throwsNoSuchMethodError(() => im.invoke(#notAClosure, []));
}

class D {
  static dynamic fakeFunctionCall = new FakeFunctionCall();
  static dynamic fakeFunctionNSM = new FakeFunctionNSM();
  static var closure = (x, y) => '2 $x $y';
  static var closureOpt = (x, y, [z, w]) => '3 $x $y $z $w';
  static var closureNamed = (x, y, {z, w}) => '4 $x $y $z $w';
  static var notAClosure = 'Not a closure';
}

testClassBase() {
  Expect.equals('1 5 6', D.fakeFunctionCall(5, 6));
  Expect.equals('7, 8', D.fakeFunctionNSM(7, 8));
  Expect.equals('2 9 10', D.closure(9, 10));
  Expect.equals('3 11 12 13 null', D.closureOpt(11, 12, 13));
  Expect.equals('4 14 15 null 16', D.closureNamed(14, 15, w: 16));
}

testClassReflective() {
  ClassMirror cm = reflectClass(D);

  Expect.equals('1 5 6', cm.invoke(#fakeFunctionCall, [5, 6]).reflectee);
  Expect.equals('7, 8', cm.invoke(#fakeFunctionNSM, [7, 8]).reflectee);
  Expect.equals('2 9 10', cm.invoke(#closure, [9, 10]).reflectee);
  Expect.equals(
      '3 11 12 13 null', cm.invoke(#closureOpt, [11, 12, 13]).reflectee);
  Expect.equals('4 14 15 null 16', //                                        //# named: continued
                cm.invoke(#closureNamed, [14, 15], {#w: 16}).reflectee); //  //# named: continued
  Expect.throwsNoSuchMethodError(() => cm.invoke(#closure, ['wrong arity']));
}

var fakeFunctionCall = new FakeFunctionCall();
dynamic fakeFunctionNSM = new FakeFunctionNSM();
var closure = (x, y) => '2 $x $y';
var closureOpt = (x, y, [z, w]) => '3 $x $y $z $w';
var closureNamed = (x, y, {z, w}) => '4 $x $y $z $w';
var notAClosure = 'Not a closure';

testLibraryBase() {
  Expect.equals('1 5 6', fakeFunctionCall(5, 6));
  Expect.equals('7, 8', fakeFunctionNSM(7, 8));
  Expect.equals('2 9 10', closure(9, 10));
  Expect.equals('3 11 12 13 null', closureOpt(11, 12, 13));
  Expect.equals('4 14 15 null 16', closureNamed(14, 15, w: 16));
}

testLibraryReflective() {
  LibraryMirror lm = reflectClass(D).owner as LibraryMirror;

  Expect.equals('1 5 6', lm.invoke(#fakeFunctionCall, [5, 6]).reflectee);
  Expect.equals('7, 8', lm.invoke(#fakeFunctionNSM, [7, 8]).reflectee);
  Expect.equals('2 9 10', lm.invoke(#closure, [9, 10]).reflectee);
  Expect.equals(
      '3 11 12 13 null', lm.invoke(#closureOpt, [11, 12, 13]).reflectee);
  Expect.equals('4 14 15 null 16', //                                       //# named: continued
                lm.invoke(#closureNamed, [14, 15], {#w: 16}).reflectee); // //# named: continued
  Expect.throwsNoSuchMethodError(() => lm.invoke(#closure, ['wrong arity']));
}

main() {
  testInstanceBase();
  testInstanceReflective();
  testClassBase();
  testClassReflective();
  testLibraryBase();
  testLibraryReflective();
}
