/*
 * Copyright (c) 2019, 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.
 */
/**
 * @assertion A pre-increment expression of the form ++e1.id is generally
 * equivalent to e1.id += 1. Similarly for --e1.id, ++e1[e2] and --e1[e2]. This
 * applies when e1 is an extension application too, reducing it to the former
 * case.
 *
 * A post-increment expression of the form e1.id++ is generally equivalent to
 * e1.id += 1 (which is e1.id = e1.id + 1 except that subexpressions of e1 are
 * not evaluated more than once), but the value of the expression is the value
 * from evaluating e1.id before adding 1.
 *
 * @description Check ++e1[id] and e1[id]++ values
 * @issue 39198
 * @author sgrekhov@unipro.ru
 */

import "../../Utils/expect.dart";

class C {
  int value;
  C() : value = 0 {}
  init() {
    value = 0;
  }
}

extension Ext on C {
  int operator [](int index) => this.value;
  void operator []=(int index, int val) {
    this.value = val;
  }
}

main() {
  C c = C();
  Expect.equals(1, ++Ext(c)[42]);
  c.init();
  Expect.equals(0, Ext(c)[42]++);
}
