// Copyright (c) 2018, 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 declaration defines an interface. The interface for this
/// mixin declaration is equivalent to the interface of the class declared as:
///  abstract class A<X extends S, Y extends T> extends A$super<X, Y>
///    implements D, E { body' }
/// where body' contains abstract declarations corresponding to the instance
/// members of body of the mixin A.
/// It is a compile time error for the mixin declaration if this class
/// declarations would not be valid.
///
/// @description Checks that a mixin declaration in form
/// mixin A<X extends S, Y extends T> on B, C implements D, E { body }
/// is equivalent to the interface of the class declared as
/// abstract class A<X extends S, Y extends T> extends A$super<X, Y>
///   implements D, E { body' }.
/// @author sgrekhov@unipro.ru

import "../../Utils/expect.dart";

class S {}
class T {}
class X extends S {}
class Y extends T {}

abstract class B {
  String get b;
}

class C {
  String get c => "C";
}

class D {
  String get d => "D";
}

abstract class E {
  String get e;
}

mixin A<X extends S, Y extends T> on B, C implements D, E {
  S x = new S();
  T y = new T();
}

class AI implements A<X, Y> {
  S x = new X();
  T y = new Y();

  String get b => "AI";
  String get c => "AI";
  String get d => "AI";
  String get e => "AI";

  test() {
    Expect.equals("AI", this.b);
    Expect.equals("AI", this.c);
    Expect.equals("AI", this.d);
    Expect.equals("AI", this.e);
  }
}

main() {
  AI ai = new AI();
  Expect.equals("AI", ai.b);
  Expect.equals("AI", ai.c);
  Expect.equals("AI", ai.d);
  Expect.equals("AI", ai.e);
  ai.test();
}
