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

// @dart = 2.9

/// 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 extends A> {
  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_ = new C<AX>(const AX()); //# 01: compile-time error
}

main() {
  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()); // inferred as `C<A>` because of the `extends A`.
  Expect.equals(true, c is C<A>);
  Expect.equals(false, c is C<AA>, 'C<A> is not a subtype of C<AA>');
  Expect.equals(true, c.b_ is B);
  Expect.equals(false, c.b_ is B<AA>);
  Expect.equals(true, c.b_.isT(const AA()), 'AA is a subtype of A');
  Expect.equals(false, c.b_.isT(const AX()), 'AX is not a subtype of A');
  new E();
}
