// 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 'package:path/path.dart' as p;
import 'package:pub/src/io.dart';
import 'package:test/test.dart';

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

void main() {
  test('activates a package at a local path', () async {
    await d.dir('foo', [
      d.libPubspec('foo', '1.0.0'),
      d.dir('bin', [d.file('foo.dart', "main() => print('ok');")]),
    ]).create();

    var path = canonicalize(p.join(d.sandbox, 'foo'));
    await runPub(
      args: ['global', 'activate', '--source', 'path', '../foo'],
      output: endsWith('Activated foo 1.0.0 at path "$path".'),
    );
  });

  // Regression test for #1751
  test('activates a package at a local path with a relative path dependency',
      () async {
    await d.dir('foo', [
      d.libPubspec(
        'foo',
        '1.0.0',
        deps: {
          'bar': {'path': '../bar'},
        },
      ),
      d.dir('bin', [
        d.file('foo.dart', """
        import 'package:bar/bar.dart';

        main() => print(value);
      """),
      ]),
    ]).create();

    await d.dir('bar', [
      d.libPubspec('bar', '1.0.0'),
      d.dir('lib', [d.file('bar.dart', "final value = 'ok';")]),
    ]).create();

    var path = canonicalize(p.join(d.sandbox, 'foo'));
    await runPub(
      args: ['global', 'activate', '--source', 'path', '../foo'],
      output: endsWith('Activated foo 1.0.0 at path "$path".'),
    );

    await runPub(
      args: ['global', 'run', 'foo'],
      output: endsWith('ok'),
      workingDirectory: p.current,
    );
  });

  test("Doesn't precompile binaries when activating from path", () async {
    final server = await servePackages();
    server.serve(
      'bar',
      '1.0.0',
      contents: [
        d.dir('bin', [d.file('bar.dart', "main() => print('bar');")]),
      ],
    );

    await d.dir('foo', [
      d.libPubspec('foo', '1.0.0', deps: {'bar': '^1.0.0'}),
      d.dir('bin', [d.file('foo.dart', "main() => print('ok');")]),
    ]).create();

    await runPub(
      args: ['global', 'activate', '--source', 'path', '../foo'],
      output: allOf(
        [contains('Activated foo 1.0.0 at path'), isNot(contains('Built'))],
      ),
    );
  });
}
