// Copyright (c) 2011, 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.
// VMOptions=--checked
// Dart test program testing generic type allocations and generic type tests.
import "package:expect/expect.dart";

class A {
  const A();
}

class AA extends A {
  const AA();
}

class AX {
  const AX();
}

class B<T extends A> {
  final A a_;
  final T t_;
  const B(T t)
      : a_ = t,
        t_ = t;
  isT(x) {
    return x is T;
  }
}

class C<T> {
  B<T> b_;
  C(T t) : b_ = new B<T>(t) {}
}

class D {
  C<AA> caa_;
  D() : caa_ = new C<AA>(const AA()) {}
}

class E {
  C<AX> cax_;
  E() : cax_ = new C<AX>(const AX()) {}
}

class GenericTest {
  static test() {
    int result = 0;
    D d = new D();
    Expect.equals(true, d.caa_.b_ is B<AA>);
    Expect.equals(true, d.caa_.b_.isT(const AA()));
    C c = new C(const AA()); // c is of raw type C, T in C<T> is dynamic.
    Expect.equals(true, c.b_ is B);
    Expect.equals(true, c.b_ is B<AA>);
    Expect.equals(true, c.b_.isT(const AA()));
    Expect.equals(true, c.b_.isT(const AX()));
    try {
      E e = new E(); // Throws a type error, if type checks are enabled.
    } on TypeError catch (error) {
      result = 1;
    }
    return result;
  }

  static testMain() {
    Expect.equals(1, test());
  }
}

main() {
  GenericTest.testMain();
}
