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

import 'package:expect/expect.dart';

class X {
  call() => 42;
}

class XX extends X {
  XX.named();
}

class Y {
  call(int x) => 87 + x;

  static int staticMethod(int x) => x + 1;
}

class Z<T> {
  final T value;
  Z(this.value);
  T call() => value;

  static int staticMethod(int x) => x + 1;
}

typedef F(int x);
typedef G(String y);
typedef H();
typedef T I<T>();

main() {
  X x = new X();
  Function f = x; // Should pass checked mode test
  Y y = new Y();
  Function g = y; // Should pass checked mode test
  F f0 = y; // Should pass checked mode test

  F f1 = x;
  //^
  // [cfe] A value of type 'dynamic Function()' can't be assigned to a variable of type 'dynamic Function(int)'.
  //     ^
  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
  G g0 = y;
  //^
  // [cfe] A value of type 'dynamic Function(int)' can't be assigned to a variable of type 'dynamic Function(String)'.
  //     ^
  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT

  Expect.equals(f(), 42);
  Expect.equals(g(100), 187);

  var z = new Z<int>(123);
  Expect.equals(z(), 123);
  Expect.equals((z as dynamic)(), 123);

  Expect.equals(Y.staticMethod(6), 7);
  Expect.equals(Z.staticMethod(6), 7);

  var xx = new XX.named();
  Expect.equals(xx(), 42);

  H xx2 = new XX.named();
  Expect.equals(xx2(), 42);

  Expect.throwsTypeError(() {
    F f2 = x as dynamic;
  });

  Expect.throwsTypeError(() {
    G g1 = y as dynamic;
  });
}
