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