// Copyright (c) 2014, 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.

library command_test;

import 'package:args/command_runner.dart';
import 'package:test/test.dart';
import 'utils.dart';

void main() {
  var foo;
  setUp(() {
    foo = new FooCommand();

    // Make sure [Command.runner] is set up.
    new CommandRunner("test", "A test command runner.").addCommand(foo);
  });

  group(".invocation has a sane default", () {
    test("without subcommands", () {
      expect(foo.invocation, equals("test foo [arguments]"));
    });

    test("with subcommands", () {
      foo.addSubcommand(new AsyncCommand());
      expect(foo.invocation, equals("test foo <subcommand> [arguments]"));
    });

    test("for a subcommand", () {
      var async = new AsyncCommand();
      foo.addSubcommand(async);

      expect(async.invocation, equals("test foo async [arguments]"));
    });
  });

  group(".usage", () {
    test("returns the usage string", () {
      expect(foo.usage, equals("""
Set a value.

Usage: test foo [arguments]
-h, --help    Print this usage information.

Run "test help" to see global options."""));
    });

    test("contains custom options", () {
      foo.argParser.addFlag("flag", help: "Do something.");

      expect(foo.usage, equals("""
Set a value.

Usage: test foo [arguments]
-h, --help         Print this usage information.
    --[no-]flag    Do something.

Run "test help" to see global options."""));
    });

    test("doesn't print hidden subcommands", () {
      foo.addSubcommand(new AsyncCommand());
      foo.addSubcommand(new HiddenCommand());

      expect(foo.usage, equals("""
Set a value.

Usage: test foo <subcommand> [arguments]
-h, --help    Print this usage information.

Available subcommands:
  async   Set a value asynchronously.

Run "test help" to see global options."""));
    });

    test("doesn't print subcommand aliases", () {
      foo.addSubcommand(new AliasedCommand());

      expect(foo.usage, equals("""
Set a value.

Usage: test foo <subcommand> [arguments]
-h, --help    Print this usage information.

Available subcommands:
  aliased   Set a value.

Run "test help" to see global options."""));
    });
  });

  test("usageException splits up the message and usage", () {
    expect(() => foo.usageException("message"), throwsUsageError("message", """
Usage: test foo [arguments]
-h, --help    Print this usage information.

Run "test help" to see global options."""));
  });

  test("considers a command hidden if all its subcommands are hidden", () {
    foo.addSubcommand(new HiddenCommand());
    expect(foo.hidden, isTrue);
  });
}
