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

import 'package:pub/src/exit_codes.dart' as exit_codes;

import 'package:test/test.dart';

import 'descriptor.dart' as d;
import 'test_pub.dart';

void main() {
  forBothPubGetAndUpgrade((command) {
    group('requires', () {
      test('a pubspec', () async {
        await d.dir(appPath, []).create();

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

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

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

    test('adds itself to the .dart_tool/package_config.json file', () async {
      // The package should use the name in the pubspec, not the name of the
      // directory.
      await d.dir(appPath, [
        d.pubspec({'name': 'myapp_name'}),
        d.libDir('myapp_name'),
      ]).create();

      await pubCommand(command);

      await d.dir('myapp', [
        d.packageConfigFile(
          [d.packageConfigEntry(name: 'myapp_name', path: '.')],
        ),
      ]).validate();
    });

    test('reports a solver failure', () async {
      // myapp depends on foo and bar which both depend on baz with mismatched
      // descriptions.
      await 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();

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

      await pubCommand(
        command,
        error: RegExp(r'bar from path is incompatible with foo from path'),
      );
    });

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

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

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

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