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

// @dart=2.19

import 'package:expect/expect.dart' show Expect;

@pragma("vm:entry-point") // Prevent obfuscation
class A {}

@pragma("vm:entry-point") // Prevent obfuscation
class B {}

@pragma("vm:entry-point") // Prevent obfuscation
class C {}

@pragma("vm:entry-point") // Prevent obfuscation
class D {}

@pragma("vm:entry-point") // Prevent obfuscation
class E {}

@pragma("vm:entry-point") // Prevent obfuscation
class F {}

@pragma("vm:entry-point") // Prevent obfuscation
class M1<Tm1> {
  Type m1() => M1<Tm1>;
}

@pragma("vm:entry-point") // Prevent obfuscation
class M2<Tm2> {
  Type m2() => M2<Tm2>;
}

@pragma("vm:entry-point") // Prevent obfuscation
class M3<Tm3> {
  Type m3() => M3<Tm3>;
}

@pragma("vm:entry-point") // Prevent obfuscation
class M4<Tm4> {
  Type m4() => M4<Tm4>;
}

@pragma("vm:entry-point") // Prevent obfuscation
class M5<Tm5> {
  Type m5() => M5<Tm5>;
}

class C1 = Object with M1, M2<A>, M3, M4<B>, M5<C>;

class C2 = Object with M1<A>, M2<B>, M3<C>, M4<D>, M5<E>;

class C3<T> = Object with M1<A>, M2<T>, M3, M4, M5<B>;

class C4 extends Object with M1, M2<A>, M3, M4<B>, M5<C> {}

class C5 extends Object with M1<A>, M2<B>, M3<C>, M4<D>, M5<E> {}

class C6<T> extends Object with M1<A>, M2<T>, M3, M4, M5<B> {}

class C7 = Object with M1<A>, M2<A>, M3<A>, M4<A>, M5<A>;

class C8 extends Object with M1<A>, M2<A>, M3<A>, M4<A>, M5<A> {}

class C9 = Object
    with M1<List<A>>, M2<List<A>>, M3<List<A>>, M4<List<A>>, M5<List<A>>;

class CA extends Object
    with M1<List<A>>, M2<List<A>>, M3<List<A>>, M4<List<A>>, M5<List<A>> {}

List<Type> trace(x) => [x.m1(), x.m2(), x.m3(), x.m4(), x.m5()];

main() {
  Expect.listEquals(
      [M1<dynamic>, M2<A>, M3<dynamic>, M4<B>, M5<C>], trace(new C1()));
  Expect.listEquals([M1<A>, M2<B>, M3<C>, M4<D>, M5<E>], trace(new C2()));
  Expect.listEquals(
      [M1<A>, M2<dynamic>, M3<dynamic>, M4<dynamic>, M5<B>], trace(new C3()));
  Expect.listEquals(
      [M1<A>, M2<F>, M3<dynamic>, M4<dynamic>, M5<B>], trace(new C3<F>()));
  Expect.listEquals(
      [M1<dynamic>, M2<A>, M3<dynamic>, M4<B>, M5<C>], trace(new C4()));
  Expect.listEquals([M1<A>, M2<B>, M3<C>, M4<D>, M5<E>], trace(new C5()));
  Expect.listEquals(
      [M1<A>, M2<dynamic>, M3<dynamic>, M4<dynamic>, M5<B>], trace(new C6()));
  Expect.listEquals(
      [M1<A>, M2<F>, M3<dynamic>, M4<dynamic>, M5<B>], trace(new C6<F>()));
  Expect.listEquals([M1<A>, M2<A>, M3<A>, M4<A>, M5<A>], trace(new C7()));
  Expect.listEquals([M1<A>, M2<A>, M3<A>, M4<A>, M5<A>], trace(new C8()));
  Expect.listEquals(
      [M1<List<A>>, M2<List<A>>, M3<List<A>>, M4<List<A>>, M5<List<A>>],
      trace(new C9()));
  Expect.listEquals(
      [M1<List<A>>, M2<List<A>>, M3<List<A>>, M4<List<A>>, M5<List<A>>],
      trace(new CA()));
}
