// Copyright 2020 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

import 'package:args/args.dart';
import 'package:fxutils/fxutils.dart';

/// Test-friendly wrapper so unit tests can use `fxTestArgParser` without
/// having its environment-aware print statements blow up.
String getFriendlyBuildDir() {
  var buildDir = '//out/default';
  try {
    buildDir = FxEnv(
      envReader: EnvReader.fromEnvironment(),
    ).userFriendlyOutputDir;

    // ignore: avoid_catching_errors
  } on RangeError {
    // pass
  }
  return buildDir;
}

final ArgParser fxTestArgParser = ArgParser()
  ..addFlag('help', abbr: 'h', defaultsTo: false, negatable: false)
  ..addFlag('host',
      defaultsTo: false,
      negatable: false,
      help: 'If true, only runs host tests. The opposite of `--device`')
  ..addFlag('device',
      abbr: 'd',
      defaultsTo: false,
      negatable: false,
      help: 'If true, only runs device tests. The opposite of `--host`')
  ..addMultiOption('package',
      abbr: 'p',
      help: 'Matches tests against their Fuchsia package Name',
      splitCommas: false)
  ..addMultiOption('component',
      abbr: 'c',
      help: '''Matches tests against their Fuchsia component Name. When
--package is also specified, results are filtered both by package
and component.''',
      splitCommas: false)
  ..addMultiOption('and',
      abbr: 'a',
      help: '''When present, adds additional requirements to the preceding
`testName` filter''')
  ..addFlag('printtests',
      defaultsTo: false,
      negatable: false,
      help: 'If true, prints the contents of '
          '`${getFriendlyBuildDir()}/tests.json`')
  ..addFlag('build',
      defaultsTo: true,
      negatable: true,
      help: 'If true, invokes `fx build` before running the test suite')
  ..addFlag('restrict-logs',
      defaultsTo: true,
      negatable: true,
      help: 'If true, passes a flag of the same name to the component test '
          'runner')
  ..addFlag('updateifinbase',
      defaultsTo: true,
      negatable: true,
      help:
          'If true, invokes `fx update-if-in-base` before running device tests')
  ..addFlag('use-package-hash',
      defaultsTo: true,
      negatable: true,
      help:
          'If true, uses the package Merkle root hash from the build artifacts '
          'when executing device tests')
  ..addFlag('info',
      defaultsTo: false,
      negatable: false,
      help: 'If true, prints the test specification in key:value format, '
          'and exits')
  ..addFlag('random',
      abbr: 'r',
      defaultsTo: false,
      negatable: false,
      help: 'If true, randomizes test execution order')
  ..addOption('fuzzy',
      defaultsTo: '3',
      help: 'The Levenshtein distance threshold to use '
          'when generating suggestions')
  ..addFlag('dry',
      defaultsTo: false,
      negatable: false,
      help: 'If true, does not invoke any tests')
  ..addFlag('fail',
      abbr: 'f',
      defaultsTo: false,
      negatable: false,
      help: 'If true, halts test suite execution on the first failed test')
  ..addFlag('log',
      defaultsTo: false,
      negatable: true,
      help: '''If true, emits all output from all tests to a file. Turned on
when running real tests unless `--no-log` is passed.''')
  ..addOption('logpath',
      defaultsTo: null,
      help: '''If passed and if --no-log is not passed, customizes the
destination of the log artifact.

Defaults to a timestamped file at the root of ${getFriendlyBuildDir()}.''')
  ..addOption('limit',
      defaultsTo: null,
      help: 'If passed, ends test suite execution after N tests')
  ..addOption('slow',
      defaultsTo: '2',
      abbr: 's',
      help: '''When set to a non-zero value, triggers output for any test that
takes longer than N seconds to execute.

Note: This has no impact if the -o flag is also set.
Note: The -s flag used to be an abbreviation for --simple.''')
  ..addOption('realm',
      abbr: 'R',
      defaultsTo: null,
      help: '''If passed, runs the tests in a named realm instead of a
randomized one.''')
  ..addOption('min-severity-logs',
      help: '''Filters log output to only messages with this for device tests.
Valid severities: TRACE, DEBUG, INFO, WARN, ERROR, FATAL.''')
  ..addFlag('exact',
      defaultsTo: false,
      help: 'If true, does not perform any fuzzy-matching on tests')
  ..addFlag('e2e',
      defaultsTo: false,
      help: 'If true, allows the execution of host tests that require a '
          'connected device or emulator, such as end-to-end tests.')
  ..addFlag('only-e2e',
      defaultsTo: false,
      help: 'If true, skips all non-e2e tests. The `--e2e` flag is redundant '
          'when passing this flag.')
  ..addFlag('skipped',
      defaultsTo: false,
      negatable: false,
      help: '''If true, prints a debug statement about each skipped test.

Note: The old `-s` abbreviation now applies to `--simple`.''')
  ..addFlag('simple',
      defaultsTo: false,
      negatable: false,
      help: 'If true, removes any color or decoration from output')
  ..addFlag('output',
      abbr: 'o',
      defaultsTo: false,
      negatable: false,
      help: 'If true, also displays the output from passing tests')
  ..addFlag('silenceunsupported',
      abbr: 'u',
      defaultsTo: false,
      negatable: false,
      help: '''If true, will reduce unsupported tests to a warning and continue
executing. This is dangerous outside of the local development
cycle, as "unsupported" tests are likely a problem with this
command and not the tests.''')
  ..addOption('test-filter',
      defaultsTo: null, help: '''Runs specific test cases in v2 suite. Run
'fx shell run-test-suite --help' for more info about this flag.''')
  ..addOption('count',
      defaultsTo: null, help: '''Number of times to run the test. Run
'fx shell run-test-suite --help' for more info about this flag.''')
  ..addFlag('also-run-disabled-tests',
      defaultsTo: false,
      help:
          '''Whether to also run tests that have been marked disabled/ignored by
the test author. Run 'fx shell run-test-suite --help' for more info about this
flag.''')
  ..addOption('timeout',
      defaultsTo: '0',
      help: '''Test timeout in seconds. Run 'fx shell run-test-suite --help' or
'fx shell run-test-component --help' for more info about this flag.''')
  ..addFlag('verbose', abbr: 'v', defaultsTo: false, negatable: false);
