// Copyright (c) 2017, 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.
import 'package:expect/expect.dart';

class C {
  dynamic f(int x) => x + 1;
  dynamic g(int x) => x + 2;
}

class D extends C {
  f(int x) => x + 41;
  get superF => super.f;
  get superG => super.g;
}

tearoffEquals(f1, f2) {
  Expect.equals(f1, f2);
  Expect.equals(f1.hashCode, f2.hashCode);
}

tearoffNotEquals(f1, f2) {
  Expect.notEquals(f1, f2);
  Expect.notEquals(f1.hashCode, f2.hashCode);
}

testDynamic() {
  C c = new C();

  dynamic f1 = c.f;
  Expect.throws(() => f1(2.5));
  Expect.equals(f1(41), 42);

  dynamic f2 = (c as dynamic).f;
  Expect.throws(() => f2(2.5));
  Expect.equals(f2(41), 42);

  tearoffEquals(f1, f1);
  tearoffEquals(f1, f2);
  tearoffEquals(f1, c.f);
  tearoffEquals(c.g, (c as dynamic).g);

  tearoffNotEquals(f1, new C().f);
  tearoffNotEquals(f1, (new C() as dynamic).f);
  tearoffNotEquals(f1, c.g);
  tearoffNotEquals(f1, (c as dynamic).g);
  tearoffNotEquals(null, f1);
  tearoffNotEquals(f1, null);
}

testSuper() {
  D d = new D();
  dynamic superF1 = d.superF;
  dynamic superF2 = (d as dynamic).superF;

  Expect.throws(() => superF1(2.5));
  Expect.throws(() => superF2(2.5));
  Expect.equals(superF1(41), 42);
  Expect.equals(superF2(41), 42);

  tearoffEquals(superF1, superF1);
  tearoffEquals(superF1, superF2);
  tearoffEquals(superF1, d.superF);
  tearoffEquals(d.f, (d as dynamic).f);

  tearoffNotEquals(superF1, d.f);
  tearoffNotEquals(superF1, (d as dynamic).f);
  tearoffNotEquals(superF1, new D().superF);
  tearoffNotEquals(superF1, (new D() as dynamic).superF);
  tearoffNotEquals(superF1, d.superG);
  tearoffNotEquals(superF1, (d as dynamic).superG);

  tearoffEquals(d.superG, (d as dynamic).superG);
  tearoffEquals(d.g, d.superG);
}

class S {
  final int id;
  S(this.id);
  toString() => 'S#$id';
}

testToString() {
  testType<T>(T c) {
    dynamic d = c;
    Object o = c;
    tearoffEquals(c.toString, d.toString);
    tearoffEquals(c.toString, o.toString);

    var expected = c.toString();
    dynamic f = d.toString;
    tearoffEquals(f(), expected);
    f = o.toString;
    tearoffEquals(f(), expected);
    var g = c.toString;
    tearoffEquals(g(), expected);
  }

  testType(new C());
  testType(new D());
  testType(new S(1));
  testType(new S(2));
  testType(new Object());
  testType(null);
  testType(Object); // Type
  testType(C); // Type
  testType(42);
  testType('hi');
  testType(true);
  testType([1, 2, 3]);
  testType({'a': 'b'});
  testType((x) => x + 1);
  testType(testType as dynamic); // illegal inferred type for T otherwise
}

class N {
  noSuchMethod(i) => i;
}

testNoSuchMethod() {
  // Create an invocation.
  Invocation i = (new N() as dynamic).foo(1, bar: 2);
  tearoffEquals(i.memberName, #foo);

  testType<T>(T c) {
    dynamic d = c;
    Object o = c;
    tearoffEquals(c.noSuchMethod, d.noSuchMethod);
    tearoffEquals(c.noSuchMethod, o.noSuchMethod);

    var expected;
    try {
      c.noSuchMethod(i);
    } on NoSuchMethodError catch (error) {
      var nsm = '$error';
      Expect.isTrue(nsm.startsWith("NoSuchMethodError: "));
      Expect.isTrue(nsm.contains("'foo'"));
      expected = (e) => e is NoSuchMethodError && '$e' == nsm;
    }
    dynamic f = d.noSuchMethod;
    Expect.throws(() => f(i), expected);
    f = o.noSuchMethod;
    Expect.throws(() => f(i), expected);
    var g = c.noSuchMethod;
    Expect.throws(() => g(i), expected);
  }

  testType(new C());
  testType(new D());
  testType(new S(1));
  testType(new S(2));
  testType(new Object());
  testType(null);
  testType(Object); // Type
  testType(C); // Type
  testType(42);
  testType('hi');
  testType(true);
  testType([1, 2, 3]);
  testType({'a': 'b'});
  testType((x) => x + 1);
  testType(testType as dynamic); // illegal inferred type for T otherwise
}

main() {
  testDynamic();
  testSuper();
  testToString();
  testNoSuchMethod();
}
