blob: b578704b2bdfd7099a5b7af11233cbc76677b060 [file] [log] [blame]
// 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[e2] op=e3 is equivalent to
* ((a, i) => a[i] = a[i] op e3)(e1, e2) where a and i are a variables that are
* not used in e3.
* @description Checks that a compound assignment expression of the form
* e1[e2] &= e3 is equivalent to ((a, i) => a[i] = a[i] & e3)(e1, e2).
* @author rodionov
*/
import '../../../../Utils/expect.dart';
class C {
C(this.v) {
getterSelectorArg = null;
setterSelectorArg = null;
}
operator &(val) {
C c = new C(v & val);
return c;
}
operator [](idx) {
++getterInvocation;
getterSelectorArg = idx;
return v;
}
void operator []=(idx, val) {
++setterInvocation;
setterSelectorArg = idx;
v = val;
}
var v;
int getterInvocation = 0, setterInvocation = 0;
var getterSelectorArg, setterSelectorArg;
}
check(operand1, operand2, idx) {
C c = new C(operand1);
var expected = operand1 & operand2;
var res = (c[idx] &= operand2);
Expect.equals(1, c.getterInvocation); //checks that fetching selector was invoked only one time
Expect.equals(1, c.setterInvocation); //checks that assignable selector was invoked only one time
Expect.equals(idx, c.getterSelectorArg);
Expect.equals(idx, c.setterSelectorArg);
Expect.equals(expected, c.v); //checks that result was assigned
}
main() {
check(3, 3, "idx");
check(10, 1, 0);
check(5, 7, 0.1);
check(-2, 1, false);
}