// Copyright (c) 2021, 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.

// SharedOptions=--enable-experiment=constructor-tearoffs

import "package:expect/expect.dart";

import "../static_type_helper.dart";

import "explicit_instantiated_type_literal_test.dart" as prefix;

// Tests that explicitly instantiated type objects work and are canonicalized
// correctly.

class C<T extends num> {}

Type type<T>() => T;

void main() {
  (C).expectStaticType<Exactly<Type>>();
  (C<int>).expectStaticType<Exactly<Type>>();

  Expect.identical(C<num>, C);
  Expect.identical(C<int>, C<int>);

  Expect.equals(C<int>, type<C<int>>());

  // Super-bounded types are valid.
  Expect.identical(C<dynamic>, C<dynamic>);
  Expect.equals(C<dynamic>, type<C<dynamic>>());

  (prefix.C).expectStaticType<Exactly<Type>>();
  (prefix.C<int>).expectStaticType<Exactly<Type>>();

  Expect.identical(prefix.C<num>, prefix.C);
  Expect.identical(prefix.C<int>, prefix.C<int>);

  Expect.equals(prefix.C<int>, type<prefix.C<int>>());

  // Super-bounded types are valid.
  Expect.identical(prefix.C<dynamic>, prefix.C<dynamic>);
  Expect.equals(prefix.C<dynamic>, type<prefix.C<dynamic>>());

  Expect.identical(C<int>, prefix.C<int>);

  (<T extends num>() {
    Expect.equals(C<T>, C<T>);
    Expect.equals(prefix.C<T>, prefix.C<T>);
  }<int>());
}
