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

/**
 * Tool for running co19 tests. Used when updating co19.
 *
 * Currently, this tool is merely a convenience around multiple
 * invocations of test.dart. Long term, we hope to evolve this into a
 * script that can automate most of the tasks necessary when updating
 * co19.
 *
 * Usage:
 * [: ./tools/testing/bin/$OS/dart tools/testing/dart/co19_test.dart :]
 */

library co19_test;

import "dart:io";

import "test_options.dart";
import "test_progress.dart";
import "test_runner.dart";
import "test_suite.dart";
import "utils.dart" show Path;
import "../../test.dart" as test_dart;

import "../../../tests/co19/test_config.dart";

const List<String> COMMON_ARGUMENTS =
    const <String>['--report', '--progress=diff', 'co19'];

const List<List<String>> COMMAND_LINES = const <List<String>>[
    const <String>['-mrelease,debug', '-rvm', '-cnone'],
    const <String>['-mrelease,debug', '-rvm', '-cnone', '--checked'],
    const <String>['-mrelease', '-rnone', '-cdartanalyzer'],
    const <String>['-mrelease', '-rnone', '-cdart2analyzer'],
    const <String>['-mrelease', '-rvm', '-cdart2dart', '--use-sdk'],
    const <String>['-mrelease', '-rd8', '-cdart2js', '--use-sdk'],
    const <String>['-mrelease', '-rd8,jsshell', '-cdart2js', '--use-sdk',
                   '--minified'],
    const <String>['-mrelease', '-rd8,jsshell', '-cdart2js', '--use-sdk',
                   '--checked'],
];

void main() {
  Options options = new Options();
  File scriptFile = new File(options.script);
  Path scriptPath =
      new Path(scriptFile.fullPathSync())
      .directoryPath.directoryPath.directoryPath.append('test.dart');
  TestUtils.testScriptPath = scriptPath.toNativePath();
  var optionsParser = new TestOptionsParser();
  List<Map> configurations = <Map>[];
  for (var commandLine in COMMAND_LINES) {
    List arguments = <String>[];
    arguments.addAll(COMMON_ARGUMENTS);
    arguments.addAll(options.arguments);
    arguments.addAll(commandLine);
    configurations.addAll(optionsParser.parse(arguments));
  }

  if (configurations != null || configurations.length > 0) {
    test_dart.testConfigurations(configurations);
  }
}

