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

// Tests static and instance fields initialization.
class DefaultInitTest {
  static testMain() {
    Expect.equals(0, A.a);
    Expect.equals(2, A.b);
    Expect.equals(null, A.c);

    A a1 = new A(42);
    Expect.equals(42, a1.d);
    Expect.equals(null, a1.e);

    A a2 = new A.named(43);
    Expect.equals(null, a2.d);
    Expect.equals(43, a2.e);

    Expect.equals(42, B.instance.x);
    Expect.equals(3, C.instance.z);
  }
}

class A {
  static final int a = 0;
  static final int b = 2;
  static int c;
  int d;
  int e;

  A(int val) {
    d = val;
  }

  A.named(int val) {
    e = val;
  }
}

// The following tests cover cases described in b/4101270

class B {
  static final B instance = const B();
  // by putting this field after the static initializer above, the JS code gen
  // was calling the constructor before the setter of this property was defined.
  final int x;
  const B() : this.x = (41 + 1);
}

class C {
  // forward reference to another class
  static final D instance = const D();
  C() {}
}

class D {
  const D(): this.z = 3;
  final int z;
}

main() {
  DefaultInitTest.testMain();
}
