| // 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. | 
 |  | 
 | import "package:expect/expect.dart"; | 
 |  | 
 | class A { | 
 |   List<int> list; | 
 |   A(int a, int b) : list = <int>[a, b]; | 
 |   operator [](index) => list[index]; | 
 |   operator []=(index, value) => list[index] = value; | 
 | } | 
 |  | 
 | class B { | 
 |   int value; | 
 |   List trace; | 
 |   B(this.trace) : value = 100; | 
 |   operator [](index) { | 
 |     trace.add(-3); | 
 |     trace.add(index); | 
 |     trace.add(this.value); | 
 |     this.value = this.value + 1; | 
 |     return this; | 
 |   } | 
 |  | 
 |   operator []=(index, value) { | 
 |     trace.add(-5); | 
 |     trace.add(index); | 
 |     trace.add(value.value); | 
 |     this.value = this.value + 1; | 
 |   } | 
 |  | 
 |   operator +(int value) { | 
 |     trace.add(-4); | 
 |     trace.add(this.value); | 
 |     trace.add(value); | 
 |     this.value = this.value + 1; | 
 |     return this; | 
 |   } | 
 | } | 
 |  | 
 | B getB(trace) { | 
 |   trace.add(-1); | 
 |   return new B(trace); | 
 | } | 
 |  | 
 | int getIndex(trace) { | 
 |   trace.add(-2); | 
 |   return 42; | 
 | } | 
 |  | 
 | main() { | 
 |   A a = new A(1, 2); | 
 |   Expect.equals(1, a[0]); | 
 |   Expect.equals(2, a[1]); | 
 |  | 
 |   Expect.equals(1, a[0]++); | 
 |   Expect.equals(2, a[0]); | 
 |  | 
 |   Expect.equals(2, a[0]--); | 
 |   Expect.equals(1, a[0]); | 
 |  | 
 |   Expect.equals(0, --a[0]); | 
 |   Expect.equals(0, a[0]); | 
 |  | 
 |   Expect.equals(1, ++a[0]); | 
 |   Expect.equals(1, a[0]); | 
 |  | 
 |   a[0] += 2; | 
 |   Expect.equals(3, a[0]); | 
 |  | 
 |   List trace = []; | 
 |   getB(trace)[getIndex(trace)] += 37; | 
 |  | 
 |   Expect.listEquals([-1, -2, -3, 42, 100, -4, 101, 37, -5, 42, 102], trace); | 
 | } |