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

/// @assertion A mixin application of the form S with M1,...,Mk; defines a
/// class C whose superclass is the application of the mixin composition
/// Mk−1 ∗ ... ∗ M1 to S.
/// ...
/// The composition of two mixins, M1< T1...TkM1 > and M2< U1...UkM2 >,
/// written M1< T1...TkM1 > ∗ M2< U1...UkM2 > defines an anonymous mixin
/// such that for any class S< V1...VkS >, the application of
/// M1< T1...TkM1 > ∗ M2< U1...UkM2 >
/// to S< V1...VkS > is equivalent to
/// abstract class Id1< T1...TkM1, U1...UkM2, V1...VkS > =
/// Id2< U1...UkM2, V1...VkS > with M1< T1...TkM1 >;
/// where Id2 denotes
/// abstract class Id2< U1...UkM2, V1...VkS > =
/// S< V1...VkS > with M2< U1...UkM2 >;
/// @description Checks that mixin composition applies mixins in the right
/// order. Test type aliases
/// @author sgrekhov@unipro.ru

// SharedOptions=--enable-experiment=nonfunction-type-aliases
import "../../../Utils/expect.dart";

class A {
  int m = 0;
}

class M1 {
  int m = 1;
}

class M2 {
  int m = 2;
}

class M3 {
  int m = 3;
}

typedef AAlias = A;
typedef MAlias1 = M1;
typedef MAlias2 = M2;
typedef MAlias3 = M3;

class B1 = AAlias with MAlias1, MAlias2;
class B2 = AAlias with MAlias1, MAlias2, MAlias3;
class B3 = B1 with MAlias3, MAlias2, MAlias1;

main() {
  B1 b1 = new B1();
  B2 b2 = new B2();
  B3 b3 = new B3();

  Expect.equals(2, b1.m);
  Expect.equals(3, b2.m);
  Expect.equals(1, b3.m);
}
