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