// Copyright (c) 2013, 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_cache_test;

import 'dart:io';
import 'dart:json' as json;

import 'package:scheduled_test/scheduled_test.dart';

import '../lib/src/io.dart';
import 'descriptor.dart' as d;
import 'test_pub.dart';

main() {
  initConfig();

  integration('running pub cache displays error message', () {
    schedulePub(args: ['cache'],
        output: '''
          Inspect the system cache.

          Usage: pub cache list
          -h, --help    Print usage information for this command.
          ''',
        error: 'The cache command expects one argument.',
        exitCode: 64);
  });

  integration('running pub cache foo displays error message', () {
    schedulePub(args: ['cache' ,'foo'],
        output: '''
          Inspect the system cache.

          Usage: pub cache list
          -h, --help    Print usage information for this command.
          ''',
        error: 'Unknown cache command "foo".',
        exitCode: 64);
  });

  integration('running pub cache list when there is no cache', () {
    schedulePub(args: ['cache', 'list'], output: '{"packages":{}}');
  });

  integration('running pub cache list on empty cache', () {
    // Set up a cache.
    d.dir(cachePath, [
      d.dir('hosted', [
         d.dir('pub.dartlang.org', [
        ])
      ])
    ]).create();

    schedulePub(args: ['cache', 'list'], output: '{"packages":{}}');
  });

  integration('running pub cache list', () {
    // Set up a cache.
    d.dir(cachePath, [
      d.dir('hosted', [
         d.dir('pub.dartlang.org', [
          d.dir("foo-1.2.3", [
            d.libPubspec("foo", "1.2.3"),
            d.libDir("foo")
          ]),
          d.dir("bar-2.0.0", [
            d.libPubspec("bar", "2.0.0"),
            d.libDir("bar") ])
        ])
      ])
    ]).create();

    schedulePub(args: ['cache', 'list'], output:
      new RegExp(r'\{"packages":\{"bar":\{"version":"2\.0\.0","location":'
          r'"[^"]+bar-2\.0\.0"\},"foo":\{"version":"1\.2\.3","location":'
          r'"[^"]+foo-1\.2\.3"\}\}\}$'));
  });

  integration('includes packages containing deps with bad sources', () {
    // Set up a cache.
    d.dir(cachePath, [
      d.dir('hosted', [
         d.dir('pub.dartlang.org', [
          d.dir("foo-1.2.3", [
            d.libPubspec("foo", "1.2.3", deps: [{"bad": "bar"}]),
            d.libDir("foo")
          ])
        ])
      ])
    ]).create();

    schedulePub(args: ['cache', 'list'], output:
      new RegExp(r'\{"packages":\{"foo":\{"version":"1\.2\.3","location":'
          r'"[^"]+foo-1\.2\.3"\}\}\}$'));
  });
}