// 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.
// Dart test program for testing setting/getting of fields when
// only getter/setter methods are specified.

import "package:expect/expect.dart";

class First {
  First(int val) : a_ = val {}

  void testMethod() {
    a = 20;
  }

  static void testStaticMethod() {
    b = 20;
  }

  int get a {
    return a_;
  }

  void set a(int val) {
    a_ = a_ + val;
  }

  static int get b {
    return b_;
  }

  static void set b(int val) {
    b_ = val;
  }

  int a_;
  static int b_ = -1;
}

class Second {
  static int c = -1;
  int a_;

  Second(int value) : a_ = value {}

  void testMethod() {
    a = 20;
  }

  static void testStaticMethod() {
    int i;
    b = 20;
    i = d;
    // TODO(asiva): Turn these on once we have error handling.
    // i = b; // Should be an error.
    // d = 40; // Should be an error.
  }

  int get a {
    return a_;
  }

  void set a(int value) {
    a_ = a_ + value;
  }

  static void set b(int value) {
    Second.c = value;
  }

  static int get d {
    return Second.c;
  }
}

class Setter1Test {
  static testMain() {
    First obj1 = new First(10);
    Expect.equals(10, obj1.a);
    obj1.testMethod();
    Expect.equals(30, obj1.a);
    First.b = 10;
    Expect.equals(10, First.b);
    First.testStaticMethod();
    Expect.equals(20, First.b);

    Second obj = new Second(10);
    Expect.equals(10, obj.a);
    obj.testMethod();
    Expect.equals(30, obj.a);

    Second.testStaticMethod();
    Expect.equals(20, Second.c);
    Expect.equals(20, Second.d);
  }
}

main() {
  Setter1Test.testMain();
}
