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

import "package:expect/expect.dart";

var global = 0;

class Foo {
  var field = 0;
  static var staticField = 0;
}

field_compound1(obj) {
  return obj.field = obj.field + 5;
}

field_compound2(obj) {
  return obj.field = obj.field + 1;
}

field_compound3(obj) {
  return obj.field = obj.field - 1;
}

field_compound4(obj) {
  return obj.field = obj.field * 1;
}

static_compound1() {
  return Foo.staticField = Foo.staticField + 5;
}

static_compound2() {
  return Foo.staticField = Foo.staticField + 1;
}

static_compound3() {
  return Foo.staticField = Foo.staticField - 1;
}

static_compound4() {
  return Foo.staticField = Foo.staticField * 1;
}

global_compound1() {
  return global = global + 5;
}

global_compound2() {
  return global = global + 1;
}

global_compound3() {
  return global = global - 1;
}

global_compound4() {
  return global = global * 1;
}

local_compound1(x) {
  x = x + 5;
  if (x > 0) {
    return x;
  }
  return -x;
}

local_compound2(x) {
  x = x + 1;
  if (x > 0) {
    return x;
  }
  return -x;
}

local_compound3(x) {
  x = x - 1;
  if (x > 0) {
    return x;
  }
  return -x;
}

local_compound4(x) {
  x = x * 1;
  if (x > 0) {
    return x;
  }
  return -x;
}

main() {
  var obj = new Foo();
  Expect.equals(5, field_compound1(obj));
  Expect.equals(5, obj.field);
  Expect.equals(6, field_compound2(obj));
  Expect.equals(6, obj.field);
  Expect.equals(5, field_compound3(obj));
  Expect.equals(5, obj.field);
  Expect.equals(5, field_compound4(obj));
  Expect.equals(5, obj.field);

  Expect.equals(5, static_compound1());
  Expect.equals(5, Foo.staticField);
  Expect.equals(6, static_compound2());
  Expect.equals(6, Foo.staticField);
  Expect.equals(5, static_compound3());
  Expect.equals(5, Foo.staticField);
  Expect.equals(5, static_compound4());
  Expect.equals(5, Foo.staticField);

  Expect.equals(5, global_compound1());
  Expect.equals(5, global);
  Expect.equals(6, global_compound2());
  Expect.equals(6, global);
  Expect.equals(5, global_compound3());
  Expect.equals(5, global);
  Expect.equals(5, global_compound4());
  Expect.equals(5, global);

  Expect.equals(8, local_compound1(3));
  Expect.equals(3, local_compound1(-8));
  Expect.equals(4, local_compound2(3));
  Expect.equals(7, local_compound2(-8));
  Expect.equals(2, local_compound3(3));
  Expect.equals(9, local_compound3(-8));
  Expect.equals(3, local_compound4(3));
  Expect.equals(8, local_compound4(-8));
}
