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

// Test [Function.apply] on user-defined classes that implement [noSuchMethod].

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

class F {
  call([p1]) => "call";
  noSuchMethod(Invocation invocation) => "NSM";
}

class G {
  call() => '42';
  noSuchMethod(Invocation invocation) => invocation;
}

class H {
  call(required, {a}) => required + a;
}

main() {
  Expect.equals('call', Function.apply(new F(), []));
  Expect.equals('call', Function.apply(new F(), [1]));
  Expect.equals('NSM', Function.apply(new F(), [1, 2]));
  Expect.equals('NSM', Function.apply(new F(), [1, 2, 3]));

  var symbol = const Symbol('a');
  var requiredParameters = [1];
  var optionalParameters = new Map<Symbol, int>()..[symbol] = 42;
  Invocation i =
      Function.apply(new G(), requiredParameters, optionalParameters);

  Expect.equals(const Symbol('call'), i.memberName);
  Expect.listEquals(requiredParameters, i.positionalArguments);
  Expect.mapEquals(optionalParameters, i.namedArguments);
  Expect.isTrue(i.isMethod);
  Expect.isFalse(i.isGetter);
  Expect.isFalse(i.isSetter);
  Expect.isFalse(i.isAccessor);

  // Check that changing the passed list and map for parameters does
  // not affect [i].
  requiredParameters[0] = 42;
  optionalParameters[symbol] = 12;
  Expect.listEquals([1], i.positionalArguments);
  Expect.mapEquals(new Map()..[symbol] = 42, i.namedArguments);

  // Check that using [i] for invocation yields the same [Invocation]
  // object.
  var mirror = reflect(new G());
  Invocation other = mirror.delegate(i);
  Expect.equals(i.memberName, other.memberName);
  Expect.listEquals(i.positionalArguments, other.positionalArguments);
  Expect.mapEquals(i.namedArguments, other.namedArguments);
  Expect.equals(i.isMethod, other.isMethod);
  Expect.equals(i.isGetter, other.isGetter);
  Expect.equals(i.isSetter, other.isSetter);
  Expect.equals(i.isAccessor, other.isAccessor);

  // Test that [i] can be used to hit an existing method.
  Expect.equals(43, new H().call(1, a: 42));
  Expect.equals(43, Function.apply(new H(), [1], new Map()..[symbol] = 42));
  mirror = reflect(new H());
  Expect.equals(43, mirror.delegate(i));
  Expect.equals(43, mirror.delegate(other));
}
