// 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 value;
  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>() {
    // 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>());
}
