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

main() {
  initConfig();

  forBothPubInstallAndUpdate((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: new RegExp(r'Missing the required "name" '
            r'field\.'));
      });
    });

    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: new RegExp(r'"dependencies.myapp": Package '
          r'may not list itself as a dependency\.'));
    });

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

      pubCommand(command, error: new RegExp(r'"dev_dependencies.myapp": '
          r'Package may not list itself as a dependency\.'));
    });
  });
}
