// 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.

// Test that we can compile from dill and run the generated code with d8.
library dart2js.kernel.run_from_dill_test;

import 'dart:async';
import 'dart:io';

import 'package:async_helper/async_helper.dart';
import 'package:expect/expect.dart';
import 'package:compiler/src/commandline_options.dart';
import 'package:compiler/src/dart2js.dart' as dart2js;
import 'package:compiler/src/filenames.dart';
import 'package:sourcemap_testing/src/stacktrace_helper.dart';

import 'compiler_helper.dart';
import '../serialization/helper.dart';

const SOURCE = const {
  'main.dart': '''
main() {
  for (int i = 0; i < 10; i++) {
    if (i == 5) continue;
    print('Hello World: \$i!');
    if (i == 7) break;
  }
}
'''
};

const OUTPUT = '''
Hello World: 0!
Hello World: 1!
Hello World: 2!
Hello World: 3!
Hello World: 4!
Hello World: 6!
Hello World: 7!
''';

main(List<String> args) {
  asyncTest(() async {
    await mainInternal(args);
  });
}

enum ResultKind { crashes, errors, warnings, success, failure }

Future<ResultKind> mainInternal(List<String> args,
    {bool skipWarnings: false, bool skipErrors: false}) async {
  Arguments arguments = new Arguments.from(args);
  Uri entryPoint;
  Map<String, String> memorySourceFiles;
  if (arguments.uri != null) {
    entryPoint = arguments.uri;
    memorySourceFiles = const <String, String>{};
  } else {
    entryPoint = Uri.parse('memory:main.dart');
    memorySourceFiles = SOURCE;
  }

  Uri dillFile =
      await generateDill(entryPoint, memorySourceFiles, printSteps: true);
  String output = uriPathToNative(dillFile.resolve('out.js').path);
  List<String> dart2jsArgs = [
    dillFile.toString(),
    '-o$output',
    Flags.useKernel,
    Flags.disableTypeInference,
    Flags.disableInlining,
    Flags.enableAssertMessage
  ];
  print('Running: dart2js ${dart2jsArgs.join(' ')}');

  await dart2js.internalMain(dart2jsArgs);

  print('---- run from dill --------------------------------------------');
  ProcessResult runResult = Process.runSync(d8executable,
      ['sdk/lib/_internal/js_runtime/lib/preambles/d8.js', output]);
  String out = '${runResult.stderr}\n${runResult.stdout}';
  print('d8 output:');
  print(out);
  Expect.equals(0, runResult.exitCode);
  Expect.equals(OUTPUT, runResult.stdout.replaceAll('\r\n', '\n'));

  return ResultKind.success;
}
