// Copyright (c) 2014, 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 'dart:io';

import 'package:test/test.dart';

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

void main() {
  test(
      'adds the latest version of the package matching the '
      'version constraint', () async {
    await servePackages()
      ..serve('foo', '1.2.2')
      ..serve('foo', '1.2.3')
      ..serve('foo', '2.0.0-dev')
      ..serve('foo', '2.0.0');

    await runPub(
      args: ['cache', 'add', 'foo', '-v', '>=1.0.0 <2.0.0'],
      silent: allOf([
        contains('Downloading foo 1.2.3...'),
        contains('X-Pub-OS: ${Platform.operatingSystem}'),
        contains('X-Pub-Command: cache add'),
        contains('X-Pub-Session-ID:'),
        contains('X-Pub-Environment: test-environment'),
        isNot(contains('X-Pub-Reason')),
      ]),
    );

    await d.cacheDir({'foo': '1.2.3'}).validate();
    await d.hostedCache([
      d.nothing('foo-1.2.2'),
      d.nothing('foo-2.0.0-dev'),
      d.nothing('foo-2.0.0'),
    ]).validate();
  });
}
