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

import "package:expect/expect.dart";

class GettersSettersTest {
  static int foo;

  static testMain() {
    A a = new A();
    a.x = 2;
    Expect.equals(2, a.x);
    Expect.equals(2, a.x_);

    // Test inheritance.
    a = new B();
    a.x = 4;
    Expect.equals(4, a.x);
    Expect.equals(4, a.x_);

    // Test overriding.
    C c = new C();
    c.x = 8;
    Expect.equals(8, c.x);
    Expect.equals(0, c.x_);
    Expect.equals(8, c.y_);

    // Test keyed getters and setters.
    a.x_ = 0;
    Expect.equals(2, a[2]);
    a[2] = 4;
    Expect.equals(6, a[0]);

    // Test assignment operators.
    a.x_ = 0;
    a[2] += 8;
    Expect.equals(12, a[0]);

    // Test calling a function that internally uses getters.
    Expect.equals(true, a.isXPositive());

    // Test static fields.
    foo = 42;
    Expect.equals(42, foo);
    A.foo = 43;
    Expect.equals(43, A.foo);

    new D().test();

    OverrideField of = new OverrideField();
    Expect.equals(27, of.getX_());

    ReferenceField rf = new ReferenceField();
    rf.x_ = 1;
    Expect.equals(1, rf.getIt());
    rf.setIt(2);
    Expect.equals(2, rf.x_);
  }
}

class A {
  int x_;
  static int foo;

  static get bar {
    return foo;
  }

  static set bar(newValue) {
    foo = newValue;
  }

  int get x {
    return x_;
  }

  void set x(int value) {
    x_ = value;
  }

  bool isXPositive() {
    return x > 0;
  }

  int operator [](int index) {
    return x_ + index;
  }

  void operator []=(int index, int value) {
    x_ = index + value;
  }

  int getX_() {
    return x_;
  }
}

class B extends A {}

class C extends A {
  int y_;

  C() : super() {
    this.x_ = 0;
  }

  int get x {
    return y_;
  }

  void set x(int value) {
    y_ = value;
  }
}

class D extends A {
  var x2_;

  set x(new_x) {
    x2_ = new_x;
  }

  test() {
    x = 87;
    Expect.equals(87, x2_);
    x = 42;
    Expect.equals(42, x2_);
  }
}

class OverrideField extends A {
  int get x_ {
    return 27;
  }
}

class ReferenceField extends A {
  setIt(a) {
    super.x_ = a;
  }

  int getIt() {
    return super.x_;
  }
}

main() {
  GettersSettersTest.testMain();
}
