| // Copyright (c) 2013, 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 for the evaluation order of getters and setters. | 
 |  | 
 | import 'package:expect/expect.dart'; | 
 |  | 
 | var trace; | 
 |  | 
 | class X { | 
 |   get b { | 
 |     trace.add('get b'); | 
 |     return new X(); | 
 |   } | 
 |  | 
 |   set c(value) { | 
 |     trace.add('set c'); | 
 |   } | 
 |  | 
 |   toString() { | 
 |     trace.add('toString'); | 
 |     return 'X'; | 
 |   } | 
 |  | 
 |   get c { | 
 |     trace.add('get c'); | 
 |     return 42; | 
 |   } | 
 |  | 
 |   get d { | 
 |     trace.add('get d'); | 
 |     return new X(); | 
 |   } | 
 |  | 
 |   operator [](index) { | 
 |     trace.add('index'); | 
 |     return 42; | 
 |   } | 
 |  | 
 |   operator []=(index, value) { | 
 |     trace.add('indexSet'); | 
 |   } | 
 | } | 
 |  | 
 | main() { | 
 |   var x = new X(); | 
 |  | 
 |   trace = []; | 
 |   x.b.c = '$x'; | 
 |   Expect.listEquals(['get b', 'toString', 'set c'], trace); | 
 |  | 
 |   trace = []; | 
 |   x.b.c += '$x'.hashCode; | 
 |   Expect.listEquals(['get b', 'get c', 'toString', 'set c'], trace); | 
 |  | 
 |   trace = []; | 
 |   x.b.c++; | 
 |   Expect.listEquals(['get b', 'get c', 'set c'], trace); | 
 |  | 
 |   trace = []; | 
 |   x.b.d[42] = '$x'; | 
 |   Expect.listEquals(['get b', 'get d', 'toString', 'indexSet'], trace); | 
 |  | 
 |   trace = []; | 
 |   x.b.d[42] += '$x'.hashCode; | 
 |   Expect.listEquals(['get b', 'get d', 'index', 'toString', 'indexSet'], trace); | 
 |  | 
 |   trace = []; | 
 |   x.b.d[42]++; | 
 |   Expect.listEquals(['get b', 'get d', 'index', 'indexSet'], trace); | 
 |  | 
 |   trace = []; | 
 |   ++x.b.d[42]; | 
 |   Expect.listEquals(['get b', 'get d', 'index', 'indexSet'], trace); | 
 |  | 
 |   trace = []; | 
 |   x.b.d[x.c] *= '$x'.hashCode; | 
 |   Expect.listEquals( | 
 |       ['get b', 'get d', 'get c', 'index', 'toString', 'indexSet'], trace); | 
 |  | 
 |   trace = []; | 
 |   x.b.c = x.d.c = '$x'; | 
 |   Expect.listEquals([ | 
 |     'get b', | 
 |     'get d', | 
 |     'toString', | 
 |     'set c', | 
 |     'set c', | 
 |   ], trace); | 
 |  | 
 |   trace = []; | 
 |   x.b.c = x.d[42] *= '$x'.hashCode; | 
 |   Expect.listEquals( | 
 |       ['get b', 'get d', 'index', 'toString', 'indexSet', 'set c'], trace); | 
 |  | 
 |   trace = []; | 
 |   x.b.c = ++x.d.c; | 
 |   Expect.listEquals(['get b', 'get d', 'get c', 'set c', 'set c'], trace); | 
 | } |