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

// @dart = 2.9

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();
}
