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