// Copyright (c) 2011, 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.

int zero() { return 0; }
int one() { return 1; }
int minus1() { return 0 - 1; }
int two() { return 2; }
int three() { return 3; }
int five() { return 5; }
int minus5() { return 0 - 5; }
int ninetyNine() { return 99; }
int four99() { return 499; }
int four99times99() { return 499 * 99; }
int four99times99plus1() { return 499 * 99 + 1; }

void postPlusPlusTest() {
  var x = zero();
  var y = x++;
  Expect.equals(0, y);
  Expect.equals(1, x);
  Expect.equals(1, x++);
  Expect.equals(2, x);
}

void prePlusPlusTest() {
  var x = zero();
  var y = ++x;
  Expect.equals(1, x);
  Expect.equals(1, y);
  Expect.equals(2, ++x);
  Expect.equals(2, ++y);
}

void postMinusMinusTest() {
  var x = four99();
  var y = x--;
  Expect.equals(499, y);
  Expect.equals(498, x);
  Expect.equals(498, x--);
  Expect.equals(497, x);
}

void preMinusMinusTest() {
  var x = four99();
  var y = --x;
  Expect.equals(498, y);
  Expect.equals(498, x);
  Expect.equals(497, --x);
  Expect.equals(497, x);
}

void main() {
  postPlusPlusTest();
  prePlusPlusTest();
  postMinusMinusTest();
  preMinusMinusTest();
}
