| // 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. |
| |
| // @dart = 2.9 |
| |
| // 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); |
| } |