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

import "package:expect/expect.dart";

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