// 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] COMPILE_TIME_ERROR.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] COMPILE_TIME_ERROR.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;
  });
}
