// TODO(multitest): This was automatically migrated from a multitest and may
// contain strange or dead code.

// @dart = 2.9

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




  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;
  });
}
