// 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_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'], 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.world'], out: 'out.js', readClosedWorld: 'out.world'); await test( ['${Flags.readClosedWorld}=out.world', 'foo.world', '--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'], out: 'out.js', readData: 'foo.dill.data'); await test([Flags.readData, 'foo.dill', '--out=foo.js'], out: 'foo.js', readData: 'foo.dill.data'); await test(['${Flags.readData}=out.data', 'foo.dill'], out: 'out.js', readData: 'out.data'); await test(['${Flags.readData}=out.data', 'foo.dill', '--out=foo.js'], out: 'foo.js', readData: 'out.data'); await test([ Flags.writeCodegen, 'foo.dill', '${Flags.codegenShard}=0', '${Flags.codegenShards}=2' ], exitCode: 1); await test([ Flags.readData, Flags.writeCodegen, 'foo.dill', '${Flags.codegenShard}=0', '${Flags.codegenShards}=2' ], out: 'out', readData: 'foo.dill.data', writeCodegen: 'out.code', codegenShard: 0, codegenShards: 2); await test([ Flags.writeCodegen, Flags.readData, 'foo.dill', '${Flags.codegenShard}=1', '${Flags.codegenShards}=2' ], out: 'out', readData: 'foo.dill.data', writeCodegen: 'out.code', codegenShard: 1, codegenShards: 2); await test([ '${Flags.readData}=foo.data', '${Flags.writeCodegen}=foo.code', 'foo.dill', '${Flags.codegenShard}=0', '${Flags.codegenShards}=3' ], out: 'out', readData: 'foo.data', writeCodegen: 'foo.code', codegenShard: 0, codegenShards: 3); await test([ '${Flags.readData}=foo.data', '${Flags.writeCodegen}', 'foo.dill', '--out=foo.js', '${Flags.codegenShard}=0', '${Flags.codegenShards}=2' ], out: 'foo.js', 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); await test([Flags.readCodegen, 'foo.dill', '${Flags.codegenShards}=2'], out: 'out.js', readData: 'foo.dill.data', readCodegen: 'foo.dill.code', codegenShards: 2); await test([ '${Flags.readCodegen}=foo.code', 'foo.dill', '${Flags.codegenShards}=3' ], out: 'out.js', readData: 'foo.dill.data', readCodegen: 'foo.code', codegenShards: 3); await test([ Flags.readData, Flags.readCodegen, 'foo.dill', '${Flags.codegenShards}=2' ], out: 'out.js', 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', '-v' ], out: 'out.js', readData: 'foo.data', readCodegen: 'foo.code', codegenShards: 3); }); } Future test(List 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.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;