// 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 constructors and initializers.

// @dart = 2.9

import "package:expect/expect.dart";

class A extends B {
  A(x, y)
      : a = x,
        super(y) {}

  var a;
}

class B {
  var b;

  B(x) : b = x {}

  B.namedB(var x) : b = x {}
}

// Test the order of initialization: first the instance variable then
// the super constructor.
abstract class Alpha {
  Alpha(v) {
    this.foo(v);
  }
  foo(v) => throw 'Alpha.foo should never be called.';
}

class Beta extends Alpha {
  Beta(v)
      : b = 1,
        super(v) {}

  foo(v) {
    // Check that 'b' was initialized.
    Expect.equals(1, b);
    b = v;
  }

  var b;
}

class ConstructorTest {
  static testMain() {
    var o = new A(10, 2);
    Expect.equals(10, o.a);
    Expect.equals(2, o.b);

    var o1 = new B.namedB(10);
    Expect.equals(10, o1.b);

    Expect.equals(22, o.a + o.b + o1.b);

    var beta = new Beta(3);
    Expect.equals(3, beta.b);
  }
}

main() {
  ConstructorTest.testMain();
}
