// Copyright (c) 2011, 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 compound assignment of the form e1.v op = e2 is equivalent
/// to ((x) => x.v = x.v op e2)(e1) where x is a variable that is not used in e2.
/// @description Checks that an expression of the form e1.v %= e2 is equivalent
/// to ((x) => x.v = x.v % e2)(e1) where x is a variable that is not used in e2.
/// @author msyabro


import '../../../../Utils/expect.dart';

class C {
  C(this.v);

  operator %(val) {
    C c = new C(v % val);
    return c;
  }

  var v;
}

class A {
  A(val) {
    _c = new C(val);
  }

  get c {
    ++getterInvocation;
    return _c;
  }

  set c(val) {
    ++setterInvocation;
    _c = val;
  }

  C? _c;

  int getterInvocation = 0;
  int setterInvocation = 0;
}

check(operand1, operand2) {
  A a = new A(operand1);
  var expected = operand1 % operand2;
  var res = (a.c %= operand2);
  Expect.equals(1, a.getterInvocation);     //checks that getter was invoked only one time
  Expect.equals(1, a.setterInvocation);     //checks that setter was invoked only one time
  Expect.equals(expected, a.c.v);           //checks that result was assigned
  Expect.equals(expected, res.v);           //checks value
}

main() {
  check(3, 3);
  check(10, 1);
  check(5, 7);
  check(-2, 1);
}
