// Copyright (c) 2012, 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.
// Test correct instance compound assignment operator.

import "package:expect/expect.dart";

class A {
  A() : f = 2 {}
  var f;
  operator [](index) => f;
  operator []=(index, value) => f = value;

  var _g = 0;
  var gGetCount = 0;
  var gSetCount = 0;
  get g {
    gGetCount++;
    return _g;
  }

  set g(value) {
    gSetCount++;
    _g = value;
  }
}

class B {
  B() : _a = new A(), count = 0 {}
  get a {
    count++;
    return _a;
  }

  var _a;
  var count;
}

var globalA;
var fooCounter = 0;
foo() {
  fooCounter++;
  return globalA;
}

main() {
  B b = new B();
  Expect.equals(0, b.count);
  Expect.equals(2, b.a.f);
  Expect.equals(1, b.count);
  var o = b.a;
  Expect.equals(2, b.count);
  b.a.f = 1;
  Expect.equals(3, b.count);
  Expect.equals(1, b._a.f);
  b.a.f += 1;
  Expect.equals(4, b.count);
  Expect.equals(2, b._a.f);

  b.count = 0;
  b._a.f = 2;
  Expect.equals(0, b.count);
  Expect.equals(2, b.a[0]);
  Expect.equals(1, b.count);
  o = b.a;
  Expect.equals(2, b.count);
  b.a[0] = 1;
  Expect.equals(3, b.count);
  Expect.equals(1, b._a.f);
  b.a[0] += 1;
  Expect.equals(4, b.count);
  Expect.equals(2, b._a.f);

  b._a.g++;
  Expect.equals(1, b._a.gGetCount);
  Expect.equals(1, b._a.gSetCount);
  Expect.equals(1, b._a._g);

  globalA = b._a;
  globalA.f = 0;
  foo().f += 1;
  Expect.equals(1, fooCounter);
  Expect.equals(1, globalA.f);
}
