// Copyright (c) 2020, 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() {
  test('allows empty version constraint', () async {
    await servePackages()
      ..serve('foo', '0.2.3')
      ..serve('foo', '1.0.1')
      ..serve('foo', '1.2.3')
      ..serve('foo', '2.0.0-dev')
      ..serve('foo', '1.3.4-dev');

    await d.appDir({}).create();

    await pubAdd(args: ['foo']);

    await d.cacheDir({'foo': '1.2.3'}).validate();
    await d.appPackageConfigFile([
      d.packageConfigEntry(name: 'foo', version: '1.2.3'),
    ]).validate();
    await d.appDir({'foo': '^1.2.3'}).validate();
  });

  test('allows specific version constraint', () async {
    final server = await servePackages();
    server.serve('foo', '1.2.3');

    await d.appDir({}).create();

    await pubAdd(args: ['foo:1.2.3']);

    await d.cacheDir({'foo': '1.2.3'}).validate();
    await d.appPackageConfigFile([
      d.packageConfigEntry(name: 'foo', version: '1.2.3'),
    ]).validate();
    await d.appDir({'foo': '1.2.3'}).validate();
  });

  test('allows specific pre-release version constraint', () async {
    final server = await servePackages();
    server.serve('foo', '1.2.3-dev');

    await d.appDir({}).create();

    await pubAdd(args: ['foo:1.2.3-dev']);

    await d.cacheDir({'foo': '1.2.3-dev'}).validate();
    await d.appPackageConfigFile([
      d.packageConfigEntry(name: 'foo', version: '1.2.3-dev'),
    ]).validate();
    await d.appDir({'foo': '1.2.3-dev'}).validate();
  });

  test('allows the "any" version constraint', () async {
    await servePackages()
      ..serve('foo', '0.2.3')
      ..serve('foo', '1.0.1')
      ..serve('foo', '1.2.3')
      ..serve('foo', '2.0.0-dev')
      ..serve('foo', '1.3.4-dev');

    await d.appDir({}).create();

    await pubAdd(args: ['foo:any']);

    await d.cacheDir({'foo': '1.2.3'}).validate();
    await d.appPackageConfigFile([
      d.packageConfigEntry(name: 'foo', version: '1.2.3'),
    ]).validate();
    await d.appDir({'foo': 'any'}).validate();
  });

  test('allows version constraint range', () async {
    final server = await servePackages();
    server.serve('foo', '1.2.3');

    await d.appDir({}).create();

    await pubAdd(args: ['foo:>1.2.0 <2.0.0']);

    await d.cacheDir({'foo': '1.2.3'}).validate();
    await d.appPackageConfigFile([
      d.packageConfigEntry(name: 'foo', version: '1.2.3'),
    ]).validate();
    await d.appDir({'foo': '>1.2.0 <2.0.0'}).validate();
  });

  test(
      'empty constraint allows it to choose the latest version not in conflict',
      () async {
    await servePackages()
      ..serve('foo', '0.1.0')
      ..serve('foo', '1.2.3', deps: {'bar': '2.0.4'})
      ..serve('bar', '2.0.3')
      ..serve('bar', '2.0.4');

    await d.appDir({'bar': '2.0.3'}).create();

    await pubAdd(args: ['foo']);

    await d.appDir({'foo': '^0.1.0', 'bar': '2.0.3'}).validate();

    await d.cacheDir({'foo': '0.1.0', 'bar': '2.0.3'}).validate();
    await d.appPackageConfigFile([
      d.packageConfigEntry(name: 'foo', version: '0.1.0'),
      d.packageConfigEntry(name: 'bar', version: '2.0.3'),
    ]).validate();
  });

  group('does not update pubspec if no available version found', () {
    test('simple', () async {
      final server = await servePackages();
      server.serve('foo', '1.0.3');

      await d.appDir({}).create();

      await pubAdd(
          args: ['foo:>1.2.0 <2.0.0'],
          error: contains(
              "Because myapp depends on foo >1.2.0 <2.0.0 which doesn't "
              'match any versions, version solving failed.'),
          exitCode: exit_codes.DATA);

      await d.appDir({}).validate();
      await d.dir(appPath, [
        // The lockfile should not be created.
        d.nothing('pubspec.lock'),
        // The ".packages" file should not have been created.
        d.nothing('.packages'),
      ]).validate();
    });

    test('transitive', () async {
      await servePackages()
        ..serve('foo', '1.2.3', deps: {'bar': '2.0.4'})
        ..serve('bar', '2.0.3')
        ..serve('bar', '2.0.4');

      await d.appDir({'bar': '2.0.3'}).create();

      await pubAdd(
          args: ['foo:1.2.3'],
          error: contains(
              'Because every version of foo depends on bar 2.0.4 and myapp '
              'depends on bar 2.0.3, foo is forbidden.'),
          exitCode: exit_codes.DATA);

      await d.appDir({'bar': '2.0.3'}).validate();
      await d.dir(appPath, [
        // The lockfile should not be created.
        d.nothing('pubspec.lock'),
        // The ".packages" file should not have been created.
        d.nothing('.packages'),
      ]).validate();
    });
  });
}
