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

/**
 * This is an example of converting the args in test.dart to use this API.
 * It shows what it looks like to build an [ArgParser] and then, when the code
 * is run, demonstrates what the generated usage text looks like.
 */
library example;

import 'dart:io';

import 'package:args/args.dart';

main() {
  var parser = new ArgParser();

  parser.addOption('mode', abbr: 'm', defaultsTo: 'debug',
      help: 'Mode in which to run the tests',
      allowed: ['all', 'debug', 'release']);

  parser.addOption('compiler', abbr: 'c', defaultsTo: 'none',
      help: 'Specify any compilation step (if needed).',
      allowed: ['none', 'dart2js', 'dartc'],
      allowedHelp: {
        'none': 'Do not compile the Dart code (run native Dart code on the'
          ' VM).\n(only valid with the following runtimes: vm, drt)',
        'dart2js': 'Compile dart code to JavaScript by running dart2js.\n'
          '(only valid with the following runtimes: d8, drt, chrome\n'
          'safari, ie, firefox, opera, none (compile only))',
        'dartc': 'Perform static analysis on Dart code by running dartc.\n'
          '(only valid with the following runtimes: none)',
      });

  parser.addOption('runtime', abbr: 'r', defaultsTo: 'vm',
      help: 'Where the tests should be run.',
      allowed: ['vm', 'd8', 'drt', 'dartium', 'ff', 'firefox', 'chrome',
              'safari', 'ie', 'opera', 'none'],
      allowedHelp: {
        'vm': 'Run Dart code on the standalone dart vm.',
        'd8': 'Run JavaScript from the command line using v8.',
        'drt': 'Run Dart or JavaScript in the headless version of Chrome,\n'
          'DumpRenderTree.',
        'dartium': 'Run Dart or JavaScript in Dartium.',
        'ff': 'Run JavaScript in Firefox',
        'chrome': 'Run JavaScript in Chrome',
        'safari': 'Run JavaScript in Safari',
        'ie': 'Run JavaScript in Internet Explorer',
        'opera': 'Run JavaScript in Opera',
        'none': 'No runtime, compile only (for example, used for dartc static\n'
          'analysis tests).',
      });

  parser.addOption('arch', abbr: 'a', defaultsTo: 'ia32',
      help: 'The architecture to run tests for',
      allowed: ['all', 'ia32', 'x64', 'simarm']);

  parser.addOption('system', abbr: 's', defaultsTo: Platform.operatingSystem,
      help: 'The operating system to run tests on',
      allowed: ['linux', 'macos', 'windows']);

  parser.addFlag('checked', defaultsTo: false,
      help: 'Run tests in checked mode');

  parser.addFlag('host-checked', defaultsTo: false,
      help: 'Run compiler in checked mode');

  parser.addOption('timeout', abbr: 't',
      help: 'Timeout in seconds');

  parser.addOption('progress', abbr: 'p', defaultsTo: 'compact',
      help: 'Progress indication mode',
      allowed: ['compact', 'color', 'line', 'verbose', 'silent', 'status',
                'buildbot']);

  parser.addFlag('report', defaultsTo: false,
      help: 'Print a summary report of the number of tests, by expectation');

  parser.addOption('tasks', abbr: 'j',
      defaultsTo: Platform.numberOfProcessors.toString(),
      help: 'The number of parallel tasks to run');

  parser.addOption('shards', defaultsTo: '1',
      help: 'The number of instances that the tests will be sharded over');

  parser.addOption('shard', defaultsTo: '1',
      help: 'The index of this instance when running in sharded mode');

  parser.addFlag('verbose', abbr: 'v', defaultsTo: false,
      help: 'Verbose output');

  parser.addFlag('list', defaultsTo: false,
      help: 'List tests only, do not run them');

  parser.addFlag('keep-generated-tests', defaultsTo: false,
      help: 'Keep the generated files in the temporary directory');

  parser.addFlag('valgrind', defaultsTo: false,
      help: 'Run tests through valgrind');

  parser.addOption('special-command',
      help: """
Special command support. Wraps the command line in
a special command. The special command should contain
an '@' character which will be replaced by the normal
command.

For example if the normal command that will be executed
is 'dart file.dart' and you specify special command
'python -u valgrind.py @ suffix' the final command will be
'python -u valgrind.py dart file.dart suffix'""");

  parser.addFlag('time',
      help: 'Print timing information after running tests',
      defaultsTo: false);

  parser.addOption('dart',    help: 'Path to dart executable');
  parser.addOption('drt',     help: 'Path to DumpRenderTree executable');
  parser.addOption('dartium', help: 'Path to Dartium Chrome executable');

  parser.addFlag('batch', abbr: 'b',
      help: 'Run browser tests in batch mode',
      defaultsTo: true);

  print(parser.getUsage());
}
