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

// Tests that type literals made from type aliases work and
// are canonicalized correctly

import "package:expect/expect.dart";

class C<T> {
  final T x;
  C(this.x);
  C.named(this.x);
}

typedef Special = C<int>; // Not generic.
typedef Direct<T> = C<T>;
typedef Bounded<T extends num> = C<T>;
typedef Wrapping<T> = C<C<T>>;
typedef Extra<T, S> = C<T>;

void main() {
  const Type co = C<Object?>;
  const Type cd = C<dynamic>;
  const Type cn = C<num>;
  const Type ci = C<int>;
  const Type cco = C<C<Object?>>;
  const Type ccd = C<C<dynamic>>;
  const Type cci = C<C<int>>;
  const Type s1 = Special;
  const Type d1 = Direct;
  const Type d2 = Direct<Object?>;
  const Type d3 = Direct<int>;
  const Type b1 = Bounded;
  const Type b2 = Bounded<num>;
  const Type b3 = Bounded<int>;
  const Type w1 = Wrapping;
  const Type w2 = Wrapping<Object?>;
  const Type w3 = Wrapping<int>;
  const Type e1 = Extra;
  const Type e2 = Extra<Object?, bool>;
  const Type e3 = Extra<int, bool>;

  Expect.identical(s1, ci);
  Expect.identical(d1, cd);
  Expect.identical(d2, co);
  Expect.identical(d3, ci);
  Expect.identical(b1, cn);
  Expect.identical(b2, cn);
  Expect.identical(b3, ci);
  Expect.identical(w1, ccd);
  Expect.identical(w2, cco);
  Expect.identical(w3, cci);
  Expect.identical(e1, cd);
  Expect.identical(e2, co);
  Expect.identical(e3, ci);

  (<T extends num>() {
    // Using a non-constant type.
    Expect.equals(Direct<T>, ci);
    Expect.equals(Bounded<T>, ci);
    Expect.equals(Wrapping<T>, cci);
    Expect.equals(Extra<T, bool>, ci);
  }<int>());
}
