// 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 initializers for final fields are evaluated in the right
// order.

int counter = 0;

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

class OneField {
  final a = new Mark('a');
  OneField();
}

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

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

class MixedFields extends OneField {
  final b = new Mark('b');
  var c = new Mark('c');
  final d = new Mark('d');
  MixedFields();
  MixedFields.c0() : c = new Mark('cc');
  MixedFields.c1()
      : c = new Mark('cc'),
        super();
  MixedFields.c2()
      : super(),
        c = new Mark('cc');
}

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

main() {
  Expect.equals('a.', run(() => new OneField()));
  Expect.equals('a.b.', run(() => new TwoFields()));
  Expect.equals('b.a.', run(() => new InheritOneField()));

  Expect.equals('b.c.d.a.', run(() => new MixedFields()));
  Expect.equals('b.c.d.cc.a.', run(() => new MixedFields.c0()));
  Expect.equals('b.c.d.cc.a.', run(() => new MixedFields.c1()));
  Expect.equals('b.c.d.a.cc.', run(() => new MixedFields.c2()));
}
