// 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 parameters keep their names in the output.

import "package:expect/expect.dart";
import "package:async_helper/async_helper.dart";
import 'compiler_helper.dart';

const String TEST_ONE = r"""
class A { }
class B { }

main() {
  new A();
  new B();
}
""";

const String TEST_TWO = r"""
class A { }
class B extends A { }

main() {
  new A();
  new B();
}
""";

const String TEST_THREE = r"""
class B extends A { }
class A { }

main() {
  new B();
  new A();
}
""";

const String TEST_FOUR = r"""
class A {
  var x;
}

class B extends A {
  var y;
  var z;
}

main() {
  new B();
}
""";

const String TEST_FIVE = r"""
class A {
  var a;
  A(a) : this.a = a {}
}

main() {
  new A(3);
}
""";

twoClasses() {
  asyncTest(() => compileAll(TEST_ONE).then((generated) {
        Expect.isTrue(
            generated.contains(new RegExp('A: {[ \n]*"\\^": "Object;"')));
        Expect.isTrue(
            generated.contains(new RegExp('B: {[ \n]*"\\^": "Object;"')));
      }));
}

subClass() {
  checkOutput(String generated) {
    Expect.isTrue(generated.contains(new RegExp('A: {[ \n]*"\\^": "Object;"')));
    Expect.isTrue(generated.contains(new RegExp('B: {[ \n]*"\\^": "A;"')));
  }

  asyncTest(() => compileAll(TEST_TWO).then(checkOutput));
  asyncTest(() => compileAll(TEST_THREE).then(checkOutput));
}

fieldTest() {
  asyncTest(() => compileAll(TEST_FOUR).then((generated) {
        Expect.isTrue(generated
            .contains(new RegExp('B: {[ \n]*"\\^": "A;y,z,x",[ \n]*static:')));
      }));
}

constructor1() {
  asyncTest(() => compileAll(TEST_FIVE).then((generated) {
        Expect.isTrue(generated.contains(new RegExp(r"new [$A-Z]+\.A\(a\);")));
      }));
}

main() {
  twoClasses();
  subClass();
  fieldTest();
  constructor1();
}
