// Copyright (c) 2016, 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 A<T> {
  A(this.x, T z);
  A.make();
  void f(T x) {}
  static String g(String x) {
    return x;
  }

  T x;
}

class B extends A<int> {
  B(int x, int z) : super(x, z);
  B.make() : super.make();
  void f(int x) {}
  static int g(int x) {
    return x;
  }
}

class C {
  C(this.x, int z);
  void f(int x) {}
  static int g(int x) {
    return x;
  }

  int x = 0;
}

typedef void ToVoid<T>(T x);
typedef T Id<T>(T x);

void main() {
  {
    A<String> a = new A<String>("hello", "world");
    Expect.isTrue(new A<String>.make() is! A<int>);
    Expect.isTrue(new A.make() is A);
    Expect.isTrue(a is! A<int>);
    Expect.isTrue(a is A<String>);
    Expect.isTrue(a.f is ToVoid<String>);
    Expect.isTrue(A.g is Id<String>);
  }
  {
    B b = new B(0, 1);
    Expect.isTrue(new B.make() is B);
    Expect.isTrue(new B.make() is A<int>);
    Expect.isTrue(b is B);
    Expect.isTrue(b.f is ToVoid<int>);
    Expect.isTrue(B.g is Id<int>);
  }
  {
    C c = new C(0, 1);
    Expect.isTrue(c is C);
    Expect.isTrue(c.f is ToVoid<int>);
    Expect.isTrue(C.g is Id<int>);
  }
}
