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

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