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

import 'dart:io';

import 'package:args/args.dart';

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

  parser.addSeparator('===== Platform');

  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'
            '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.addSeparator('===== Runtime');

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

  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('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('valgrind',
      defaultsTo: false, help: 'Run tests through valgrind');

  parser.addSeparator('===== Output');

  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.addFlag('verbose',
      abbr: 'v', defaultsTo: false, help: 'Verbose output');

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

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

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

  parser.addSeparator('===== Miscellaneous');

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

  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.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.addOption('mandatory', help: 'A mandatory option', mandatory: true);

  print(parser.usage);
}
