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

// Test Parameter Intializer.


class ParameterInitializer2Test {
  static testMain() {
    var a = new A(123);
    Expect.equals(123, a.x);

    var b = new B(123);
    Expect.equals(123, b.x);

    var c = new C(123);
    Expect.equals(123, c.x);

    var d = new D(123);
    Expect.equals(123, d.x);

    var e = new E(1);
    Expect.equals(4, e.x);

    var f = new F(1,2,3,4);
    Expect.equals(4, f.z);
  }
}

// untyped
class A {
  A(this.x) {
  }
  int x;
}

// typed
class B {
  B(int this.x) {
  }
  int x;
}

// const typed
class C {
  const C(int this.x);
  final int x;
}

// const untyped
class D {
  const D(this.x);
  final x;
}

// make sure this.<X> references work properly in the constructor scope.
class E {
  E(this.x) {
    var myVar = this.x * 2;
    this.x = myVar + 1;
    x = myVar + 2;
    var foo = x + 1;
  }
  int x;
}


// mixed
class F {
  F(x, this.y_, int w, int this.z) : x_ = x, w_ = w { }
  F.foobar(this.z, int this.x_, int this.az_) { }
  int x_;
  int y_;
  int w_;
  int z;
  int az_;
}


main() {
  ParameterInitializer2Test.testMain();
}
