| // 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(0.5, 7, 0.1); |
| check(-2, 1, false); |
| } |