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

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

/// This test suite attempts to cover the edge cases of version resolution
/// with regards to transitive dependencies.
void main() {
  test('unlocks transitive dependencies', () async {
    /// The server used to only have the foo v3.2.1 as the latest,
    /// so pub get will create a pubspec.lock to foo 3.2.1
    await servePackages((builder) {
      builder.serve('foo', '3.2.1');
      builder.serve('bar', '1.0.0', deps: {'foo': '^3.2.1'});
    });

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

    /// foo's package creator releases a newer version of foo, and we
    /// want to test that this is what the user gets when they run
    /// pub add foo.
    globalPackageServer!.add((builder) {
      builder.serve('foo', '3.5.0');
      builder.serve('foo', '3.1.0');
      builder.serve('foo', '2.5.0');
    });

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

    await d.appDir({'foo': '^3.5.0', 'bar': '1.0.0'}).validate();
    await d.cacheDir({'foo': '3.5.0', 'bar': '1.0.0'}).validate();
    await d.appPackagesFile({'foo': '3.5.0', 'bar': '1.0.0'}).validate();
  });

  test('chooses the appropriate version to not break other dependencies',
      () async {
    /// The server used to only have the foo v3.2.1 as the latest,
    /// so pub get will create a pubspec.lock to foo 3.2.1
    await servePackages((builder) {
      builder.serve('foo', '3.2.1');
      builder.serve('bar', '1.0.0', deps: {'foo': '^3.2.1'});
    });

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

    globalPackageServer!.add((builder) {
      builder.serve('foo', '4.0.0');
      builder.serve('foo', '2.0.0');
    });

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

    await d.appDir({'foo': '^3.2.1', 'bar': '1.0.0'}).validate();
    await d.cacheDir({'foo': '3.2.1', 'bar': '1.0.0'}).validate();
    await d.appPackagesFile({'foo': '3.2.1', 'bar': '1.0.0'}).validate();
  });

  test('may upgrade other packages if they allow a later version to be chosen',
      () async {
    /// The server used to only have the foo v3.2.1 as the latest,
    /// so pub get will create a pubspec.lock to foo 3.2.1
    await servePackages((builder) {
      builder.serve('foo', '3.2.1');
      builder.serve('bar', '1.0.0', deps: {'foo': '^3.2.1'});
    });

    await d.appDir({'bar': '^1.0.0'}).create();
    await pubGet();

    globalPackageServer!.add((builder) {
      builder.serve('foo', '5.0.0');
      builder.serve('foo', '4.0.0');
      builder.serve('foo', '2.0.0');
      builder.serve('bar', '1.5.0', deps: {'foo': '^4.0.0'});
    });

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

    await d.appDir({'foo': '^4.0.0', 'bar': '^1.0.0'}).validate();
    await d.cacheDir({'foo': '4.0.0', 'bar': '1.5.0'}).validate();
    await d.appPackagesFile({'foo': '4.0.0', 'bar': '1.5.0'}).validate();
  });
}
