// 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');
  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.usage);
}
