// 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 instance fields.

import "package:expect/expect.dart";

class First {
  First() {}
  var a;
  var b;

  addFields() {
    return a + b;
  }

  setValues() {
    a = 24;
    b = 10;
    return a + b;
  }
}

class Second extends First {
  var c;
  get a {
    return -12;
  }

  set b(a) {
    a.c = 12;
  }
}

class FieldInitializedToNull {
  int x, y;

  static void test() {
    var f = new FieldInitializedToNull();
    int missingArg([int x = 42]) => x;
    Expect.isNull(f.x);
    Expect.isNull(f.y);
    // Regression tests for a DDC bug, where undefined gets initialized in the
    // fields, and is incorrect recognized as a missing argument.
    Expect.isNull(missingArg(f.x));
    Expect.isNull(missingArg(f.y));
  }
}

class FieldTest {
  static one() {
    var f = new First();
    f.a = 3;
    f.b = f.a;
    Expect.equals(3, f.a);
    Expect.equals(f.a, f.b);
    f.b = (f.a = 10);
    Expect.equals(10, f.a);
    Expect.equals(10, f.b);
    f.b = f.a = 15;
    Expect.equals(15, f.a);
    Expect.equals(15, f.b);
    Expect.equals(30, f.addFields());
    Expect.equals(34, f.setValues());
    Expect.equals(24, f.a);
    Expect.equals(10, f.b);
  }

  static two() {
    // The tests below are a little cumbersome because not
    // everything is implemented yet.
    var o = new Second();
    // 'a' getter is overridden, always returns -12.
    Expect.equals(-12, o.a);
    o.a = 2;
    Expect.equals(-12, o.a);
    // 'b' setter is overridden to write 12 to field 'c'.
    o.b = o;
    Expect.equals(12, o.c);
  }
}

main() {
  FieldTest.one();
  FieldTest.two();
  FieldInitializedToNull.test();
}
