// 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.
// Test that instanceof works correctly with type variables.

// @dart = 2.9

import "package:expect/expect.dart";

// Test that partially typed generic instances are correctly constructed.

// Test factory case.
class Foo<K, V> {
  Foo() {}

  factory Foo.fac() {
    return new Foo<K, V>();
  }

  FooString() {
    return new Foo<K, String>.fac();
  }
}

// Test constructor case.
class Moo<K, V> {
  Moo() {}

  MooString() {
    return new Moo<K, String>();
  }
}

testAll() {
  var foo_int_num = new Foo<int, num>();
  Expect.isTrue(foo_int_num is Foo<int, num>);
  Expect.isTrue(foo_int_num is! Foo<int, String>);
  // foo_int_num.FooString() returns a Foo<int, String>
  Expect.isTrue(foo_int_num.FooString() is! Foo<int, num>);
  Expect.isTrue(foo_int_num.FooString() is Foo<int, String>);

  var foo_raw = new Foo();
  Expect.isTrue(foo_raw is! Foo<int, num>);
  Expect.isTrue(foo_raw is! Foo<int, String>);
  Expect.isTrue(foo_raw is Foo<dynamic, dynamic>);
  // foo_raw.FooString() returns a Foo<dynamic, String>
  Expect.isTrue(foo_raw.FooString() is! Foo<int, num>);
  Expect.isTrue(foo_raw.FooString() is! Foo<int, String>);
  Expect.isTrue(foo_raw.FooString() is Foo<dynamic, String>);

  var moo_int_num = new Moo<int, num>();
  Expect.isTrue(moo_int_num is Moo<int, num>);
  Expect.isTrue(moo_int_num is! Moo<int, String>);
  // moo_int_num.MooString() returns a Moo<int, String>
  Expect.isTrue(moo_int_num.MooString() is! Moo<int, num>);
  Expect.isTrue(moo_int_num.MooString() is Moo<int, String>);

  var moo_raw = new Moo();
  Expect.isTrue(moo_raw is! Moo<int, num>);
  Expect.isTrue(moo_raw is! Moo<int, String>);
  Expect.isTrue(moo_raw is Moo<dynamic, dynamic>);
  // moo_raw.MooString() returns a Moo<dynamic, String>
  Expect.isTrue(moo_raw.MooString() is! Moo<int, num>);
  Expect.isTrue(moo_raw.MooString() is! Moo<int, String>);
  Expect.isTrue(moo_raw.MooString() is Moo<dynamic, String>);
}

main() {
  // Repeat type checks so that inlined tests can be tested as well.
  for (int i = 0; i < 5; i++) {
    testAll();
  }
}
