// 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 cn = C<num>;
  const Type ci = C<int>;
  const Type cco = C<C<Object?>>;
  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, co);
  Expect.identical(d2, co);
  Expect.identical(d3, ci);
  Expect.identical(b1, cn);
  Expect.identical(b2, cn);
  Expect.identical(b3, ci);
  Expect.identical(w1, cco);
  Expect.identical(w2, cco);
  Expect.identical(w3, cci);
  Expect.identical(e1, co);
  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>());
}
