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

// Functional test of 'tryInline' annotation from package:meta/dart2js.dart.

import "package:expect/expect.dart";
import "package:async_helper/async_helper.dart";
import 'package:compiler/compiler.dart';
import '../helpers/memory_compiler.dart';

const MEMORY_SOURCE_FILES = const {
  'main.dart': r'''
        import 'package:meta/dart2js.dart';

        monster1(u) {
          print(u + 1000);
          print(u + 1000);
          print(u + 1000);
          print(u + 1000);
          print(u + 1000);
          print(u + 1000);
          print(u + 1000);
          print(u + 1000);
          print(u + 1000);
          print(u + 1000);
        }

        @tryInline
        monster2(u) {
          print(u + 1000);
          print(u + 1000);
          print(u + 1000);
          print(u + 1000);
          print(u + 1000);
          print(u + 1000);
          print(u + 1000);
          print(u + 1000);
          print(u + 1000);
          print(u + 1000);
        }

        main() {
          // large function used twice should not normally be inlined.
          monster1(38000992);
          monster1(38000993);
          monster2(48000992);
          monster2(48000993);
        }'''
};

void main() {
  runTests() async {
    OutputCollector collector = new OutputCollector();
    await runCompiler(
        memorySourceFiles: MEMORY_SOURCE_FILES, outputProvider: collector);
    String jsOutput = collector.getOutput('', OutputType.js);

    void has(String text) {
      Expect.isTrue(jsOutput.contains(text), "output should contain '$text'");
    }

    void hasNot(String text) {
      print(jsOutput);
      Expect.isFalse(
          jsOutput.contains(text), "output must not contain '$text'");
    }

    // Check that (u + 1000) from monster1 is not inlined and constant folded.
    has('38000992');
    has('38000993');
    hasNot('38001992');
    hasNot('38001993');

    // Check that (u + 1000) from monster2 is inlined and constant folded.
    hasNot('48000992');
    hasNot('48000993');
    has('48001992');
    has('48001993');
  }

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