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