// 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.dart';
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('', OutputType.js);
  Expect.isNotNull(jsOutput);
  if (mapping != null) {
    find(jsOutput, '//# sourceMappingURL=$mapping', true);
  } else {
    find(jsOutput, '//# sourceMappingURL=', false);
  }
  String jsSourceMapOutput = collector.getOutput('', 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');
  });
}
