// 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.',
        // TODO(antonm): rename flag.
        'drt': 'Run Dart or JavaScript in the headless version of Chrome,\n'
          'content shell.',
        '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');
  // TODO(antonm): rename the option.
  parser.addOption('drt',     help: 'Path to content shell 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());
}
