// Copyright (c) 2017, 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.

import 'dart:async';
import 'package:async_helper/async_helper.dart';
import 'package:compiler/compiler_new.dart';
import 'package:compiler/src/commandline_options.dart';
import 'package:expect/expect.dart';
import '../memory_compiler.dart';

main() {
  asyncTest(() async {
    String oldMap = (await compile([])).getOutput('', OutputType.sourceMap);
    String newMap = (await compile([Flags.useNewSourceInfo]))
        .getOutput('', OutputType.sourceMap);
    OutputCollector multiCollector1 = await compile([Flags.useMultiSourceInfo]);
    String multiMap1a = multiCollector1.getOutput('', OutputType.sourceMap);
    String multiMap1b =
        multiCollector1.getOutput('out.js', OutputType.sourceMap);
    Expect.equals(oldMap, multiMap1a);
    Expect.equals(newMap, multiMap1b);
    OutputCollector multiCollector2 =
        await compile([Flags.useMultiSourceInfo, Flags.useNewSourceInfo]);
    String multiMap2a = multiCollector2.getOutput('', OutputType.sourceMap);
    String multiMap2b =
        multiCollector2.getOutput('out.js', OutputType.sourceMap);
    Expect.equals(newMap, multiMap2a);
    Expect.equals(oldMap, multiMap2b);
  });
}

Future<OutputCollector> compile(List<String> options) async {
  OutputCollector collector = new OutputCollector();
  await runCompiler(
      entryPoint: Uri.parse('memory:main.dart'),
      memorySourceFiles: const {'main.dart': 'main() {}'},
      outputProvider: collector,
      options: options);
  return collector;
}
