// Copyright (c) 2011, 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:async_helper/async_helper.dart';
import 'package:expect/expect.dart';
import '../compiler_helper.dart';

main() {
  runTests({bool useKernel, int numberOfParameters}) async {
    StringBuffer buffer = new StringBuffer();
    buffer.write("foo(");
    for (int i = 0; i < numberOfParameters; i++) {
      buffer.write("x$i, ");
    }
    buffer.write("x) { int i = ");
    for (int i = 0; i < numberOfParameters; i++) {
      buffer.write("x$i+");
    }
    buffer.write("$numberOfParameters; return i; }");
    String code = buffer.toString();

    String generated =
        await compile(code, entry: 'foo', minify: true, useKernel: useKernel);
    RegExp re = new RegExp(r"\(a,b,c");
    Expect.isTrue(re.hasMatch(generated));

    re = new RegExp(r"x,y,z,a0,a1,a2");
    Expect.isTrue(re.hasMatch(generated));

    re = new RegExp(r"y,z,a0,a1,a2,a3,a4,a5,a6");
    Expect.isTrue(re.hasMatch(generated));

    re = new RegExp(r"g8,g9,h0,h1");
    Expect.isTrue(re.hasMatch(generated));

    re = new RegExp(r"z8,z9,aa0,aa1,aa2");
    Expect.isTrue(re.hasMatch(generated));

    re = new RegExp(r"aa9,ab0,ab1");
    Expect.isTrue(re.hasMatch(generated));

    re = new RegExp(r"az9,ba0,ba1");
    Expect.isTrue(re.hasMatch(generated));
  }

  asyncTest(() async {
    // The [numberOfParameters] values are somewhat arbitrary.
    print('--test from ast---------------------------------------------------');
    await runTests(useKernel: false, numberOfParameters: 1800);
    print('--test from kernel------------------------------------------------');
    await runTests(useKernel: true, numberOfParameters: 2000);
  });
}
