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