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

// @dart = 2.7

// 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_api.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'], out: 'out.js');
    await test(['foo.dart', '-ofoo.js'], out: 'foo.js');
    await test(['foo.dart', '--out=foo.js'], out: 'foo.js');

    await test([Flags.cfeOnly], exitCode: 1);
    await test([Flags.cfeOnly, 'foo.dart'], out: 'out.dill');
    await test([Flags.cfeOnly, 'foo.dart', '--out=out.dill'], out: 'out.dill');
    await test([Flags.cfeOnly, 'foo.dart', Flags.readClosedWorld], exitCode: 1);
    await test(['foo.dart', Flags.readClosedWorld, Flags.cfeOnly], exitCode: 1);
    await test([Flags.cfeOnly, 'foo.dart', Flags.readData], exitCode: 1);
    await test(['foo.dart', Flags.readData, Flags.cfeOnly], exitCode: 1);
    await test([Flags.cfeOnly, 'foo.dart', Flags.readCodegen], exitCode: 1);
    await test(['foo.dart', Flags.readCodegen, Flags.cfeOnly], exitCode: 1);
    await test([Flags.cfeOnly, 'foo.dart', Flags.writeClosedWorld],
        exitCode: 1);
    await test(['foo.dart', Flags.writeClosedWorld, Flags.cfeOnly],
        exitCode: 1);
    await test([Flags.cfeOnly, 'foo.dart', Flags.writeData], exitCode: 1);
    await test(['foo.dart', Flags.writeData, Flags.cfeOnly], exitCode: 1);
    await test([Flags.cfeOnly, 'foo.dart', Flags.writeCodegen], exitCode: 1);
    await test(['foo.dart', Flags.writeCodegen, Flags.cfeOnly], exitCode: 1);

    await test([Flags.writeData, 'foo.dart'],
        out: 'out.dill', writeData: 'out.dill.data');
    await test(['${Flags.writeData}=foo.data', 'foo.dart', '--out=foo.dill'],
        out: 'foo.dill', writeData: 'foo.data');
    await test([Flags.readClosedWorld, Flags.writeClosedWorld, 'foo.dart'],
        exitCode: 1);
    await test([Flags.writeClosedWorld, Flags.readClosedWorld, 'foo.dart'],
        exitCode: 1);
    await test([Flags.readData, Flags.writeData, 'foo.dart'], exitCode: 1);
    await test([Flags.writeData, Flags.readData, 'foo.dart'], exitCode: 1);
    await test([Flags.readCodegen, Flags.writeClosedWorld, 'foo.dart'],
        exitCode: 1);
    await test([Flags.readCodegen, Flags.writeData, 'foo.dart'], exitCode: 1);
    await test([Flags.writeClosedWorld, Flags.readData, 'foo.dart'],
        exitCode: 1);
    await test([Flags.writeClosedWorld, Flags.readCodegen, 'foo.dart'],
        exitCode: 1);
    await test([Flags.writeData, Flags.readCodegen, 'foo.dart'], exitCode: 1);

    await test([
      Flags.writeClosedWorld,
      'foo.dart',
    ], out: 'out.dill', writeClosedWorld: 'out.dill.world');
    await test(
        ['${Flags.writeClosedWorld}=foo.world', 'foo.dart', '--out=foo.dill'],
        out: 'foo.dill', writeClosedWorld: 'foo.world');

    await test([Flags.readClosedWorld, 'foo.dill'],
        out: 'out.js', readClosedWorld: 'foo.dill.world');
    await test([Flags.readClosedWorld, 'foo.dill', '--out=foo.js'],
        out: 'foo.js', readClosedWorld: 'foo.dill.world');
    await test(['${Flags.readClosedWorld}=out.world', 'foo.dill'],
        out: 'out.js', readClosedWorld: 'out.world');
    await test(
        ['${Flags.readClosedWorld}=out.world', 'foo.dill', '--out=foo.js'],
        out: 'foo.js', readClosedWorld: 'out.world');
    await test(
      [Flags.readClosedWorld, Flags.writeData, 'foo.dill'],
      out: 'out.dill',
      readClosedWorld: 'foo.dill.world',
      writeData: 'out.dill.data',
    );
    await test([
      '${Flags.readClosedWorld}=foo.world',
      '${Flags.writeData}=foo.data',
      'foo.dart',
      '--out=foo.dill'
    ], out: 'foo.dill', readClosedWorld: 'foo.world', writeData: 'foo.data');

    await test([Flags.readData, 'foo.dill'], exitCode: 1);
    await test([Flags.readClosedWorld, Flags.readData, 'foo.dill'],
        out: 'out.js',
        readClosedWorld: 'foo.dill.world',
        readData: 'foo.dill.data');
    await test(
        [Flags.readClosedWorld, Flags.readData, 'foo.dill', '--out=foo.js'],
        out: 'foo.js',
        readClosedWorld: 'foo.dill.world',
        readData: 'foo.dill.data');
    await test([
      '${Flags.readClosedWorld}=out.world',
      '${Flags.readData}=out.data',
      'foo.dill'
    ], out: 'out.js', readClosedWorld: 'out.world', readData: 'out.data');
    await test([
      '${Flags.readClosedWorld}=out.world',
      '${Flags.readData}=out.data',
      'foo.dill',
      '--out=foo.js'
    ], out: 'foo.js', readClosedWorld: 'out.world', readData: 'out.data');

    await test([
      Flags.writeCodegen,
      'foo.dill',
      '${Flags.codegenShard}=0',
      '${Flags.codegenShards}=2'
    ], exitCode: 1);
    await test([
      Flags.readClosedWorld,
      Flags.readData,
      Flags.writeCodegen,
      'foo.dill',
      '${Flags.codegenShard}=0',
      '${Flags.codegenShards}=2'
    ],
        out: 'out',
        readClosedWorld: 'foo.dill.world',
        readData: 'foo.dill.data',
        writeCodegen: 'out.code',
        codegenShard: 0,
        codegenShards: 2);
    await test([
      Flags.writeCodegen,
      Flags.readData,
      Flags.readClosedWorld,
      'foo.dill',
      '${Flags.codegenShard}=1',
      '${Flags.codegenShards}=2'
    ],
        out: 'out',
        readClosedWorld: 'foo.dill.world',
        readData: 'foo.dill.data',
        writeCodegen: 'out.code',
        codegenShard: 1,
        codegenShards: 2);
    await test([
      '${Flags.readClosedWorld}=foo.world',
      '${Flags.readData}=foo.data',
      '${Flags.writeCodegen}=foo.code',
      'foo.dill',
      '${Flags.codegenShard}=0',
      '${Flags.codegenShards}=3'
    ],
        out: 'out',
        readClosedWorld: 'foo.world',
        readData: 'foo.data',
        writeCodegen: 'foo.code',
        codegenShard: 0,
        codegenShards: 3);
    await test([
      '${Flags.readData}=foo.data',
      '${Flags.writeCodegen}',
      '${Flags.readClosedWorld}=foo.world',
      'foo.dill',
      '--out=foo.js',
      '${Flags.codegenShard}=0',
      '${Flags.codegenShards}=2'
    ],
        out: 'foo.js',
        readClosedWorld: 'foo.world',
        readData: 'foo.data',
        writeCodegen: 'foo.js.code',
        codegenShard: 0,
        codegenShards: 2);
    await test([Flags.writeCodegen, 'foo.dill', Flags.readCodegen],
        exitCode: 1);
    await test([Flags.readCodegen, Flags.writeCodegen, 'foo.dill'],
        exitCode: 1);
    await test(
        [Flags.readData, Flags.writeCodegen, 'foo.dill', Flags.readCodegen],
        exitCode: 1);
    await test(
        [Flags.readCodegen, Flags.readData, Flags.writeCodegen, 'foo.dill'],
        exitCode: 1);
    await test([
      Flags.readData,
      Flags.writeCodegen,
      'foo.dill',
    ], exitCode: 1);
    await test([
      Flags.readData,
      Flags.writeCodegen,
      'foo.dill',
      '${Flags.codegenShard}=0'
    ], exitCode: 1);
    await test([
      Flags.readData,
      Flags.writeCodegen,
      'foo.dill',
      '${Flags.codegenShards}=2'
    ], exitCode: 1);
    await test([
      Flags.readData,
      Flags.writeCodegen,
      'foo.dill',
      '${Flags.codegenShards}=0'
    ], exitCode: 1);
    await test([
      Flags.readData,
      Flags.writeCodegen,
      'foo.dill',
      '${Flags.codegenShard}=-1',
      '${Flags.codegenShards}=2'
    ], exitCode: 1);
    await test([
      Flags.readData,
      Flags.writeCodegen,
      'foo.dill',
      '${Flags.codegenShard}=2',
      '${Flags.codegenShards}=2'
    ], exitCode: 1);

    // These three flags should parse in any order, but all are required.
    await test([
      Flags.readClosedWorld,
      Flags.readData,
      Flags.readCodegen,
      'foo.dill',
      '${Flags.codegenShards}=2'
    ],
        out: 'out.js',
        readClosedWorld: 'foo.dill.world',
        readData: 'foo.dill.data',
        readCodegen: 'foo.dill.code',
        codegenShards: 2);
    await test([
      Flags.readClosedWorld,
      Flags.readCodegen,
      Flags.readData,
      'foo.dill',
      '${Flags.codegenShards}=2'
    ],
        out: 'out.js',
        readClosedWorld: 'foo.dill.world',
        readData: 'foo.dill.data',
        readCodegen: 'foo.dill.code',
        codegenShards: 2);
    await test([
      Flags.readCodegen,
      Flags.readClosedWorld,
      Flags.readData,
      'foo.dill',
      '${Flags.codegenShards}=2'
    ],
        out: 'out.js',
        readClosedWorld: 'foo.dill.world',
        readData: 'foo.dill.data',
        readCodegen: 'foo.dill.code',
        codegenShards: 2);
    await test([
      Flags.readCodegen,
      Flags.readData,
      Flags.readClosedWorld,
      'foo.dill',
      '${Flags.codegenShards}=2'
    ],
        out: 'out.js',
        readClosedWorld: 'foo.dill.world',
        readData: 'foo.dill.data',
        readCodegen: 'foo.dill.code',
        codegenShards: 2);
    await test([
      Flags.readData,
      Flags.readCodegen,
      Flags.readClosedWorld,
      'foo.dill',
      '${Flags.codegenShards}=2'
    ],
        out: 'out.js',
        readClosedWorld: 'foo.dill.world',
        readData: 'foo.dill.data',
        readCodegen: 'foo.dill.code',
        codegenShards: 2);
    await test([
      Flags.readData,
      Flags.readClosedWorld,
      Flags.readCodegen,
      'foo.dill',
      '${Flags.codegenShards}=2'
    ],
        out: 'out.js',
        readClosedWorld: 'foo.dill.world',
        readData: 'foo.dill.data',
        readCodegen: 'foo.dill.code',
        codegenShards: 2);
    await test([
      Flags.readClosedWorld,
      Flags.readCodegen,
      'foo.dill',
      '${Flags.codegenShards}=2'
    ], exitCode: 1);
    await test([
      Flags.readData,
      Flags.readCodegen,
      'foo.dill',
      '${Flags.codegenShards}=2'
    ], exitCode: 1);

    await test([
      Flags.readData,
      Flags.readClosedWorld,
      Flags.readCodegen,
      'foo.dill',
      '${Flags.codegenShards}=2'
    ],
        out: 'out.js',
        readClosedWorld: 'foo.dill.world',
        readData: 'foo.dill.data',
        readCodegen: 'foo.dill.code',
        codegenShards: 2);
    await test([
      '${Flags.readCodegen}=foo.code',
      'foo.dill',
      '${Flags.codegenShards}=3',
      Flags.readData,
      Flags.readClosedWorld,
    ],
        out: 'out.js',
        readData: 'foo.dill.data',
        readClosedWorld: 'foo.dill.world',
        readCodegen: 'foo.code',
        codegenShards: 3);

    await test([
      Flags.readData,
      Flags.readCodegen,
      Flags.readClosedWorld,
      'foo.dill',
      '${Flags.codegenShards}=2'
    ],
        out: 'out.js',
        readClosedWorld: 'foo.dill.world',
        readData: 'foo.dill.data',
        readCodegen: 'foo.dill.code',
        codegenShards: 2);
    await test([
      '${Flags.readData}=foo.data',
      '${Flags.readCodegen}=foo.code',
      'foo.dill',
      '${Flags.codegenShards}=3',
      '${Flags.readClosedWorld}=foo.world',
      '-v'
    ],
        out: 'out.js',
        readClosedWorld: 'foo.world',
        readData: 'foo.data',
        readCodegen: 'foo.code',
        codegenShards: 3);
  });
}

Future test(List<String> arguments,
    {int exitCode,
    String out,
    String readClosedWorld,
    String writeClosedWorld,
    String readData,
    String writeData,
    String readCodegen,
    String writeCodegen,
    int codegenShard,
    int codegenShards}) 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(toUri(out), options.outputUri, "Unexpected output uri.");
    Expect.equals(toUri(readClosedWorld), options.readClosedWorldUri,
        "Unexpected readClosedWorld uri");
    Expect.equals(toUri(writeClosedWorld), options.writeClosedWorldUri,
        "Unexpected writeClosedWorld uri");
    Expect.equals(
        toUri(readData), options.readDataUri, "Unexpected readData uri");
    Expect.equals(
        toUri(writeData), options.writeDataUri, "Unexpected writeData uri");
    Expect.equals(toUri(readCodegen), options.readCodegenUri,
        "Unexpected readCodegen uri");
    Expect.equals(toUri(writeCodegen), options.writeCodegenUri,
        "Unexpected writeCodegen uri");
    Expect.equals(
        codegenShard, options.codegenShard, "Unexpected codegenShard uri");
    Expect.equals(
        codegenShards, options.codegenShards, "Unexpected codegenShards uri");
  }

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

Uri toUri(String path) => path != null ? Uri.base.resolve(path) : null;
