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

// @dart = 2.9

import "package:expect/expect.dart";

class A<T> {
  factory A.factory() {
    return new B<T>();
  }

  A();

  build() {
    return new A<T>();
  }
}

class B<T> extends A<T> {
  B();

  build() {
    return new B<T>();
  }
}

main() {
  Expect.isTrue(new A<List>() is A<List>);
  Expect.isTrue(new A<List>.factory() is B<List>);

  // Check that we don't always return true for is checks with
  // generics.
  Expect.isFalse(new A<List>() is A<Set>);
  Expect.isFalse(new A<List>.factory() is B<Set>);

  Expect.isTrue(new A<List>().build() is A<List>);
  Expect.isFalse(new A<List>().build() is A<Set>);

  Expect.isTrue(new A<List>.factory().build() is B<List>);
  Expect.isFalse(new A<List>.factory().build() is B<Set>);

  Expect.isTrue(new B<List>().build() is B<List>);
  Expect.isFalse(new B<List>().build() is B<Set>);
}
