// 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 'dart:io';

import 'package:scheduled_test/scheduled_test.dart';

import 'descriptor.dart' as d;
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:
      cache      Inspect the system cache.
      deploy     Copy and compile all Dart entrypoints in the 'web' directory.
      help       Display help information for Pub.
      install    Install the current package's dependencies.
      publish    Publish the current package to pub.dartlang.org.
      update     Update the current package's dependencies to the 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: ['install', '--help'],
        output: '''
          Install the current package's dependencies.

          Usage: pub install
          -h, --help            Print usage information for this command.
              --[no-]offline    Use cached packages instead of accessing the network.
    ''');
  });

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

          Usage: pub install
          -h, --help            Print usage information for this command.
              --[no-]offline    Use cached packages instead of accessing the network.
    ''');
  });

  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".
        Run "pub help" to see available commands.
        ''',
        exitCode: 64);
  });

  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: 64);
  });

  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: 64);
  });

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

            Usage: pub install
            -h, --help            Print usage information for this command.
                --[no-]offline    Use cached packages instead of accessing the network.
            ''');
    });

    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('an unknown help command displays an error message', () {
      schedulePub(args: ['help', 'quylthulg'],
          error: '''
            Could not find a command named "quylthulg".
            Run "pub help" to see available commands.
            ''',
            exitCode: 64);
    });

  });

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

    integration('parses a release-style version', () {
      d.dir(sdkPath, [
        d.file('version', '0.1.2.0_r17645'),
      ]).create();

      schedulePub(args: ['version'], output: "Pub 0.1.2+0.r17645\n");
    });

    integration('parses a dev-only style version', () {
      // The "version" file generated on developer builds is a little funky and
      // we need to make sure we don't choke on it.
      d.dir(sdkPath, [
        d.file('version', '0.1.2.0_r16279_bobross'),
      ]).create();

      schedulePub(args: ['version'], output: "Pub 0.1.2+0.r16279.bobross\n");
    });
  });
}
