// 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 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 operators and "mixin" implementation of "on" clause interfaces
/// @author ngl@unipro.ru

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

mixin class A {
  int va = 1;
  int operator +(A v1) {return v1.va + 10000;}
}

class B {
  int vb = 2;
  int operator -() => vb + 20000;
}

class C = B with A;

mixin M on A, B {
  int va = 10;
  int vb = 20;
  int operator +(A v1) => v1.va + 100000;
  int operator -() => vb + 200000;

  testM() {
    Expect.equals(10001, super + new A());
    Expect.equals(10100, super + this);
    Expect.equals(20200, -super);
  }
}

class MA extends C with M {
  int va = 100;
  int vb = 200;
  int operator +(A v1) => v1.va + 1000000;
  int operator -() => vb + 2000000;

  testMA() {
    Expect.equals(100001, super + new A());
    Expect.equals(100100, super + this);
    Expect.equals(200200, -super);
  }
}

main() {
  MA ma = new MA();
  Expect.equals(1000100, ma + ma);
  Expect.equals(2000200, -ma);

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