// Copyright (c) 2012, 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 that field initializers are evaluated in the right order.

int counter = 0;

class Mark {
  static StringBuffer buffer;
  Mark(value) {
    buffer.add('$value.');
  }
}

class OneField {
  var a = new Mark('a');

  OneField();

  OneField.init() : a = new Mark('ai');
}

class TwoFields {
  var b = new Mark('b');
  var a = new Mark('a');

  TwoFields();

  TwoFields.initA() : a = new Mark('ai');

  TwoFields.initB() : b = new Mark('bi');

  TwoFields.initBoth() : a = new Mark('ai'), b = new Mark('bi');
}

class InheritOneField extends OneField {
  var b = new Mark('b');

  InheritOneField() : super();

  InheritOneField.init() : b = new Mark('bi'), super();

  InheritOneField.superWithInit() : super.init();

  InheritOneField.initWithSuperInit() : b = new Mark('bi'), super.init();

  InheritOneField.initWithSuperInit2() : super.init(), b = new Mark('bi');
}

String run(callback) {
  Mark.buffer = new StringBuffer();
  callback();
  return Mark.buffer.toString();
}

main() {
  Expect.equals('a.', run(() => new OneField()));
  Expect.equals('a.ai.', run(() => new OneField.init()));

  Expect.equals('b.a.', run(() => new TwoFields()));
  Expect.equals('b.a.ai.', run(() => new TwoFields.initA()));
  Expect.equals('b.a.bi.', run(() => new TwoFields.initB()));
  Expect.equals('b.a.ai.bi.', run(() => new TwoFields.initBoth()));

  Expect.equals('b.a.', run(() =>
      new InheritOneField()));
  Expect.equals('b.bi.a.', run(() =>
      new InheritOneField.init()));
  Expect.equals('b.a.ai.', run(() =>
      new InheritOneField.superWithInit()));
  Expect.equals('b.bi.a.ai.', run(() =>
      new InheritOneField.initWithSuperInit()));
  Expect.equals('b.a.ai.bi.', run(() =>
      new InheritOneField.initWithSuperInit2()));
}
