// 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 The mixin introduced by a mixin declaration contains all the
/// non-static members declared by the mixin, just as the mixin derived from a
/// class declaration currently does.
///
/// @description Checks that a mixin declaration contains all the non-static
/// members declared by the mixin.
/// @author sgrekhov@unipro.ru

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

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

class I<T> {
  String iProperty = "I property";
  String iMethod() => "I method";
  String get iGetter => "I getter";
  void set iSetter(String val) {}
  String operator ~() => "I operator";
}

abstract class J<T> {
  String jProperty = "";
  String jMethod();
  String get jGetter;
  void set jSetter(String val);
  String operator -() => "J operator";
}

class A<T> {
  String aProperty = "A property";
  String aMethod() => "A method";
  String get aGetter => "A getter";
  void set aSetter(String val) {}
  String operator +(A v) => "A operator";
}

abstract class B<T> {
  String bProperty = "";
  String bMethod();
  String get bGetter;
  void set bSetter(String);
  String operator -(B v) => "B operator";
}

class C<T1, T2> implements A<T1>, B<T2> {
  String iProperty = "C I property";
  String iMethod() => "C I method";
  String get iGetter => "C I getter";
  void set iSetter(String val) {}
  String operator ~() => "C I operator";

  String jProperty = "C J property";
  String jMethod() => "C J method";
  String get jGetter => "C J getter";
  void set jSetter(String) {}
  String operator -() => "C J operator";

  String aProperty = "C A property";
  String aMethod() => "C A method";
  String get aGetter => "C A getter";
  void set aSetter(String) {}
  String operator +(A v) => "C A operator";

  String bProperty = "C B property";
  String bMethod() => "C B method";
  String get bGetter => "C B getter";
  void set bSetter(String) {}
  String operator -(B v) => "C B operator";
}

mixin M<T1, T2> on A<T1>, B<T2> implements I<T1>, J<T2> {
  String mProperty = "M property";
  String mMethod() => "M method";
  String get mGetter => "M getter";
  void set mSetter(String val) {}
  String operator *(M v) => "M operator";
}

class MA extends C<X, Y> with M<X, Y> {
  test() {
    Expect.equals("C I property", this.iProperty);
    Expect.equals("C I method", this.iMethod());
    Expect.equals("C I getter", this.iGetter);
    this.iSetter = "x";
    Expect.equals("C I operator", ~this);

    Expect.equals("C J property", this.jProperty);
    Expect.equals("C J method", this.jMethod());
    Expect.equals("C J getter", this.jGetter);
    this.jSetter = "x";
    Expect.equals("C J operator", -this);

    Expect.equals("C A property", this.aProperty);
    Expect.equals("C A method", this.aMethod());
    Expect.equals("C A getter", this.aGetter);
    this.aSetter = "x";
    Expect.equals("C A operator", this + this);

    Expect.equals("C B property", this.bProperty);
    Expect.equals("C B method", this.bMethod());
    Expect.equals("C B getter", this.bGetter);
    this.bSetter = "x";
    Expect.equals("C B operator", this - this);

    Expect.equals("M property", this.mProperty);
    Expect.equals("M method", this.mMethod());
    Expect.equals("M getter", this.mGetter);
    this.mSetter = "x";
    Expect.equals("M operator", this * this);
  }
}

main() {
  MA ma = new MA();
  Expect.equals("C I property", ma.iProperty);
  Expect.equals("C I method", ma.iMethod());
  Expect.equals("C I getter", ma.iGetter);
  ma.iSetter = "x";
  Expect.equals("C I operator", ~ma);

  Expect.equals("C J property", ma.jProperty);
  Expect.equals("C J method", ma.jMethod());
  Expect.equals("C J getter", ma.jGetter);
  ma.jSetter = "x";
  Expect.equals("C J operator", -ma);

  Expect.equals("C A property", ma.aProperty);
  Expect.equals("C A method", ma.aMethod());
  Expect.equals("C A getter", ma.aGetter);
  ma.aSetter = "x";
  Expect.equals("C A operator", ma + ma);

  Expect.equals("C B property", ma.bProperty);
  Expect.equals("C B method", ma.bMethod());
  Expect.equals("C B getter", ma.bGetter);
  ma.bSetter = "x";
  Expect.equals("C B operator", ma - ma);

  Expect.equals("M property", ma.mProperty);
  Expect.equals("M method", ma.mMethod());
  Expect.equals("M getter", ma.mGetter);
  ma.mSetter = "x";
  Expect.equals("M operator", ma * ma);

  ma.test();
}
