// Copyright (c) 2018, 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';
import 'package:async_helper/async_helper.dart';
import 'package:compiler/src/compiler.dart';
import 'package:compiler/src/elements/entities.dart';
import 'package:compiler/src/world.dart' show JClosedWorld;
import '../helpers/memory_compiler.dart';

const Map<String, String> MEMORY_SOURCE_FILES = const {
  'main.dart': r"""
int method(String arg) => arg.length;

@pragma('dart2js:noInline')
int methodNoInline(String arg) => arg.length;

@pragma('dart2js:tryInline')
int methodTryInline(String arg) {
  return arg.length;
}

void main(List<String> args) {
  print(method(args[0]));
  print(method('bar'));
  print(methodNoInline(args[0]));
  print(methodNoInline('bar'));
  print(methodTryInline(args[0]));
  print(methodTryInline('bar'));
}
"""
};

main() {
  asyncTest(() async {
    await runTest();
  });
}

runTest() async {
  CompilationResult result =
      await runCompiler(memorySourceFiles: MEMORY_SOURCE_FILES);
  Compiler compiler = result.compiler;
  JClosedWorld closedWorld = compiler.backendClosedWorldForTesting;
  Expect.isFalse(compiler.compilationFailed, 'Unsuccessful compilation');

  void test(String name,
      {bool expectNoInline: false, bool expectTryInline: false}) {
    LibraryEntity mainApp = closedWorld.elementEnvironment.mainLibrary;
    FunctionEntity method =
        closedWorld.elementEnvironment.lookupLibraryMember(mainApp, name);
    Expect.isNotNull(method, "Cannot find method '$name'");
    Expect.equals(
        expectNoInline,
        closedWorld.annotationsData.nonInlinableFunctions.contains(method),
        "Unexpected annotation of 'noInline' on '$method'.");
    Expect.equals(
        expectTryInline,
        closedWorld.annotationsData.tryInlineFunctions.contains(method),
        "Unexpected annotation of 'tryInline' on '$method'.");
  }

  test('method');
  test('methodNoInline', expectNoInline: true);
  test('methodTryInline', expectTryInline: true);
}
