| // Copyright (c) 2013, 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. |
| |
| import 'package:args/args.dart'; |
| import 'package:args/command_runner.dart'; |
| import 'package:test/test.dart'; |
| |
| class CommandRunnerWithFooter extends CommandRunner { |
| @override |
| String get usageFooter => 'Also, footer!'; |
| |
| CommandRunnerWithFooter(super.executableName, super.description); |
| } |
| |
| class CommandRunnerWithFooterAndWrapping extends CommandRunner { |
| @override |
| String get usageFooter => 'LONG footer! ' |
| 'This is a long footer, so we can check wrapping on long footer messages.' |
| '\n\n' |
| 'And make sure that they preserve newlines properly.'; |
| |
| @override |
| ArgParser get argParser => _argParser; |
| final _argParser = ArgParser(usageLineLength: 40); |
| |
| CommandRunnerWithFooterAndWrapping(super.executableName, super.description); |
| } |
| |
| class FooCommand extends Command { |
| bool hasRun = false; |
| |
| @override |
| final name = 'foo'; |
| |
| @override |
| final description = 'Set a value.'; |
| |
| @override |
| final takesArguments = false; |
| |
| @override |
| void run() { |
| hasRun = true; |
| } |
| } |
| |
| class ValueCommand extends Command<int> { |
| @override |
| final name = 'foo'; |
| |
| @override |
| final description = 'Return a value.'; |
| |
| @override |
| final takesArguments = false; |
| |
| @override |
| int run() => 12; |
| } |
| |
| class AsyncValueCommand extends Command<String> { |
| @override |
| final name = 'foo'; |
| |
| @override |
| final description = 'Return a future.'; |
| |
| @override |
| final takesArguments = false; |
| |
| @override |
| Future<String> run() async => 'hi'; |
| } |
| |
| class Category1Command extends Command { |
| bool hasRun = false; |
| |
| @override |
| final name = 'bar'; |
| |
| @override |
| final description = 'Print a value.'; |
| |
| @override |
| final category = 'Printers'; |
| |
| @override |
| final takesArguments = false; |
| |
| @override |
| void run() { |
| hasRun = true; |
| } |
| } |
| |
| class Category2Command extends Command { |
| bool hasRun = false; |
| |
| @override |
| final name = 'baz'; |
| |
| @override |
| final description = 'Display a value.'; |
| |
| @override |
| final category = 'Displayers'; |
| |
| @override |
| final takesArguments = false; |
| |
| @override |
| void run() { |
| hasRun = true; |
| } |
| } |
| |
| class Category2Command2 extends Command { |
| bool hasRun = false; |
| |
| @override |
| final name = 'baz2'; |
| |
| @override |
| final description = 'Display another value.'; |
| |
| @override |
| final category = 'Displayers'; |
| |
| @override |
| final takesArguments = false; |
| |
| @override |
| void run() { |
| hasRun = true; |
| } |
| } |
| |
| class MultilineCommand extends Command { |
| bool hasRun = false; |
| |
| @override |
| final name = 'multiline'; |
| |
| @override |
| final description = 'Multi\nline.'; |
| |
| @override |
| final takesArguments = false; |
| |
| @override |
| void run() { |
| hasRun = true; |
| } |
| } |
| |
| class WrappingCommand extends Command { |
| bool hasRun = false; |
| |
| @override |
| ArgParser get argParser => _argParser; |
| final _argParser = ArgParser(usageLineLength: 40); |
| |
| @override |
| final name = 'wrapping'; |
| |
| @override |
| final description = |
| 'This command overrides the argParser so that it will wrap long lines.'; |
| |
| @override |
| final takesArguments = false; |
| |
| @override |
| void run() { |
| hasRun = true; |
| } |
| } |
| |
| class LongCommand extends Command { |
| bool hasRun = false; |
| |
| @override |
| ArgParser get argParser => _argParser; |
| final _argParser = ArgParser(usageLineLength: 40); |
| |
| @override |
| final name = 'long'; |
| |
| @override |
| final description = |
| 'This command has a long description that needs to be wrapped ' |
| 'sometimes.\nIt has embedded newlines,\n' |
| ' and indented lines that also need to be wrapped and have their ' |
| 'indentation preserved.\n${'0123456789' * 10}'; |
| |
| @override |
| final takesArguments = false; |
| |
| @override |
| void run() { |
| hasRun = true; |
| } |
| } |
| |
| class MultilineSummaryCommand extends MultilineCommand { |
| @override |
| String get summary => description; |
| } |
| |
| class HiddenCommand extends Command { |
| bool hasRun = false; |
| |
| @override |
| final name = 'hidden'; |
| |
| @override |
| final description = 'Set a value.'; |
| |
| @override |
| final hidden = true; |
| |
| @override |
| final takesArguments = false; |
| |
| @override |
| void run() { |
| hasRun = true; |
| } |
| } |
| |
| class HiddenCategorizedCommand extends Command { |
| bool hasRun = false; |
| |
| @override |
| final name = 'hiddencategorized'; |
| |
| @override |
| final description = 'Set a value.'; |
| |
| @override |
| final category = 'Some category'; |
| |
| @override |
| final hidden = true; |
| |
| @override |
| final takesArguments = false; |
| |
| @override |
| void run() { |
| hasRun = true; |
| } |
| } |
| |
| class AliasedCommand extends Command { |
| bool hasRun = false; |
| |
| @override |
| final name = 'aliased'; |
| |
| @override |
| final description = 'Set a value.'; |
| |
| @override |
| final takesArguments = false; |
| |
| @override |
| final aliases = const ['alias', 'als']; |
| |
| @override |
| void run() { |
| hasRun = true; |
| } |
| } |
| |
| class AsyncCommand extends Command { |
| bool hasRun = false; |
| |
| @override |
| final name = 'async'; |
| |
| @override |
| final description = 'Set a value asynchronously.'; |
| |
| @override |
| final takesArguments = false; |
| |
| @override |
| Future run() => Future.value().then((_) => hasRun = true); |
| } |
| |
| class AllowAnythingCommand extends Command { |
| bool hasRun = false; |
| |
| @override |
| final name = 'allowAnything'; |
| |
| @override |
| final description = 'A command using allowAnything.'; |
| |
| @override |
| final argParser = ArgParser.allowAnything(); |
| |
| @override |
| void run() { |
| hasRun = true; |
| } |
| } |
| |
| class CustomNameCommand extends Command { |
| @override |
| final String name; |
| |
| CustomNameCommand(this.name); |
| |
| @override |
| String get description => 'A command with a custom name'; |
| } |
| |
| void throwsIllegalArg(void Function() function, {String? reason}) { |
| expect(function, throwsArgumentError, reason: reason); |
| } |
| |
| void throwsFormat(ArgParser parser, List<String> args) { |
| expect(() => parser.parse(args), throwsFormatException); |
| } |
| |
| Matcher throwsUsageException(Object? message, Object? usage) => |
| throwsA(isA<UsageException>() |
| .having((e) => e.message, 'message', message) |
| .having((e) => e.usage, 'usage', usage)); |