// 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);
}
