// 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_correctOrder()
      : b = new Mark('bi'),
        super.init();

  InheritOneField.initWithSuperInit_incorrectOrder()
      :
        super.init(), //# 01: compile-time error
        b = new Mark('bi')
        , super.init() //# none: ok
  ;
}

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_correctOrder()));
  Expect.equals(
      'b.bi.a.ai.', run(() => new InheritOneField.initWithSuperInit_incorrectOrder()));
}
