// Copyright (c) 2012, 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.7

// dart2jsOptions=--no-minify

import "package:expect/expect.dart";

class NoSuchMethodInfo {
  Object receiver;
  Symbol name;
  List args;
  NoSuchMethodInfo(Object r, Symbol m, List a)
      : receiver = r,
        name = m,
        args = a;
}

class A {
  noSuchMethod(Invocation invocation) {
    topLevelInfo = new NoSuchMethodInfo(
        this, invocation.memberName, invocation.positionalArguments);
    return topLevelInfo;
  }

  foo(a, b, c) {
    Expect.fail('Should never enter here');
  }
}

// Used for the setter case.
NoSuchMethodInfo topLevelInfo;

main() {
  A a = new A();
  var info = (a as dynamic).foo();
  Expect.equals(#foo, info.name);
  Expect.isTrue(info.args.isEmpty);
  Expect.isTrue(identical(info.receiver, a));

  info = (a as dynamic).foo(2);
  Expect.equals(#foo, info.name);
  Expect.isTrue(info.args.length == 1);
  Expect.isTrue(info.args[0] == 2);
  Expect.isTrue(identical(info.receiver, a));

  info = (a as dynamic).bar;
  Expect.equals(#bar, info.name);
  Expect.isTrue(info.args.length == 0);
  Expect.isTrue(identical(info.receiver, a));

  (a as dynamic).bar = 2;
  info = topLevelInfo;
  Expect.equals(const Symbol('bar='), info.name);
  Expect.isTrue(info.args.length == 1);
  Expect.isTrue(info.args[0] == 2);
  Expect.isTrue(identical(info.receiver, a));
}
