// 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.

// @dart = 2.9

/// @assertion In a mixin declaration like mixin A<X extends S, Y extends T>
/// on B, C implements D, E { body } the on clause declares the interfaces B and
/// C as super-class constraints of the mixin. Having a super-class constraint
/// allows the mixin declaration instance members to perform super-invocations
/// (like super.foo()) if they are allowed by a class implementing both B and C.
///
/// @description Checks that a mixin declaration can perform super-invocations.
/// Test methods and "implements" implementation of "on" clause interfaces
/// @author sgrekhov@unipro.ru

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

class A {
  String a1() => "A.a1";
  String a2() {
    return "A.a2";
  }
  String a3(String arg) {
    return "A.a3:$arg";
  }
}

class B {
  String b1() => "B.b1";
  String b2() {
    return "B.b2";
  }
  String b3(String arg) {
    return "B.b3:$arg";
  }
}

class C implements A, B {
  String a1() => "C.a1";
  String a2() {
    return "C.a2";
  }
  String a3(String arg) {
    return "C.a3:$arg";
  }
  String b1() => "C.b1";
  String b2() {
    return "C.b2";
  }
  String b3(String arg) {
    return "C.b3:$arg";
  }
}

mixin M on A, B {
  String a1() => "M.a1";
  String a2() {
    return "M.a2";
  }
  String a3(String arg) {
    return "M.a3:$arg";
  }
  String b1() => "M.b1";
  String b2() {
    return "M.b2";
  }
  String b3(String arg) {
    return "M.b3:$arg";
  }

  testM() {
    Expect.equals("C.a1", super.a1());
    Expect.equals("C.a2", super.a2());
    Expect.equals("C.a3:M", super.a3("M"));
    Expect.equals("C.b1", super.b1());
    Expect.equals("C.b2", super.b2());
    Expect.equals("C.b3:M", super.b3("M"));
  }
}

class MA extends C with M {
  String a1() => "MA.a1";
  String a2() {
    return "MA.a2";
  }
  String a3(String arg) {
    return "MA.a3:$arg";
  }
  String b1() => "MA.b1";
  String b2() {
    return "MA.b2";
  }
  String b3(String arg) {
    return "MA.b3:$arg";
  }

  testMA() {
    Expect.equals("M.a1", super.a1());
    Expect.equals("M.a2", super.a2());
    Expect.equals("M.a3:MA", super.a3("MA"));
    Expect.equals("M.b1", super.b1());
    Expect.equals("M.b2", super.b2());
    Expect.equals("M.b3:MA", super.b3("MA"));
  }
}

main() {
  MA ma = new MA();
  Expect.equals("MA.a1", ma.a1());
  Expect.equals("MA.a2", ma.a2());
  Expect.equals("MA.a3:X", ma.a3("X"));
  Expect.equals("MA.b1", ma.b1());
  Expect.equals("MA.b2", ma.b2());
  Expect.equals("MA.b3:X", ma.b3("X"));

  ma.testM();
  ma.testMA();
}
