// Copyright (c) 2014, 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 that options '--source-map' and '--out' correctly adds
// `sourceMappingURL` and "file" attributes to source file and source map file.

library test.source_map;

import 'package:async_helper/async_helper.dart';
import 'package:compiler/compiler_api.dart' as api;
import 'package:expect/expect.dart';
import '../helpers/memory_compiler.dart';

const SOURCE = const {
  '/main.dart': """
main() {}
""",
};

void find(String text, String substring, bool expected) {
  bool found = text.contains(substring);

  if (expected && !found) {
    Expect.isTrue(found, 'Expected "$substring" in:\n$text');
  }
  if (!expected && found) {
    Expect.isFalse(
        found,
        'Unexpected "$substring" in:\n'
        '${text.substring(text.indexOf(substring))}');
  }
}

test({String out, String sourceMap, String mapping, String file}) async {
  OutputCollector collector = new OutputCollector();
  List<String> options = <String>[];
  if (out != null) {
    options.add("--out=$out");
  }
  if (sourceMap != null) {
    options.add("--source-map=$sourceMap");
  }

  await runCompiler(
      entryPoint: Uri.parse('memory:/main.dart'),
      memorySourceFiles: SOURCE,
      showDiagnostics: true,
      outputProvider: collector,
      options: options);
  String jsOutput = collector.getOutput('', api.OutputType.js);
  Expect.isNotNull(jsOutput);
  if (mapping != null) {
    find(jsOutput, '//# sourceMappingURL=$mapping', true);
  } else {
    find(jsOutput, '//# sourceMappingURL=', false);
  }
  String jsSourceMapOutput = collector.getOutput('', api.OutputType.sourceMap);
  Expect.isNotNull(jsSourceMapOutput);
  if (file != null) {
    find(jsSourceMapOutput, '"file": "$file"', true);
  } else {
    find(jsSourceMapOutput, '"file": ', false);
  }
}

void main() {
  asyncTest(() async {
    await test();
    await test(sourceMap: 'file:/out.js.map');
    await test(out: 'file:/out.js');
    await test(
        out: 'file:/out.js',
        sourceMap: 'file:/out.js.map',
        file: 'out.js',
        mapping: 'out.js.map');
    await test(
        out: 'file:/dir/out.js',
        sourceMap: 'file:/dir/out.js.map',
        file: 'out.js',
        mapping: 'out.js.map');
  });
}
