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

// 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 'package:compiler/src/util/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 = 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');
  });
}
