// 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:path/path.dart' as p;
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() {
  setUp(() async {
    final server = await servePackages();
    server.serve('bar', '1.0.0');

    await d.dir('flutter', [
      d.dir('packages', [
        d.dir('foo', [
          d.libDir('foo', 'foo 0.0.1'),
          d.libPubspec('foo', '0.0.1', deps: {'bar': 'any'}),
        ]),
      ]),
      d.dir('bin/cache/pkg', [
        d.dir(
          'baz',
          [d.libDir('baz', 'foo 0.0.1'), d.libPubspec('baz', '0.0.1')],
        ),
      ]),
      d.flutterVersion('1.2.3'),
    ]).create();
  });

  test("adds an SDK dependency's dependencies", () async {
    await d.appDir(dependencies: {}).create();
    await pubAdd(
      args: ['foo', '--sdk', 'flutter'],
      environment: {'FLUTTER_ROOT': p.join(d.sandbox, 'flutter')},
    );

    await d.dir(appPath, [
      d.pubspec({
        'name': 'myapp',
        'dependencies': {
          'foo': {'sdk': 'flutter'},
        },
      }),
    ]).validate();

    await d.appPackageConfigFile([
      d.packageConfigEntry(
        name: 'foo',
        path: p.join(d.sandbox, 'flutter', 'packages', 'foo'),
      ),
      d.packageConfigEntry(name: 'bar', version: '1.0.0'),
    ]).validate();
  });

  test(
      "adds an SDK dependency's dependencies with version constraint specified",
      () async {
    await d.appDir(dependencies: {}).create();
    await pubAdd(
      args: ['foo:0.0.1', '--sdk', 'flutter'],
      environment: {'FLUTTER_ROOT': p.join(d.sandbox, 'flutter')},
    );

    await d.dir(appPath, [
      d.pubspec({
        'name': 'myapp',
        'dependencies': {
          'foo': {'sdk': 'flutter', 'version': '0.0.1'},
        },
      }),
    ]).validate();
    await d.appPackageConfigFile([
      d.packageConfigEntry(
        name: 'foo',
        path: p.join(d.sandbox, 'flutter', 'packages', 'foo'),
      ),
      d.packageConfigEntry(name: 'bar', version: '1.0.0'),
    ]).validate();
  });

  test('adds an SDK dependency from bin/cache/pkg', () async {
    await d.appDir(dependencies: {}).create();
    await pubAdd(
      args: ['baz', '--sdk', 'flutter'],
      environment: {'FLUTTER_ROOT': p.join(d.sandbox, 'flutter')},
    );

    await d.appPackageConfigFile([
      d.packageConfigEntry(
        name: 'baz',
        path: p.join(d.sandbox, 'flutter', 'bin', 'cache', 'pkg', 'baz'),
      ),
    ]).validate();
  });

  test("fails if the version constraint doesn't match", () async {
    await d.appDir(dependencies: {}).create();
    await pubAdd(
      args: ['foo:^1.0.0', '--sdk', 'flutter'],
      environment: {'FLUTTER_ROOT': p.join(d.sandbox, 'flutter')},
      error: equalsIgnoringWhitespace("""
              Because myapp depends on foo ^1.0.0 from sdk which doesn't match
                any versions, version solving failed.
            """),
      exitCode: exit_codes.DATA,
    );

    await d.appDir(dependencies: {}).validate();
    await d.dir(appPath, [
      d.nothing('.dart_tool/package_config.json'),
      d.nothing('pubspec.lock'),
    ]).validate();
  });
}
