// 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 For any other valid operator op, a compound assignment of the
/// form v op =e is equivalent to v=v op e
/// @description Checks that an expression of the form v %= e is equivalent
/// to v = v % e.
/// @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;
  }

  test(val, expected) {
    var res = (c %= val);
    Expect.equals(1, getterInvocation);     //checks that getter was invoked only one time
    Expect.equals(1, setterInvocation);     //checks that setter was invoked only one time
    Expect.equals(expected, c.v);           //checks that result was assigned
    Expect.equals(expected, res.v);         //checks result
  }

  C? _c;

  int getterInvocation = 0;
  int setterInvocation = 0;
}

main() {
  new A(3).test(3, 3 % 3);
  new A(10).test(1, 10 % 1);
  new A(5).test(7, 5 % 7);
  new A(-2).test(1, -2 % 1);
}
