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

library pub_tests;

import 'package:scheduled_test/scheduled_test.dart';

import '../lib/src/exit_codes.dart' as exit_codes;
import 'test_pub.dart';

final USAGE_STRING = """
    Pub is a package manager for Dart.

    Usage: pub <command> [arguments]

    Global options:
    -h, --help            Print this usage information.
        --version         Print pub version.
        --[no-]trace      Print debugging information when an error occurs.
        --verbosity       Control output verbosity.

              [all]       Show all output including internal tracing messages.
              [io]        Also show IO operations.
              [normal]    Show errors, warnings, and user messages.
              [solver]    Show steps during version resolution.

    -v, --verbose         Shortcut for "--verbosity=all".

    Available commands:
      build      Apply transformers to build a package.
      cache      Work with the system cache.
      deps       Print package dependencies.
      get        Get the current package's dependencies.
      help       Display help information for Pub.
      publish    Publish the current package to pub.dartlang.org.
      run        Run an executable from a package.
      serve      Run a local web development server.
      upgrade    Upgrade the current package's dependencies to latest versions.
      uploader   Manage uploaders for a package on pub.dartlang.org.
      version    Print pub version.

    Use "pub help [command]" for more information about a command.
    """;

final VERSION_STRING = '''
    Pub 0.1.2+3
    ''';

main() {
  initConfig();

  integration('running pub with no command displays usage', () {
    schedulePub(args: [], output: USAGE_STRING);
  });

  integration('running pub with just --help displays usage', () {
    schedulePub(args: ['--help'], output: USAGE_STRING);
  });

  integration('running pub with just -h displays usage', () {
    schedulePub(args: ['-h'], output: USAGE_STRING);
  });

  integration('running pub with --help after command shows command usage', () {
    schedulePub(args: ['get', '--help'],
        output: '''
          Get the current package's dependencies.

          Usage: pub get
          -h, --help            Print usage information for this command.
              --[no-]offline    Use cached packages instead of accessing the network.
          -n, --dry-run         Report what dependencies would change but don't change any.
    ''');
  });

  integration('running pub with -h after command shows command usage', () {
    schedulePub(args: ['get', '-h'],
        output: '''
          Get the current package's dependencies.

          Usage: pub get
          -h, --help            Print usage information for this command.
              --[no-]offline    Use cached packages instead of accessing the network.
          -n, --dry-run         Report what dependencies would change but don't change any.
    ''');
  });

  integration('running pub with --help after a command with subcommands shows '
              'command usage', () {
    schedulePub(args: ['cache', '--help'],
        output: '''
          Work with the system cache.

          Usage: pub cache <subcommand>
          -h, --help    Print usage information for this command.

          Available subcommands:
            add      Install a package.
            repair   Reinstall cached packages.
     ''');
  });


  integration('running pub with just --version displays version', () {
    schedulePub(args: ['--version'], output: VERSION_STRING);
  });

  integration('an unknown command displays an error message', () {
    schedulePub(args: ['quylthulg'],
        error: '''
        Could not find a command named "quylthulg".

        Available commands:
          build      Apply transformers to build a package.
          cache      Work with the system cache.
          deps       Print package dependencies.
          get        Get the current package's dependencies.
          help       Display help information for Pub.
          publish    Publish the current package to pub.dartlang.org.
          run        Run an executable from a package.
          serve      Run a local web development server.
          upgrade    Upgrade the current package's dependencies to latest versions.
          uploader   Manage uploaders for a package on pub.dartlang.org.
          version    Print pub version.
        ''',
        exitCode: exit_codes.USAGE);
  });

  integration('an unknown subcommand displays an error message', () {
    schedulePub(args: ['cache', 'quylthulg'],
        error: '''
        Could not find a subcommand named "quylthulg" for "pub cache".

        Usage: pub cache <subcommand>
        -h, --help    Print usage information for this command.

        Available subcommands:
          add      Install a package.
          repair   Reinstall cached packages.
        ''',
        exitCode: exit_codes.USAGE);
  });

  integration('an unknown option displays an error message', () {
    schedulePub(args: ['--blorf'],
        error: '''
        Could not find an option named "blorf".
        Run "pub help" to see available options.
        ''',
        exitCode: exit_codes.USAGE);
  });

  integration('an unknown command option displays an error message', () {
    // TODO(rnystrom): When pub has command-specific options, a more precise
    // error message would be good here.
    schedulePub(args: ['version', '--blorf'],
        error: '''
        Could not find an option named "blorf".
        Run "pub help" to see available options.
        ''',
        exitCode: exit_codes.USAGE);
  });

  integration('an unexpected argument displays an error message', () {
    schedulePub(args: ['version', 'unexpected'],
        error: '''
        Command "version" does not take any arguments.

        Usage: pub version
         -h, --help    Print usage information for this command.
        ''',
        exitCode: exit_codes.USAGE);
  });

  integration('a missing subcommand displays an error message', () {
    schedulePub(args: ['cache'],
        error: '''
        Missing subcommand for "pub cache".

        Usage: pub cache <subcommand>
        -h, --help    Print usage information for this command.

        Available subcommands:
          add      Install a package.
          repair   Reinstall cached packages.
        ''',
        exitCode: exit_codes.USAGE);
  });

  group('help', () {
    integration('shows global help if no command is given', () {
      schedulePub(args: ['help'], output: USAGE_STRING);
    });

    integration('shows help for a command', () {
      schedulePub(args: ['help', 'get'],
          output: '''
            Get the current package's dependencies.

            Usage: pub get
            -h, --help            Print usage information for this command.
                --[no-]offline    Use cached packages instead of accessing the network.
            -n, --dry-run         Report what dependencies would change but don't change any.
            ''');
    });

    integration('shows help for a command', () {
      schedulePub(args: ['help', 'publish'],
          output: '''
            Publish the current package to pub.dartlang.org.

            Usage: pub publish [options]
            -h, --help       Print usage information for this command.
            -n, --dry-run    Validate but do not publish the package.
            -f, --force      Publish without confirmation if there are no errors.
                --server     The package server to which to upload this package.
                             (defaults to "https://pub.dartlang.org")
            ''');
    });

    integration('shows non-truncated help', () {
      schedulePub(args: ['help', 'serve'],
          output: '''
            Run a local web development server.

            By default, this serves "web/" and "test/", but an explicit list of
            directories to serve can be provided as well.

            Usage: pub serve [directories...]
            -h, --help               Print usage information for this command.
                --mode               Mode to run transformers in.
                                     (defaults to "debug")

                --all                Use all default source directories.
                --hostname           The hostname to listen on.
                                     (defaults to "localhost")

                --port               The base port to listen on.
                                     (defaults to "8080")

                --[no-]dart2js       Compile Dart to JavaScript.
                                     (defaults to on)

                --[no-]force-poll    Force the use of a polling filesystem watcher.
            ''');
    });

    integration('shows help for a subcommand', () {
      schedulePub(args: ['help', 'cache', 'list'],
          output: '''
            List packages in the system cache.

            Usage: pub cache list
            -h, --help    Print usage information for this command.
            ''');
    });

    integration('an unknown help command displays an error message', () {
      schedulePub(args: ['help', 'quylthulg'],
          error: '''
            Could not find a command named "quylthulg".

            Available commands:
              build      Apply transformers to build a package.
              cache      Work with the system cache.
              deps       Print package dependencies.
              get        Get the current package's dependencies.
              help       Display help information for Pub.
              publish    Publish the current package to pub.dartlang.org.
              run        Run an executable from a package.
              serve      Run a local web development server.
              upgrade    Upgrade the current package's dependencies to latest versions.
              uploader   Manage uploaders for a package on pub.dartlang.org.
              version    Print pub version.
            ''',
            exitCode: exit_codes.USAGE);
    });

    integration('an unknown help subcommand displays an error message', () {
      schedulePub(args: ['help', 'cache', 'quylthulg'],
          error: '''
            Could not find a subcommand named "quylthulg" for "pub cache".

            Usage: pub cache <subcommand>
            -h, --help    Print usage information for this command.

            Available subcommands:
              add      Install a package.
              repair   Reinstall cached packages.
            ''',
            exitCode: exit_codes.USAGE);
    });

    integration('an unexpected help subcommand displays an error message', () {
      schedulePub(args: ['help', 'version', 'badsubcommand'],
          error: '''
            Command "pub version" does not expect a subcommand.

            Usage: pub version
            -h, --help    Print usage information for this command.
            ''',
            exitCode: exit_codes.USAGE);
    });
  });

  group('version', () {
    integration('displays the current version', () {
      schedulePub(args: ['version'], output: VERSION_STRING);
    });
  });
}
