// 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 'descriptor.dart' as d;
import 'test_pub.dart';

main() {
  initConfig();

  forBothPubGetAndUpgrade((command) {
    group('requires', () {
      integration('a pubspec', () {
        d.dir(appPath, []).create();

        pubCommand(command,
            error: new RegExp(r'Could not find a file named "pubspec.yaml" '
                r'in "[^\n]*"\.'));
      });

      integration('a pubspec with a "name" key', () {
        d.dir(appPath, [
          d.pubspec({"dependencies": {"foo": null}})
        ]).create();

        pubCommand(command,
            error: contains('Missing the required "name" field.'),
            exitCode: exit_codes.DATA);
      });
    });

    integration('adds itself to the packages', () {
      // The symlink should use the name in the pubspec, not the name of the
      // directory.
      d.dir(appPath, [
        d.pubspec({"name": "myapp_name"}),
        d.libDir('myapp_name')
      ]).create();

      pubCommand(command);

      d.dir(packagesPath, [
        d.dir("myapp_name", [
          d.file('myapp_name.dart', 'main() => "myapp_name";')
        ])
      ]).validate();
    });

    integration('does not adds itself to the packages if it has no "lib" '
        'directory', () {
      // The symlink should use the name in the pubspec, not the name of the
      // directory.
      d.dir(appPath, [
        d.pubspec({"name": "myapp_name"}),
      ]).create();

      pubCommand(command);

      d.dir(packagesPath, [
        d.nothing("myapp_name")
      ]).validate();
    });

    integration('does not add a package if it does not have a "lib" '
        'directory', () {
      // Using a path source, but this should be true of all sources.
      d.dir('foo', [
        d.libPubspec('foo', '0.0.0-not.used')
      ]).create();

      d.dir(appPath, [
        d.appPubspec({"foo": {"path": "../foo"}})
      ]).create();

      pubCommand(command);

      d.packagesDir({"foo": null}).validate();
    });

    integration('reports a solver failure', () {
      // myapp depends on foo and bar which both depend on baz with mismatched
      // descriptions.
      d.dir('deps', [
        d.dir('foo', [
          d.pubspec({"name": "foo", "dependencies": {
            "baz": {"path": "../baz1"}
          }})
        ]),
        d.dir('bar', [
          d.pubspec({"name": "bar", "dependencies": {
            "baz": {"path": "../baz2"}
          }})
        ]),
        d.dir('baz1', [
          d.libPubspec('baz', '0.0.0')
        ]),
        d.dir('baz2', [
          d.libPubspec('baz', '0.0.0')
        ])
      ]).create();

      d.dir(appPath, [
        d.appPubspec({
          "foo": {"path": "../deps/foo"},
          "bar": {"path": "../deps/bar"}
        })
      ]).create();

      pubCommand(command,
          error: new RegExp("^Incompatible dependencies on baz:\n"));
    });

    integration('does not allow a dependency on itself', () {
      d.dir(appPath, [
        d.appPubspec({
          "myapp": {"path": "."}
        })
      ]).create();

      pubCommand(command,
          error: contains('A package may not list itself as a dependency.'),
          exitCode: exit_codes.DATA);
    });

    integration('does not allow a dev dependency on itself', () {
      d.dir(appPath, [
        d.pubspec({
          "name": "myapp",
          "dev_dependencies": {
            "myapp": {"path": "."}
          }
        })
      ]).create();

      pubCommand(command,
          error: contains('A package may not list itself as a dependency.'),
          exitCode: exit_codes.DATA);
    });
  });
}
