// 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 = 2.9

import "package:expect/expect.dart";

// 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 const int a = 0;
  static const 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 const 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 const D instance = const D();
  C() {}
}

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

main() {
  DefaultInitTest.testMain();
}
