// 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.write('$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()));
}
