// 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 'dart:async';
import 'package:expect/expect.dart';
import 'package:async_helper/async_helper.dart';
import '../helpers/compiler_helper.dart';

const String TEST_INVOCATION0 = r"""
main() {
  var o = null;
  o();
}
""";

const String TEST_INVOCATION1 = r"""
main() {
  var o = null;
  o(1);
}
""";

const String TEST_INVOCATION2 = r"""
main() {
  var o = null;
  o(1, 2);
}
""";

const String TEST_BAILOUT = r"""
class A {
  var x;
  foo(_) { // make sure only g has no arguments
    var f = () { return 499;  };
    return 499 + x + f();
  }
}

main() { new A().foo(1); }
""";

Future closureInvocation({bool minify, String prefix}) async {
  await compile(TEST_INVOCATION0, minify: minify, check: (String generated) {
    Expect.isTrue(generated.contains(".$prefix\$0()"));
  });
  await compile(TEST_INVOCATION1, minify: minify, check: (String generated) {
    Expect.isTrue(generated.contains(".$prefix\$1(1)"));
  });
  await compile(TEST_INVOCATION2, minify: minify, check: (String generated) {
    Expect.isTrue(generated.contains(".$prefix\$2(1,${minify ? "" : " "}2)"));
  });
}

// Make sure that the bailout version does not introduce a second version of
// the closure.
Future closureBailout({bool minify, String prefix}) async {
  String generated = await compileAll(TEST_BAILOUT, minify: minify);
  RegExp regexp = new RegExp("$prefix\\\$0:${minify ? "" : " "}function");
  Iterator<Match> matches = regexp.allMatches(generated).iterator;
  checkNumberOfMatches(matches, 1);
}

main() {
  runTests() async {
    await closureInvocation(minify: false, prefix: "call");
    await closureInvocation(minify: true, prefix: "");
    await closureBailout(minify: false, prefix: "call");
    await closureBailout(minify: true, prefix: "");
  }

  asyncTest(() async {
    print('--test from kernel------------------------------------------------');
    await runTests();
  });
}
