// Copyright (c) 2016, 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 the command line options of dart2js.

import 'dart:async';

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

import 'package:compiler/compiler_new.dart' as api;
import 'package:compiler/src/commandline_options.dart';
import 'package:compiler/src/dart2js.dart' as entry;
import 'package:compiler/src/options.dart' show CompilerOptions;

main() {
  entry.enableWriteString = false;
  asyncTest(() async {
    await test([], exitCode: 1);
    await test(['foo.dart']);
    await test([Flags.useKernel], exitCode: 1);
    await test([Flags.useKernel, 'foo.dart']);
    await test([Flags.resolveOnly, 'foo.dart'],
        resolveOnly: true, resolutionOutput: Uri.base.resolve('out.data'));
    await test(['--resolution-input=bar.dart', 'foo.dart'],
        resolutionInputs: [Uri.base.resolve('bar.dart')]);
    await test([Flags.resolveOnly, '--resolution-input=bar.dart', 'foo.dart'],
        resolveOnly: true,
        resolutionOutput: Uri.base.resolve('out.data'),
        resolutionInputs: [Uri.base.resolve('bar.dart')]);
    await test([Flags.resolveOnly, '--resolution-input=out.data', 'foo.dart'],
        exitCode: 1);
  });
}

Future test(List<String> arguments,
    {int exitCode,
    bool resolveOnly: false,
    Uri resolutionOutput,
    List<Uri> resolutionInputs}) async {
  print('--------------------------------------------------------------------');
  print('dart2js ${arguments.join(' ')}');
  print('--------------------------------------------------------------------');
  entry.CompileFunc oldCompileFunc = entry.compileFunc;
  entry.ExitFunc oldExitFunc = entry.exitFunc;

  CompilerOptions options;
  int actualExitCode;
  entry.compileFunc = (_options, input, diagnostics, output) {
    options = _options;
    return new Future<api.CompilationResult>.value(
        new api.CompilationResult(null));
  };
  entry.exitFunc = (_exitCode) {
    actualExitCode = _exitCode;
    throw 'exited';
  };
  try {
    await entry.compilerMain(arguments);
  } catch (e, s) {
    Expect.equals('exited', e, "Unexpected exception: $e\n$s");
  }
  Expect.equals(exitCode, actualExitCode, "Unexpected exit code");
  if (actualExitCode == null) {
    Expect.isNotNull(options, "Missing options object");
    Expect.equals(
        resolveOnly, options.resolveOnly, "Unexpected resolveOnly value");
    Expect.equals(resolutionOutput, options.resolutionOutput,
        "Unexpected resolutionOutput value");
    if (resolutionInputs == null) {
      Expect.isNull(
          options.resolutionInputs, "Unexpected resolutionInputs value");
    } else {
      Expect.listEquals(resolutionInputs, options.resolutionInputs,
          "Unexpected resolutionInputs value");
    }
  }

  entry.compileFunc = oldCompileFunc;
  entry.exitFunc = oldExitFunc;
}
