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