// Copyright (c) 2014, 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.

// @dart = 2.7

// Ensures that closures are in the output unit of their enclosing element.

import 'package:async_helper/async_helper.dart';
import 'package:compiler/compiler.dart';
import 'package:expect/expect.dart';

import '../helpers/memory_compiler.dart';

void main() {
  asyncTest(() async {
    print('--test from kernel------------------------------------------------');
    await runTest();
  });
}

runTest() async {
  OutputCollector collector = new OutputCollector();
  await runCompiler(memorySourceFiles: sources, outputProvider: collector);
  String mainOutput = collector.getOutput("", OutputType.js);
  String deferredOutput = collector.getOutput("out_1", OutputType.jsPart);

  Expect.isTrue(mainOutput.contains("other_method_name() {"));
  Expect.isFalse(mainOutput.contains("unique_method_name() {"));
  Expect.isFalse(mainOutput.contains("unique_method_name_closure() {"));
  Expect.isFalse(mainOutput.contains("unique-string"));

  Expect.isFalse(deferredOutput.contains("other_method_name() {"));
  Expect.isTrue(deferredOutput.contains("unique_method_name() {"));
  Expect.isTrue(deferredOutput.contains("unique_method_name_closure() {"));
  Expect.isTrue(deferredOutput.contains("unique-string"));
}

// Make sure that deferred constants are not inlined into the main hunk.
const Map<String, String> sources = const {
  "main.dart": """
    import 'lib.dart' deferred as lib;

    main() async {
      await (lib.loadLibrary)();
      lib.unique_method_name();
      other_method_name();
    }
    other_method_name() { throw "hi"; }""",
  "lib.dart": """
    library deferred;

    unique_method_name() => (() => print("unique-string"))();
    """
};
